From 3efdc9b6bc82dda8972af33ca0cfdb258d93cc46 Mon Sep 17 00:00:00 2001 From: coxifred Date: Tue, 30 Jun 2020 23:18:30 +0200 Subject: [PATCH] Commit --- python/.gradle/python/bin/activate | 84 + python/.gradle/python/bin/activate.csh | 55 + python/.gradle/python/bin/activate.fish | 102 + python/.gradle/python/bin/activate.ps1 | 60 + python/.gradle/python/bin/activate.xsh | 46 + python/.gradle/python/bin/activate_this.py | 46 + python/.gradle/python/bin/easy_install | 8 + python/.gradle/python/bin/easy_install-3.6 | 8 + python/.gradle/python/bin/futurize | 8 + python/.gradle/python/bin/pasteurize | 8 + python/.gradle/python/bin/pip | 8 + python/.gradle/python/bin/pip3 | 8 + python/.gradle/python/bin/pip3.6 | 8 + python/.gradle/python/bin/python | 1 + python/.gradle/python/bin/python-config | 78 + python/.gradle/python/bin/python3 | Bin 0 -> 11336 bytes python/.gradle/python/bin/python3.6 | 1 + python/.gradle/python/bin/wheel | 8 + python/.gradle/python/include/python3.6m | 1 + .../python/lib/python3.6/__future__.py | 1 + .../__pycache__/__future__.cpython-36.pyc | Bin 0 -> 4208 bytes .../__pycache__/_bootlocale.cpython-36.pyc | Bin 0 -> 1021 bytes .../_collections_abc.cpython-36.pyc | Bin 0 -> 28838 bytes .../__pycache__/_weakrefset.cpython-36.pyc | Bin 0 -> 7869 bytes .../python3.6/__pycache__/abc.cpython-36.pyc | Bin 0 -> 7556 bytes .../__pycache__/base64.cpython-36.pyc | Bin 0 -> 17100 bytes .../__pycache__/bisect.cpython-36.pyc | Bin 0 -> 2717 bytes .../__pycache__/codecs.cpython-36.pyc | Bin 0 -> 33941 bytes .../python3.6/__pycache__/copy.cpython-36.pyc | Bin 0 -> 7120 bytes .../__pycache__/copyreg.cpython-36.pyc | Bin 0 -> 4285 bytes .../python3.6/__pycache__/enum.cpython-36.pyc | Bin 0 -> 23494 bytes .../__pycache__/fnmatch.cpython-36.pyc | Bin 0 -> 2915 bytes .../__pycache__/functools.cpython-36.pyc | Bin 0 -> 24103 bytes .../__pycache__/genericpath.cpython-36.pyc | Bin 0 -> 3767 bytes .../__pycache__/hashlib.cpython-36.pyc | Bin 0 -> 8264 bytes .../__pycache__/heapq.cpython-36.pyc | Bin 0 -> 14333 bytes .../python3.6/__pycache__/hmac.cpython-36.pyc | Bin 0 -> 4877 bytes .../python3.6/__pycache__/imp.cpython-36.pyc | Bin 0 -> 9737 bytes .../python3.6/__pycache__/io.cpython-36.pyc | Bin 0 -> 3428 bytes .../__pycache__/keyword.cpython-36.pyc | Bin 0 -> 1806 bytes .../__pycache__/linecache.cpython-36.pyc | Bin 0 -> 3819 bytes .../__pycache__/locale.cpython-36.pyc | Bin 0 -> 34086 bytes .../__pycache__/ntpath.cpython-36.pyc | Bin 0 -> 13791 bytes .../__pycache__/operator.cpython-36.pyc | Bin 0 -> 13954 bytes .../python3.6/__pycache__/os.cpython-36.pyc | Bin 0 -> 29669 bytes .../__pycache__/posixpath.cpython-36.pyc | Bin 0 -> 10464 bytes .../__pycache__/random.cpython-36.pyc | Bin 0 -> 19371 bytes .../python3.6/__pycache__/re.cpython-36.pyc | Bin 0 -> 14099 bytes .../__pycache__/reprlib.cpython-36.pyc | Bin 0 -> 5441 bytes .../__pycache__/shutil.cpython-36.pyc | Bin 0 -> 30745 bytes .../python3.6/__pycache__/site.cpython-36.pyc | Bin 0 -> 21860 bytes .../__pycache__/sre_compile.cpython-36.pyc | Bin 0 -> 10319 bytes .../__pycache__/sre_constants.cpython-36.pyc | Bin 0 -> 6013 bytes .../__pycache__/sre_parse.cpython-36.pyc | Bin 0 -> 20399 bytes .../python3.6/__pycache__/stat.cpython-36.pyc | Bin 0 -> 3892 bytes .../__pycache__/struct.cpython-36.pyc | Bin 0 -> 353 bytes .../__pycache__/tarfile.cpython-36.pyc | Bin 0 -> 62688 bytes .../__pycache__/tempfile.cpython-36.pyc | Bin 0 -> 22268 bytes .../__pycache__/token.cpython-36.pyc | Bin 0 -> 3361 bytes .../__pycache__/tokenize.cpython-36.pyc | Bin 0 -> 18688 bytes .../__pycache__/types.cpython-36.pyc | Bin 0 -> 8242 bytes .../__pycache__/warnings.cpython-36.pyc | Bin 0 -> 13299 bytes .../__pycache__/weakref.cpython-36.pyc | Bin 0 -> 19184 bytes .../python/lib/python3.6/_bootlocale.py | 1 + .../python/lib/python3.6/_collections_abc.py | 1 + .../python/lib/python3.6/_dummy_thread.py | 1 + .../python/lib/python3.6/_weakrefset.py | 1 + python/.gradle/python/lib/python3.6/abc.py | 1 + python/.gradle/python/lib/python3.6/base64.py | 1 + python/.gradle/python/lib/python3.6/bisect.py | 1 + python/.gradle/python/lib/python3.6/codecs.py | 1 + .../.gradle/python/lib/python3.6/collections | 1 + .../python3.6/config-3.6m-x86_64-linux-gnu | 1 + python/.gradle/python/lib/python3.6/copy.py | 1 + .../.gradle/python/lib/python3.6/copyreg.py | 1 + .../lib/python3.6/distutils/__init__.py | 134 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3182 bytes .../lib/python3.6/distutils/distutils.cfg | 6 + python/.gradle/python/lib/python3.6/encodings | 1 + python/.gradle/python/lib/python3.6/enum.py | 1 + .../.gradle/python/lib/python3.6/fnmatch.py | 1 + .../.gradle/python/lib/python3.6/functools.py | 1 + .../python/lib/python3.6/genericpath.py | 1 + .../.gradle/python/lib/python3.6/hashlib.py | 1 + python/.gradle/python/lib/python3.6/heapq.py | 1 + python/.gradle/python/lib/python3.6/hmac.py | 1 + python/.gradle/python/lib/python3.6/imp.py | 1 + python/.gradle/python/lib/python3.6/importlib | 1 + python/.gradle/python/lib/python3.6/io.py | 1 + .../.gradle/python/lib/python3.6/keyword.py | 1 + .../.gradle/python/lib/python3.6/lib-dynload | 1 + .../.gradle/python/lib/python3.6/linecache.py | 1 + python/.gradle/python/lib/python3.6/locale.py | 1 + .../lib/python3.6/no-global-site-packages.txt | 0 python/.gradle/python/lib/python3.6/ntpath.py | 1 + .../.gradle/python/lib/python3.6/operator.py | 1 + .../python/lib/python3.6/orig-prefix.txt | 1 + python/.gradle/python/lib/python3.6/os.py | 1 + .../.gradle/python/lib/python3.6/posixpath.py | 1 + python/.gradle/python/lib/python3.6/random.py | 1 + python/.gradle/python/lib/python3.6/re.py | 1 + .../.gradle/python/lib/python3.6/reprlib.py | 1 + .../python/lib/python3.6/rlcompleter.py | 1 + python/.gradle/python/lib/python3.6/shutil.py | 1 + .../PyYAML-5.3.1.dist-info/INSTALLER | 1 + .../PyYAML-5.3.1.dist-info/LICENSE | 20 + .../PyYAML-5.3.1.dist-info/METADATA | 41 + .../PyYAML-5.3.1.dist-info/RECORD | 40 + .../PyYAML-5.3.1.dist-info/WHEEL | 5 + .../PyYAML-5.3.1.dist-info/top_level.txt | 2 + .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 277 bytes .../crcmod-1.7.dist-info/INSTALLER | 1 + .../crcmod-1.7.dist-info/LICENSE | 22 + .../crcmod-1.7.dist-info/METADATA | 159 + .../site-packages/crcmod-1.7.dist-info/RECORD | 16 + .../site-packages/crcmod-1.7.dist-info/WHEEL | 5 + .../crcmod-1.7.dist-info/top_level.txt | 1 + .../site-packages/crcmod/__init__.py | 8 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 293 bytes .../__pycache__/_crcfunpy.cpython-36.pyc | Bin 0 -> 2601 bytes .../crcmod/__pycache__/crcmod.cpython-36.pyc | Bin 0 -> 11111 bytes .../__pycache__/predefined.cpython-36.pyc | Bin 0 -> 4537 bytes .../crcmod/__pycache__/test.cpython-36.pyc | Bin 0 -> 14679 bytes .../site-packages/crcmod/_crcfunpy.py | 107 + .../python3.6/site-packages/crcmod/crcmod.py | 457 + .../site-packages/crcmod/predefined.py | 162 + .../python3.6/site-packages/crcmod/test.py | 540 ++ .../python3.6/site-packages/easy_install.py | 5 + .../future-0.18.2.dist-info/INSTALLER | 1 + .../future-0.18.2.dist-info/LICENSE.txt | 19 + .../future-0.18.2.dist-info/METADATA | 109 + .../future-0.18.2.dist-info/RECORD | 415 + .../future-0.18.2.dist-info/WHEEL | 5 + .../future-0.18.2.dist-info/entry_points.txt | 4 + .../future-0.18.2.dist-info/top_level.txt | 4 + .../site-packages/future/__init__.py | 93 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3102 bytes .../future/backports/__init__.py | 26 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 601 bytes .../__pycache__/_markupbase.cpython-36.pyc | Bin 0 -> 9586 bytes .../__pycache__/datetime.cpython-36.pyc | Bin 0 -> 50967 bytes .../backports/__pycache__/misc.cpython-36.pyc | Bin 0 -> 28991 bytes .../__pycache__/socket.cpython-36.pyc | Bin 0 -> 14259 bytes .../__pycache__/socketserver.cpython-36.pyc | Bin 0 -> 22422 bytes .../__pycache__/total_ordering.cpython-36.pyc | Bin 0 -> 2241 bytes .../future/backports/_markupbase.py | 422 + .../future/backports/datetime.py | 2152 +++++ .../future/backports/email/__init__.py | 78 + .../email/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2019 bytes .../__pycache__/_encoded_words.cpython-36.pyc | Bin 0 -> 6085 bytes .../_header_value_parser.cpython-36.pyc | Bin 0 -> 80754 bytes .../__pycache__/_parseaddr.cpython-36.pyc | Bin 0 -> 12681 bytes .../__pycache__/_policybase.cpython-36.pyc | Bin 0 -> 14635 bytes .../__pycache__/base64mime.cpython-36.pyc | Bin 0 -> 3438 bytes .../email/__pycache__/charset.cpython-36.pyc | Bin 0 -> 11905 bytes .../email/__pycache__/encoders.cpython-36.pyc | Bin 0 -> 2168 bytes .../email/__pycache__/errors.cpython-36.pyc | Bin 0 -> 6156 bytes .../__pycache__/feedparser.cpython-36.pyc | Bin 0 -> 10702 bytes .../__pycache__/generator.cpython-36.pyc | Bin 0 -> 11698 bytes .../email/__pycache__/header.cpython-36.pyc | Bin 0 -> 17021 bytes .../__pycache__/headerregistry.cpython-36.pyc | Bin 0 -> 20956 bytes .../__pycache__/iterators.cpython-36.pyc | Bin 0 -> 2140 bytes .../email/__pycache__/message.cpython-36.pyc | Bin 0 -> 28694 bytes .../email/__pycache__/parser.cpython-36.pyc | Bin 0 -> 6025 bytes .../email/__pycache__/policy.cpython-36.pyc | Bin 0 -> 8329 bytes .../__pycache__/quoprimime.cpython-36.pyc | Bin 0 -> 9244 bytes .../email/__pycache__/utils.cpython-36.pyc | Bin 0 -> 10339 bytes .../future/backports/email/_encoded_words.py | 232 + .../backports/email/_header_value_parser.py | 2965 ++++++ .../future/backports/email/_parseaddr.py | 546 ++ .../future/backports/email/_policybase.py | 365 + .../future/backports/email/base64mime.py | 120 + .../future/backports/email/charset.py | 409 + .../future/backports/email/encoders.py | 90 + .../future/backports/email/errors.py | 111 + .../future/backports/email/feedparser.py | 525 ++ .../future/backports/email/generator.py | 498 + .../future/backports/email/header.py | 581 ++ .../future/backports/email/headerregistry.py | 592 ++ .../future/backports/email/iterators.py | 74 + .../future/backports/email/message.py | 882 ++ .../future/backports/email/mime/__init__.py | 0 .../mime/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 155 bytes .../__pycache__/application.cpython-36.pyc | Bin 0 -> 1584 bytes .../mime/__pycache__/audio.cpython-36.pyc | Bin 0 -> 2743 bytes .../mime/__pycache__/base.cpython-36.pyc | Bin 0 -> 1108 bytes .../mime/__pycache__/image.cpython-36.pyc | Bin 0 -> 2029 bytes .../mime/__pycache__/message.cpython-36.pyc | Bin 0 -> 1462 bytes .../mime/__pycache__/multipart.cpython-36.pyc | Bin 0 -> 1663 bytes .../__pycache__/nonmultipart.cpython-36.pyc | Bin 0 -> 929 bytes .../mime/__pycache__/text.cpython-36.pyc | Bin 0 -> 1443 bytes .../backports/email/mime/application.py | 39 + .../future/backports/email/mime/audio.py | 74 + .../future/backports/email/mime/base.py | 25 + .../future/backports/email/mime/image.py | 48 + .../future/backports/email/mime/message.py | 36 + .../future/backports/email/mime/multipart.py | 49 + .../backports/email/mime/nonmultipart.py | 24 + .../future/backports/email/mime/text.py | 44 + .../future/backports/email/parser.py | 135 + .../future/backports/email/policy.py | 193 + .../future/backports/email/quoprimime.py | 326 + .../future/backports/email/utils.py | 400 + .../future/backports/html/__init__.py | 27 + .../html/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1019 bytes .../html/__pycache__/entities.cpython-36.pyc | Bin 0 -> 50640 bytes .../html/__pycache__/parser.cpython-36.pyc | Bin 0 -> 13596 bytes .../future/backports/html/entities.py | 2514 +++++ .../future/backports/html/parser.py | 536 ++ .../future/backports/http/__init__.py | 0 .../http/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 149 bytes .../http/__pycache__/client.cpython-36.pyc | Bin 0 -> 30907 bytes .../http/__pycache__/cookiejar.cpython-36.pyc | Bin 0 -> 54439 bytes .../http/__pycache__/cookies.cpython-36.pyc | Bin 0 -> 16252 bytes .../http/__pycache__/server.cpython-36.pyc | Bin 0 -> 34885 bytes .../future/backports/http/client.py | 1346 +++ .../future/backports/http/cookiejar.py | 2110 +++++ .../future/backports/http/cookies.py | 598 ++ .../future/backports/http/server.py | 1226 +++ .../site-packages/future/backports/misc.py | 944 ++ .../site-packages/future/backports/socket.py | 454 + .../future/backports/socketserver.py | 747 ++ .../future/backports/test/__init__.py | 9 + .../test/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 421 bytes .../test/__pycache__/pystone.cpython-36.pyc | Bin 0 -> 6673 bytes .../__pycache__/ssl_servers.cpython-36.pyc | Bin 0 -> 6963 bytes .../test/__pycache__/support.cpython-36.pyc | Bin 0 -> 55200 bytes .../future/backports/test/badcert.pem | 36 + .../future/backports/test/badkey.pem | 40 + .../future/backports/test/dh512.pem | 9 + .../test/https_svn_python_org_root.pem | 41 + .../future/backports/test/keycert.passwd.pem | 33 + .../future/backports/test/keycert.pem | 31 + .../future/backports/test/keycert2.pem | 31 + .../future/backports/test/nokia.pem | 31 + .../future/backports/test/nullbytecert.pem | 90 + .../future/backports/test/nullcert.pem | 0 .../future/backports/test/pystone.py | 272 + .../future/backports/test/sha256.pem | 128 + .../future/backports/test/ssl_cert.pem | 15 + .../future/backports/test/ssl_key.passwd.pem | 18 + .../future/backports/test/ssl_key.pem | 16 + .../future/backports/test/ssl_servers.py | 207 + .../future/backports/test/support.py | 2048 ++++ .../future/backports/total_ordering.py | 38 + .../future/backports/urllib/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 151 bytes .../urllib/__pycache__/error.cpython-36.pyc | Bin 0 -> 2588 bytes .../urllib/__pycache__/parse.cpython-36.pyc | Bin 0 -> 28758 bytes .../urllib/__pycache__/request.cpython-36.pyc | Bin 0 -> 70280 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 3808 bytes .../__pycache__/robotparser.cpython-36.pyc | Bin 0 -> 6053 bytes .../future/backports/urllib/error.py | 75 + .../future/backports/urllib/parse.py | 991 ++ .../future/backports/urllib/request.py | 2647 ++++++ .../future/backports/urllib/response.py | 103 + .../future/backports/urllib/robotparser.py | 211 + .../future/backports/xmlrpc/__init__.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 151 bytes .../xmlrpc/__pycache__/client.cpython-36.pyc | Bin 0 -> 33904 bytes .../xmlrpc/__pycache__/server.cpython-36.pyc | Bin 0 -> 29942 bytes .../future/backports/xmlrpc/client.py | 1496 +++ .../future/backports/xmlrpc/server.py | 999 ++ .../site-packages/future/builtins/__init__.py | 51 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1257 bytes .../__pycache__/disabled.cpython-36.pyc | Bin 0 -> 2331 bytes .../__pycache__/iterators.cpython-36.pyc | Bin 0 -> 1486 bytes .../builtins/__pycache__/misc.cpython-36.pyc | Bin 0 -> 3028 bytes .../__pycache__/new_min_max.cpython-36.pyc | Bin 0 -> 1531 bytes .../__pycache__/newnext.cpython-36.pyc | Bin 0 -> 1974 bytes .../__pycache__/newround.cpython-36.pyc | Bin 0 -> 2771 bytes .../__pycache__/newsuper.cpython-36.pyc | Bin 0 -> 2823 bytes .../site-packages/future/builtins/disabled.py | 66 + .../future/builtins/iterators.py | 52 + .../site-packages/future/builtins/misc.py | 135 + .../future/builtins/new_min_max.py | 59 + .../site-packages/future/builtins/newnext.py | 70 + .../site-packages/future/builtins/newround.py | 102 + .../site-packages/future/builtins/newsuper.py | 114 + .../site-packages/future/moves/__init__.py | 8 + .../moves/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 346 bytes .../__pycache__/_dummy_thread.cpython-36.pyc | Bin 0 -> 323 bytes .../__pycache__/_markupbase.cpython-36.pyc | Bin 0 -> 317 bytes .../moves/__pycache__/_thread.cpython-36.pyc | Bin 0 -> 305 bytes .../moves/__pycache__/builtins.cpython-36.pyc | Bin 0 -> 339 bytes .../__pycache__/collections.cpython-36.pyc | Bin 0 -> 599 bytes .../__pycache__/configparser.cpython-36.pyc | Bin 0 -> 295 bytes .../moves/__pycache__/copyreg.cpython-36.pyc | Bin 0 -> 363 bytes .../__pycache__/itertools.cpython-36.pyc | Bin 0 -> 326 bytes .../moves/__pycache__/pickle.cpython-36.pyc | Bin 0 -> 357 bytes .../moves/__pycache__/queue.cpython-36.pyc | Bin 0 -> 300 bytes .../moves/__pycache__/reprlib.cpython-36.pyc | Bin 0 -> 303 bytes .../__pycache__/socketserver.cpython-36.pyc | Bin 0 -> 321 bytes .../__pycache__/subprocess.cpython-36.pyc | Bin 0 -> 438 bytes .../moves/__pycache__/sys.cpython-36.pyc | Bin 0 -> 293 bytes .../moves/__pycache__/winreg.cpython-36.pyc | Bin 0 -> 304 bytes .../future/moves/_dummy_thread.py | 8 + .../site-packages/future/moves/_markupbase.py | 8 + .../site-packages/future/moves/_thread.py | 8 + .../site-packages/future/moves/builtins.py | 10 + .../site-packages/future/moves/collections.py | 18 + .../future/moves/configparser.py | 8 + .../site-packages/future/moves/copyreg.py | 12 + .../future/moves/dbm/__init__.py | 20 + .../dbm/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 441 bytes .../moves/dbm/__pycache__/dumb.cpython-36.pyc | Bin 0 -> 308 bytes .../moves/dbm/__pycache__/gnu.cpython-36.pyc | Bin 0 -> 303 bytes .../moves/dbm/__pycache__/ndbm.cpython-36.pyc | Bin 0 -> 304 bytes .../site-packages/future/moves/dbm/dumb.py | 9 + .../site-packages/future/moves/dbm/gnu.py | 9 + .../site-packages/future/moves/dbm/ndbm.py | 9 + .../future/moves/html/__init__.py | 31 + .../html/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 817 bytes .../html/__pycache__/entities.cpython-36.pyc | Bin 0 -> 325 bytes .../html/__pycache__/parser.cpython-36.pyc | Bin 0 -> 317 bytes .../future/moves/html/entities.py | 8 + .../site-packages/future/moves/html/parser.py | 8 + .../future/moves/http/__init__.py | 4 + .../http/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 217 bytes .../http/__pycache__/client.cpython-36.pyc | Bin 0 -> 298 bytes .../http/__pycache__/cookiejar.cpython-36.pyc | Bin 0 -> 322 bytes .../http/__pycache__/cookies.cpython-36.pyc | Bin 0 -> 344 bytes .../http/__pycache__/server.cpython-36.pyc | Bin 0 -> 537 bytes .../site-packages/future/moves/http/client.py | 8 + .../future/moves/http/cookiejar.py | 8 + .../future/moves/http/cookies.py | 9 + .../site-packages/future/moves/http/server.py | 20 + .../site-packages/future/moves/itertools.py | 8 + .../site-packages/future/moves/pickle.py | 11 + .../site-packages/future/moves/queue.py | 8 + .../site-packages/future/moves/reprlib.py | 8 + .../future/moves/socketserver.py | 8 + .../site-packages/future/moves/subprocess.py | 11 + .../site-packages/future/moves/sys.py | 8 + .../future/moves/test/__init__.py | 5 + .../test/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 267 bytes .../test/__pycache__/support.cpython-36.pyc | Bin 0 -> 407 bytes .../future/moves/test/support.py | 10 + .../future/moves/tkinter/__init__.py | 27 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 677 bytes .../__pycache__/colorchooser.cpython-36.pyc | Bin 0 -> 449 bytes .../__pycache__/commondialog.cpython-36.pyc | Bin 0 -> 449 bytes .../__pycache__/constants.cpython-36.pyc | Bin 0 -> 437 bytes .../tkinter/__pycache__/dialog.cpython-36.pyc | Bin 0 -> 421 bytes .../tkinter/__pycache__/dnd.cpython-36.pyc | Bin 0 -> 413 bytes .../__pycache__/filedialog.cpython-36.pyc | Bin 0 -> 437 bytes .../tkinter/__pycache__/font.cpython-36.pyc | Bin 0 -> 417 bytes .../__pycache__/messagebox.cpython-36.pyc | Bin 0 -> 441 bytes .../__pycache__/scrolledtext.cpython-36.pyc | Bin 0 -> 445 bytes .../__pycache__/simpledialog.cpython-36.pyc | Bin 0 -> 445 bytes .../tkinter/__pycache__/tix.cpython-36.pyc | Bin 0 -> 409 bytes .../tkinter/__pycache__/ttk.cpython-36.pyc | Bin 0 -> 409 bytes .../future/moves/tkinter/colorchooser.py | 12 + .../future/moves/tkinter/commondialog.py | 12 + .../future/moves/tkinter/constants.py | 12 + .../future/moves/tkinter/dialog.py | 12 + .../site-packages/future/moves/tkinter/dnd.py | 12 + .../future/moves/tkinter/filedialog.py | 12 + .../future/moves/tkinter/font.py | 12 + .../future/moves/tkinter/messagebox.py | 12 + .../future/moves/tkinter/scrolledtext.py | 12 + .../future/moves/tkinter/simpledialog.py | 12 + .../site-packages/future/moves/tkinter/tix.py | 12 + .../site-packages/future/moves/tkinter/ttk.py | 12 + .../future/moves/urllib/__init__.py | 5 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 269 bytes .../urllib/__pycache__/error.cpython-36.pyc | Bin 0 -> 489 bytes .../urllib/__pycache__/parse.cpython-36.pyc | Bin 0 -> 730 bytes .../urllib/__pycache__/request.cpython-36.pyc | Bin 0 -> 1026 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 437 bytes .../__pycache__/robotparser.cpython-36.pyc | Bin 0 -> 332 bytes .../future/moves/urllib/error.py | 16 + .../future/moves/urllib/parse.py | 28 + .../future/moves/urllib/request.py | 94 + .../future/moves/urllib/response.py | 12 + .../future/moves/urllib/robotparser.py | 8 + .../site-packages/future/moves/winreg.py | 8 + .../future/moves/xmlrpc/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 147 bytes .../xmlrpc/__pycache__/client.cpython-36.pyc | Bin 0 -> 294 bytes .../xmlrpc/__pycache__/server.cpython-36.pyc | Bin 0 -> 294 bytes .../future/moves/xmlrpc/client.py | 7 + .../future/moves/xmlrpc/server.py | 7 + .../future/standard_library/__init__.py | 815 ++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 18606 bytes .../site-packages/future/tests/__init__.py | 0 .../tests/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 140 bytes .../tests/__pycache__/base.cpython-36.pyc | Bin 0 -> 16573 bytes .../site-packages/future/tests/base.py | 539 ++ .../site-packages/future/types/__init__.py | 257 + .../types/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 5958 bytes .../types/__pycache__/newbytes.cpython-36.pyc | Bin 0 -> 14358 bytes .../types/__pycache__/newdict.cpython-36.pyc | Bin 0 -> 3667 bytes .../types/__pycache__/newint.cpython-36.pyc | Bin 0 -> 12704 bytes .../types/__pycache__/newlist.cpython-36.pyc | Bin 0 -> 3014 bytes .../__pycache__/newmemoryview.cpython-36.pyc | Bin 0 -> 951 bytes .../__pycache__/newobject.cpython-36.pyc | Bin 0 -> 2608 bytes .../types/__pycache__/newopen.cpython-36.pyc | Bin 0 -> 1539 bytes .../types/__pycache__/newrange.cpython-36.pyc | Bin 0 -> 6026 bytes .../types/__pycache__/newstr.cpython-36.pyc | Bin 0 -> 14580 bytes .../site-packages/future/types/newbytes.py | 460 + .../site-packages/future/types/newdict.py | 111 + .../site-packages/future/types/newint.py | 381 + .../site-packages/future/types/newlist.py | 95 + .../future/types/newmemoryview.py | 29 + .../site-packages/future/types/newobject.py | 117 + .../site-packages/future/types/newopen.py | 32 + .../site-packages/future/types/newrange.py | 170 + .../site-packages/future/types/newstr.py | 426 + .../site-packages/future/utils/__init__.py | 767 ++ .../utils/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 20209 bytes .../surrogateescape.cpython-36.pyc | Bin 0 -> 3784 bytes .../future/utils/surrogateescape.py | 198 + .../iso8601-0.1.12.dist-info/DESCRIPTION.rst | 192 + .../iso8601-0.1.12.dist-info/INSTALLER | 1 + .../iso8601-0.1.12.dist-info/METADATA | 205 + .../iso8601-0.1.12.dist-info/RECORD | 13 + .../iso8601-0.1.12.dist-info/WHEEL | 6 + .../iso8601-0.1.12.dist-info/metadata.json | 1 + .../iso8601-0.1.12.dist-info/top_level.txt | 1 + .../site-packages/iso8601/__init__.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 159 bytes .../__pycache__/iso8601.cpython-36.pyc | Bin 0 -> 6597 bytes .../__pycache__/test_iso8601.cpython-36.pyc | Bin 0 -> 5346 bytes .../site-packages/iso8601/iso8601.py | 214 + .../site-packages/iso8601/test_iso8601.py | 102 + .../site-packages/libfuturize/__init__.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 139 bytes .../__pycache__/fixer_util.cpython-36.pyc | Bin 0 -> 11945 bytes .../__pycache__/main.cpython-36.pyc | Bin 0 -> 9499 bytes .../site-packages/libfuturize/fixer_util.py | 520 ++ .../libfuturize/fixes/__init__.py | 97 + .../fixes/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2131 bytes .../__pycache__/fix_UserDict.cpython-36.pyc | Bin 0 -> 2166 bytes .../fix_absolute_import.cpython-36.pyc | Bin 0 -> 2456 bytes ...rts_except_unicode_literals.cpython-36.pyc | Bin 0 -> 1045 bytes .../__pycache__/fix_basestring.cpython-36.pyc | Bin 0 -> 770 bytes .../__pycache__/fix_bytes.cpython-36.pyc | Bin 0 -> 1008 bytes .../fixes/__pycache__/fix_cmp.cpython-36.pyc | Bin 0 -> 1049 bytes .../__pycache__/fix_division.cpython-36.pyc | Bin 0 -> 397 bytes .../fix_division_safe.cpython-36.pyc | Bin 0 -> 2988 bytes .../__pycache__/fix_execfile.cpython-36.pyc | Bin 0 -> 1282 bytes .../fix_future_builtins.cpython-36.pyc | Bin 0 -> 1694 bytes ...fix_future_standard_library.cpython-36.pyc | Bin 0 -> 1044 bytes ...ure_standard_library_urllib.cpython-36.pyc | Bin 0 -> 1110 bytes .../__pycache__/fix_input.cpython-36.pyc | Bin 0 -> 1048 bytes .../__pycache__/fix_metaclass.cpython-36.pyc | Bin 0 -> 5781 bytes .../__pycache__/fix_next_call.cpython-36.pyc | Bin 0 -> 3006 bytes .../__pycache__/fix_object.cpython-36.pyc | Bin 0 -> 777 bytes .../fix_oldstr_wrap.cpython-36.pyc | Bin 0 -> 1356 bytes ...fix_order___future__imports.cpython-36.pyc | Bin 0 -> 1003 bytes .../__pycache__/fix_print.cpython-36.pyc | Bin 0 -> 2376 bytes .../fix_print_with_import.cpython-36.pyc | Bin 0 -> 924 bytes .../__pycache__/fix_raise.cpython-36.pyc | Bin 0 -> 2462 bytes ...remove_old__future__imports.cpython-36.pyc | Bin 0 -> 1210 bytes .../fix_unicode_keep_u.cpython-36.pyc | Bin 0 -> 1131 bytes ...fix_unicode_literals_import.cpython-36.pyc | Bin 0 -> 776 bytes .../fix_xrange_with_import.cpython-36.pyc | Bin 0 -> 855 bytes .../libfuturize/fixes/fix_UserDict.py | 102 + .../libfuturize/fixes/fix_absolute_import.py | 91 + ...future__imports_except_unicode_literals.py | 26 + .../libfuturize/fixes/fix_basestring.py | 17 + .../libfuturize/fixes/fix_bytes.py | 24 + .../libfuturize/fixes/fix_cmp.py | 33 + .../libfuturize/fixes/fix_division.py | 12 + .../libfuturize/fixes/fix_division_safe.py | 104 + .../libfuturize/fixes/fix_execfile.py | 37 + .../libfuturize/fixes/fix_future_builtins.py | 59 + .../fixes/fix_future_standard_library.py | 24 + .../fix_future_standard_library_urllib.py | 28 + .../libfuturize/fixes/fix_input.py | 32 + .../libfuturize/fixes/fix_metaclass.py | 262 + .../libfuturize/fixes/fix_next_call.py | 104 + .../libfuturize/fixes/fix_object.py | 17 + .../libfuturize/fixes/fix_oldstr_wrap.py | 39 + .../fixes/fix_order___future__imports.py | 36 + .../libfuturize/fixes/fix_print.py | 94 + .../fixes/fix_print_with_import.py | 22 + .../libfuturize/fixes/fix_raise.py | 107 + .../fixes/fix_remove_old__future__imports.py | 26 + .../libfuturize/fixes/fix_unicode_keep_u.py | 24 + .../fixes/fix_unicode_literals_import.py | 18 + .../fixes/fix_xrange_with_import.py | 20 + .../site-packages/libfuturize/main.py | 322 + .../site-packages/libpasteurize/__init__.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 141 bytes .../__pycache__/main.cpython-36.pyc | Bin 0 -> 5870 bytes .../libpasteurize/fixes/__init__.py | 54 + .../fixes/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 864 bytes .../__pycache__/feature_base.cpython-36.pyc | Bin 0 -> 2587 bytes ...ix_add_all__future__imports.cpython-36.pyc | Bin 0 -> 1030 bytes ...fix_add_all_future_builtins.cpython-36.pyc | Bin 0 -> 1158 bytes ...ure_standard_library_import.cpython-36.pyc | Bin 0 -> 959 bytes .../fix_annotations.cpython-36.pyc | Bin 0 -> 1665 bytes .../__pycache__/fix_division.cpython-36.pyc | Bin 0 -> 1305 bytes .../__pycache__/fix_features.cpython-36.pyc | Bin 0 -> 2369 bytes .../fix_fullargspec.cpython-36.pyc | Bin 0 -> 820 bytes .../fix_future_builtins.cpython-36.pyc | Bin 0 -> 1491 bytes .../__pycache__/fix_getcwd.cpython-36.pyc | Bin 0 -> 1082 bytes .../__pycache__/fix_imports.cpython-36.pyc | Bin 0 -> 3562 bytes .../__pycache__/fix_imports2.cpython-36.pyc | Bin 0 -> 7099 bytes .../__pycache__/fix_kwargs.cpython-36.pyc | Bin 0 -> 3763 bytes .../__pycache__/fix_memoryview.cpython-36.pyc | Bin 0 -> 889 bytes .../__pycache__/fix_metaclass.cpython-36.pyc | Bin 0 -> 1993 bytes .../__pycache__/fix_newstyle.cpython-36.pyc | Bin 0 -> 1168 bytes .../fixes/__pycache__/fix_next.cpython-36.pyc | Bin 0 -> 1517 bytes .../fix_printfunction.cpython-36.pyc | Bin 0 -> 764 bytes .../__pycache__/fix_raise.cpython-36.pyc | Bin 0 -> 1302 bytes .../__pycache__/fix_raise_.cpython-36.pyc | Bin 0 -> 1428 bytes .../__pycache__/fix_throw.cpython-36.pyc | Bin 0 -> 1163 bytes .../__pycache__/fix_unpacking.cpython-36.pyc | Bin 0 -> 5743 bytes .../libpasteurize/fixes/feature_base.py | 57 + .../fixes/fix_add_all__future__imports.py | 24 + .../fixes/fix_add_all_future_builtins.py | 37 + .../fix_add_future_standard_library_import.py | 23 + .../libpasteurize/fixes/fix_annotations.py | 48 + .../libpasteurize/fixes/fix_division.py | 28 + .../libpasteurize/fixes/fix_features.py | 86 + .../libpasteurize/fixes/fix_fullargspec.py | 16 + .../fixes/fix_future_builtins.py | 46 + .../libpasteurize/fixes/fix_getcwd.py | 26 + .../libpasteurize/fixes/fix_imports.py | 112 + .../libpasteurize/fixes/fix_imports2.py | 174 + .../libpasteurize/fixes/fix_kwargs.py | 147 + .../libpasteurize/fixes/fix_memoryview.py | 21 + .../libpasteurize/fixes/fix_metaclass.py | 78 + .../libpasteurize/fixes/fix_newstyle.py | 33 + .../libpasteurize/fixes/fix_next.py | 43 + .../libpasteurize/fixes/fix_printfunction.py | 17 + .../libpasteurize/fixes/fix_raise.py | 25 + .../libpasteurize/fixes/fix_raise_.py | 35 + .../libpasteurize/fixes/fix_throw.py | 23 + .../libpasteurize/fixes/fix_unpacking.py | 120 + .../site-packages/libpasteurize/main.py | 204 + .../python3.6/site-packages/past/__init__.py | 90 + .../past/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3075 bytes .../site-packages/past/builtins/__init__.py | 72 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1628 bytes .../builtins/__pycache__/misc.cpython-36.pyc | Bin 0 -> 2284 bytes .../__pycache__/noniterators.cpython-36.pyc | Bin 0 -> 3212 bytes .../site-packages/past/builtins/misc.py | 94 + .../past/builtins/noniterators.py | 272 + .../past/translation/__init__.py | 485 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 11261 bytes .../site-packages/past/types/__init__.py | 29 + .../types/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 857 bytes .../__pycache__/basestring.cpython-36.pyc | Bin 0 -> 1264 bytes .../types/__pycache__/olddict.cpython-36.pyc | Bin 0 -> 2315 bytes .../types/__pycache__/oldstr.cpython-36.pyc | Bin 0 -> 2870 bytes .../site-packages/past/types/basestring.py | 39 + .../site-packages/past/types/olddict.py | 96 + .../site-packages/past/types/oldstr.py | 135 + .../site-packages/past/utils/__init__.py | 97 + .../utils/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3000 bytes .../pip-20.1.1.dist-info/INSTALLER | 1 + .../pip-20.1.1.dist-info/LICENSE.txt | 20 + .../pip-20.1.1.dist-info/METADATA | 87 + .../site-packages/pip-20.1.1.dist-info/RECORD | 743 ++ .../site-packages/pip-20.1.1.dist-info/WHEEL | 6 + .../pip-20.1.1.dist-info/entry_points.txt | 5 + .../pip-20.1.1.dist-info/top_level.txt | 1 + .../python3.6/site-packages/pip/__init__.py | 18 + .../python3.6/site-packages/pip/__main__.py | 26 + .../pip/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 614 bytes .../pip/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 462 bytes .../site-packages/pip/_internal/__init__.py | 17 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 663 bytes .../__pycache__/build_env.cpython-36.pyc | Bin 0 -> 7342 bytes .../__pycache__/cache.cpython-36.pyc | Bin 0 -> 9018 bytes .../__pycache__/configuration.cpython-36.pyc | Bin 0 -> 10677 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 12736 bytes .../__pycache__/locations.cpython-36.pyc | Bin 0 -> 4435 bytes .../_internal/__pycache__/main.cpython-36.pyc | Bin 0 -> 600 bytes .../__pycache__/pyproject.cpython-36.pyc | Bin 0 -> 3691 bytes .../self_outdated_check.cpython-36.pyc | Bin 0 -> 5435 bytes .../__pycache__/wheel_builder.cpython-36.pyc | Bin 0 -> 6674 bytes .../site-packages/pip/_internal/build_env.py | 219 + .../site-packages/pip/_internal/cache.py | 349 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 225 bytes .../__pycache__/autocompletion.cpython-36.pyc | Bin 0 -> 4950 bytes .../__pycache__/base_command.cpython-36.pyc | Bin 0 -> 5625 bytes .../cli/__pycache__/cmdoptions.cpython-36.pyc | Bin 0 -> 20363 bytes .../command_context.cpython-36.pyc | Bin 0 -> 1288 bytes .../cli/__pycache__/main.cpython-36.pyc | Bin 0 -> 1401 bytes .../__pycache__/main_parser.cpython-36.pyc | Bin 0 -> 2174 bytes .../cli/__pycache__/parser.cpython-36.pyc | Bin 0 -> 8893 bytes .../__pycache__/progress_bars.cpython-36.pyc | Bin 0 -> 7621 bytes .../__pycache__/req_command.cpython-36.pyc | Bin 0 -> 9803 bytes .../cli/__pycache__/spinners.cpython-36.pyc | Bin 0 -> 4679 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 354 bytes .../pip/_internal/cli/autocompletion.py | 164 + .../pip/_internal/cli/base_command.py | 228 + .../pip/_internal/cli/cmdoptions.py | 962 ++ .../pip/_internal/cli/command_context.py | 36 + .../site-packages/pip/_internal/cli/main.py | 75 + .../pip/_internal/cli/main_parser.py | 99 + .../site-packages/pip/_internal/cli/parser.py | 266 + .../pip/_internal/cli/progress_bars.py | 277 + .../pip/_internal/cli/req_command.py | 408 + .../pip/_internal/cli/spinners.py | 173 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 122 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2885 bytes .../commands/__pycache__/cache.cpython-36.pyc | Bin 0 -> 4405 bytes .../commands/__pycache__/check.cpython-36.pyc | Bin 0 -> 1545 bytes .../__pycache__/completion.cpython-36.pyc | Bin 0 -> 2970 bytes .../__pycache__/configuration.cpython-36.pyc | Bin 0 -> 6504 bytes .../commands/__pycache__/debug.cpython-36.pyc | Bin 0 -> 6291 bytes .../__pycache__/download.cpython-36.pyc | Bin 0 -> 3837 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 2816 bytes .../commands/__pycache__/hash.cpython-36.pyc | Bin 0 -> 1972 bytes .../commands/__pycache__/help.cpython-36.pyc | Bin 0 -> 1175 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 15787 bytes .../commands/__pycache__/list.cpython-36.pyc | Bin 0 -> 8275 bytes .../__pycache__/search.cpython-36.pyc | Bin 0 -> 4520 bytes .../commands/__pycache__/show.cpython-36.pyc | Bin 0 -> 6349 bytes .../__pycache__/uninstall.cpython-36.pyc | Bin 0 -> 2755 bytes .../commands/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 5013 bytes .../pip/_internal/commands/cache.py | 181 + .../pip/_internal/commands/check.py | 51 + .../pip/_internal/commands/completion.py | 95 + .../pip/_internal/commands/configuration.py | 233 + .../pip/_internal/commands/debug.py | 237 + .../pip/_internal/commands/download.py | 142 + .../pip/_internal/commands/freeze.py | 99 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/install.py | 691 ++ .../pip/_internal/commands/list.py | 299 + .../pip/_internal/commands/search.py | 146 + .../pip/_internal/commands/show.py | 180 + .../pip/_internal/commands/uninstall.py | 89 + .../pip/_internal/commands/wheel.py | 190 + .../pip/_internal/configuration.py | 426 + .../pip/_internal/distributions/__init__.py | 24 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 797 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 1897 bytes .../__pycache__/installed.cpython-36.pyc | Bin 0 -> 1183 bytes .../__pycache__/sdist.cpython-36.pyc | Bin 0 -> 3413 bytes .../__pycache__/wheel.cpython-36.pyc | Bin 0 -> 1519 bytes .../pip/_internal/distributions/base.py | 45 + .../pip/_internal/distributions/installed.py | 24 + .../pip/_internal/distributions/sdist.py | 104 + .../pip/_internal/distributions/wheel.py | 36 + .../site-packages/pip/_internal/exceptions.py | 308 + .../pip/_internal/index/__init__.py | 2 + .../index/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 179 bytes .../__pycache__/collector.cpython-36.pyc | Bin 0 -> 17335 bytes .../__pycache__/package_finder.cpython-36.pyc | Bin 0 -> 25531 bytes .../pip/_internal/index/collector.py | 661 ++ .../pip/_internal/index/package_finder.py | 1016 ++ .../site-packages/pip/_internal/locations.py | 194 + .../site-packages/pip/_internal/main.py | 16 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 213 bytes .../__pycache__/candidate.cpython-36.pyc | Bin 0 -> 1401 bytes .../__pycache__/direct_url.cpython-36.pyc | Bin 0 -> 6450 bytes .../__pycache__/format_control.cpython-36.pyc | Bin 0 -> 2378 bytes .../models/__pycache__/index.cpython-36.pyc | Bin 0 -> 1117 bytes .../models/__pycache__/link.cpython-36.pyc | Bin 0 -> 6990 bytes .../models/__pycache__/scheme.cpython-36.pyc | Bin 0 -> 843 bytes .../__pycache__/search_scope.cpython-36.pyc | Bin 0 -> 3347 bytes .../selection_prefs.cpython-36.pyc | Bin 0 -> 1575 bytes .../__pycache__/target_python.cpython-36.pyc | Bin 0 -> 3200 bytes .../models/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 3147 bytes .../pip/_internal/models/candidate.py | 36 + .../pip/_internal/models/direct_url.py | 245 + .../pip/_internal/models/format_control.py | 84 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 236 + .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 133 + .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 78 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 201 bytes .../network/__pycache__/auth.cpython-36.pyc | Bin 0 -> 6934 bytes .../network/__pycache__/cache.cpython-36.pyc | Bin 0 -> 2622 bytes .../__pycache__/download.cpython-36.pyc | Bin 0 -> 4312 bytes .../__pycache__/session.cpython-36.pyc | Bin 0 -> 9217 bytes .../network/__pycache__/utils.cpython-36.pyc | Bin 0 -> 699 bytes .../network/__pycache__/xmlrpc.cpython-36.pyc | Bin 0 -> 1541 bytes .../pip/_internal/network/auth.py | 298 + .../pip/_internal/network/cache.py | 81 + .../pip/_internal/network/download.py | 200 + .../pip/_internal/network/session.py | 421 + .../pip/_internal/network/utils.py | 48 + .../pip/_internal/network/xmlrpc.py | 44 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 149 bytes .../__pycache__/check.cpython-36.pyc | Bin 0 -> 3630 bytes .../__pycache__/freeze.cpython-36.pyc | Bin 0 -> 5869 bytes .../__pycache__/prepare.cpython-36.pyc | Bin 0 -> 10732 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 155 bytes .../build/__pycache__/metadata.cpython-36.pyc | Bin 0 -> 1188 bytes .../metadata_legacy.cpython-36.pyc | Bin 0 -> 1902 bytes .../build/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 1283 bytes .../__pycache__/wheel_legacy.cpython-36.pyc | Bin 0 -> 2513 bytes .../_internal/operations/build/metadata.py | 40 + .../operations/build/metadata_legacy.py | 77 + .../pip/_internal/operations/build/wheel.py | 46 + .../operations/build/wheel_legacy.py | 115 + .../pip/_internal/operations/check.py | 163 + .../pip/_internal/operations/freeze.py | 272 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 213 bytes .../editable_legacy.cpython-36.pyc | Bin 0 -> 1283 bytes .../install/__pycache__/legacy.cpython-36.pyc | Bin 0 -> 3273 bytes .../install/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 14937 bytes .../operations/install/editable_legacy.py | 52 + .../_internal/operations/install/legacy.py | 142 + .../pip/_internal/operations/install/wheel.py | 631 ++ .../pip/_internal/operations/prepare.py | 568 ++ .../site-packages/pip/_internal/pyproject.py | 196 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2136 bytes .../__pycache__/constructors.cpython-36.pyc | Bin 0 -> 10701 bytes .../req/__pycache__/req_file.cpython-36.pyc | Bin 0 -> 12747 bytes .../__pycache__/req_install.cpython-36.pyc | Bin 0 -> 20193 bytes .../req/__pycache__/req_set.cpython-36.pyc | Bin 0 -> 5743 bytes .../__pycache__/req_tracker.cpython-36.pyc | Bin 0 -> 4008 bytes .../__pycache__/req_uninstall.cpython-36.pyc | Bin 0 -> 17362 bytes .../pip/_internal/req/constructors.py | 464 + .../pip/_internal/req/req_file.py | 582 ++ .../pip/_internal/req/req_install.py | 850 ++ .../pip/_internal/req/req_set.py | 202 + .../pip/_internal/req/req_tracker.py | 151 + .../pip/_internal/req/req_uninstall.py | 649 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 149 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 967 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../__pycache__/resolver.cpython-36.pyc | Bin 0 -> 11116 bytes .../_internal/resolution/legacy/resolver.py | 459 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 160 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 2272 bytes .../__pycache__/candidates.cpython-36.pyc | Bin 0 -> 13326 bytes .../__pycache__/factory.cpython-36.pyc | Bin 0 -> 5150 bytes .../__pycache__/provider.cpython-36.pyc | Bin 0 -> 1860 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 4236 bytes .../__pycache__/resolver.cpython-36.pyc | Bin 0 -> 5502 bytes .../_internal/resolution/resolvelib/base.py | 52 + .../resolution/resolvelib/candidates.py | 450 + .../resolution/resolvelib/factory.py | 201 + .../resolution/resolvelib/provider.py | 54 + .../resolution/resolvelib/requirements.py | 119 + .../resolution/resolvelib/resolver.py | 174 + .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 144 bytes .../utils/__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 1334 bytes .../utils/__pycache__/compat.cpython-36.pyc | Bin 0 -> 6070 bytes .../compatibility_tags.cpython-36.pyc | Bin 0 -> 3560 bytes .../__pycache__/deprecation.cpython-36.pyc | Bin 0 -> 2761 bytes .../direct_url_helpers.cpython-36.pyc | Bin 0 -> 2625 bytes .../__pycache__/distutils_args.cpython-36.pyc | Bin 0 -> 1191 bytes .../utils/__pycache__/encoding.cpython-36.pyc | Bin 0 -> 1228 bytes .../__pycache__/entrypoints.cpython-36.pyc | Bin 0 -> 1282 bytes .../__pycache__/filesystem.cpython-36.pyc | Bin 0 -> 5520 bytes .../__pycache__/filetypes.cpython-36.pyc | Bin 0 -> 595 bytes .../utils/__pycache__/glibc.cpython-36.pyc | Bin 0 -> 1680 bytes .../utils/__pycache__/hashes.cpython-36.pyc | Bin 0 -> 4096 bytes .../inject_securetransport.cpython-36.pyc | Bin 0 -> 913 bytes .../utils/__pycache__/logging.cpython-36.pyc | Bin 0 -> 9147 bytes .../utils/__pycache__/misc.cpython-36.pyc | Bin 0 -> 24051 bytes .../utils/__pycache__/models.cpython-36.pyc | Bin 0 -> 1892 bytes .../__pycache__/packaging.cpython-36.pyc | Bin 0 -> 2579 bytes .../__pycache__/pkg_resources.cpython-36.pyc | Bin 0 -> 1792 bytes .../setuptools_build.cpython-36.pyc | Bin 0 -> 2911 bytes .../__pycache__/subprocess.cpython-36.pyc | Bin 0 -> 5516 bytes .../utils/__pycache__/temp_dir.cpython-36.pyc | Bin 0 -> 6990 bytes .../utils/__pycache__/typing.cpython-36.pyc | Bin 0 -> 1422 bytes .../__pycache__/unpacking.cpython-36.pyc | Bin 0 -> 5970 bytes .../utils/__pycache__/urls.cpython-36.pyc | Bin 0 -> 1480 bytes .../__pycache__/virtualenv.cpython-36.pyc | Bin 0 -> 3219 bytes .../utils/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 6255 bytes .../pip/_internal/utils/appdirs.py | 44 + .../pip/_internal/utils/compat.py | 270 + .../pip/_internal/utils/compatibility_tags.py | 169 + .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/direct_url_helpers.py | 130 + .../pip/_internal/utils/distutils_args.py | 48 + .../pip/_internal/utils/encoding.py | 42 + .../pip/_internal/utils/entrypoints.py | 31 + .../pip/_internal/utils/filesystem.py | 222 + .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/glibc.py | 98 + .../pip/_internal/utils/hashes.py | 133 + .../_internal/utils/inject_securetransport.py | 36 + .../pip/_internal/utils/logging.py | 399 + .../site-packages/pip/_internal/utils/misc.py | 913 ++ .../pip/_internal/utils/models.py | 42 + .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/pkg_resources.py | 44 + .../pip/_internal/utils/setuptools_build.py | 181 + .../pip/_internal/utils/subprocess.py | 277 + .../pip/_internal/utils/temp_dir.py | 271 + .../pip/_internal/utils/typing.py | 38 + .../pip/_internal/utils/unpacking.py | 272 + .../site-packages/pip/_internal/utils/urls.py | 55 + .../pip/_internal/utils/virtualenv.py | 116 + .../pip/_internal/utils/wheel.py | 225 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 437 bytes .../vcs/__pycache__/bazaar.cpython-36.pyc | Bin 0 -> 3723 bytes .../vcs/__pycache__/git.cpython-36.pyc | Bin 0 -> 9562 bytes .../vcs/__pycache__/mercurial.cpython-36.pyc | Bin 0 -> 5020 bytes .../vcs/__pycache__/subversion.cpython-36.pyc | Bin 0 -> 8448 bytes .../__pycache__/versioncontrol.cpython-36.pyc | Bin 0 -> 19526 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../site-packages/pip/_internal/vcs/git.py | 394 + .../pip/_internal/vcs/mercurial.py | 161 + .../pip/_internal/vcs/subversion.py | 334 + .../pip/_internal/vcs/versioncontrol.py | 723 ++ .../pip/_internal/wheel_builder.py | 309 + .../site-packages/pip/_vendor/__init__.py | 114 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2920 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 21422 bytes .../__pycache__/contextlib2.cpython-36.pyc | Bin 0 -> 15317 bytes .../_vendor/__pycache__/distro.cpython-36.pyc | Bin 0 -> 36620 bytes .../__pycache__/ipaddress.cpython-36.pyc | Bin 0 -> 66504 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 243102 bytes .../__pycache__/retrying.cpython-36.pyc | Bin 0 -> 8044 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 26955 bytes .../_vendor/__pycache__/toml.cpython-36.pyc | Bin 0 -> 22471 bytes .../site-packages/pip/_vendor/appdirs.py | 633 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 502 bytes .../__pycache__/_cmd.cpython-36.pyc | Bin 0 -> 1505 bytes .../__pycache__/adapter.cpython-36.pyc | Bin 0 -> 3001 bytes .../__pycache__/cache.cpython-36.pyc | Bin 0 -> 1718 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 709 bytes .../__pycache__/controller.cpython-36.pyc | Bin 0 -> 7743 bytes .../__pycache__/filewrapper.cpython-36.pyc | Bin 0 -> 2106 bytes .../__pycache__/heuristics.cpython-36.pyc | Bin 0 -> 4636 bytes .../__pycache__/serialize.cpython-36.pyc | Bin 0 -> 4179 bytes .../__pycache__/wrapper.cpython-36.pyc | Bin 0 -> 618 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 246 bytes .../__pycache__/file_cache.cpython-36.pyc | Bin 0 -> 3156 bytes .../__pycache__/redis_cache.cpython-36.pyc | Bin 0 -> 1502 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 376 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 188 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 230 bytes .../__pycache__/__main__.cpython-36.pyc | Bin 0 -> 405 bytes .../certifi/__pycache__/core.cpython-36.pyc | Bin 0 -> 869 bytes .../pip/_vendor/certifi/cacert.pem | 4641 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 30 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 796 bytes .../__pycache__/big5freq.cpython-36.pyc | Bin 0 -> 54683 bytes .../__pycache__/big5prober.cpython-36.pyc | Bin 0 -> 1072 bytes .../chardistribution.cpython-36.pyc | Bin 0 -> 6268 bytes .../charsetgroupprober.cpython-36.pyc | Bin 0 -> 2179 bytes .../__pycache__/charsetprober.cpython-36.pyc | Bin 0 -> 3405 bytes .../codingstatemachine.cpython-36.pyc | Bin 0 -> 2836 bytes .../chardet/__pycache__/compat.cpython-36.pyc | Bin 0 -> 312 bytes .../__pycache__/cp949prober.cpython-36.pyc | Bin 0 -> 1079 bytes .../chardet/__pycache__/enums.cpython-36.pyc | Bin 0 -> 2570 bytes .../__pycache__/escprober.cpython-36.pyc | Bin 0 -> 2561 bytes .../chardet/__pycache__/escsm.cpython-36.pyc | Bin 0 -> 7318 bytes .../__pycache__/eucjpprober.cpython-36.pyc | Bin 0 -> 2365 bytes .../__pycache__/euckrfreq.cpython-36.pyc | Bin 0 -> 24069 bytes .../__pycache__/euckrprober.cpython-36.pyc | Bin 0 -> 1080 bytes .../__pycache__/euctwfreq.cpython-36.pyc | Bin 0 -> 54692 bytes .../__pycache__/euctwprober.cpython-36.pyc | Bin 0 -> 1080 bytes .../__pycache__/gb2312freq.cpython-36.pyc | Bin 0 -> 38334 bytes .../__pycache__/gb2312prober.cpython-36.pyc | Bin 0 -> 1088 bytes .../__pycache__/hebrewprober.cpython-36.pyc | Bin 0 -> 2922 bytes .../__pycache__/jisfreq.cpython-36.pyc | Bin 0 -> 44478 bytes .../chardet/__pycache__/jpcntx.cpython-36.pyc | Bin 0 -> 38617 bytes .../langbulgarianmodel.cpython-36.pyc | Bin 0 -> 24832 bytes .../langcyrillicmodel.cpython-36.pyc | Bin 0 -> 30383 bytes .../__pycache__/langgreekmodel.cpython-36.pyc | Bin 0 -> 24510 bytes .../langhebrewmodel.cpython-36.pyc | Bin 0 -> 23364 bytes .../langhungarianmodel.cpython-36.pyc | Bin 0 -> 24806 bytes .../__pycache__/langthaimodel.cpython-36.pyc | Bin 0 -> 23343 bytes .../langturkishmodel.cpython-36.pyc | Bin 0 -> 23361 bytes .../__pycache__/latin1prober.cpython-36.pyc | Bin 0 -> 2893 bytes .../mbcharsetprober.cpython-36.pyc | Bin 0 -> 2184 bytes .../mbcsgroupprober.cpython-36.pyc | Bin 0 -> 1075 bytes .../chardet/__pycache__/mbcssm.cpython-36.pyc | Bin 0 -> 17528 bytes .../sbcharsetprober.cpython-36.pyc | Bin 0 -> 2937 bytes .../sbcsgroupprober.cpython-36.pyc | Bin 0 -> 1565 bytes .../__pycache__/sjisprober.cpython-36.pyc | Bin 0 -> 2391 bytes .../universaldetector.cpython-36.pyc | Bin 0 -> 5786 bytes .../__pycache__/utf8prober.cpython-36.pyc | Bin 0 -> 1922 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 391 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 148 bytes .../cli/__pycache__/chardetect.cpython-36.pyc | Bin 0 -> 3072 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 396 bytes .../colorama/__pycache__/ansi.cpython-36.pyc | Bin 0 -> 3294 bytes .../__pycache__/ansitowin32.cpython-36.pyc | Bin 0 -> 7569 bytes .../__pycache__/initialise.cpython-36.pyc | Bin 0 -> 1617 bytes .../colorama/__pycache__/win32.cpython-36.pyc | Bin 0 -> 3819 bytes .../__pycache__/winterm.cpython-36.pyc | Bin 0 -> 4557 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../site-packages/pip/_vendor/contextlib2.py | 518 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 994 bytes .../distlib/__pycache__/compat.cpython-36.pyc | Bin 0 -> 32020 bytes .../__pycache__/database.cpython-36.pyc | Bin 0 -> 42615 bytes .../distlib/__pycache__/index.cpython-36.pyc | Bin 0 -> 17318 bytes .../__pycache__/locators.cpython-36.pyc | Bin 0 -> 38902 bytes .../__pycache__/manifest.cpython-36.pyc | Bin 0 -> 10313 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 4432 bytes .../__pycache__/metadata.cpython-36.pyc | Bin 0 -> 27679 bytes .../__pycache__/resources.cpython-36.pyc | Bin 0 -> 10861 bytes .../__pycache__/scripts.cpython-36.pyc | Bin 0 -> 10737 bytes .../distlib/__pycache__/util.cpython-36.pyc | Bin 0 -> 48096 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 20640 bytes .../distlib/__pycache__/wheel.cpython-36.pyc | Bin 0 -> 25679 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 436 bytes .../_backport/__pycache__/misc.cpython-36.pyc | Bin 0 -> 1033 bytes .../__pycache__/shutil.cpython-36.pyc | Bin 0 -> 21389 bytes .../__pycache__/sysconfig.cpython-36.pyc | Bin 0 -> 16018 bytes .../__pycache__/tarfile.cpython-36.pyc | Bin 0 -> 63000 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 786 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/locators.py | 1302 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1096 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 416 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/util.py | 1761 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1004 ++ .../site-packages/pip/_vendor/distro.py | 1230 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1265 bytes .../__pycache__/_ihatexml.cpython-36.pyc | Bin 0 -> 13809 bytes .../__pycache__/_inputstream.cpython-36.pyc | Bin 0 -> 22677 bytes .../__pycache__/_tokenizer.cpython-36.pyc | Bin 0 -> 42113 bytes .../__pycache__/_utils.cpython-36.pyc | Bin 0 -> 3235 bytes .../__pycache__/constants.cpython-36.pyc | Bin 0 -> 66381 bytes .../__pycache__/html5parser.cpython-36.pyc | Bin 0 -> 99714 bytes .../__pycache__/serializer.cpython-36.pyc | Bin 0 -> 10883 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1721 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 378 bytes .../_trie/__pycache__/_base.cpython-36.pyc | Bin 0 -> 1535 bytes .../_trie/__pycache__/datrie.cpython-36.pyc | Bin 0 -> 1980 bytes .../_trie/__pycache__/py.cpython-36.pyc | Bin 0 -> 2185 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 153 bytes .../alphabeticalattributes.cpython-36.pyc | Bin 0 -> 1279 bytes .../filters/__pycache__/base.cpython-36.pyc | Bin 0 -> 803 bytes .../inject_meta_charset.cpython-36.pyc | Bin 0 -> 1850 bytes .../filters/__pycache__/lint.cpython-36.pyc | Bin 0 -> 2596 bytes .../__pycache__/optionaltags.cpython-36.pyc | Bin 0 -> 3057 bytes .../__pycache__/sanitizer.cpython-36.pyc | Bin 0 -> 19115 bytes .../__pycache__/whitespace.cpython-36.pyc | Bin 0 -> 1311 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 892 bytes .../__pycache__/genshi.cpython-36.pyc | Bin 0 -> 1636 bytes .../__pycache__/sax.cpython-36.pyc | Bin 0 -> 1454 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3273 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 11280 bytes .../__pycache__/dom.cpython-36.pyc | Bin 0 -> 9300 bytes .../__pycache__/etree.cpython-36.pyc | Bin 0 -> 11820 bytes .../__pycache__/etree_lxml.cpython-36.pyc | Bin 0 -> 11746 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3960 bytes .../__pycache__/base.cpython-36.pyc | Bin 0 -> 6948 bytes .../__pycache__/dom.cpython-36.pyc | Bin 0 -> 1675 bytes .../__pycache__/etree.cpython-36.pyc | Bin 0 -> 3517 bytes .../__pycache__/etree_lxml.cpython-36.pyc | Bin 0 -> 6610 bytes .../__pycache__/genshi.cpython-36.pyc | Bin 0 -> 1849 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 210 bytes .../idna/__pycache__/codec.cpython-36.pyc | Bin 0 -> 3057 bytes .../idna/__pycache__/compat.cpython-36.pyc | Bin 0 -> 570 bytes .../idna/__pycache__/core.cpython-36.pyc | Bin 0 -> 9196 bytes .../idna/__pycache__/idnadata.cpython-36.pyc | Bin 0 -> 29966 bytes .../idna/__pycache__/intranges.cpython-36.pyc | Bin 0 -> 1771 bytes .../__pycache__/package_data.cpython-36.pyc | Bin 0 -> 164 bytes .../idna/__pycache__/uts46data.cpython-36.pyc | Bin 0 -> 245585 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 398 + .../pip/_vendor/idna/idnadata.py | 1991 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8317 +++++++++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2420 +++++ .../pip/_vendor/msgpack/__init__.py | 54 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1345 bytes .../__pycache__/_version.cpython-36.pyc | Bin 0 -> 181 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 1819 bytes .../msgpack/__pycache__/ext.cpython-36.pyc | Bin 0 -> 6188 bytes .../__pycache__/fallback.cpython-36.pyc | Bin 0 -> 26071 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 191 + .../pip/_vendor/msgpack/fallback.py | 1063 +++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 684 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 522 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 1098 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2922 bytes .../__pycache__/_typing.cpython-36.pyc | Bin 0 -> 1437 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 9242 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 4034 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 20273 bytes .../packaging/__pycache__/tags.cpython-36.pyc | Bin 0 -> 16873 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 1501 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 13150 bytes .../pip/_vendor/packaging/_compat.py | 38 + .../pip/_vendor/packaging/_structures.py | 86 + .../pip/_vendor/packaging/_typing.py | 39 + .../pip/_vendor/packaging/markers.py | 328 + .../pip/_vendor/packaging/requirements.py | 145 + .../pip/_vendor/packaging/specifiers.py | 849 ++ .../pip/_vendor/packaging/tags.py | 739 ++ .../pip/_vendor/packaging/utils.py | 62 + .../pip/_vendor/packaging/version.py | 535 ++ .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 235 bytes .../__pycache__/_in_process.cpython-36.pyc | Bin 0 -> 8199 bytes .../pep517/__pycache__/build.cpython-36.pyc | Bin 0 -> 3328 bytes .../pep517/__pycache__/check.cpython-36.pyc | Bin 0 -> 4812 bytes .../__pycache__/colorlog.cpython-36.pyc | Bin 0 -> 2882 bytes .../pep517/__pycache__/compat.cpython-36.pyc | Bin 0 -> 1016 bytes .../__pycache__/dirtools.cpython-36.pyc | Bin 0 -> 1280 bytes .../__pycache__/envbuild.cpython-36.pyc | Bin 0 -> 4313 bytes .../pep517/__pycache__/meta.cpython-36.pyc | Bin 0 -> 2765 bytes .../__pycache__/wrappers.cpython-36.pyc | Bin 0 -> 10440 bytes .../pip/_vendor/pep517/_in_process.py | 280 + .../site-packages/pip/_vendor/pep517/build.py | 124 + .../site-packages/pip/_vendor/pep517/check.py | 203 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 34 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 167 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 308 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 99729 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 612 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 5511 bytes .../progress/__pycache__/bar.cpython-36.pyc | Bin 0 -> 2712 bytes .../__pycache__/counter.cpython-36.pyc | Bin 0 -> 1485 bytes .../__pycache__/spinner.cpython-36.pyc | Bin 0 -> 1400 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 7107 ++++++++++++++ .../pip/_vendor/requests/__init__.py | 133 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 3446 bytes .../__pycache__/__version__.cpython-36.pyc | Bin 0 -> 508 bytes .../_internal_utils.cpython-36.pyc | Bin 0 -> 1261 bytes .../__pycache__/adapters.cpython-36.pyc | Bin 0 -> 16852 bytes .../requests/__pycache__/api.cpython-36.pyc | Bin 0 -> 6690 bytes .../requests/__pycache__/auth.cpython-36.pyc | Bin 0 -> 8305 bytes .../requests/__pycache__/certs.cpython-36.pyc | Bin 0 -> 586 bytes .../__pycache__/compat.cpython-36.pyc | Bin 0 -> 1565 bytes .../__pycache__/cookies.cpython-36.pyc | Bin 0 -> 18740 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 5460 bytes .../requests/__pycache__/help.cpython-36.pyc | Bin 0 -> 2639 bytes .../requests/__pycache__/hooks.cpython-36.pyc | Bin 0 -> 933 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 24127 bytes .../__pycache__/packages.cpython-36.pyc | Bin 0 -> 478 bytes .../__pycache__/sessions.cpython-36.pyc | Bin 0 -> 19378 bytes .../__pycache__/status_codes.cpython-36.pyc | Bin 0 -> 4790 bytes .../__pycache__/structures.cpython-36.pyc | Bin 0 -> 4362 bytes .../requests/__pycache__/utils.cpython-36.pyc | Bin 0 -> 22247 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../site-packages/pip/_vendor/requests/api.py | 161 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 76 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 954 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 767 ++ .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 982 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 591 bytes .../__pycache__/providers.cpython-36.pyc | Bin 0 -> 5736 bytes .../__pycache__/reporters.cpython-36.pyc | Bin 0 -> 1943 bytes .../__pycache__/resolvers.cpython-36.pyc | Bin 0 -> 14154 bytes .../__pycache__/structs.cpython-36.pyc | Bin 0 -> 3056 bytes .../pip/_vendor/resolvelib/providers.py | 121 + .../pip/_vendor/resolvelib/reporters.py | 36 + .../pip/_vendor/resolvelib/resolvers.py | 414 + .../pip/_vendor/resolvelib/structs.py | 68 + .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/six.py | 980 ++ .../site-packages/pip/_vendor/toml.py | 1039 ++ .../pip/_vendor/toml/__init__.py | 21 + .../toml/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 559 bytes .../toml/__pycache__/decoder.cpython-36.pyc | Bin 0 -> 20115 bytes .../toml/__pycache__/encoder.cpython-36.pyc | Bin 0 -> 6868 bytes .../toml/__pycache__/ordered.cpython-36.pyc | Bin 0 -> 960 bytes .../toml/__pycache__/tz.cpython-36.pyc | Bin 0 -> 1068 bytes .../site-packages/pip/_vendor/toml/decoder.py | 945 ++ .../site-packages/pip/_vendor/toml/encoder.py | 250 + .../site-packages/pip/_vendor/toml/ordered.py | 15 + .../site-packages/pip/_vendor/toml/tz.py | 21 + .../pip/_vendor/urllib3/__init__.py | 86 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2152 bytes .../__pycache__/_collections.cpython-36.pyc | Bin 0 -> 10645 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 9978 bytes .../__pycache__/connectionpool.cpython-36.pyc | Bin 0 -> 24058 bytes .../__pycache__/exceptions.cpython-36.pyc | Bin 0 -> 10353 bytes .../urllib3/__pycache__/fields.cpython-36.pyc | Bin 0 -> 8057 bytes .../__pycache__/filepost.cpython-36.pyc | Bin 0 -> 2713 bytes .../__pycache__/poolmanager.cpython-36.pyc | Bin 0 -> 13076 bytes .../__pycache__/request.cpython-36.pyc | Bin 0 -> 5545 bytes .../__pycache__/response.cpython-36.pyc | Bin 0 -> 20193 bytes .../pip/_vendor/urllib3/_collections.py | 336 + .../pip/_vendor/urllib3/connection.py | 414 + .../pip/_vendor/urllib3/connectionpool.py | 1051 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 152 bytes .../_appengine_environ.cpython-36.pyc | Bin 0 -> 1361 bytes .../__pycache__/appengine.cpython-36.pyc | Bin 0 -> 8133 bytes .../__pycache__/ntlmpool.cpython-36.pyc | Bin 0 -> 3198 bytes .../__pycache__/pyopenssl.cpython-36.pyc | Bin 0 -> 14820 bytes .../securetransport.cpython-36.pyc | Bin 0 -> 19639 bytes .../contrib/__pycache__/socks.cpython-36.pyc | Bin 0 -> 5468 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 169 bytes .../__pycache__/bindings.cpython-36.pyc | Bin 0 -> 10236 bytes .../__pycache__/low_level.cpython-36.pyc | Bin 0 -> 7413 bytes .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/low_level.py | 328 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 121 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 498 + .../urllib3/contrib/securetransport.py | 859 ++ .../pip/_vendor/urllib3/contrib/socks.py | 210 + .../pip/_vendor/urllib3/exceptions.py | 255 + .../pip/_vendor/urllib3/fields.py | 273 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 278 bytes .../packages/__pycache__/six.cpython-36.pyc | Bin 0 -> 26505 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 163 bytes .../__pycache__/makefile.cpython-36.pyc | Bin 0 -> 1253 bytes .../urllib3/packages/backports/makefile.py | 52 + .../pip/_vendor/urllib3/packages/six.py | 1021 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 539 bytes .../_implementation.cpython-36.pyc | Bin 0 -> 3270 bytes .../ssl_match_hostname/_implementation.py | 160 + .../pip/_vendor/urllib3/poolmanager.py | 470 + .../pip/_vendor/urllib3/request.py | 171 + .../pip/_vendor/urllib3/response.py | 809 ++ .../pip/_vendor/urllib3/util/__init__.py | 46 + .../util/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1117 bytes .../__pycache__/connection.cpython-36.pyc | Bin 0 -> 3121 bytes .../util/__pycache__/queue.cpython-36.pyc | Bin 0 -> 993 bytes .../util/__pycache__/request.cpython-36.pyc | Bin 0 -> 3287 bytes .../util/__pycache__/response.cpython-36.pyc | Bin 0 -> 1920 bytes .../util/__pycache__/retry.cpython-36.pyc | Bin 0 -> 12841 bytes .../util/__pycache__/ssl_.cpython-36.pyc | Bin 0 -> 9747 bytes .../util/__pycache__/timeout.cpython-36.pyc | Bin 0 -> 8780 bytes .../util/__pycache__/url.cpython-36.pyc | Bin 0 -> 10584 bytes .../util/__pycache__/wait.cpython-36.pyc | Bin 0 -> 3103 bytes .../pip/_vendor/urllib3/util/connection.py | 138 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 135 + .../pip/_vendor/urllib3/util/response.py | 86 + .../pip/_vendor/urllib3/util/retry.py | 450 + .../pip/_vendor/urllib3/util/ssl_.py | 407 + .../pip/_vendor/urllib3/util/timeout.py | 258 + .../pip/_vendor/urllib3/util/url.py | 430 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 9630 bytes .../__pycache__/labels.cpython-36.pyc | Bin 0 -> 4042 bytes .../__pycache__/mklabels.cpython-36.pyc | Bin 0 -> 1864 bytes .../__pycache__/tests.cpython-36.pyc | Bin 0 -> 5020 bytes .../__pycache__/x_user_defined.cpython-36.pyc | Bin 0 -> 2617 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3306 +++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 99964 bytes .../__pycache__/py2_warn.cpython-36.pyc | Bin 0 -> 558 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 153 bytes .../__pycache__/appdirs.cpython-36.pyc | Bin 0 -> 20691 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 203162 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24450 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 689 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 527 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 974 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2831 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8854 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3850 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19793 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 458 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 10568 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 66 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2331 bytes .../site-packages/pkg_resources/py2_warn.py | 16 + .../pyusb-1.0.2.dist-info/INSTALLER | 1 + .../pyusb-1.0.2.dist-info/LICENSE | 27 + .../pyusb-1.0.2.dist-info/METADATA | 47 + .../pyusb-1.0.2.dist-info/RECORD | 34 + .../site-packages/pyusb-1.0.2.dist-info/WHEEL | 5 + .../pyusb-1.0.2.dist-info/top_level.txt | 1 + .../serial-0.0.97.dist-info/INSTALLER | 1 + .../serial-0.0.97.dist-info/METADATA | 26 + .../serial-0.0.97.dist-info/RECORD | 33 + .../serial-0.0.97.dist-info/WHEEL | 6 + .../serial-0.0.97.dist-info/top_level.txt | 1 + .../site-packages/serial/__init__.py | 10 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 770 bytes .../serial/__pycache__/errors.cpython-36.pyc | Bin 0 -> 4500 bytes .../serial/__pycache__/hooks.cpython-36.pyc | Bin 0 -> 4857 bytes .../serial/__pycache__/marshal.cpython-36.pyc | Bin 0 -> 12467 bytes .../serial/__pycache__/meta.cpython-36.pyc | Bin 0 -> 17338 bytes .../serial/__pycache__/model.cpython-36.pyc | Bin 0 -> 23620 bytes .../__pycache__/properties.cpython-36.pyc | Bin 0 -> 22460 bytes .../serial/__pycache__/request.cpython-36.pyc | Bin 0 -> 12480 bytes .../serial/__pycache__/test.cpython-36.pyc | Bin 0 -> 5857 bytes .../site-packages/serial/abc/__init__.py | 9 + .../abc/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 454 bytes .../abc/__pycache__/model.cpython-36.pyc | Bin 0 -> 5863 bytes .../abc/__pycache__/properties.cpython-36.pyc | Bin 0 -> 2506 bytes .../site-packages/serial/abc/model.py | 250 + .../site-packages/serial/abc/properties.py | 108 + .../python3.6/site-packages/serial/errors.py | 214 + .../python3.6/site-packages/serial/hooks.py | 258 + .../python3.6/site-packages/serial/marshal.py | 704 ++ .../python3.6/site-packages/serial/meta.py | 812 ++ .../python3.6/site-packages/serial/model.py | 1306 +++ .../site-packages/serial/properties.py | 941 ++ .../python3.6/site-packages/serial/request.py | 451 + .../python3.6/site-packages/serial/test.py | 304 + .../serial/utilities/__init__.py | 513 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 10759 bytes .../__pycache__/compatibility.cpython-36.pyc | Bin 0 -> 1013 bytes .../serial/utilities/compatibility.py | 29 + .../setuptools-47.3.1.dist-info/INSTALLER | 1 + .../setuptools-47.3.1.dist-info/LICENSE | 19 + .../setuptools-47.3.1.dist-info/METADATA | 109 + .../setuptools-47.3.1.dist-info/RECORD | 194 + .../setuptools-47.3.1.dist-info/WHEEL | 5 + .../dependency_links.txt | 2 + .../entry_points.txt | 68 + .../setuptools-47.3.1.dist-info/top_level.txt | 3 + .../setuptools-47.3.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 249 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 8667 bytes .../_deprecation_warning.cpython-36.pyc | Bin 0 -> 508 bytes .../__pycache__/_imp.cpython-36.pyc | Bin 0 -> 2048 bytes .../__pycache__/archive_util.cpython-36.pyc | Bin 0 -> 5098 bytes .../__pycache__/build_meta.cpython-36.pyc | Bin 0 -> 8448 bytes .../__pycache__/config.cpython-36.pyc | Bin 0 -> 19157 bytes .../__pycache__/dep_util.cpython-36.pyc | Bin 0 -> 817 bytes .../__pycache__/depends.cpython-36.pyc | Bin 0 -> 5151 bytes .../__pycache__/dist.cpython-36.pyc | Bin 0 -> 32992 bytes .../__pycache__/errors.cpython-36.pyc | Bin 0 -> 808 bytes .../__pycache__/extension.cpython-36.pyc | Bin 0 -> 1935 bytes .../__pycache__/glob.cpython-36.pyc | Bin 0 -> 3712 bytes .../__pycache__/installer.cpython-36.pyc | Bin 0 -> 4055 bytes .../__pycache__/launch.cpython-36.pyc | Bin 0 -> 814 bytes .../__pycache__/lib2to3_ex.cpython-36.pyc | Bin 0 -> 2692 bytes .../__pycache__/monkey.cpython-36.pyc | Bin 0 -> 4661 bytes .../__pycache__/msvc.cpython-36.pyc | Bin 0 -> 43133 bytes .../__pycache__/namespaces.cpython-36.pyc | Bin 0 -> 3638 bytes .../__pycache__/package_index.cpython-36.pyc | Bin 0 -> 32924 bytes .../__pycache__/py27compat.cpython-36.pyc | Bin 0 -> 1724 bytes .../__pycache__/py31compat.cpython-36.pyc | Bin 0 -> 1169 bytes .../__pycache__/py33compat.cpython-36.pyc | Bin 0 -> 1396 bytes .../__pycache__/py34compat.cpython-36.pyc | Bin 0 -> 442 bytes .../__pycache__/sandbox.cpython-36.pyc | Bin 0 -> 15645 bytes .../__pycache__/site-patch.cpython-36.pyc | Bin 0 -> 1468 bytes .../__pycache__/ssl_support.cpython-36.pyc | Bin 0 -> 6757 bytes .../__pycache__/unicode_utils.cpython-36.pyc | Bin 0 -> 1129 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 288 bytes .../__pycache__/wheel.cpython-36.pyc | Bin 0 -> 7195 bytes .../windows_support.cpython-36.pyc | Bin 0 -> 971 bytes .../setuptools/_deprecation_warning.py | 7 + .../site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 150 bytes .../__pycache__/ordered_set.cpython-36.pyc | Bin 0 -> 16380 bytes .../__pycache__/pyparsing.cpython-36.pyc | Bin 0 -> 203159 bytes .../_vendor/__pycache__/six.cpython-36.pyc | Bin 0 -> 24447 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-36.pyc | Bin 0 -> 698 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 536 bytes .../__pycache__/_compat.cpython-36.pyc | Bin 0 -> 971 bytes .../__pycache__/_structures.cpython-36.pyc | Bin 0 -> 2828 bytes .../__pycache__/markers.cpython-36.pyc | Bin 0 -> 8888 bytes .../__pycache__/requirements.cpython-36.pyc | Bin 0 -> 3969 bytes .../__pycache__/specifiers.cpython-36.pyc | Bin 0 -> 19762 bytes .../packaging/__pycache__/tags.cpython-36.pyc | Bin 0 -> 10918 bytes .../__pycache__/utils.cpython-36.pyc | Bin 0 -> 1414 bytes .../__pycache__/version.cpython-36.pyc | Bin 0 -> 11967 bytes .../setuptools/_vendor/packaging/_compat.py | 31 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 296 + .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/specifiers.py | 749 ++ .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 175 + .../site-packages/setuptools/build_meta.py | 271 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 677 bytes .../command/__pycache__/alias.cpython-36.pyc | Bin 0 -> 2394 bytes .../__pycache__/bdist_egg.cpython-36.pyc | Bin 0 -> 14536 bytes .../__pycache__/bdist_rpm.cpython-36.pyc | Bin 0 -> 1737 bytes .../__pycache__/bdist_wininst.cpython-36.pyc | Bin 0 -> 1167 bytes .../__pycache__/build_clib.cpython-36.pyc | Bin 0 -> 2402 bytes .../__pycache__/build_ext.cpython-36.pyc | Bin 0 -> 9730 bytes .../__pycache__/build_py.cpython-36.pyc | Bin 0 -> 8729 bytes .../__pycache__/develop.cpython-36.pyc | Bin 0 -> 6446 bytes .../__pycache__/dist_info.cpython-36.pyc | Bin 0 -> 1354 bytes .../__pycache__/easy_install.cpython-36.pyc | Bin 0 -> 65915 bytes .../__pycache__/egg_info.cpython-36.pyc | Bin 0 -> 21504 bytes .../__pycache__/install.cpython-36.pyc | Bin 0 -> 3959 bytes .../install_egg_info.cpython-36.pyc | Bin 0 -> 2399 bytes .../__pycache__/install_lib.cpython-36.pyc | Bin 0 -> 4064 bytes .../install_scripts.cpython-36.pyc | Bin 0 -> 2288 bytes .../__pycache__/py36compat.cpython-36.pyc | Bin 0 -> 4584 bytes .../__pycache__/register.cpython-36.pyc | Bin 0 -> 890 bytes .../command/__pycache__/rotate.cpython-36.pyc | Bin 0 -> 2540 bytes .../__pycache__/saveopts.cpython-36.pyc | Bin 0 -> 885 bytes .../command/__pycache__/sdist.cpython-36.pyc | Bin 0 -> 7953 bytes .../command/__pycache__/setopt.cpython-36.pyc | Bin 0 -> 4563 bytes .../command/__pycache__/test.cpython-36.pyc | Bin 0 -> 8439 bytes .../command/__pycache__/upload.cpython-36.pyc | Bin 0 -> 867 bytes .../__pycache__/upload_docs.cpython-36.pyc | Bin 0 -> 6058 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 509 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 30 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 330 + .../setuptools/command/build_py.py | 276 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2375 +++++ .../setuptools/command/egg_info.py | 721 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 68 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 252 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 280 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 700 ++ .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/dist.py | 1031 ++ .../site-packages/setuptools/errors.py | 16 + .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 66 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2354 bytes .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 150 + .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 71 + .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/msvc.py | 1825 ++++ .../site-packages/setuptools/namespaces.py | 111 + .../site-packages/setuptools/package_index.py | 1140 +++ .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 492 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 76 + .../site-packages/setuptools/ssl_support.py | 265 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 217 + .../setuptools/windows_support.py | 29 + .../python3.6/site-packages/usb/__init__.py | 97 + .../usb/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1959 bytes .../usb/__pycache__/_debug.cpython-36.pyc | Bin 0 -> 2027 bytes .../usb/__pycache__/_interop.cpython-36.pyc | Bin 0 -> 1380 bytes .../usb/__pycache__/_lookup.cpython-36.pyc | Bin 0 -> 1485 bytes .../__pycache__/_objfinalizer.cpython-36.pyc | Bin 0 -> 3543 bytes .../usb/__pycache__/control.cpython-36.pyc | Bin 0 -> 5919 bytes .../usb/__pycache__/core.cpython-36.pyc | Bin 0 -> 39381 bytes .../usb/__pycache__/legacy.cpython-36.pyc | Bin 0 -> 13446 bytes .../usb/__pycache__/libloader.cpython-36.pyc | Bin 0 -> 4746 bytes .../usb/__pycache__/util.cpython-36.pyc | Bin 0 -> 10678 bytes .../lib/python3.6/site-packages/usb/_debug.py | 77 + .../python3.6/site-packages/usb/_interop.py | 98 + .../python3.6/site-packages/usb/_lookup.py | 94 + .../site-packages/usb/_objfinalizer.py | 155 + .../site-packages/usb/backend/__init__.py | 378 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 15938 bytes .../__pycache__/libusb0.cpython-36.pyc | Bin 0 -> 13454 bytes .../__pycache__/libusb1.cpython-36.pyc | Bin 0 -> 21639 bytes .../__pycache__/openusb.cpython-36.pyc | Bin 0 -> 16447 bytes .../site-packages/usb/backend/libusb0.py | 678 ++ .../site-packages/usb/backend/libusb1.py | 952 ++ .../site-packages/usb/backend/openusb.py | 749 ++ .../python3.6/site-packages/usb/control.py | 253 + .../lib/python3.6/site-packages/usb/core.py | 1289 +++ .../lib/python3.6/site-packages/usb/legacy.py | 355 + .../python3.6/site-packages/usb/libloader.py | 190 + .../lib/python3.6/site-packages/usb/util.py | 330 + .../wheel-0.34.2.dist-info/INSTALLER | 1 + .../wheel-0.34.2.dist-info/LICENSE.txt | 22 + .../wheel-0.34.2.dist-info/METADATA | 66 + .../wheel-0.34.2.dist-info/RECORD | 38 + .../wheel-0.34.2.dist-info/WHEEL | 6 + .../wheel-0.34.2.dist-info/entry_points.txt | 6 + .../wheel-0.34.2.dist-info/top_level.txt | 1 + .../python3.6/site-packages/wheel/__init__.py | 1 + .../python3.6/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 154 bytes .../wheel/__pycache__/__main__.cpython-36.pyc | Bin 0 -> 547 bytes .../wheel/__pycache__/_version.cpython-36.pyc | Bin 0 -> 166 bytes .../__pycache__/bdist_wheel.cpython-36.pyc | Bin 0 -> 11106 bytes .../__pycache__/macosx_libfile.cpython-36.pyc | Bin 0 -> 6982 bytes .../wheel/__pycache__/metadata.cpython-36.pyc | Bin 0 -> 3694 bytes .../__pycache__/pep425tags.cpython-36.pyc | Bin 0 -> 7574 bytes .../wheel/__pycache__/pkginfo.cpython-36.pyc | Bin 0 -> 1525 bytes .../wheel/__pycache__/util.cpython-36.pyc | Bin 0 -> 1270 bytes .../__pycache__/wheelfile.cpython-36.pyc | Bin 0 -> 5502 bytes .../python3.6/site-packages/wheel/_version.py | 4 + .../site-packages/wheel/bdist_wheel.py | 403 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 2996 bytes .../cli/__pycache__/convert.cpython-36.pyc | Bin 0 -> 6171 bytes .../cli/__pycache__/install.cpython-36.pyc | Bin 0 -> 135 bytes .../wheel/cli/__pycache__/pack.cpython-36.pyc | Bin 0 -> 2795 bytes .../cli/__pycache__/unpack.cpython-36.pyc | Bin 0 -> 899 bytes .../site-packages/wheel/cli/convert.py | 269 + .../site-packages/wheel/cli/install.py | 0 .../python3.6/site-packages/wheel/cli/pack.py | 79 + .../site-packages/wheel/cli/unpack.py | 25 + .../site-packages/wheel/macosx_libfile.py | 341 + .../python3.6/site-packages/wheel/metadata.py | 138 + .../site-packages/wheel/pep425tags.py | 261 + .../python3.6/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.6/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + .../python3.6/site-packages/yaml/__init__.py | 427 + .../yaml/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 11727 bytes .../yaml/__pycache__/composer.cpython-36.pyc | Bin 0 -> 3493 bytes .../__pycache__/constructor.cpython-36.pyc | Bin 0 -> 21231 bytes .../yaml/__pycache__/cyaml.cpython-36.pyc | Bin 0 -> 3658 bytes .../yaml/__pycache__/dumper.cpython-36.pyc | Bin 0 -> 2033 bytes .../yaml/__pycache__/emitter.cpython-36.pyc | Bin 0 -> 25375 bytes .../yaml/__pycache__/error.cpython-36.pyc | Bin 0 -> 2244 bytes .../yaml/__pycache__/events.cpython-36.pyc | Bin 0 -> 4030 bytes .../yaml/__pycache__/loader.cpython-36.pyc | Bin 0 -> 2242 bytes .../yaml/__pycache__/nodes.cpython-36.pyc | Bin 0 -> 1688 bytes .../yaml/__pycache__/parser.cpython-36.pyc | Bin 0 -> 11864 bytes .../yaml/__pycache__/reader.cpython-36.pyc | Bin 0 -> 4453 bytes .../__pycache__/representer.cpython-36.pyc | Bin 0 -> 10089 bytes .../yaml/__pycache__/resolver.cpython-36.pyc | Bin 0 -> 5435 bytes .../yaml/__pycache__/scanner.cpython-36.pyc | Bin 0 -> 25838 bytes .../__pycache__/serializer.cpython-36.pyc | Bin 0 -> 3324 bytes .../yaml/__pycache__/tokens.cpython-36.pyc | Bin 0 -> 5187 bytes .../python3.6/site-packages/yaml/composer.py | 139 + .../site-packages/yaml/constructor.py | 748 ++ .../lib/python3.6/site-packages/yaml/cyaml.py | 101 + .../python3.6/site-packages/yaml/dumper.py | 62 + .../python3.6/site-packages/yaml/emitter.py | 1137 +++ .../lib/python3.6/site-packages/yaml/error.py | 75 + .../python3.6/site-packages/yaml/events.py | 86 + .../python3.6/site-packages/yaml/loader.py | 63 + .../lib/python3.6/site-packages/yaml/nodes.py | 49 + .../python3.6/site-packages/yaml/parser.py | 589 ++ .../python3.6/site-packages/yaml/reader.py | 185 + .../site-packages/yaml/representer.py | 389 + .../python3.6/site-packages/yaml/resolver.py | 227 + .../python3.6/site-packages/yaml/scanner.py | 1435 +++ .../site-packages/yaml/serializer.py | 111 + .../python3.6/site-packages/yaml/tokens.py | 104 + python/.gradle/python/lib/python3.6/site.py | 829 ++ .../python/lib/python3.6/sre_compile.py | 1 + .../python/lib/python3.6/sre_constants.py | 1 + .../.gradle/python/lib/python3.6/sre_parse.py | 1 + python/.gradle/python/lib/python3.6/stat.py | 1 + python/.gradle/python/lib/python3.6/struct.py | 1 + .../.gradle/python/lib/python3.6/tarfile.py | 1 + .../.gradle/python/lib/python3.6/tempfile.py | 1 + python/.gradle/python/lib/python3.6/token.py | 1 + .../.gradle/python/lib/python3.6/tokenize.py | 1 + python/.gradle/python/lib/python3.6/types.py | 1 + .../.gradle/python/lib/python3.6/warnings.py | 1 + .../.gradle/python/lib/python3.6/weakref.py | 1 + python/.gradle/python/lib64 | 1 + python/build.gradle | 9 +- python/superwatt.py | 2 +- 1638 files changed, 222834 insertions(+), 4 deletions(-) create mode 100644 python/.gradle/python/bin/activate create mode 100644 python/.gradle/python/bin/activate.csh create mode 100644 python/.gradle/python/bin/activate.fish create mode 100644 python/.gradle/python/bin/activate.ps1 create mode 100644 python/.gradle/python/bin/activate.xsh create mode 100644 python/.gradle/python/bin/activate_this.py create mode 100755 python/.gradle/python/bin/easy_install create mode 100755 python/.gradle/python/bin/easy_install-3.6 create mode 100755 python/.gradle/python/bin/futurize create mode 100755 python/.gradle/python/bin/pasteurize create mode 100755 python/.gradle/python/bin/pip create mode 100755 python/.gradle/python/bin/pip3 create mode 100755 python/.gradle/python/bin/pip3.6 create mode 120000 python/.gradle/python/bin/python create mode 100755 python/.gradle/python/bin/python-config create mode 100755 python/.gradle/python/bin/python3 create mode 120000 python/.gradle/python/bin/python3.6 create mode 100755 python/.gradle/python/bin/wheel create mode 120000 python/.gradle/python/include/python3.6m create mode 120000 python/.gradle/python/lib/python3.6/__future__.py create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/__future__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/_weakrefset.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/abc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/base64.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/bisect.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/codecs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/copy.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/copyreg.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/enum.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/functools.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/genericpath.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/hashlib.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/heapq.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/hmac.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/imp.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/io.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/keyword.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/linecache.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/locale.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/ntpath.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/operator.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/os.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/posixpath.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/random.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/re.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/reprlib.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/shutil.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/site.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/sre_compile.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/sre_constants.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/sre_parse.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/stat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/struct.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/tarfile.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/tempfile.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/token.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/tokenize.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/types.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/warnings.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/__pycache__/weakref.cpython-36.pyc create mode 120000 python/.gradle/python/lib/python3.6/_bootlocale.py create mode 120000 python/.gradle/python/lib/python3.6/_collections_abc.py create mode 120000 python/.gradle/python/lib/python3.6/_dummy_thread.py create mode 120000 python/.gradle/python/lib/python3.6/_weakrefset.py create mode 120000 python/.gradle/python/lib/python3.6/abc.py create mode 120000 python/.gradle/python/lib/python3.6/base64.py create mode 120000 python/.gradle/python/lib/python3.6/bisect.py create mode 120000 python/.gradle/python/lib/python3.6/codecs.py create mode 120000 python/.gradle/python/lib/python3.6/collections create mode 120000 python/.gradle/python/lib/python3.6/config-3.6m-x86_64-linux-gnu create mode 120000 python/.gradle/python/lib/python3.6/copy.py create mode 120000 python/.gradle/python/lib/python3.6/copyreg.py create mode 100644 python/.gradle/python/lib/python3.6/distutils/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/distutils/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/distutils/distutils.cfg create mode 120000 python/.gradle/python/lib/python3.6/encodings create mode 120000 python/.gradle/python/lib/python3.6/enum.py create mode 120000 python/.gradle/python/lib/python3.6/fnmatch.py create mode 120000 python/.gradle/python/lib/python3.6/functools.py create mode 120000 python/.gradle/python/lib/python3.6/genericpath.py create mode 120000 python/.gradle/python/lib/python3.6/hashlib.py create mode 120000 python/.gradle/python/lib/python3.6/heapq.py create mode 120000 python/.gradle/python/lib/python3.6/hmac.py create mode 120000 python/.gradle/python/lib/python3.6/imp.py create mode 120000 python/.gradle/python/lib/python3.6/importlib create mode 120000 python/.gradle/python/lib/python3.6/io.py create mode 120000 python/.gradle/python/lib/python3.6/keyword.py create mode 120000 python/.gradle/python/lib/python3.6/lib-dynload create mode 120000 python/.gradle/python/lib/python3.6/linecache.py create mode 120000 python/.gradle/python/lib/python3.6/locale.py create mode 100644 python/.gradle/python/lib/python3.6/no-global-site-packages.txt create mode 120000 python/.gradle/python/lib/python3.6/ntpath.py create mode 120000 python/.gradle/python/lib/python3.6/operator.py create mode 100644 python/.gradle/python/lib/python3.6/orig-prefix.txt create mode 120000 python/.gradle/python/lib/python3.6/os.py create mode 120000 python/.gradle/python/lib/python3.6/posixpath.py create mode 120000 python/.gradle/python/lib/python3.6/random.py create mode 120000 python/.gradle/python/lib/python3.6/re.py create mode 120000 python/.gradle/python/lib/python3.6/reprlib.py create mode 120000 python/.gradle/python/lib/python3.6/rlcompleter.py create mode 120000 python/.gradle/python/lib/python3.6/shutil.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/LICENSE create mode 100644 python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/LICENSE create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/_crcfunpy.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/crcmod.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/predefined.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/test.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/_crcfunpy.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/crcmod.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/predefined.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/crcmod/test.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/easy_install.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/LICENSE.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/entry_points.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/_markupbase.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/datetime.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/misc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/socket.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/socketserver.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/total_ordering.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/_markupbase.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/datetime.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/_encoded_words.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/_header_value_parser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/_parseaddr.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/_policybase.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/base64mime.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/charset.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/encoders.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/errors.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/feedparser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/generator.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/header.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/headerregistry.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/iterators.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/message.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/parser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/policy.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/quoprimime.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/__pycache__/utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/_encoded_words.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/_header_value_parser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/_parseaddr.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/_policybase.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/base64mime.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/charset.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/encoders.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/errors.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/feedparser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/generator.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/header.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/headerregistry.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/iterators.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/message.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/application.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/audio.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/image.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/message.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/multipart.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/nonmultipart.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/text.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/application.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/audio.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/image.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/message.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/multipart.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/nonmultipart.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/text.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/parser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/policy.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/quoprimime.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/email/utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__pycache__/entities.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__pycache__/parser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/html/entities.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/html/parser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/client.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/cookiejar.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/cookies.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/server.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/client.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/cookiejar.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/cookies.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/http/server.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/misc.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/socket.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/socketserver.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/pystone.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/ssl_servers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/support.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/badcert.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/badkey.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/dh512.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/https_svn_python_org_root.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert.passwd.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert2.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nokia.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nullbytecert.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nullcert.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/pystone.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/sha256.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_cert.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_key.passwd.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_key.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_servers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/test/support.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/total_ordering.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/error.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/parse.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/request.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/response.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/robotparser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/error.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/parse.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/request.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/response.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/robotparser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__pycache__/client.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__pycache__/server.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/client.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/server.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/disabled.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/iterators.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/misc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/new_min_max.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/newnext.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/newround.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/newsuper.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/disabled.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/iterators.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/misc.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/new_min_max.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/newnext.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/newround.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/builtins/newsuper.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/_dummy_thread.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/_markupbase.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/_thread.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/builtins.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/collections.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/configparser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/copyreg.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/itertools.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/pickle.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/queue.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/reprlib.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/socketserver.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/subprocess.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/sys.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/winreg.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/_dummy_thread.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/_markupbase.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/_thread.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/builtins.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/collections.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/configparser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/copyreg.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/__pycache__/dumb.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/__pycache__/gnu.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/__pycache__/ndbm.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/dumb.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/gnu.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/ndbm.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__pycache__/entities.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__pycache__/parser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/html/entities.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/html/parser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/client.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/cookiejar.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/cookies.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/server.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/client.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/cookiejar.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/cookies.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/http/server.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/itertools.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/pickle.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/queue.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/reprlib.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/socketserver.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/subprocess.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/sys.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__pycache__/support.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/test/support.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/colorchooser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/commondialog.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/constants.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/dialog.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/dnd.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/filedialog.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/font.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/messagebox.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/scrolledtext.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/simpledialog.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/tix.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/ttk.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/colorchooser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/commondialog.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/constants.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/dialog.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/dnd.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/filedialog.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/font.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/messagebox.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/scrolledtext.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/simpledialog.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/tix.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/ttk.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/error.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/parse.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/request.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/response.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/robotparser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/error.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/parse.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/request.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/response.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/robotparser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/winreg.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/__pycache__/client.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/__pycache__/server.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/client.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/server.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/standard_library/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/standard_library/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/tests/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/tests/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/tests/__pycache__/base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/tests/base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newbytes.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newdict.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newint.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newlist.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newmemoryview.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newobject.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newopen.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newrange.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newstr.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newbytes.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newdict.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newint.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newlist.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newmemoryview.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newobject.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newopen.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newrange.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/types/newstr.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/utils/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/utils/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/utils/__pycache__/surrogateescape.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/future/utils/surrogateescape.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/DESCRIPTION.rst create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/metadata.json create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/iso8601.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/test_iso8601.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601/iso8601.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/iso8601/test_iso8601.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/__pycache__/fixer_util.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/__pycache__/main.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixer_util.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_UserDict.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_absolute_import.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_add__future__imports_except_unicode_literals.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_basestring.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_bytes.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_cmp.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_division.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_division_safe.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_execfile.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_future_builtins.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_future_standard_library.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_future_standard_library_urllib.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_input.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_metaclass.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_next_call.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_object.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_oldstr_wrap.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_order___future__imports.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_print.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_print_with_import.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_raise.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_remove_old__future__imports.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_unicode_keep_u.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_unicode_literals_import.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/__pycache__/fix_xrange_with_import.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_UserDict.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_absolute_import.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_add__future__imports_except_unicode_literals.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_basestring.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_bytes.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_cmp.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_division.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_division_safe.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_execfile.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_future_builtins.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_future_standard_library.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_future_standard_library_urllib.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_input.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_metaclass.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_next_call.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_object.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_oldstr_wrap.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_order___future__imports.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_print.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_print_with_import.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_raise.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_remove_old__future__imports.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_unicode_keep_u.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_unicode_literals_import.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/fixes/fix_xrange_with_import.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libfuturize/main.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/__pycache__/main.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/feature_base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_add_all__future__imports.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_add_all_future_builtins.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_add_future_standard_library_import.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_annotations.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_division.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_features.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_fullargspec.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_future_builtins.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_getcwd.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_imports.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_imports2.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_kwargs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_memoryview.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_metaclass.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_newstyle.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_next.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_printfunction.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_raise.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_raise_.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_throw.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/__pycache__/fix_unpacking.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/feature_base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_add_all__future__imports.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_add_all_future_builtins.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_add_future_standard_library_import.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_annotations.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_division.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_features.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_fullargspec.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_future_builtins.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_getcwd.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_imports.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_imports2.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_kwargs.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_memoryview.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_metaclass.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_newstyle.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_next.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_printfunction.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_raise.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_raise_.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_throw.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/fixes/fix_unpacking.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/libpasteurize/main.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/builtins/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/builtins/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/builtins/__pycache__/misc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/builtins/__pycache__/noniterators.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/builtins/misc.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/builtins/noniterators.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/translation/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/translation/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/types/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/types/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/types/__pycache__/basestring.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/types/__pycache__/olddict.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/types/__pycache__/oldstr.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/types/basestring.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/types/olddict.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/types/oldstr.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/utils/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/past/utils/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip-20.1.1.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip-20.1.1.dist-info/LICENSE.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip-20.1.1.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip-20.1.1.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip-20.1.1.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip-20.1.1.dist-info/entry_points.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip-20.1.1.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/__main__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/build_env.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/cache.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/configuration.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/exceptions.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/locations.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/main.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/pyproject.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/build_env.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cache.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/main.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/parser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/base_command.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/command_context.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/main.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/main_parser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/parser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/req_command.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/spinners.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/cli/status_codes.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/cache.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/check.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/completion.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/debug.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/download.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/hash.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/help.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/install.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/list.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/search.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/show.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/cache.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/check.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/completion.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/configuration.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/debug.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/download.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/freeze.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/hash.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/help.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/install.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/list.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/search.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/show.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/uninstall.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/commands/wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/configuration.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/installed.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/sdist.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/distributions/wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/exceptions.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/index/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/index/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/index/__pycache__/collector.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/index/collector.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/index/package_finder.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/locations.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/main.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/candidate.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/format_control.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/index.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/link.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/scheme.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/target_python.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/__pycache__/wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/candidate.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/direct_url.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/format_control.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/index.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/link.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/scheme.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/search_scope.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/target_python.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/models/wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/__pycache__/auth.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/__pycache__/cache.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/__pycache__/download.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/__pycache__/session.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/__pycache__/utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/auth.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/cache.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/download.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/session.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/check.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/check.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/freeze.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/operations/prepare.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/pyproject.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/__pycache__/constructors.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_file.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_install.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_set.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/constructors.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/req_file.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/req_install.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/req_set.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/req_tracker.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/__pycache__/base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/self_outdated_check.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/logging.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/misc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/models.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/typing.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/urls.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/appdirs.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/deprecation.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/encoding.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/filesystem.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/filetypes.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/glibc.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/hashes.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/logging.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/misc.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/models.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/packaging.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/subprocess.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/typing.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/unpacking.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/urls.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/utils/wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/git.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/git.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/subversion.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_internal/wheel_builder.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/contextlib2.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/distro.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/retrying.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/__pycache__/toml.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/appdirs.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/certifi/core.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/enums.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/chardet/version.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/win32.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/contextlib2.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/database.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/index.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/locators.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/markers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/resources.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/util.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/version.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/distro.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/core.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/codec.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/core.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/intranges.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/package_data.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/ipaddress.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/_typing.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/_typing.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/markers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/tags.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/packaging/version.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/build.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/check.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/meta.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/progress/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/progress/bar.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/progress/counter.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/progress/spinner.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/pyparsing.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/api.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/help.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/models.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/__version__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/adapters.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/api.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/auth.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/certs.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/cookies.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/help.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/hooks.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/models.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/packages.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/sessions.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/structures.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/requests/utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/retrying.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/six.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/__pycache__/decoder.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/__pycache__/encoder.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/__pycache__/ordered.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/__pycache__/tz.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/decoder.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/encoder.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/ordered.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/toml/tz.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/request.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/response.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/vendor.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/__pycache__/py2_warn.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/_vendor/six.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/extern/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pkg_resources/py2_warn.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pyusb-1.0.2.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pyusb-1.0.2.dist-info/LICENSE create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pyusb-1.0.2.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pyusb-1.0.2.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pyusb-1.0.2.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/pyusb-1.0.2.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial-0.0.97.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial-0.0.97.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial-0.0.97.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial-0.0.97.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial-0.0.97.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/errors.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/hooks.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/marshal.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/meta.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/model.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/properties.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/request.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/__pycache__/test.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/abc/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/abc/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/abc/__pycache__/model.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/abc/__pycache__/properties.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/abc/model.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/abc/properties.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/errors.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/hooks.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/marshal.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/meta.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/model.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/properties.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/request.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/test.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/utilities/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/utilities/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/utilities/__pycache__/compatibility.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/serial/utilities/compatibility.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/LICENSE create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/dependency_links.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/entry_points.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools-47.3.1.dist-info/zip-safe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/_imp.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/archive_util.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/build_meta.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/config.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/dep_util.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/depends.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/dist.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/errors.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/extension.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/glob.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/installer.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/launch.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/monkey.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/msvc.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/namespaces.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/package_index.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/py27compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/py31compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/py33compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/py34compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/sandbox.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/site-patch.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/ssl_support.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/unicode_utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/version.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/__pycache__/windows_support.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_deprecation_warning.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_imp.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/__pycache__/six.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/_vendor/six.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/archive_util.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/build_meta.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/cli-32.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/cli-64.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/cli.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/alias.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/build_clib.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/build_ext.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/build_py.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/develop.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/dist_info.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/easy_install.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/egg_info.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/install.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/install_lib.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/install_scripts.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/py36compat.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/register.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/rotate.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/saveopts.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/sdist.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/setopt.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/test.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/upload.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/__pycache__/upload_docs.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/alias.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/bdist_egg.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/bdist_rpm.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/bdist_wininst.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/build_clib.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/build_ext.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/build_py.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/develop.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/dist_info.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/easy_install.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/egg_info.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/install.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/install_egg_info.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/install_lib.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/install_scripts.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/launcher manifest.xml create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/py36compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/register.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/rotate.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/saveopts.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/sdist.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/setopt.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/test.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/upload.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/command/upload_docs.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/config.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/dep_util.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/depends.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/dist.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/errors.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/extension.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/extern/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/extern/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/glob.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/gui-32.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/gui-64.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/gui.exe create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/installer.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/launch.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/lib2to3_ex.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/monkey.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/msvc.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/namespaces.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/package_index.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/py27compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/py31compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/py33compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/py34compat.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/sandbox.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/script (dev).tmpl create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/script.tmpl create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/site-patch.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/ssl_support.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/unicode_utils.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/version.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/setuptools/windows_support.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/_debug.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/_interop.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/_lookup.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/_objfinalizer.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/control.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/core.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/legacy.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/libloader.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/__pycache__/util.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/_debug.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/_interop.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/_lookup.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/_objfinalizer.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/backend/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/backend/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/backend/__pycache__/libusb0.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/backend/__pycache__/libusb1.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/backend/__pycache__/openusb.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/backend/libusb0.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/backend/libusb1.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/backend/openusb.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/control.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/core.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/legacy.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/libloader.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/usb/util.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel-0.34.2.dist-info/INSTALLER create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel-0.34.2.dist-info/LICENSE.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel-0.34.2.dist-info/METADATA create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel-0.34.2.dist-info/RECORD create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel-0.34.2.dist-info/WHEEL create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel-0.34.2.dist-info/entry_points.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel-0.34.2.dist-info/top_level.txt create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__main__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/__main__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/_version.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/bdist_wheel.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/macosx_libfile.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/metadata.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/pep425tags.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/pkginfo.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/util.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/__pycache__/wheelfile.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/_version.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/bdist_wheel.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/__pycache__/convert.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/__pycache__/install.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/__pycache__/pack.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/__pycache__/unpack.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/convert.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/install.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/pack.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/cli/unpack.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/macosx_libfile.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/metadata.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/pep425tags.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/pkginfo.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/util.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/wheel/wheelfile.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__init__.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/__init__.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/composer.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/constructor.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/cyaml.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/dumper.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/emitter.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/error.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/events.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/loader.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/nodes.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/parser.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/reader.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/representer.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/resolver.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/scanner.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/serializer.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/__pycache__/tokens.cpython-36.pyc create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/composer.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/constructor.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/cyaml.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/dumper.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/emitter.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/error.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/events.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/loader.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/nodes.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/parser.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/reader.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/representer.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/resolver.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/scanner.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/serializer.py create mode 100644 python/.gradle/python/lib/python3.6/site-packages/yaml/tokens.py create mode 100644 python/.gradle/python/lib/python3.6/site.py create mode 120000 python/.gradle/python/lib/python3.6/sre_compile.py create mode 120000 python/.gradle/python/lib/python3.6/sre_constants.py create mode 120000 python/.gradle/python/lib/python3.6/sre_parse.py create mode 120000 python/.gradle/python/lib/python3.6/stat.py create mode 120000 python/.gradle/python/lib/python3.6/struct.py create mode 120000 python/.gradle/python/lib/python3.6/tarfile.py create mode 120000 python/.gradle/python/lib/python3.6/tempfile.py create mode 120000 python/.gradle/python/lib/python3.6/token.py create mode 120000 python/.gradle/python/lib/python3.6/tokenize.py create mode 120000 python/.gradle/python/lib/python3.6/types.py create mode 120000 python/.gradle/python/lib/python3.6/warnings.py create mode 120000 python/.gradle/python/lib/python3.6/weakref.py create mode 120000 python/.gradle/python/lib64 diff --git a/python/.gradle/python/bin/activate b/python/.gradle/python/bin/activate new file mode 100644 index 0000000..659ffde --- /dev/null +++ b/python/.gradle/python/bin/activate @@ -0,0 +1,84 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + + +if [ "${BASH_SOURCE-}" = "$0" ]; then + echo "You must source this script: \$ source $0" >&2 + exit 33 +fi + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH:+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_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="/root/pimpMySuperWatt/python/.gradle/python" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${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 + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/python/.gradle/python/bin/activate.csh b/python/.gradle/python/bin/activate.csh new file mode 100644 index 0000000..e8326cf --- /dev/null +++ b/python/.gradle/python/bin/activate.csh @@ -0,0 +1,55 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/root/pimpMySuperWatt/python/.gradle/python" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = '('"$VIRTUAL_ENV:t:q"') ' +endif + +if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then + if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then + set do_prompt = "1" + else + set do_prompt = "0" + endif +else + set do_prompt = "1" +endif + +if ( $do_prompt == "1" ) then + # Could be in a non-interactive environment, + # in which case, $prompt is undefined and we wouldn't + # care about the prompt anyway. + if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" + if ( "$prompt:q" =~ *"$newline:q"* ) then + : + else + set prompt = "$env_name:q$prompt:q" + endif + endif +endif + +unset env_name +unset do_prompt + +alias pydoc python -m pydoc + +rehash diff --git a/python/.gradle/python/bin/activate.fish b/python/.gradle/python/bin/activate.fish new file mode 100644 index 0000000..38f2674 --- /dev/null +++ b/python/.gradle/python/bin/activate.fish @@ -0,0 +1,102 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) + else + set -gx PATH $_OLD_VIRTUAL_PATH + end + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + and functions -q _old_fish_prompt + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/root/pimpMySuperWatt/python/.gradle/python" + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH $PATH +end +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/python/.gradle/python/bin/activate.ps1 b/python/.gradle/python/bin/activate.ps1 new file mode 100644 index 0000000..95504d3 --- /dev/null +++ b/python/.gradle/python/bin/activate.ps1 @@ -0,0 +1,60 @@ +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent + +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) { + Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue + } + + if (!$NonDestructive) { + # Self destruct! + Remove-Item function:deactivate + Remove-Item function:pydoc + } +} + +function global:pydoc { + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH + +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) { + function global:_old_virtual_prompt { + "" + } + $function:_old_virtual_prompt = $function:prompt + + if ("" -ne "") { + function global:prompt { + # Add the custom prefix to the existing prompt + $previous_prompt_value = & $function:_old_virtual_prompt + ("" + $previous_prompt_value) + } + } + else { + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + $previous_prompt_value = & $function:_old_virtual_prompt + $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) " + ($new_prompt_value + $previous_prompt_value) + } + } +} diff --git a/python/.gradle/python/bin/activate.xsh b/python/.gradle/python/bin/activate.xsh new file mode 100644 index 0000000..f3ac9ac --- /dev/null +++ b/python/.gradle/python/bin/activate.xsh @@ -0,0 +1,46 @@ +"""Xonsh activate script for virtualenv""" +from xonsh.tools import get_sep as _get_sep + +def _deactivate(args): + if "pydoc" in aliases: + del aliases["pydoc"] + + if ${...}.get("_OLD_VIRTUAL_PATH", ""): + $PATH = $_OLD_VIRTUAL_PATH + del $_OLD_VIRTUAL_PATH + + if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""): + $PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME + del $_OLD_VIRTUAL_PYTHONHOME + + if "VIRTUAL_ENV" in ${...}: + del $VIRTUAL_ENV + + if "VIRTUAL_ENV_PROMPT" in ${...}: + del $VIRTUAL_ENV_PROMPT + + if "nondestructive" not in args: + # Self destruct! + del aliases["deactivate"] + + +# unset irrelevant variables +_deactivate(["nondestructive"]) +aliases["deactivate"] = _deactivate + +$VIRTUAL_ENV = r"/root/pimpMySuperWatt/python/.gradle/python" + +$_OLD_VIRTUAL_PATH = $PATH +$PATH = $PATH[:] +$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True) + +if ${...}.get("PYTHONHOME", ""): + # unset PYTHONHOME if set + $_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME + del $PYTHONHOME + +$VIRTUAL_ENV_PROMPT = "" +if not $VIRTUAL_ENV_PROMPT: + del $VIRTUAL_ENV_PROMPT + +aliases["pydoc"] = ["python", "-m", "pydoc"] diff --git a/python/.gradle/python/bin/activate_this.py b/python/.gradle/python/bin/activate_this.py new file mode 100644 index 0000000..aa96457 --- /dev/null +++ b/python/.gradle/python/bin/activate_this.py @@ -0,0 +1,46 @@ +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + __file__ +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +# prepend bin to PATH (this file is inside the bin directory) +bin_dir = os.path.dirname(os.path.abspath(__file__)) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + +base = os.path.dirname(bin_dir) + +# virtual env is right above bin directory +os.environ["VIRTUAL_ENV"] = base + +# add the virtual environments site-package to the host python import mechanism +IS_PYPY = hasattr(sys, "pypy_version_info") +IS_JYTHON = sys.platform.startswith("java") +if IS_JYTHON: + site_packages = os.path.join(base, "Lib", "site-packages") +elif IS_PYPY: + site_packages = os.path.join(base, "site-packages") +else: + IS_WIN = sys.platform == "win32" + if IS_WIN: + site_packages = os.path.join(base, "Lib", "site-packages") + else: + site_packages = os.path.join(base, "lib", "python{}.{}".format(*sys.version_info), "site-packages") + +prev = set(sys.path) +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base + +# Move the added items to the front of the path, in place +new = list(sys.path) +sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/python/.gradle/python/bin/easy_install b/python/.gradle/python/bin/easy_install new file mode 100755 index 0000000..cddde54 --- /dev/null +++ b/python/.gradle/python/bin/easy_install @@ -0,0 +1,8 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/.gradle/python/bin/easy_install-3.6 b/python/.gradle/python/bin/easy_install-3.6 new file mode 100755 index 0000000..cddde54 --- /dev/null +++ b/python/.gradle/python/bin/easy_install-3.6 @@ -0,0 +1,8 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/.gradle/python/bin/futurize b/python/.gradle/python/bin/futurize new file mode 100755 index 0000000..8d1806c --- /dev/null +++ b/python/.gradle/python/bin/futurize @@ -0,0 +1,8 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from libfuturize.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/.gradle/python/bin/pasteurize b/python/.gradle/python/bin/pasteurize new file mode 100755 index 0000000..09e6eb8 --- /dev/null +++ b/python/.gradle/python/bin/pasteurize @@ -0,0 +1,8 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from libpasteurize.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/.gradle/python/bin/pip b/python/.gradle/python/bin/pip new file mode 100755 index 0000000..581099b --- /dev/null +++ b/python/.gradle/python/bin/pip @@ -0,0 +1,8 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/.gradle/python/bin/pip3 b/python/.gradle/python/bin/pip3 new file mode 100755 index 0000000..581099b --- /dev/null +++ b/python/.gradle/python/bin/pip3 @@ -0,0 +1,8 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/.gradle/python/bin/pip3.6 b/python/.gradle/python/bin/pip3.6 new file mode 100755 index 0000000..581099b --- /dev/null +++ b/python/.gradle/python/bin/pip3.6 @@ -0,0 +1,8 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/.gradle/python/bin/python b/python/.gradle/python/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/python/.gradle/python/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/python/.gradle/python/bin/python-config b/python/.gradle/python/bin/python-config new file mode 100755 index 0000000..6114c09 --- /dev/null +++ b/python/.gradle/python/bin/python-config @@ -0,0 +1,78 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python + +import sys +import getopt +import sysconfig + +valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'help'] + +if sys.version_info >= (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/python/.gradle/python/bin/python3 b/python/.gradle/python/bin/python3 new file mode 100755 index 0000000000000000000000000000000000000000..a64949e47514c0c0c946cc0b0ea57d2e085d82fc GIT binary patch literal 11336 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/bin/python3.6 b/python/.gradle/python/bin/python3.6 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/python/.gradle/python/bin/python3.6 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/python/.gradle/python/bin/wheel b/python/.gradle/python/bin/wheel new file mode 100755 index 0000000..875d40e --- /dev/null +++ b/python/.gradle/python/bin/wheel @@ -0,0 +1,8 @@ +#!/root/pimpMySuperWatt/python/.gradle/python/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from wheel.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/.gradle/python/include/python3.6m b/python/.gradle/python/include/python3.6m new file mode 120000 index 0000000..ba3a1bf --- /dev/null +++ b/python/.gradle/python/include/python3.6m @@ -0,0 +1 @@ +/usr/include/python3.6m \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/__future__.py b/python/.gradle/python/lib/python3.6/__future__.py new file mode 120000 index 0000000..3a6dd9a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/__future__.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/__future__.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/__pycache__/__future__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/__future__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d271d1606292432ef5d55f88e30904cfbe8af86 GIT binary patch literal 4208 zcmbtXTXWmS6$US&NLUw3wv)7Vn+=_`VoOuLw0Wr0j%ArjnW0DzN!b%jrkEvmNx}mH z$O5n|jUGDV^vCoU^dIy`;I&Ws3w`Q$KtLoVx#OhZVE14zXV2|BXZd)2UDq}C-TAhr z{aagjDxja@4gQ5jXoeY#6fekdNv8=&t9 z*4Ju}`KY96J!yGLFmJ^C2@j;WZ@bKPEpO`c&>lLHIousbd@PwY0VRWmt~a?gVUF!e zW(Tx0oJcnE)bx+K&hQ*a9!5%b_*Ak#v8tJV?^IdW4{guoPER@#hp}qC$_}|Jc<8B< zg~5akvAX`*hjg|h)q%sutXiw;`td|6S!XVU;Er=rzjD%7SI((39L$DZIAL5#_J{jn zt1I3;L5UIv)$b5H_dkQWwTA^SGfaER_m-f zlws0aP}GKvWtDk~RYx{FP<_IJP}%PILadBYzu9Z;wNpiwrLXDwWe=((e1cgB*eVE_ zN_`6p98YX(GK-0k@}|r*M-fGaX)=52dn#NE6*v)==9VS>Pzpp@%T2gi6ew`Y&sCU3LG}* zf$t%D!FMXdi6?@(-Wbd9QW);k5-`)uWl48x5PvCQAZL*|c7}F1vZW(xY(#k^iKbxU zMGmq8IV(UmBplDOTcpB?&eb@YN;f1c(eN;`9hi-cBG)2&LgXYfK_0A-E~f;#Y#?KvJAb&`4P;lje0E0=;k^py9%F39KM&YSo05gx}wA z2d-w*2*8~35I!YoxbMRg%0^1i?+J;7FmuFy*L?f-Z6ZKGnzvlbiG8o*!?)?q(X3CLAGy^P4E?=Xf<+W7IsQ=5N$!IcoCM6saj|7M5K+c~DRB26Z%2 zL;0t|kBh+%8j3$I2k4Uv0{RuYB%m*e3QDgYm$PuUir7pK^~7->Z}1VCv)q|xYG--0 zxw8V=ywI>W*QpiavX@rUxH8S^XS}`?BDG>%45TwMHnX*9fi-SkY)MBHncyFq!mUU9 zPit3sUbySS1&1g7$d~FBf^FA70sP$E##nLT$n4XxhhP3a{dnB?a(ABL8~zEDM76X- z)9jK?xNN|pCHzjeGVL4L3M)smc&Mj0F#~Nm(_SZPpZ>ikQ9J;)Ys(A*o3NARaFh~C z$79z%O%hIakw_4Rg*+?x^(-U*&w}5$xRKOyY6DWC+d`L^Y}VYuXS{tiHw`czkYlyd z=`SwyzPj!MEb!0N0@swUMco(b*M+Bn-2c-AFqEn@dvw8PF|SeSPP04K1W8F)ve_o| ze~-;>U6ZxHyD-}7>D@)6T~6;yR$IZYByK(dA#x$b4nXu85PDr072e@y4glplYMrD3 zK9uxT;!Z{KB`|o8kO*a3Y?=}a(@-wwip!xqThXblQsh%|G0j*v%~=fxy=I!eiez30C&Hqlm`a50fC$QH%DM7Nxm>O!qvsS>=Y*EHNSD2MCAs^Z7ieT9 zx#yjeP0k5N=M`#J(R6An>MnZqOKR4r`BnCrO(pZm)Th~^_e>F!Y>H)T)n^%%OEZ0+!~Ai zN~XTJX4gmYs%Z+(Lg?z4rZ1{~rcptm?=<^^=5ymV$gi87W^ZqRKP7wZcJ~!Vw=sHf zG&t%t&F8I`E&6L?{A@n9_pIM-9}Svj>+nUlH!wb#PrYgl{$lnAdxPd-v$HhwqSxvS zz_qhKAa*~W?>XwU_PfvV7p66U9PPgG@qF&tUa$A9xz{(JJwIqK9yAxaKj^+l;GhTz ziZG!F0g5WBqWD)7|B6Ci5rz~Y;X0_r<*#N~{qqB?2>yzuSjgv=f2D$6DgyaSzx>AC LBG#4iKd${RK6_#X literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/_bootlocale.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc5620f3710776f413dd702f05a0f8141fa82859 GIT binary patch literal 1021 zcmZuw!EVz)5Z&D*j_bNri$I7AT27FvO%AOpBoLx%%K?dUXiy9xVLv7FO&Sqxb%-hNK%1RIr{`FCZkl*CLXBqczQH($($cP9k zSVBj%UfGCAI&aO}qIFGSQ!I&&@P5!yC)+6l$>tspI6ia>N5uP-DE zKNGPm{KgjSnDoNSUwb@NnM&h?n__IF<$B8PndFI{#EImo76mSak%GsTtISHsL89iy z#$by)c%jl4i-Szt#u&Y{PuZq%e5tw%Fyg`CDkVw%!67VqS&-(#rZ3j8l z|DilCatSA~MZ2_TIvez75Q{|Knu!|k?ktS${_Y?eV{DVJpO@7`1VwVE5|AmGVaF<) zxv4O&ctXKPebZf~ozp9FP3zWR(VEx5)G2xlaP|l+Ipw-&RM+hs z#5#&;qarPz-jCPEAFoJAOkl}(YU!Mz;9xrRkidp*&pU#iGuRN!onbAlqskL8;Kf{a zJ`LY(z3h3_>YgzYtkT&bfCg}&qvb4#k~o{GY^tm7{>OvEmK qsI{QRg_TXA|5&Scj=IW!-TYhLIC71hu=+*- literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/_collections_abc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..002e3509f60eedd0b0d052803dea80480c2790b4 GIT binary patch literal 28838 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�K7(A@^mCj$Fl70?UuVrT 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/base64.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/base64.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5952ca283688fdfd6c69498d22dd675336b8dfd GIT binary patch literal 17100 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 AMF0Q* literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/bisect.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/bisect.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abbe9e3a7722c5f095effdf495bc2bbe9806583b GIT binary patch literal 2717 zcmds(&u<$=6vtfZ>Y*wXqN+qB2vQS~;)1NPXY8G3e|2^? zwWE!M2>%TK(q1{`fVgwwy;<9d(iDM8rHEb4?9O|$@6C^ozvH`WYrap|4U++_b_xB`mo)Y2gkznKa)|V=mBcsxU@o182Wx_b`oZCU+kxbf8cEE+ zG3QXSTyi}MrRZ9>rm(ihTM#-fATjupH2EZv6K>Rz+&y!^eTIDkxAMQ^Q6V2|o$AVk zY*n+KPtd3+ujsULqO@{CRk^VezY^Vn&;ESe(`jmYnToS-W_v{@^#M1~o|!OBdfkcU zB9e<{q=xrCn>X%u@AZb3lx{YwI*DUlDlq&F@Tfb>1WPu@U@ z{+@tqrbPchh(N6VGbI|zaf)h-+O?$bf2u_7xf0<-EmQVDyd*>x!<#@{Kr8wYXdWKr zyRUt&Rx5*nNJoQ#Jw^L?zys1{V|){{Uz!o2>_N bDvC%x#Qat=J;#3s$}K3H{<{tw-0So&BsIK6 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/codecs.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/codecs.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2059ddb55395f3b7f820fc269b769fc0dc89b79 GIT binary patch literal 33941 zcmeHwYm6LMc3xM%rl&bG9F8bH^emB*W=0~1)LWvoT)tP_rAAzm5~Y^bt)9L$oaXd& zkE*&koOaWRHA=GUShAc&g2Y}gg8h-lpGATg0pb8&!!YtA0TRGK45R$Vh5^ItBnXf- zU|@ml=KIdQb*rkUXGBSqb`506u6Nz%x#xW6ac?~}K3*QObVX4I^DOg*j+sl#ec9Z^TG9jc6|Cn_cN zWIj_Ft(4VM*zc%}si!OB>Y2)fm%YAIJ-eLs|I{nv&SYhmH(r@)jd^3{Y@#ydl`D67 zW0l>wbGJ89+4Gf*dQRz!?Zf%LjcjE<&R$Uaakk&P2Y2tq`7!k( z&R_KI#rb_We@Weg^Lym}{W$-UI*#+>-u<}$0M5Ux?!)K_Ot30^)U92sb5g@Y8r1ouBz%)HG`u=>Z1BO?j2T_)Mf1F)}Qu{ zs52W*_xhX2t2NAY_CzbEl~ z3csiEd*)3|5l-bf?>Ri(5&C+*^1SzgdUH98E8q1VM!y|X74_Ce&dXMh$@z=wEme{8 z7ghFhX7-)lcinnhdG)|OeAvCX-dSq5+|#_^Uh=Lrf{wp_$US-SyjyE2cgbt6dVVlh zE|;(RjZVjFxeM#=D>c7<_+(4@o_oPtS?K!L+?kbH^F&jh%+=c~vv_5uK8u7`*Zsz| zrH*@g{?d6Q+-$m+cpf0P!1Hf-YR;X1)xCQ1(xsF0SKh>HKjh$=pLIg#vEC!+YK^9+ z+)mqVwrkigdG12D(d;x@rV_{8M}n~AOUXSyEH>NijZ?Af-aL3setE$c+kuZ1a z)mOqIHq}#S_5Q-yu!Qrcp5zsCWUf8?baV|z=34c&E9agMN0|bSo_IDKvxj^nafalg z$DVr9-atNy$8@fv((>n9i|w!=hvC%uR^9hjyjG{y)W!Ex*UosXk{^y;?)YA9<&sxR zoUxN|Zz_4uTpN$B>DSBGJoILKjQ*Eo@5c2;T!QG4fy>d;qj(ynU*FA{M!i$@e824n;dtX(tL=Ny>4fjCHfwczzVGHrv%XaGeQ$B#&fbMu zeK}~>f~A2QQ?1$xa!w{wL9(QB&)4~cW13=2t~t=&|Nf6Z2*ArTKmCd9e)7{GFK6KK zJji5z@>9?mMnlu9%emPUus?xca0nYO0|}6+WR+9NVf5y~!E-AA9futK{amF$t`442 zR5^^vvVS*T=^Z^S!%%r0P<`O8En&E^bdA`y#gFCjGtzcPMB{7&N+T*Ri6x$g8ceW#!8=lc1@{6_ZHXn&+XTFv6xXf=oHqt$%B zfNh~)#J1SaV>^PUN2{fNNoAHt{R{mP&PMyAD7iB~TMi4I?kWb@NVVGX)~eMoFU@`s z`S}lH6HW~wsN}VXn#Mp6AZbHI=1h~9e*_63t6aSq_%>z#S?2K!H&1c%G&fIj!^gvX z;58Tjb;f@ICqF)W#BaAdM^+mvtFNqI?t-mdt#xoN4DiU@HNU2sUUb@QEIj+PIeBXC z*(1{I!5nzm6G-bD_yv2g$>erB#nitN&U(9~A33P!Oq0~v8~o$m_Q(S`QRt8B(ks|z zah&Vq`#=MW`8^r5Z+5=-$V-m|bB_dWd*QlQ@3@O?-;FvNyw9z5+(!=HJU&|pN2}F3 z20?%xC|9d1ZPjghI3BB3-|g0#?2~F$S|`jl)U4w_kL;yw^oBqtEa4Gv)vs2YI15

gKF229J@lA&Hplw*cpipa~0~pgo9uV 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 JmvfW3{|BJv!F>P# literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/copy.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/copy.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..888d460956df3c371b66eb1ce1701d778155a92c GIT binary patch literal 7120 zcmcIo&2QYs73YxLFKV@xWm*1+ld$qfwDwxghnoh0VkEZXG)*l8aZso0qzh^}D^cQ- z>*1`lYfwEzM&nb__FNRX_FD8%6h;4l0PP`1w#cPGffPOW5aiI`n;~~4=L5ZT7aR`f zf3Fb z8E+WA?Ux=JeucTJK}w2(BC)PwI3Ui`5tEZ z6~DS+wP*aAUwLS>>w#e#?b&w2cl;TA9~ph0&-vy)<45^CKgJjMalXh;@RNLwpW>%E z+j;`EGw7e=PoiX7PjPeW>E6+s#s~Gb%a8B|cUO)3f4pn(?{MbVLCZqB>zms(@z0{4 zFKyK^a%t7zXI1SiYUfn#9BSuP?L2BVn)eGPmUvCI)mDvrjeDTBVf0LY)~`Nf?F&kV zXCOnvKLQz+`7&rLDL_HhiQ`EfeCPF}`FlQpAIskh`TIovKE7&<8;TO!YOa!o7op*c z+YUJUlh(1;uU;*m1zk;QPvte}3bhM8=Fj;@!TTkCDc1wF&HKmD*5WO+E#~7E{Nrf5 z%rB#jw4^m+isw}e^x-f1Cm{6-U%?2rb%iwKpY%_m?OETXKi0GT)BY2n^V~gl&%6g3 zcZ}v4?=NM;c!Nh=1YLJI+4RCN-gUjmcYV$WO}85l#zC~<#se-q8N^Yt;y7T+b7xV|QkZRtvapbxB@ zLFC4AlZ#?Z%MAm_9|j4=6OGVI5;uqv>4A}?3EnQduT2VkWrO(_;~A1d$gO zLXZs*UsKip&rG$TwC+$O!440{EwDD>1i}S8nXV5jAm$1s_LOd+K-HKtM0>Xzy8{tJ zsy>Yd?2u?DN-Ttt<*>d^H#){&@^ZP*rB@v`|VEdi~1eH+@1xTr_Pd4LW z=wm%HKf!$$^rHeBxiqw} z&o!OLog3{L7Epu}E{Pkp%Mn&faz@BqzyW|x0(a>8F{nnd_IR!w5Adl#t$h%D4q>|G z_J&cH{AbJUbEwO2IT02E(7W3%_MyvL`A1IxjxCTBZZ8O_Iqq(A*@8hwe!Q!DJR!WX zsybdYc9WnVgdTXOJaBI(v9f_4WikM)noqPfLF->v~3>XC6 z?GQSBnJAHcLT;tlTo_s@458*uXM;oef%L>i(&;QWTaIdioRZVG@=l!&lsjo!aosyy z^XSLjVIR6yCk=Vk+><*?iUYo++JXo@eLV&{piN6_6~cc`VbxlbWeq<_2A=G0c9dy# zslE6yR9?lC)KPE)ah5?b7EVMnE2#rwt!ZV|PA9@DT3ZDz zS;<$hQ(JtP+G^cWbPeMvT&3~U^Xn9$EBGiy=TuL5()0V&-Z#)*msP)#vPE$CA(OSV zB%OUz{53W17;*-*te%;ceq;U|-_7cS@J=4GkVd9a3eIQO6YBwxCC09HP=#XwKFAjr zHmCO$-mBAr`E@$v2+4hD>k}MKyccV?d5bK97V31?ve`}tUUAsv9X{%GKDVK5GLyWm z^Wgk2D&nao&C%{n#RlY82&(S+q*>2ws%8yMxUkvG0+2E%NRr{Y@*r95T?|vEnH|w% zgMNRgOgpP!Ff2_7vKeJDG_{B$G7BQXY;l|vu|u<*u~BAq!z3$%xqyqz##-I1s`!_& z$V{;_HEmHP!VZe-c#^9qjB?dHFjdCWU%xoLnYPG z_BPp?TCvH*X*4~)`f;?ycoZ-UCg?k>-iUopn&}d5=toRWFz^xbF>Gr6w#NR+&;_(n@Vum_o*0Nm}S9J1wVWv6jMyfgX&FJ^^NI*d)!Y`7vk`9_?r(tNB{hv?~6PRuyt;Kn~5Y)eP$SG_5M+ z)PNl7DNlO-l~#eA8jyp8E-mHAanhQc**B4%fFjnJlXc<-=&2EUl-!0&tgb=>(8j7E zXEndfAYA}m!OdxKT|`9xA84%!G6(Xlg;N8RX3-=XR2)I^UObxON81y(}=g{_NJO$F|dx9@IV@h}wbYDbe!`QQc zr5szUMhfig*`w2`feV58y%OOoEfEg(88hymxr-4B>`hZFVSZNj1_K`X&GG?`NH=1c ziY5(V-eWw%Urr2#(x*=`N*(3~To1GXJNTHzD5X_u&+jh$Xm?>o`s=qVl$J|2o7}ih-!s z+QjkEo{;v)1`{&24GjCBvBw?(n~$KQUz+!Uy{WVaNX(UI#YGH-zLZ*~TSi{_3ul!S zKym7|zY|qjqHH`kJ5`Vz4nn@N8pepyl540GqtIfm<=sC1MWL(OyuAu^leaNsz z%c-%&_Q|Zy?9KusT~5`1RCTu^l?L6lg(@aBme>3yRbE=UO6a46qFjk+tJ=qfPqY~ z*XcmH>JXf6w(=fI%?I3;4txKDsRdYHew-tsJJIQQQ2`Z4&na+4M~%8IT!N*WuymZ4 z^iPcqR*YLU@_R!S9ecOoQQm?Rq}zwblh{1Maz}`nRL()JF%P${=XvWc$27FBPj5lo zbtI{qJV3teBhBINrnjSWFr*+zWRR1hAGZoD#vQd&ef{E!6tvI88b;0#G7@eXb_gYG6WV9JG6*oeHWk6dT0ay}%-$dr6{ z7=;`cH%Z**aRg=sCFEefK!chI1{6^w=d{HuE1DZ58VZEU(TNpo*0*fEIFJ4>@g!sj zhGVit)-Y9TSGAy#4otE_3r{k_c0FP~4*ER`BF-U{KX=IQS=#RbKNf<58pf=qwZaF& zncFm1e1i6O;G%4DQG2#zX$^t9DK^s@!hV~qC|Za2v!#vJM@SaX=G)t-r?$eX6M@p6 zlhgYc^U7NlJu`Lm8Y4G#wh+ny-wT*Cvxk5tt)(+*ec!^t@jKwUL?aQ>EP|geN2_TG zV^8kQg0or0*(~Tf>8v_vK0|nRdUR5ancF+i^9y$01g&yTOQuy&d~fu_v|3$)MRh@%L{sE_7jHMWBntp#y zr$uu{9|M(5FHvd4D`?cQ&$Eh$kVoX1$O$3=E)NH|G2() z%%+=wtfaF2c9l*ZIAhVS5-qAJx7W4_DeAm$*OD;SmjmLv#0G^JNKOFxuRnBDWL75y z+`>r1qQixb7=!@`r;vwGcw{ajA3?67!mD{Ur@|}hq1qhYWtG9uH{~*lX7l;1lIMgt z5s_jfS!I`d+i)sbg)%z9H&m#Y)m|TU;d^kqqjRqk#EM1xNGvvx(bMG^F1`g9H4$BH;g#WPe;Zlli!3s*K-sTanc%s;`G(Fi3(VYplf*T;U28cQ4$} z>W9WzBruaIG|p_=!OW)JLt2T2YP7Vvj?%%&S>l`mM&Y8!8m}QO4c3QJr>-g@Q^&qK zIRzb7nR8p+h!IoDlPT>VIEyD1pH)|Nwtnq7%u9ZXfuJ7N6&B%mw`X#vDJ% z7eR;o6koz~o}cE+c((Z&zJliooVkE@5^a&6iy|B2PPu>Yrr zA|D7D=`tF~@>Rw~B=)o@RJNJrnI1*mQbvO;?dM`O44-agD#CwR-tc3c;hS2tT?K6=lPf6-p;XiuYxg_LNsAd}*F2CDdwI z`;7$kd|HBA4pUvq`UH-Rr)SiQQtXtk#LUc@G#80HnuyaR-4bi514Ge|p42`$#`U#C<6t{sPa`AkpbotcguB2+(mhTIFU;>e@Kj+&P}?ys7 zYd70TdN|HbkDXL6jMY5mf1eJeYg)FX-KWk%f=ti7g#nzy>IZUJo6`^N1E;uH*(3>^ zgdI4b8Q!tJBY#eGMb5))t8&IN%6aTkx8k@EyK!6xahw&Ij$=5Cljf>+Hxngl57D7T z?Lbf85j~b-M%Nu|r^te&uQqGj^e4|^{F-d{n!F`7R|7%nKZRzj`Ckwfe7=wM+WOqy zyFx16X7{Y$T{vLm^&Fzhm5Ob<+Pecckt>g^mn-X*_77Oav=2o*)ymM~9BGRA^3y3T<+3Ne~H@PLEAaxEPK2mjgNpq{TRAgFcd$ZxQZM>`nq z_JI%Xb7Ss*G~77Z2XeA!grC7PtMU#pQ~B~=`b6bceiteyirm9^slWD`6j9H`aW_wT zDvtNhrb+P=J%O=HKqKRrig;9BYT{W-B7;eh-b(Zs&QvsgAMIv{x#9RtR`l?yC$uqO z90L#v!aP7j<8r*SP%qpC!bw7q1{83ZIRX9v$Jmi25nG8uL`#XxLn1%CfA`VTPaoYk z{$t{Ze5Xiu1en{iM`C-d%QlC4j5#fcLtD`To~3X$;~$+??JALXYY#a9&`QxQ&(LXZ zB73S1Cby_vT6NqHL--+Zkf8S_7OCs#Eco7ny<+>!g*W;v#0Xw#Gn=Tk9k7O4WWMd% zA(Mo^(;z3~P_X?HO;H%aPtdwRz6VxE_~ zjmIFnk#mF*etj|8EhWEdk|^{$+!2LVwBX1!qO_C--&6>$&oukXvet(y&bNtdL zrb39lINq4v+m+Yo-V-<{5GF)00Pt@Rbnk7G_zs|E&XDlVRk(f6IxuOFJBLhNF23IT z3Y-q0;SUEWa}eNG-c=`P0^UB@! zxqoQOZ$Y()0;qgTaIrndTL22L^5ma^n;{P>k3yGV#I|1kjpi!X(9dV-b?fEzbqgQ? z1ditc676Y81z@0?bi(A1xc+0Ihq8#0D9@0oVKoZxh~h_?vL%Un*(*^rhC|UqHZz4! zAp|#eLK(x&s-v0)uA#S(^r>Wt61>h}QUY*wB~oRyE6g?x#wes})K9XJgO(jZ2t}s} z*wrXn7fms-o8?j4!yKHWW3&11Q)Ngr7xVTgDtZVL=NwdMxwo{SGg?BO~#Xt%LpQep7 zIaXBC)l_Cqb(ATy&A8TE?U+#w=Ot?xW5n^Aya30PKSo#2$MLR6`cia(atzIm_r3U% zx}<;r#36r*uG4O~9UzvBX!b|w>M&E2GP8D2K-M8ZS!zWwSqGxvhLZ0Sub+b<8`OR> z7~qX0H0$^#?rP5nCQo8&!!uc-c4?{(%$kAV$D=Vky3Y%&Qa?jywSj-O>k#fSrwv35 zfsa0V%(4}rqiZj-Hd}HCBYmK!{1B_AkVU14hh{?eD-bAwP?sVck!4+=S>G<-MF87{ z%TTtd%cy4^lYTi6IYM#fBNm1z*r^DtT{^XPu=_E~ zOG+x=ps63CvtZhDFnWOGw*d3P(DvfAf6KCDU1QnDAW%#;7Na7wv6!PS!hW!Wv6v%o zXa{zO1t%7QH#oN~SdHC=Ul?nxkv(o(oXTTo|N1AzM2SF*;}(gc2l(XELTRdCC`qmE zUpg`al`xal$4s!+@#I|yZImZ}LDU^|_2P_zQ~Ct!xRP#YG$`*8b)Py)M@?tG0Z0+w zqAAMCq`*dXZHfq}E~VMYkFuIk8r8p4ksreGO{s@MfyoD$tv&NOICF|Q&m2Y3^mnvz zg@EcJqi>zgGF4%`OsNWsV|>t|U<$xzK9jv)y PPT&W(TsRp1c4DCjl2Xw3=s(e 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 Or#EJw$5RvTng0#Q+UlYJ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/fnmatch.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0897095e40adaf0ac09227605db98da1ada06e7 GIT binary patch literal 2915 zcma)8L66+F6(%K(W=6YSZ=G~gUkavxlNrOFZQ(X>gCMTc*ocj08^l`}7_YsMMb55v zHIkO(#5)5ymrajFa}Ijzsed6r|3ZI&u08oL?5W?QG~=z|Lo_3j;(L62eEhyg-nw)t zikR4Yw$9jp*@Y)S`ww`{5emu1OmgXEe9T?#jXhWUW8c-mIFP;!WJiVv!MG#4GWd>- zLlqo#Wl#2H^fyng$@TBp86WrLCFw)jmm9K!I+B-Vheo zZE~3A2jWF)4~02YStiQZTBUO{ilRyG6bAPn{OR7#-7oLm5MSNh-M#nq&afG&jEIw@ z(2`8pLfAtkvLcBykreqiDz|BokCs-F*r>NzinAB-+z1;V!yGAzGNq!9Y~9>YYW>D&coGY(4rW=bBXwG8Wej;D1dPowM*?;7H7TYg zLLryR;($wwZq`g;DHsgz`FCo zF1-<{9Sx&bzy;f>!%3Q9H|lP?74=%%pg`6AWeil}kv<-(eY}6fYkq~ovLk-vRe;9J zWt*eTtzWTQ_ z-)}UR6D}29a9cg6csIwe)TY2G;FK1UtgKd?HoJkXPoOb!BR(rYkCjH8%Ow$904AwM z=x9f7=7pZdS-MctjY}sEXANozsAg`gngVYpvlO79y>^NZCSqR9fQ9@+Y(kt{j7!Z8 zF#{bg?D$*w(~KVmwO5!r00|E39(h6TXi76fuMUXpwGZLHm|jEQ`TcEO6n48zr{$OP zM>B-sF}8HO#0C}l_UJ&zGE>XXEPejbZ`+SsqmQ;*heqXG6V%?pYeE$4@;YDVuNZ*| zvv#NPsX-{}j-8iECg^q#Ikkf5C-|_eVir);0}G%^v>ZGMrk>>$av^&Byho5lpKpVs zPUWBRqY&Wrb{5ftM}NL~`}XgCfAcrPZXKn7k+E@}VCLs@t4!@1t91u6)t**$x21jE zaYz{kI)Z52MR@k1IPPL&s8Rc9xNtQEayY9u_uJ9?P^Uck0eTIIm>2Pg_xQTka)RdPk(;;Ma4d6Pq$tMm0tyCTn{P_i$;sHlfh$_ z4^BUD8owls))u7De0V|g;bT@ghA(b??NXG3qnSN7%8H@^XO;rIl-(ae7~6)BgzwQX z)U>U-OGS?gT2|dJ3zMEYq=j)=s$32`b%!8kTqNrdahqjU|D1;OsUXa~4x*+c^=rIl z3kCB6pr*$o#IMIUQEu`Lz6u^8h4fwU-bDjwamc7#Qj`3+PbgUY{U_zG8=!iU&0HoX zh9I|79@+)j1pcu=lA^PMg44o$Fho{NlS7xNiJt#Y^oHjaWA(voiZc%fCz;$CHYgbS zO$Z2MO+?-Z#_B3S4HowJiYOHK6>h!&eIzHUoN;$p(jMoE_%AFp5C#C(W8pL>{K1HrN4!x&Q&J+(EYaR zIBQGU53MYM?1!c7RJ0?1TuFWX<5GI^58#k2cl3WS^BT>ZKO=9e&R@N&K)qa-mq7Bc z9l@(mVkI;`Jd5N8zI}O_bTKx}w_5pzlMA_Ch14%M!Ip61Z8dB4t#{x06kHy5Awh@*>4{FWQR3MvX`o;xIvsBsM`#L29{m1L@Hd~<6 zJOI~v?nmsS3>NTr(V};&zPqXwMP^7P z&N8U@kk2XMswJS5q7wxZr< GFZv%R#QUoN literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/functools.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/functools.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..939631e4a01bf9e83d7ca9a23e294ccc62f4d359 GIT binary patch literal 24103 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/genericpath.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/genericpath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b8c789ee419e7aecc720b640e3a999ba5759c5e GIT binary patch literal 3767 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/heapq.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/heapq.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2a3a7c818c222a64421fd8849b88654ee5629be GIT binary patch literal 14333 zcmeHOU2GiJb)MNjE{7D&$g(UswlkuVh^wqf%f~(ota(! zI2MwoPo=!`bLak?bM86c`I+(gBS##^azFaXhnDqE*2LdwTz?n8c+IvfWvyAtUb9s} z6;(-XfQ} zVz14svuZ(2;p!{>S#?@{y?ykKb=L}yl`Q|+El2;{w)pQuD=d6q_2<#!8||Z=>9uKl zve!Q!==DwXa@HK_b==JL#MW~M`kg_)>RNSQze|(-{9|fytANoz!s;)zpIdv*Kkh&G z;Q7baW81dWOSi4sx4eHVS=Kwg*L5HE{GRW6?N+3NWV7QgdP`eN-jdtZ0bBZ}Lv6`% z*gbYVjow;&{n%|r+TGp^8k??nZ|lB$^>v(A&u)Ed<-Y5MYG32(efD>}cH7;myN#$9 zCPCP8{kGrn!vvG*sN*g#x$bq$nr!-R>}~mO)I`@#*V929g>@&4!gKyk5bqsIk{VGM z2g=vJa+Ap2@ZBJ624Rr+nDGu~3&I2sWuVj5QPSkp^D^YVS(c$Ykq@&1?&HKlaEAw}H%#RG2 zSj^pq0z|#U#Y$c7O^^uDL9@TOQ`^H~qP;N2c6MU7joqMhqg0gOEIik3dkvpgcpUm3 zHZr@95e<#_9qAjBsxnY1XYJ9sLZO7R9bM9T=?Zv*kd~U;w zp>;v1pqXJy^bN~&puT30wBPoU0Q$KZbfKBaw(rXhg9{lXc7*+p6f6tOa|7i8#?!>8 zgpJLhtu)5P?Vz=pwEHepl5&VP9tBY^uDcu9I4&E(7~)=#cpGh81YyH>Z}qXSA*qcI zl1o-72dWHJtmbxnbRX}*0X3_G)I_Lkd%6Y7fJNMa4*PDh9SPqc8A=q#0cn6{JPM%O znO;(k9(K6Z!|;qYYLS!aU)<9`A5eQms7g)p5IQI=(!CT%I$5ka9S@3#pOHJCK#-3B z9$uK7a(dCxNz98K=bpaO3_9cuk|e-S~9w}Q~q>i++OUW(6Vi`|%p-=cb^ zQgywJ=#iLJ$A^$p>?QCun?WN0vO}GqlYIvk5Bx=gkv0|ELwA_DM+cC?blB@`&=NO% z*qQj6kGIYkg`l0``VTd>$S44)4|)-$zkXBJ-@K;-o3c5;ZipG)%3yT^!!?S zURgF5D=8%_tLc5Z)XD`j!^%Z> zs=La5tFO7|!MSt8xQ|5pfD`Uc-Ss{A=!Os13u%h4OA-EKao1-AcI0~X3^w9M=y*Vj zp4WCaXb1g?eR8*fDwrA29(Q4NK%VjJFdSOxb`XZXcCfVZWkwC!UdaW)+<>`T1RgR^&mXYHV2 zpx1$`k9&~9SmQtiC{U50S?HU>5D9u~Vg$p{l5nP~w`#tZJAUBkmJ1S6XV2)NP25HPkE zSyNUMzX4u_2kaFcKKBGp(OqVbMjLTJyAR?K)nUW9p{ZC+gcb*#uEbfn%MBVXqA*Yh zZ_&XR3Jv@^2<(iPTnOQ-7bYZ*uF{cmg&<=HaXzxd0($IR{-KM2u@S+KQ&YhWgSBPRRAGq521D49$b#GX$ZPj}Xc(hh2m`Z@ zArr&3e-3^VE;>N)r=VAyb1Wo~-h$UcI1Uk{5n2)@ut$TBR7%;#loi;J?=Lyu>$6ou z<3WM!BZX}C+wDg^x8+lS?)!^~%R)D-LH{(p_Zw~)Kqs3BTYCr}FuO3xr=&{sjpJ#q zIj|!Jfx;k;rZ6P7i2h6YG&jVH1F+kQ z#@!?)a^2ezh&M?JcF{u@gmrM?y@qVF#Fn%<`d>1fEeQX+C<=g4+uW=h4uq*B813}k z_ins(1DK4&5y7Q)ubg9Y_#@~m;?VK*Y3%w1^KW`E=M4tJ*bN`48_=%r#7R#D#LFzO z1J&3hp_|l_C_EIQi;Q4M9uh+s60o!j4DZ*)9_5;<>$N)(bcfktg7{>-ncIM3DHyQfX-9F3_L)|eg zh~F9BLozNbKr?=ZY~Mj3Yb4>dvGbs3QoA>T7RZjb#N=X7_#rG+xQ4}Th-j$RTOk4} zF+C4n9h)u2jqM4L6`-f;HK+p%x<@atnCA7M9%0)#c7{@Cn=a)3X4Ia=#vu<(at`{>wG5gGHf|Srsxlq;#dlfaIFpdZT zJ_Tp28|ju8B4beZR_;RrHw3n%3!DmQm(X+!JFs7`?T7>n=UA5;(T)(@LM^y*p1@$f zJ9(IzZi7)tI46cD6e<^O0`8G;wIo*IbZLm-J@SIKq+{qzoB`A0Fa&B4_42TQia&NW z1{Y=1HWAIhS};SCK@?_h^fVGeAy(!%gH2AkF$|2iFxe)&bC7J9;CoIU1&*j*q5Kkr z-Ck06NQ78}0b-Mc@{!x@?d}q6A}ysB=;nLKH|c8N>zjhgC?K#W7Zb!L5A0t|Dp}F>HU*Iw5bbQ1V36YFK#b&gS@)&GG zevS-Yv;){lCn8Z)rr#}%vI1i#e+MoN5(bY>jLZmIBQXbv2#8oF^a4)!ZDKYE6c)Bc|^lNb}l;N#>lZ@PMihHfe64NJh-VoLG3Z$n_^V*@FD65z60b!Xa|Ho zCCLRMTx@?mn*#`udfHSzxr2dCMJ{27#=%Zxib{s;qKWuvGCnuJd;>j#aEn_8Ll@ZR z6u#dDg&&jXGe9;vSl}w41)d+?2NjG%{v1GoY@R6IhKD>~04|R%Q-l@-Pi={b=C-F$ z`2#)hzyjRVojx~CJc8Nu%#VOd{O5^(Ngbkzo+L@y!YHTVb-j(C4afn=q?SjLs9W#D zEc{2X&5V{*QIYVVM%oTg00mS#iPuE{udxH5i#u&HlWjOc*`cx5GISwHVsb?BLrn>T zjv<>ZaJG!`7Mm!(z}7qk1!?#-atG~WqA1HTjAmSb;2JR`{Sg#Wyh^SPIYKg8z+n33 zv^NwLHQNLgfG*Y7OPqz=8p0MMJHii&M>R;{HiLC83MtT~GFC!RZc0b6L*;CEjje6e zW4JBQS&2=^y|_cMJuv1yiUK}^$@qxW#MUGVbH3-p$syigMuPd;sb*2C^a1IzMwE;n z6R#n)DNMTU!CX!`*IAr~hm*7hRB#woVpE8aQn3Uxp8I_)khpK?;mBQ8i49YNP2e3oA`WPJ#kmqmaHY;kk_8n|xogfWyFgU=3{6 z_!E18Hz!G9U_Hj$lM~kCBI^D{)cs4l7j9u13Ah2uV2~u#QM5CKGo$9FehlqMi#$u8 zV|MFvyppkQ){3KwxFR*0UXO!j!fbt1Z2MuYFe-7jQHhZMSC*bf|6jlLijJb>l`j17 zd;Qxz__n)Vf_o`RzOsY_Ott;&wjFF-x{%(SU%G@O-|IeH>h?94{v-TiytS~bf@3$> z!oOnr6Dcg=hEjNJ4Iu%2mQpxr4GRO2$JJCWj|;XnDBOmuAd$lEo41ewi&gEZrAJL> zK}Hl`Dj+?Ll_7v4HfS^@a_MzzMLmb+(GF8d4&6G#azEu#`m(nSL2(YHZ6>#)h)D5peOS zEdfXk)a?sp1roVS;2V|W$-qupp=*n9!CarI%7!nK8CdNC5m4qOK1k&xjh*1ec6@bC z0u{~yfVhbw3J8Z?aYMwf%RGi9dS=8AfGDvXW(in|LOw;hF-oF;Ep=hKb;%dRYY~uT zCP5T<6c{xggsiQ*+ep9>X)@g)mJz!J=uP$q6iF?YC^=D=L>R=i-D_f6s9j%?6(~gh z$usjpCmlce4#cn}%4F+jvBjwl>1S}QpW}g6HK8~(h@apWS8=drjMC&PL$#vXh;=OE z0#;EsYBR96Caw!&G0KLGjFrgP$I5kP-|!+a6KIh_wzqpW+`LJHA}kqeNEs-I5f}#c z(N2>83_nAAVctFph2LY@_yd=y{CE~b)pcjx!?$yxqnW{-K>@L5u8U=%{&9?#i%Ux?{sTM_Rh!- zM|QA(Qz-Jk#4oPk0Bf!s-^*6MCBGG5z4V^9!yPzePjcZGG~RVsqnQ+n);r!#rb@@~ z;4oDh&92M7MqT#)8}vE^jPy%r&(({3VLMt-pr*2DgWQ)Wm$NZsLa40^eBNxjcX^ZI$$Q2L)xH zfXDofH7wz22~W#|;-CzixH>4a|5daO3lE)J)tUsaL| z6jSLJa)ZT`fBHtT;qE#)4h3rAMxZQ|OdK z#izJQp#qEzNhE`SlClT(F#yB!U~A_l7%G6Va8Q<(%Ag|mx6r$MlESH+w6?5SOWzt) zAcm|J068cR0X^fn9xgx>6d0Z{@Pb%u3AiYh;!W9Kkxi{2Xd=Ld@_I$BwK=^mo0_ee) zYJoxA7jpwQuU+Xd@;Fh%aC1^e49}E;Fs@JY>gzo0Wp{KWpMyFjtW~Mh}Yf^9YHz+5U2P%#JCJ$$L*eg4Ml5gayVuH)V zRE3ap^E$)WEx$jSN}XNR+8dyN|lGz za6T!arHqyeTI^vJfk$DhiVu?(c5Wt9Ni~_K!xjgA^`pXYdg%0D9ykx2;SB6)=CL)H z9#oH6gPB&5NzGmB;kzX(nZZX^pJbmqJ$&~Aw8H+NpzO1wl389U0@{D{FYPQ3imG@L z;P6p#IExi#hDQdoKf(uEGXD`(ggsBeVvk7R@aK2A%1_f({@ttsWRST(#1pLcQvx4& zc-hRH&6~~o;KGfHjJbYN(3SqXJ8$KDmxgoTdv-79SkoGCMI(V(oJ*6E!2Ca>EW(%5 z^$Qvt@!wb)DII?z@+jz3(jVpP9WIet#oL1FyvO7pMMe~{P^gl88gabT1W{5kUlXyG zI(}xVdTBaxJLsUK3Z28tVJS^7!m;QiirVoK-oXXo;#oGZh!7*Begxe}Y;eqABZjT8*G7RMb9#mijFBX!m7q{FLXuouGn^Pr`*`0gKwsp{!LUT15bt zUa@{);_x(r#V4zQX8AP=M`bCyj|xFDDv^RwS#sf#9j{G8Nb7R9AN*M&xqG4tgQB&ORc z>px8@0~>RdKPxB{$o?2X@NLVi3zR*Z(Zi38Ke343OgiBK3U4v_#Om?S2j$xqd{>zm zjrg&8(&BG8HL!-HTSTpARSlr9aOfisvw;Pgu%dl}c&rX;9)##EL4D#kthCGq?L z`~f`2G}j)Kxgu6dCG=yfY2&l!sZXkhQT4=*KloC*;1xjE)uHpLHE_Vq%wUG}f$v?R zaAr^)I8E@nkFS(Qc!k{wDrY9Ctj+FjT+hDCz$^ExmX?3t%UZJ_YwYur1A^V#D7ivs zS!GV5EAAwe6S#K zxIYgMY@;NI+@M+bN#SAX_C&md>SkeSSyHW0iKOqdre8Z(`K2OXuUz|A8WrQBinaSv zUaMWY+Kw8iOJBo9)>G;sIawS+bP=)`!wOlms94&{I%ye_z>5GDBRTMR1*eg%_fey- zqWM3^WaLZG%4qk`;uka9l_icF&awB1xlj@ZrMm!(Xu`E3kLWoj0dN+s9)uS3>+ zTDF+(%5*7P`t__~-y#lXOyygf)vT0^D$&LRU?IRbNYQrsPQUBFt#zbFb8jRG-k9Ul zFLPfp?sin%4Z0?!7O@CBOQ9mtGVn+H4N@)!j))Wg572+yT^k}gFoFt+GE0Ne%izft)t3+4) zGx$3zSUQIc?nR7bHF*5g5#*gi+u`{7FIf2h7+>8SU!P?7sw$rq4?)<=8J_Wf<}e7W zrU%xHrRE+Zo0!1af7pj-)4*B$h_f>Xk#=g}0BL`90BOggfMS=4w7)VKhX0|&`3wk- z|Aho}9E!HHcp_+P`)21a+Srg1QIj1?oQ8NAZzKifi+`(FF3Q z0cG~36r<_i8hH7-ObVZ`-_bq)APfukPD1b<+~h&e9yrPo?`eT}9}pREki<5Jp~W#m z?7o=2H~T^W29z-r%c*)=z}k<)UkF$i$K>RT{JxR+wL{i?TE?CliN8NyM1Kn+ltYTi z`WhM-9q*Xp)_3{*4IaM7!<#%vJ(H42`5C*ImG=XgtG9pmk+O}t&m@iu#!;q9z($_PK~v(P4b5}fE& zaAIMcsR3W5BKWs&^1l;!8Mv;Z#`^l&^!hr!#_lm~KpWmAudmB%&2hS+tC+&1Ae_u( zB;vCeJxjq)vj!yf98LeO>1H%}A5|ogcsQE5As;*$7syNn-;iMSDG-7GB?&15Ub%(I z+7xf_DaC|Y<+e4dUNs+CTq7Cr4{#`bTtbe3+G4rtROhQx)ft?ps?*hr)nnCXs?W{; cp>@ppj&qHkjd?-=9x6LC58yq{MOG*O2e}vU3;+NC literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/hmac.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/hmac.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4757c2887cbf1134a0ac7b206e40bc2af8bb56e GIT binary patch literal 4877 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/io.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/io.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..677125d499ccd6d47340b9a10d4da8b362977985 GIT binary patch literal 3428 zcmbtX&2k&Z5#Gf=mn29^lq~9ZM7zpj6$2ie@*!clNJ^l?azrYm6gnHH)&tA{7;<+9 zo?Q@vuFf@8evLdt4tb5e=A_CSY^bQgeMlol2{f^u_9K*nz$uy_iyYm647fdev?7Gg|P3g%cxhz*? zvsZoL{B6~LDj#9?Db4=k{!}`5-aeFza;;Y?W}jS}W#`UcpH5cc_Y?TN>2JEuxf9>5 zIP&vL?-$qn;5zjAixV$>@7Pl}$*#C_=4>(k@2cax9!RD%i?kSpk`0Z%QbHyyh5FSb z9q5>;IF+WyyQI}DNsZ(Y8}L|!D(<%!40xT93R4v`J(Mx)jpA;qXk)^J?5S7^*nmZh z^J7|`x1ZW0Qaxn4XCIGtPS`+6!%cTEp}howcW@r>rmVvg$+{s=5_WWQfI*8LrCx46 zUy2o~I|oZxd4aaYj&&-x*+7rwl{DKh&F%RHz9%f!ULuFwaErPl)3Jmba8tlR21nW0 zD7e?3`=9)tsc0C=NXDt%mN0Il$HNdu2wG>j0%9Jsle4xl+Aw9^oG_trV9JuwaHvfR zjD2;5;}E(W0D{wgo66W8p8HB5Px-hQj0dVaKxBECu!K-d*jS|l8?S4iy(wtK*YGjx zOwv4q^QauEP#&ECO2-Y4mV>frI(CMF z1}5+sf+>HV%}&~)OeWqO#5S8+JxACnUDNR?QbJ=&$xL_tiYvqN$)*MYd;YmT_0l$SGt# z@L+!GKk}tn3InK5Yv$bWAsB`*SoS~%h9yj;+d0rYeneeNc{kF1&41!iegu2=<1_;~ z#vhT#LlvU}Cfn>RHOTzYiAO;o_Dr2FHuq2u79HF-{Sj3Wi+KbBQqHJ6P>$)eGfgtG= zadXK|M@b^X5X&%XnS8YOPR3Z&8eL-9KKKP>?3GH59Nt+vN+oO>YS3m)M$@k*k^67-DSPNBN)N49bh>h7f_mu;(Ag_54t zauQ|>v$m4e^6r+^i-OD=Q&wipo7A0;^9C~?=M88+KDEu}+Ss;=%*$(xUQ5~Xje5)0 z-^4|ym*QmF;sK@I{w_Fczb>Ahzd0?Q+Q%>6)9vVZYdO390ZJO&k{q)_qC^63aL3e0 z)JZIm@JK9@Sc1qlj^eJ#-&EnT9OJDmUr@`C#xybSmy~`_R^OAsF21ur((d7#tV2i# z_cE-;Ev9mT8#_F^^%yivR8J7_HNtA^PUa$=L`IJLf6JmdZP=zTqO2(_yGOU;nlkeAW7TN9opZ zViEm;P?J9mcgw}?Po~@!-Y2_P$=x&e2;l~a`y?Jfz|k4o%p=my+{mAvkd6#|hi`%A zlL0ia7xDcdfR*4Tkw1>YTKN?yaBKf4ip5|~|BoXe3xAp;*mASA;9TJiI!>PJ82tk` zk*zQ6ejg0tBiua=7zCE!oe~5#J>2+Z4&^F8XMO0#3yb<%HuF~8Z3HpD; zJcRJ;`v=cof;g5?hLN6Sq+`~@EAPtq$-{R{BI*>#}dncdNm&e6H)=sUXBY(^2`-~U!8Y8I0tXR+wcy& z3-7^s;IIxGaAB|>GvNt#Oox6Pz(sifXA*~^2A4)mYY`q3N?`Lo>0F-ubz4jil?KBv z_q7`Hje$XKv)S_pVo^sWXO0#@w z4^+mDn&=)n(n9d0Z-wUj6Pbd{29>GIP?T#?ZX_9SJ;^?aB97nA?umyxa({QUIPXqA zja);T6V`>J!&DmUf?G*yg!AvJ4CwaWQ?@`x0n{-p>@Pw1nXhX_IRRYl4e)aEtx z;T_ZG573?t5%|Y+ULTNozRxTY2h$NISo7iWlBmc}(qD%Wb@f<=;kRmlL4h?!x=SSjaWcE1zdLBD_A z+SN+g-5lHU%jx||F7(61BEPt)9lReYOO);)&uQVaEH+iO#O6)j!8+bw-{yLUTvSL=2`^}5}1 zfzL{}t68bjz;|UPG9#>8?siYE(%^21vwz)W$ylJQJm)ELr3!L=tYDIg8%xNUJ4k$1 Q_Zj_vf9OZ7eyL9X1~O~<>Hq)$ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/linecache.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/linecache.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..637db49bb6cd42fe9e08c0142f35c7cb1d53e57b GIT binary patch literal 3819 zcmZWsO>Y~=8J^h>a=D^tSymm(aGXhi#wH-sYSX5LAqx%crb&^gX{1E1;DB9mR??Eo zU21k%g~GBxL7#kRU9_j3dTcNK0X-Gyf9PS+TYv&S)IY$N_IYQQlH!n>;q1=LJMX+7 z&->_|#YNv|;_*LL82gG{_}Cc#2rWy{Nw&u%msZU8xcRmAEc0vc+2+^TbEGXD=^om9 zuDm2`(tg7CY7q9jjg_4x%{BI=;Vi6lH?`5*;QoltQOMg@L@dbC}98 zR*PsjN|nZ%J9orUm_SN&AOa&Q35KB$F-fY$K{`(4nuxSGiQ-tqX*v)xJxPRyLZvK` zg@NiFiBX`BuwGSC#QwzBM}Zb3uH!$4;n-GDKMXb9qwsq%ZKI1}d=&NuX51r7)5k%h z@dLE%9y-l(mRmDx3LEF#!Q_CaLi607@c~a9i*csDo7*{ja*eIBZAR9U_-)%;&p9L% ztZfxur9f8LahSB7!XxXEjzx_WOVXlM-m7~Ur~5&i6|OP-Uzu8jke46aRcWg4j$pu# zC)?vusCEO5XXBB(okJDKIGjJm(f+&Ns~+CzynB}#$GFdL@TS$H z@%%$t8w1b^gb%_F*Rf7lACU2k4~#SsCOT4KJn3w;dEuIOM%xQr3nCO*^d?$HXEUc~ zelVi<3uxxBPcg`0??Fx7CabTqsRcV*Ggx+D&)-RlYz!Y;@C%>8)(+G5z*iq}c!D$S z%+McV%_AmlsO_Bo<|m;xN*jY#vGUDOE<>CG%v_}73w%Bs$v}q}u8eR+RLV5Wl3QBz z(nJSQB7%f$p(aMSrhFjxiXf&um~@njyFI5{Z?#=T##dz8Vqt8=oAZi=kHcZACO=jx zRmNg%TQz7YS*UQ0{8tTI$JDpcvSoD4@wmsE@TLW?ws?&zn(vW2=|e|0(TuhKhCvR; z4m@>LGtK+fjLrCzCoAv)hY#M)*&#hUvfgX;bIz|Q`h zI~aNJ_&S|+pB=C7mH}v=e)cfRdV!Lqhm6T1fQrfYK!qY5YmpuZa#`uV+jDFpP%-Ha z=oycIVId#@V&eGC_Lgx^yHPlClxgFh!Wo2zIi@x+ zvL#SWZBX{)$iB&v@gHWV_AYzIlUnJ)XIy<=`VgxeT`x0H{cEyZo+F)AHe*v4KEH+? zo~|8O@cW<2J@EGi{Ow8?QSui$3x0N?n~RE7e}b8QW5ymL8guKwA&DCXg;$yMDEFb0 z-(Scvul_^3zwGN~-$!&lp4OlN%`WDMLSVL4MO{l@A`PIoD0Mh_QAXXx8-Bue+3}0B z8-6g?_V~pkyx%pLQtf(6FZC}|{Qs^sts`2Oaa#{j>i(R43f#e|SI^`;E9I1klzY(O z@3|-aRkC(t#+$IKd9&aG@nqu%0L2YtL;nieip8dlsh>A;Klje9k$b?k=II|Ra0)J@ z!vs(yQGNATB><`nH8?XlVX&`EiVqJ^!G|GWDmlEBi4&D3hihV_P`^bWhGCWkhvAx# zRj!>OVhM3;1{W`!LfAJP>4`b2gu0h}<0aoz1Uy@3@I&xN;k}KPf$6}YIs2kHMOl^X zHTHY!*uk}U!F`hyD4JGhopLe>U&)e}{svvEmkvjp$0UtJ*VySB7vQwB5vNG+Y!id| zTD63A>P>Xd|A&tvotsuMjV_@D#-rO(3uhx z{A?6QhGhURh?Nv>lm+{!_}K(+`e~FDjh)FTESI<5(^^IQV_iLaIvs=wp@oxbDqFASJ#AQkJ@5XcP*#fvI~2rW~aFrhzHIh1#U@o^$n7 z)^aLXPjlXPWF25-A);!a54Lu5n+Wd=r75?t!ck9ktzSopAxh`w?ty{EjgqtxUGRhd zB5b!qqOo%-V5<5Y*uh9aIKR%-K!S-Z?3|O+I1OZ|O7^-BB9ILrkXR}St@v}A#1nA> z7A)rE5G>jVqPi4<|5DY8hQm-ssA!;B_gRvXpYQiTopWK;+No4p+3c%|XiNe~U%E+m&gr+g0~5r|wW^aP2!7(Ig@c zlLVyY#cUc8eN>dKCWnpK3jksiBoryUjnc`Rl-(JjBmsr_S^$NnV|#Uf$$#B{@Bes# ByI%kR literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/locale.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/locale.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..988c71589977ec6f519e3c20c295e481de49fbc3 GIT binary patch literal 34086 zcmeI53w&JJUEk-W(P%W5WUtrj-E20K%{pssY^~qxePq|NEZf?ZWv?agW3ro@(VQ!3 zq|way-Wki9$RUY0WC=-FLI|%7gcL#&prkY{l+w~dN@)v}wh+P;C@p=kKwp%$blXC| zzjN=M8BLa?kWW9K_VcO7|MNfZ=l}fA|NPInM@M(;$Yx{t=l<|uJoekMo`26LVzE=W z{kP z$3pDsSamiPb4S*)UOOJs&*TfE=8c6hb9Z5&AWHqjGJ-gax-4I-P~v1LVj-~zwa{#%>?<~ZSFUR@OzV+TD`{{Ce}Vezuz1& zV}!mL`=`uNa}4{v*nhwrH#@QK$Np*afZ2t8+?+H!$YIbtXdVLJ=e}hrZXPxxgdH%C zm{I%=nzx!q!4vKsh5OB8<`nirX40GnA2w6w7Vr^s#!Q2cnzQB{_!wn;);w+o$mh7b zi#(q&DeNck|3Nbw^oBcz{{=II{{wD(_2lY&SIkr9Y4ePE7I(qC%{&Lz z?|JifeZb{7>`8=1Vsk33xJu%V5DgumD^M;VH1-=@6a)KdV^@E&y)>o&%l--VQkC?_$1# zIV4;RVG&#cgnPl@7PuiOjzH;_LRbc`0Ob%?!D}H@!0SL2r~!50YKT3s!0&+u_NKT7 z_*w`XVCx^^>)=hG)dTOuF4zkFZh+qv!qm% z{FAnnzk%&<0zVbvzXguqZ(|qybRYZ-ZowBq_&eaA1w`{d7sB5I3;sUv4}hPy_5B5G zzi4g$5S!qafPZ9tKW|&}kFg8>$xDfsXA5Vr{W9C2mJdG{sZ_w0)GJfC*Ti( z{|x*W;J*TY1pGJPRp7q^{{#4+z#jvDf>a~P2HA)eE5VADFezXFNCSgF1{ea6j?6G1 z8EOYG0*nGs1Cl@Q2HphR14!bO zq$vqglI1vXAMh670B|sb3Gn^EA>c4@1UL#vQalbwGJF6y2|Nfq1Uw8p0=yM?6nG3c z1xx~`fhph&Fb$jq&H?9v8Q^i?31Aku0L%dwflI)Xz-3?_SOBg7PXSK@&j8N?1>kMK zbHMY!+W`l72T%kSff8T<7g*}S%h*?dGO!A)0Tp09#8q$&r~_945AcBo&;+gl8^Cp7 z6KDbN1h#-1z`KC21Kth12Y4@V6LHHQeo$m>y^BvyL1=4vS zk-OPdjm!7kjK^cHM&}c2iI+ya-L6LId#&%xP4-moS!)J%g?+LoY(ilsF(2FiBkU53 zFUMoC*;=Vsar1t&UaxtL{CdqaEAB)#yRhPhj(pv#T`L>c&sS<22P^J1w~{ZGO0Mtc z8?}6ccvJaGdGTI_+q@<(&G`9Z)#QuD`1zIc@=7*HRc)>>x?X;%=B*bSjdFE4A4K)@ z8*YV6NfqT$tdxtsVz|}ia@AEyrP_ME;;y^ZMwUYTsFM9L%hgh)soF+OqPYBevAU@Y z)@#+uX1?jWCMu{}TqiEI&8`>gv}na$S7FzRm8Q+3+$b*6Kgy(D^lg>;TJ5`ypyB(+ z^GnTYsZp*~C-O6mY_a0k@}24!cd6K{G-yz%W@wpj^DNTtu%dl+Vhmor39c2ZhAisbZtHWX*Cr9SmH1M}Qqt(2jPd)TGdAX|p|4)yP)LEw`PSopPoY zp1m~P&dPRic6M@Mx;=<}Vdlbgdl<`wi*wTplb4^hG3KsZn7%wS)lL&IIXm0VOr4*+ z>|B_9rle}Jl-ng!&dAM>UJPN-7tp z^Ub>JJq=;sU*Bx3)T;MSEPF*$aU&;l7kOitj-F1*Oq#D7b8BS1wuB1S4=8MQ<}|wqJKk||-}y?_-l=+Q z_ZnXEiY3RCm&*-52;W{Cn}1K79^&ZC3`-{75Z(3|;NOE08%V_yU*)%LvWsFYS?tEL zg;D`k-&iANQa9u8g)A8UG{fKFX8UQjyX<=5oPX;aBmA1vK_oE=m%dhPxc>cDo6rQ) zAefC>>$I{lyxrlS^Y&ANc6_RJpA$xN*P9haq*l$_1tsL*e*W&MyThEulR+}?5z>yw zJxvEVNTx)o%QbJaJz$rZp3c+E@&+-U27JYjr84nMyfarcdo+1$r|iYjh~13ch&AHg z?ycBrq7m0hA25cw@nm~AtgL14yPeuK)&`dGUf*=HZm5rDt?93c2CoA68H`vW9Z$ux z@eV^u;wMn${7V=nb|ZfM>{bjN-lI1XTZu+&E#ci^U{hPnUhI!Dgt4`Zccj5Q)(~FL zZpEL1t6e?zG;w6xO5BKF&7$8EbEE&%;MQ2VN>7zdKAJ7#2~Ul0XP?p;u2r8 zWATSr>{!t5t++R4;`Lo7aeM4W(z^2|S-;z)aHqCX{*kSi8CXIF17~lKnL+yIImR!} zSPpE(8i}m|^wqKVDSdit;6|*PGMO7`U~oBhBXfPOk=$Ym(9frD3~j}7G50-U^R!w`*L)!Fwx1Cyr5sqiQ zyGYi~M9jOL5^V>i+wsrXjOwl_NwJtkbLiqs=A$HwbKD%e1IVT z5JrrVALEyT4syU)Je^44O2tRwyR0n{-yPp2iiu|uV{z{yX*xtA4%XpfnoA~rBXRv6 zNMt_)!;qK+gTJ2%l6)Y>q=BoQWEx#fKMgr;F<>US7b3DL3ZzJeDGFOj8#CESaZ&>b zvEhH49c%_C6-*%SECt)qfD6rFA5YnCEToI;wPv+ZNL5%*3Mmh>zdJ^(j8}K+Nb<16 z&yd>Rg`p|3%XUdF#GZIS>)gKmk3IC<{{4?#dSuPre01Wz$Ht!fkRVkP(RDqD( z5iU1Y%B2;yAk{{(tX0F!Ygx z*AD3Cv23NZdTqs*;#;ZPVte3$)r{P-!PkZ?$)~+{nWVVks$KqX3~nX7%Z>QfpkYct z^aCGCJeQE`5qM@JaT7o9?IvA+hZ%&6X5eqhtwBpPY43B5)YiaO`euTX#EZp)Gi&(U z5)$4g$#)>i^Tq(BZcDQ@0PzgZ*$Guh2b3Eyym4B?6jL{O56L);QAnC{({j6jd(vng zCT^tYPG;LG9qLtBpa!o0@>Y_?>4Z9Nb?_#gO9v<6bC(#tjA0pJ$v-4}VmI?WcUl^#m8_rT;P>A3{N+IodxiCbD?2hSyenKCm zj9&+Wr8+ed&xK?@hV9OT#5NIl781{~IE(NTxbMQ9Ni1}DQjRRN&{$$$vc!%o#!>+n z>B@2}IF{JnjQnc1APqFfTLXJy$YYQUM8!Rc52YljNn$cXw@H4Bd!M)YJY%x;f}}Kf z7gCwYt;M{G*-@{W5zC<>zjvF_`g_e7enVRs?-R&jL*7Tt&icp9u0RsIk*@CEO5^)k ze1FLL4%(8U9Ddr|QvZV4O%B;kNnbR#*1u%-;5WRLrR;?F2j(_g%e_ileFwg`qfca; zvNbG!{ATgH!}{GpdBfK4Bz~{6en*&4$faAuuz++mkN=(4|8eU-6#5e$yKW{( zH6+XwdVOmqnnDb?CG&0SmuP#fJ)X3MzMU`OB-=hwCcK9kK<_~rZ^URlI29_TdS@OJ zLMtPJj$f8iuNkQGn0EJ0-5XB1iB@{wzKMP1rG=1}zZ!q!)%c^{ab^7$8QPV26EY6U zkeKKllVJrd@m%kKj1w}B$T*7eYJC5z@o_s1y?f>PCK>xM#s`9RK;#!pn`Cj3ImMD( zK^ZWf^Gbvi(t(m8m^M4?&ZcU&piHGX8zI=T2f|&_UtcU_BJBfn$dzJ4%SR^C1+b8y z73iN+V`TNmfUoMulIbLKC7wy{P2>=F#}IaRgZCtMCuGYY24_1z*+){DL}!zzo=O60 znH31wz1vm8%3mj^5Z+yM&P$aV`Y0G(pq@G)cF1sBo)+%6xADQ&z`lvYN0u2MF&U8h zr@tNAD8GdY1lp-?og{p8>ZE1bZrtKX(s8B-8#wPSZN`|+2}oOd2Sf}ua!K!m^-nVS z<*zkhpmqLIk?l#(5@2=M9W|)Qhbr$sMYY(W?1^9#V~Iy%gJ*?_L_ip;c#Nmo>7aY; zV7C(upBr5LoA!3rxVFbo!QQXNYcw^8>}KP+z>ItA_;vOu>ZeYBh!e7!+r7ulI4z8~ z9(m0c21E8$TgBL@Fm~)~pms{?@&18QnUB53Ky4!)MUn_2P8(KiG9;g#&evL5m7-UA zpfBeqAuUDRWCC?elE^_7xvS~0{c0rB#CN< zrNIm!l-!njO_6cPEeFA4mu!ecN{7_nNL@~yw{wn57)+KIBi{D$}a-jhFm*U%|8 z%!8EW-6kVgVC$%^8=k6Z_4S@Q3UyAxKit=p_JD)Bt8q?^v9dWjj+`XJxaX6mLl2rC z0y}44!lD_Aczh=+8)PQymc5ZC zr{~y@X->tf`w2nLLMF5^v8N)tjrl?pli4Um1fW?rXJlkna{jBUfwnV#Bk ziBYkBpG7>?-N(HQ3tN6^lNcKGYR@HaB>2(Uc2{#uj0$^NX*7StzO3#EsUhspp}BU- zZE{c~rqddpn3=zL^5pRc4<0`LYPQEdaAo1_!IQ0_j@PU4Q_Sp}B=TOsU^)$HQ)2hQ zwiRd^ZV(`aO|Z4~8jAcb8Qb@b?J*}%`8ZM3x_T?nHK>22dJz+&r{dm=WYAe;v{mW! z(65t9J%Rj2KXE=J!i}$Dx9l8dZv9T+7fe$2jW~~6DN5i z#l93GCmsaO-ZbTXcq>KD88#cpKu9>;aSQDOYhGCiXde;v(%|pa7eIJELVKw z8VahRm@G?8q)KRu7M0w|lQnV$9^;yxDw1QjH4!gTYRR)})!Ifi$UQoL&WESN>;P+> zjFm&^-#LZ0%~C+PINElvO6gQ7ud$Vl&WiVscd{`xm$NbJd^P@%Wg6c5G^O7xLn6#v zAmKLU){JM}dZ+ASsopaf?Oe!n16C{5yPebl*BFWprqxB3gLv;(3>_<4=25UrSd7(s zH-4yhYqhmz-BJ8PnkK?T`WTG2lZfvWPk9HH*iLa;@mnczGx5EcsigLb;=+MiB;d!X zWSV$74zQ{$Tq$;u3d^#;)Xs8OB8U;l!DCi2++j{)Or6!#!x6|<9p-eh%bbD<#!4rR z#z}*o0rpOKa9Cj7Y40htoMLBeKqKZPafnzMQZ1V7JhFx1SRl}Rnlw{pxcCK4nNW`F zA8V0yFc_8~b!{V{NUM+N3_54!y1amRYq#|I{aOZ_#bq=WOt%9adg`493mvkGXuW5$ zsvupcU}iN|&}l5M^vL_2Vl91ycR(iclliAQM?QAy6w6A_jg_KGVE$~ ziKJV;(ZTXM_gRdzzZ|r8vS?QAEDmlSFt52$5ZraK3?!^^&op~4v=pw_WxsYXT(854 zrz6MKt|-f3bRR-5Jf4`FV@=jnu+z|chip?A9H4!p>{_ma$=0_%@8k@Cz6%czHJ-ny z$+VmJu@OxsPD$AMW#W76GVOg3|828Cf~iXKrQ+N?w53Irh1ZHR8E=o#VuzH+0pZW;VDJ73uLsBL}EmwAB?E zuw{WP>@}kre7@&K%E5#AKV_b2^D?xsSr5)X!!Z;i)D0}#zJN(;ioT}6wbNNtPxTDw z?`uG<#Fa@fpn^J?bPh#+&OOcU|yL#H{BWD41t~D{c#QNUddY(WH2$S zn;L2)D28z_!$Bbwv-`h>Q=L>gQ%X_qN94g4`~byzm@m~w+6j;VVC^-sjWej!kh!xt^VMp*wuG& z*37wTBd5~=2xzGI#U!k9!QKd9_IKv1C7x*Q3_7{9cenRRLY~2;3rC&j-gxEAU^jG6uQgnoeQeRXVsmbs&HD-Q#($$(^6Bic8n~ERFT( zx;i;bk)eqBwR3`^;7AQC{%98Ubwn{x%t`Vg#B#SqDZkykNQHwaudIS6^7CAVLx3WK zTJ_!rD)OpT`)I@NadWN94JBjQ47O|eqAph!jg_XK53XSZoZsGOD%XPJIn^ap6iN}# z1)P#sUWDxy7r6(~y8zU<8%PCoD5ndCu-nBl=QEpD&db+m1sDIg>%ls?jtHmTw^u$0 z==9#UW?Hp7J8jn-$V;~mCqkc|XJ$to;fHLfr{CP_HA4Na@_xcfrAuXw#u3q)tU8b* zYfRL^8)YsIE_SP+D~%JZOhGo`0NE8x#D0444i~;C@m06w=uETSYkWn|7lCD z*3hrM#CEc=9ThFL(c%evi_NtMHp88m|gI0J5v)PrpjT<|`fe>YuD z%q>|4e9_*@6>HGH-Z?_By{!8G5JSaf12ZA(LW9fcgs3)Al`zU8Xy-U2yg) zI)GtGDC-&enNS)-iuAO)G)ZWP9tW+3--|^W3mkQJ*Ld% zP+jLBV|9nUM&DD9s3%yVEQJS?2NB>kNj=(=bDZ=%Bht=U0gu_IJ3N8RFDcG@86zBd z@f696{d;98na^qPbt)Rmjj;pnunBR|&W={%zt}{B+c&y{BmK9LAeCr+R-r%2y~=azX`9G4|+uUIM9 za!}4K?9Aw!6q*aqs9!|?u}nJ&i|=%d`~-GRNQ~~4fpzVHZb`KcU$%;-V2$Md4s#Q` zj=yLxOS7j&O7&ttQ=n}V_PlZKEb{)av&e1paL9D}fM3qkdgk{h@a!K8b2YX94F)3+WP^xoLNAabA<&vcCAae!%YwMUVJ48c_Xs~&J z?<|#xcvcDJ$|W`e&XWH$%9jc^wg!pM~)v3 z@$nF!=$;fD=~|DsdX5x&?1y^nhkNWtd+f)0>^-?3?dE>0Ywd~fK-ahD_~OArYM#~< z(hHMQ3t%w~t8BZrP0aaQYmjkHqcHZHx@PB*yEC`{ig$l^7xJf%%=#uA5b%PJLh6Bg%`Eg(a=7F=mplE?T2X7^A5(L!VH^uj%dzlu zE5|)&&BSmBN^5lUlO5N3RWYM5Z^gM14bLda&UZWI2sQGZsqSo}8%qA7b7?l}{L-~< zbw*2@&bjWqp^FVH=ZT)$kMaf1nJ&#LhU-lBwoe|X`(sRX=YNo7dzX-8b|$Ql($8M$ zDH0j6+%u}xiZeIc6FiE?w(^F}HRr-pQS(g8Io)M$t~1@O+OgKC%M|N+P&K#Woa^@9 z1J+}zJBuG^jct!{__(E;$!H#pLPV3jwU@`X>RFF2vr?JW?Sv?gZJjR4JQEF=Lbs0* z9_P1>5gs$Wty21#-t^3=h;0OPKi6CTxh}N?wY$_iddh5mDjF;~x}5tk-LrlDIBuJ_ zZ7EU)9ZsXx6ncBZhDKzs(COZ~j=DAHnP)ncKibN;wN6!P&UBYO9A#W;-3c`6`hD{m zkIC*xtD&%qZu-DuY8#~yW9rLd^yV?F7}4BThG+VtPfv9!ACz!z+uR|^`R(oXoeSOe z21({-`trEc%f?hJ3w?Kdtw(Pytw)!pgG}e2>Pxas3Q&?O{YjqcEoH24Drw-G{axPN z&aa1;;EfSK9t#{Z^D~!c4jw&v>_}^PX~~(7mV&XRvU9el;m9FN<%$Doh77weyfwO1 zbIxw-ei;6C){MvYsi`HQm)5mLZ0AKwO(c_upA0W;iWvqKkORgP)@GTO^>)wba;2{` zmd*BQoLhEV-PI{@bqZQ;_He-EYui%}uN0lm1kSA#*Sc%N=!&bE9}&aJ*651mr8DzW zGcyOzOh47iApI6^HHrvSDMcGF0WJQrZXAI5Tk)( z^6~|h<(zC~%EhRw%0-Pt*i~hOo^2~_**G)3EA4Q3x!bu!v{SUKUTX&v_Xm)rFz8rP- z@LJ7z;r1Y4q0^@IW#>Xqn_w90$VMH}i@mI~ZKcbtm#;eT)~MK32qhYv(e*XwLU)a2(O<80 zLx&N^E<{mt>(!nb4zKs_WY*#4+qmd@!@1DyJvwiF)434Mpj?%`S69r_H}4&8las46 zCd16yZZ}j{sLnG{JF3ipxu{ce))f)!Frw3BBu0)_t9{~iwbt(ehug+ctKRlq=FX~L z+vdY6P%CZcy2G{J?Iw;VdimsVt*5_+YkqgUhU>7@sFUTm^hDIeda>?IMnO62idtn| zQ;}=5Znp1k<f|#xAa%U8%o_h=x4V4CdonNp#+7Vax^{<1Hg5JVUy z!c>>N(|`WT_6lFGQ^%y%V(z++p{ z!~VMSbVs&?RJUtW@aV}MZrn?lqlC_PhlWw!-Y_WLzslP$9nxX&@PKIq{V?3qQ7!cv zHM1enZoJ2flx(;o?wboj!VUMR?{Ax76x-65sKm0jheF%5pAwfFFTi_ zm2kA-^(~xu^z8XqNgMrr-e_p|mcDhhA<7-?$PD)G)89(86Gxve!_p%uOszJvGk*57h-AD!^0bpc*F`uudi(D!d7mxtZLet(Vv?v4p9&0 zHk+=tpkbz)&5dsF<^m1J^5T)BhmW+f!OFf^US_^vCz0$cYktXZDJq-EbEj?8p~&?F zF`L`!vVRu6e<4vkS{NuEb&9Q4)}jgYt>~^%ikel6TrWTk;x1uba#}^+4L}oGcX6&c z%PWMeW937LMj@m7x@C@P@u)hkPgFFW?bP0a9YmSzNKmv@CL$Eh4tU%2zE~ zty#3TVNqovm;y_eDkURmHTl zg|^D52x(oSsA{#;IinU$gevw2Rr!`v_6mtbx0P9RL;jORLAbaqiac2ukbM&cp->QB zNJ~N3S{L>l+H5gxNG#HDG>MDL#77rct_FFer3zHVgsXMpl$~o$P}Nzabs%*W`n^(s zY}DEsuLd=Be!GbEXTHBe_H;dZz9rP?((Vy0u}G`Y?JX7yLyOIdgkOd%E#)3h#C*T> z=9$vLCB5mj(i$vH*yFfXsx;wNTiH_74~JXnQc%-m$tkr4FeXZcM2P`FW5+wtLayH$ zvFKE!;IrOTMxo_KVUQEyBG-d(yN=hy&3z=E{%8%AR=7##y9fQQl@kCd^_mct)OpZI zx`gD|*Z`x#YZeO`j$1e#A-_b4Mxwck5FIYHUA=l3OAH=>rgKDQ#Zn6-4fiJDs< zr@7X;wPUYxmDU{Oi*Y`7Yu)~u-V+?$6}qYUj?%5Q22q0rQx~Nd?kuS3cfGD(CmIxm z8b`bgv;tG>5LpZor7=O_Eb&INHi|XnV9t~5s>+P@r zX`Fej3z7gq{1yeC*W5yeyN0!@C3#rz09qtSCE=5E`Ni504eBv!7p(<|Ey8Y(JIx3Ox&h17%it!K&e}F%;4vsSD5?tx&TSMi#vhXlSKb z4Vm`H>QrU0ma5?r?W;lZ@xhxX&-&w!#}60Ly5 z{&`-Ld-XKEOtaW%mx`?sizcegYLOecY6MIRrBk^=DMG=lOsvv2G)}Aa){sTg{Iqg` zmG;++8wJ!$jNfXpPB|HiSXUGi53Mj^y1=Deh+HS%LSl^~P*_16w^}r@?AE+x>RT)o zjk~_t8r$w&_xpW3NMHIb2{~xC)>>o=X`$5;g`vw@W3gGI+tFl+0@j#j=&{zk){sTE zI-Gy65z4tY?*&25*#O(H#2O3%jTSU^t3^HA&X9ef*W&rmgoG$GT2O9c4eo(1YYj$? z7K^oM0R2@{uCkrhAZA-yiYf*v%YEpTCaWO*H-K`gWD1E2^+Xd@DWYr=nm}DAWt8+) zxXO#`p~pzz!Fzd-U+r)^QGo`~d4UoY<`T*)P+A%*t>e;F(GN+qRC3sL(qbf_wA54U zR2Ie5IulRYC@tjc%rbOQEJ$f-px~wHb#zba&UFSJ%@ZiGPJg3w5{V--tRwJ9&txMp z>(DY;E1ijsX?>IU)D!KJMVrn#f}6BSn&?&LK1Zq58eS-o#Ak%*G2SqdsFs!j3C^CD zvZ&e&ajTuMQ7TT6kw9}K1_}~it5Pe}M`W3(viMYMr>dKLWP-dgfD#F>TP^A^uu~H6 zij~%$KJO@%USi#FMX6*+^UyP~-X_s5Q5j|=js$FPpbA^9@#accSfU2)qi+%yN3o>! z1hnRIWm!J9j|R{wsn@kup+r)Dg6arL(i>4=fEi1a~;s@m)Bdw0v%+{K0+pl$LNeipJqfY3YkJ)E*R!wg{Br>!5(T6Eti9wNQv8PIn2g%$I~ugHiZsN?P>gQxb1_Yyd?N-M@ote~Yz_w*i%h5BcFz%p-Det-aD_#pHDXaG)O!1L1>T!bozz02TPcKCr4v5$1a(k_p^_qq z(H-OgloiBp!c?0zM*^R+EZORuPN8+Q6i9`vtCSQBEd z44{;Yt+?gX{4B5i3W6o0t%{>9*S)yn~`!E^-BC4@s^-+zLiQqC<$5r;xPPJ3qZiR%TqtYf8?Ua-XLd;2N zq^uJOYMmSzel$^H3mRy2P}(G*cxu45q;je+6Qbmh0Ne}2)#i#7RnRbrsWs>zR7qa5 zHDVE!((6&1UTcSSp9*zLg+bm#UQ_=Jpk!hTozQj#6%%tl)vT7U6^3N;ULjoemX6g9 z+o@*BKUPRf?IdQ_q(Tx_sWFIYooKSy!)=pFb+a3Qfl522%CElEo=rR}A3QksQmqa@W|r;X^M zROBW_qJ`2P0`-%GS1F#@?149I@3x4{Qe2`^7Fq35ORA(&H4u%kuB=&A)5=*R_D~Z*58Ao}IR6K8X4FMeCY9ZP61?TQnI&Iep%`o+KB0 z=88*4gdp7>L|0NoS!wrE)AP7=EexciN2^CUO*(s%3Z$!DC=qn`sgR}*rp}WByg-3+ zk^*%835({5itEC~Fe>dWapq3zk!;QfNSWIUNGJq!m53f%q*iCqB9wJahc#UHc`Q0j zbJ$W}p-9jS>qB)v_YbJCoTqwbZxvbeNXvj+8}8fNPS< zfRs*XhT?V4hy*$wwwp6m&7R|fbY>6IF(OEZ?Cc6(EO>@6n_!8q`57$8Jb{y^T z8OsY5IXfe~szNQEC$c@{vM6)~k^C?+H!f`CB1bL6vIT3cp1*{PYbCVM9$nEGogKi{ zbs~YM4y`~ss)7o1DaoP>&se0f!E=f>fi95%bcVhFJw-tZ3tVatuE`)K&9q_kGoDw% zXJ@mk( zvmcPodEg;6F5Fq9fwgBVAf48*s^~xjq@xfRJyTKhgk|RveF9Q84AvEjV5N8pm%Wf^ z*MfOm_Dq5?Dy~?LRxaD@>`?@)NQVUDzf?ZKmlNeXWxOEc?K0xl;5&;YPzFP? z4OyGA8d8cOWi_M*4yl1ds>{$lGWN?*1BcYWAvJJF%^Er*<2=Sb<#$qskufYIXAPB+ zQyDpxky9Btm9ePMr(`@JW6&CkJgCTniae;u83oj2oRhI4V~30fWsJxemGMRy&s#&e zJR)OE&N10`%Jzhe$7IaQ_<9-dm+`cWT{2F|Sdj5%8TZPVPzF`m?w9eXHRQ+N_l%Vv zlJOoHEg5q%wq#tghT;`v<69dHIo~VWc^M@c<1%iQvBw&Ua#prAYsk5#F5xwSSot;? zx663=9vSMUht*9FTR%m9Sdkyr;61E#oI3VMYjAJrR%6LSENF{ql#(5dDGA_wjz?f7) zueXLuE6BEAh9l>UY-eOVF5@m4Pb%O^+1?=Iw2XJlxLd}AjJ!1zZ%Vc)+3u6=vWypH z9Fy@r8P{d3$~cZuiiQ95HK3l3vmaD_k*~Jo`ohV=0ZvWi$%ReuD z$kQWNubjtdWoN^OgdWPbhWGPiL+}>Hcq=;{{>di-UKbX^cc1o2TfXJxQ)XVxYt|oX zB_}2(T08hyvL`1wd(t21PhVW(Yvp|SAuLZfk+E&2yMO#4`?+9iVD93=^h2!&yCK2H z;=wB+dd)I|Ci7n8jtgbzWB=bYyeo33un)MCKY_M zZ@=>VCd#nyRq$!-Z(+Adc&6C?f1HOaIB+aEj`yvKw}DaENf+_-B2Onz*ut4f3D5Q3 zPFOpm_kW;4KX^Fwipvb_!ml_!ik%@xoU~Z;{Q`?l)z- zRffJN^;j8$r=^0AQ*{~`e6ae0x@Y!G!e;cRE^Wc2j_js2juJvepo%=G;9LVIWqO0zG2cw35@_EA&2CZO0~RaRe;p*QZx zrSo!#_W}8Sn+(y2eH>l1A-bh^E#-GVGq*NG35G|1F@r;sN7YsSF|Kq(e~(5K$kTNh zz2qSZ=5e}oCY|7c<`HPS@0ZBz-8H25K7eE@l}hXy$&BURkQvSWa1 zWKzOync>WQ=B~`{-0|G5+|FEfBr%faIVfI=-8GcE`z!nbr{q@%P{V$L~p=FFLM{`3Fee>sOwjgM!un!9|qtZDzE4gH-!`6XPz1w+$>R@Q`G z)`d|vkek9RTf!=*M5=5HyPOv3vLhUkX=KV7&a>q#=VRqD&U57)@@yk_Lla{nC&ooy zOo)P*6jS0MF)h9%4v2%|kT@)6#KYoX(_#$ygm^~ekQc;RF^+svJS+0Zr^It&7WqTs%VGlg zv^XaU$iL*}HV$lP-j^zxcwS7R=Abw)rjQ>JFNj0P4~q+82Kmfx0ke3q@$lA>@)2FT zsrfUO<~_2Ry{pSJx<)^dDIfVY%{RWLiI>D9c;~2iSsX?FsCY#@irf_!g^T<#aYNt=v#?b`<0UEfS$)c=n8EaBTvmY>u$-|`;$ zP{*uhF{=gdkyQgTGh`u|*<0codU{gLjz|4fym_)*;!z(+C}GIwRQrSqnd@5dM(6Iu z=GIozcU#qP-LGzW?pD>Wx7v+rSa15lf_t;>i{|ZM>Bi!hpK)(_GC*}Ho4x7>p;r}d zbJeYHwVE=l`)h8vUJu-@rf4@jSJb6f3mdx&$#b_ExK&@c(p&YU8#cLdHfdZ9@VG=n zC}m^4)Gd;0P{{rP+PV#g^xfAQS%O5HD;e!KB0Ny1W5kM$>F$8XB5S~c+ER6VG! z1hKWztov~`Xf^7gko8-5z~$KC%-acLX9ewPqH!8SYMYgIWn1FsdQsSy{1x5_Wr)ka7a7!2oW;oSnQ z8nGk2YJ;211nm~BQ&4I9^;%PS6&fDRA7huEYUBjC=V9ll)NFY^-*J5a8pPRzRv1A| zr=`FjOIu#-7|V-ABhJ=?I@qY{*RW12 zyP+3gSuGmv4>frjE$>}kl+9+i*aC~axqH3c^5o5Gi2L1ez3DHO)?`&Qyxwi2zH;{I z}U;y;SZ}c!|RD*Ritox9=m1=D>sVM!DmTr;LWoe--X@NSYdU7>ibgOc$z2*6# zyVVXtcg1sqP`XX&@_H?}elv8B$))00Y&3(|US$TBCF*Js39(kIQKbduVa1snyDjgs zlua4uUk*cAUulQQy@{UVOr=u8XoE^6b}AK`YNbNL9xy|w3>D z7K~|qO3&*Su6;||XHR-}u%xsgAiaKA>tbQKY;0Q1QxTZK1)Rppg%0e6tuW&?Bhlt?L4NQxt*H>@_@8To-N6+jyEA*}*j4rf)*Yb11!d(h?cGueduSgFrVLqBjlXi)W zgOFD>vt^^3>e@SZ!xZ-kfxV=?_pNRkPt$uko;ux3l#$<$G9ryP%}pC+C%6-(a+>^Z z`Ya@^2z1N^P2yZ`gZUl%f>(e?4f&C0qVOWQ#2Km!>j}sB0t7P`>^C zO)ava|7OrieKpN@q!VYN6l@fY=V5J{s)pW=?1LnPDV0O;(xDS(R!!Fb*An5&Zj6ac zq^%l}{zu05K!v`z5jf?R6dfT3)+pa!pg2ZmfUe?daImnB@gUYh3ZE6jwbRtuHXt1 zLPOvoezrlW1&Ols0(fx>R{>n9YN^am4a+F#j-G?e9YPC7KY*5fsU!I$L}9)@`We0@ zsbf1QPjVLmIOQpDunrD3z`rKAIE6bKcj+!#Y@{Nr+n&+2A`6z0&OCrVrnOB&{wwNq zkx_NvIoxm95uT!b3OtiTo4b$!SiIZ@JOFOtHh7vnsG%KkAeYhhC!c9+i*eNdOyLFE zqOZtSeSuHMsHFN7*<@_yChR|%=bqGPVW$tZ92re9UyZ?f*U558(1pNHK{l`M;yX(h z-2gD}wP56+5gSuvr`_@t8U-z{R$r|{2b5SlyzPZ;=>wwNGbh7#3r5*I_f%<07y-2f zeyjMr>(v?4U}6B}tGfj9-c~EzO_a>lRd=`9b^*%uHJ>{s)uUL=eZd_VTl1|VKfW3= zFg9*icLO(+Z4b6yH9R-+>eo-b=RTQq^Yzp3xi7rnwv<-G2QeTur&`kwt99RlB6E50 zZo>v}L#VIe@g_>=7xnVUqex?gLwg|bwkQ%QnKuIrW7O2f05 zt({wh%{5!Z;1mJpQ8l~Z&Z_FqA0(|3$=U+XVVK_g2T3zrZ$hQeGV?fTguK448Zk5@ ztJnRbUTwBzxSp8TO}Xm=4xsu&sN}v4pqBqL^IBY_4=%!jYe8Yj&rEXU`RI(V5eC5$ z@k!_RXiY}d$kH&Wt8R}F2^W1zz{(ISpQh3)lyDu}9T(}AwCATLm0m)!#PF&xHa&!~ zFH?g7&_0LT*jj~~QcTM?=o!JJoTG%mt(+ojrUe(l7v4_U=IqQU6q1_l;0mZ??V&6T zi2Y!g)8|qIas|C$0s>KT0DDuo`jAHx=|dhtDp`mPt*b}+27oODuoTqoRlFn>_rsyC{VzuyLd)`kt; zA}EAjpQI5CV-xzT`w#|}SS2+Hmn$ftZiZ0@gCcOjV1T(j7MG!Vli7Evb3XAq7#EYN zi2m9w@DdF-QT-?DB;N$v6jQNtTiFM2X{i)X^;RF=cVarQg&|28ik9O0uc92MxIZ=< zMtS@wp8p6}kVm48Il2uV&Ow0}20Tm_XrG58-0U|u;RoqM{F@k(U315cOnD`Oktp;- z8jL%AGmU%PJ*Rce?Rgk=;O@vwRHi8mDj8bWf`Yc7-1R-ZVX;K5ts@ixz^&FBMKaMPG!DwN(gR)KR#yRfiihfcHSvnn(p`R#22?;)w1?n_ z+{FRyV_U*)skhLCvF9~Bjdc<0_1L0O#TJcZbS1{n>ThucQ%JN_me#=_11hJ_7$dF= zfg+(}KtQ*DHQ4x{3yFS=HNxDpu47I3-V!Nc(>?p%X=UCr_OfwX8UkOSi?(l$19T;~ z15Oz;GlC0nV0fA%4onWM{s~t=o{Tai3q~Iose3|to&`0f_<(Y|fNn;o*fUgEzIkm( zM>TzNJK^*yXN&YCF9*gz^n1Wi$XEIgTx`f|UwjZJhX(=mkKh$)*9Q%R9lg&T2npGL z-e(|02_gbhgH+*ezQ3vz;yVQQ#R!4?h#MSF0(^*~d`+#Z4z~(-pxXL_98x#f-CAij z>NS@FREoiGP-Kpcq^dH@B%3zwYPA840Zi@1`P`PQ;|>PX+0rTX?iJ`&a%kbga|kH? z)^&E^l{;gpy6csz*WXxrJx&K<1wlQp2z#F1F(4fy%t8+Pf8z>B=W3P#RXYVJ>az^gvfu@N-AkOSCaVW?HFa6^Eh@t{>PyxLqzCkuAO?pK(H$8tp!GbF{il&nH zWqe$|ha{PetWw3ubSU6ufyLEy44O_J(?QT;io#B}5FOZpiKgN<{YetWnz(q9AqssS zz~o3edN_-~1cxD%y$~7lQUoi35!Oc8%xSGxA`^IvFonwHH6lisk`1^`aD(>r5cseM z&Y|)qo(U5dkfE6BRPRSH3Ty1s`SU&Fo5FF*vZWFWCu>}`TNfxUl)MNlMa{g(YVpRE zrG$%AScF0J5lmYl=?azJK>}4qY$F*)E&4`mki#>9iFg1NRc2lZrbYVv)k zIw-IZo*+n?#=RlTXVGT+{7sM+Uq~Zba*J|dA-ZJw%YvdTRQp}7O>ylNVRLO-{vmyh zIURd8c$P|_zyYWKG~skaTvUKC%tYLqun&{(YN@~?eCU5eZ`sHK`#_NjlVc=ymtEY+t=QH>&n$PE|(puy7uyoSIZeH zU3&ZKyO(3c_U{`|K~z74gBsk1s%EQ)18Q;F^KaE<(~q6kyCoF(t?QV=~G<^0%o6>YcuZJnR2eukB~Xi12&`nW$sC5dh zO}WBPK(hx>0|rQ!s8LE*#*n}2QzIRLKkq}4#ser~%Hv;vBF7Von6k$M>N`Xg$iygB z{GSf-?09dLX;x~+yehe!vr!JS{R!x2Y}#BJXTEsg8+Xm^J2$Znl&q#HfAIyzel!`o zC9?^Y(zKeRW5!r4xj^HC!;}R-jPU68-`xb~1Er@rs|iYDO9w$O>><{xE9B0@Qtmm( zfjfu#1$XY7$hwT?$51+!I8W~=xE^{JQAGsSRzvcV5gu6cgu?GR_7#pLuB}ly8Kr3#wb8rkYlG}=alB*Zc`nly`K$DLUno6LWiJ4yIDt2qUd`T+Qxxa zQT5a&hhB2r<`D7%+K?uqR&XGb_o*H1p?&QRpcfUynnGI|7kx+dL6(z^=hR2vOeI~~ z4+kvY-*$R}Y$s?U*c;FxaN(gpQvNjJ_BwPEEDY3UQConkPqtNR4^AZMBHZ<&`iUh4 zBiHUyJzHS%TZqZ)z&Ti18)>r1_?g3{G&Gj8^MeTcJhWQ{ErgREQ95!C!@CN8tV*PV zAmONeLEFBY)RBJB0KfNiw!kJkrv_WT#BvL+*Fap$ zN06T)QO!04y|=-PXT^+? z&d2D@IZ7U-#6?mr@IFShQBemna6Z9Kj%HxfYpWHo`8FzgNATu9lIZbP78zj!;etER z`(;xW*gMA#1DR>G!F2$PPX-+c8p;Ml1frH52mv{yCN4JMUP1w|KV-ncRd}wyiACxR zCj#J1kczjd6oPeOG8r&^U`(<1u6KT*d{IX1-WGE2c+DW@flU{;N=|x%cJ19&pferI zLC}&<1hDJ%4L>ZAqq&On9z8en8@>2x^%kN}q#npzm(_XzJ(0NYCHK1Lxht*a$)`@A zdiq)Nhq=G4rtBRrz$y)PvMIDP2)i>Z*KUiI*v7X};ANGx3_aK1q}u(?ay(f{&bU;1 zlgfa)Dj=CAFOIBdO6B*dCp|8VPOT43SnNR@g|x{o46BgWg=h@5+l!*iE5)n)Xo{rJ zsT4#|j(?#wC@o<_pXMchhY|`0$Zt`iMyU9B|1>3ewvW-oI35P)fM7hH1f_1P<5bB( zD!D`*QOvhSOh$i`xX5E*W)t^E+*u&*1NQr|>zUqk%(z4rEuAE!y6jLL&K7pZcTR=y8DRArm$dh0(SN=>fu8f+{{;8{t7}?> zQ;5LP@$DGsX|3t-U&r9TjvvydHP~z8>MR4Ss6te@s|WKD0vcg1Dtr%G1q(kOT46q% z2n(wz_8i_%7+`W^N=(2G)M*>0zx$sCGZZ?HC(KaAu3xgLnk>>l92M9O;jBVc;zR<} zrOu?^mJx#N2h$YWexi9y&P>KNod92 zGPV)88Hg2*Q5mIEvA#2?lH{-6%bsuGTp9u9h1ZA^sb5>`Je(Z$DxGgMYY6^bK%v*} z|2_u!d+1&MJ|!cP@CT@SeenH(o{>d7DLym=FnxvvO*H{OQM^ksI`0*NpUi9{F&hLF{&SEnhe(xB$XXnCN7PsO5R2(tDr-LLQv%_ zH&OK&E>m?9m#7dGV^vK>R#IidJB{lM9m8vIi&63r5lTd!{c0;YfdM3>SQb@=t? z{*m2CXD+7kWE$!VPmH6m+{k{Mfg96CEGQ<( zE5e2FnK+__DAIGn`~;hopCH=siH?&PHty26b3TE!vwPuV?PFsVcAdz61ck=(uA>I0 z8@NUxfU$cdOmi*d9__dmh@y8*_>SZiX^3q7c_Nvb00M}K4~-rN1Y;Vt$n?TA{2 zk#z^>l6-7tb%9-XjExDxQ?l|f^FlbuCwO)Fqh$V58xM&Ckv4KJX#&V}uyg4vIN{;L z4hX#MHiBCHgMfT=07rCXa!i4|KOAXT16R_%1)b^*+AAlCRZE>?s)laVsXoG_s;_of z`&}#fq=Qgum!7b0#B}WQmqHX3+X`GXWTZL-g9od&p<`We{$|721Eq&h3$b;UXSNyX zXcWu^MvpgCnTXoJC9zYkHW2?q4AbFaWEY` zR-5kq(cs0wI+9A@b)4?$M9|Z`ziw2-{5Iae5;E@ZXR42TL$bAfA0uywnTEE^`C|vV z`o|go1xwfiGsV=!L7?~lZJ3`7hS@3JccJ?_d`O+El}V)Q#Rt-0sB?Kzwc>1=)o`5R zEp~YsPwuCyW1L72l{OxTHSONTCj3?;)txxw`Pc%(86|I2V-NInPF}@J_@5Lywa>fF zK|IDepIi(iyB{2;KSjOUiVWCaJdNv&@(F37GWcg(<;48Tl;FK+`Il68kP;U2K|%{3JLlDZn_QsP3L+#Hq5=DU zFu0N*!er_U7@Y&d*^I1n&~cna=V@mKB|DpP()i_^DTBjoa9tmE&N$o7X=f5O6hAN> c$D-hzk$uj2#xM^c6zAyEsk~*R5STOm7jG7XV*mgE literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/operator.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/operator.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ea7125725c9ad94303f126b5c902471327c906a GIT binary patch literal 13954 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 YUX^^8{FmjO&0W~{9JAm#{z3lz4|Tt6hX4Qo literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/os.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/os.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75a14f36bf79d482d08ac7f3ac6c67c63a33b5c2 GIT binary patch literal 29669 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 NU5_WX5PP}w{|0;U`%M4< literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/posixpath.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/posixpath.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d318b8fb60fc4dd9873e6b165691af9e23e07ef GIT binary patch literal 10464 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/re.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/re.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f391a4171a330a090b9f8f335424dc87dd85a7bf GIT binary patch literal 14099 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 QKAkJ(ijzg7n3>M~H>vVNdjJ3c literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/reprlib.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/reprlib.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcb68cbe4f96824ed5fd85b353909d34d31733c0 GIT binary patch literal 5441 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 uI(9_*sbs!H?S$E9R5$J#EnJ( literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/shutil.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/shutil.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8e10c3fa40a069e2ebdea25b2dca8e605ff6661 GIT binary patch literal 30745 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/sre_constants.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/sre_constants.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d14f046bb857b5c8937c6ad64c9786560d7f124 GIT binary patch literal 6013 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 R@DCAqlv(-2BRCh8{{R~~6p;V` literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/sre_parse.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/sre_parse.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6cdc91a3f53f77663d885344f740f5923bf55f2 GIT binary patch literal 20399 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/stat.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/stat.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c34fbdc980b4e344d54f6e6e42eedfe475f1686 GIT binary patch literal 3892 zcmb7GOLN;s62?FfMNv=Nviy*2BeoTZwnaI9D2nYkqDWA}S|qptXh~Dq;!TiXK;&ONBsusH&LH~ z+x&C5!)IZh&mqSoa=nGzZ(|&HFrIn5Qz$QB-(9qSfqwVU|2}ek04e?u7Wg9EpJWzJ1_6t*+Y)QSX;(PIjp zAkM(o*x%>Ow*BVXeo1G#?Kd6zCEI?t+kSW2e)G;%^m~dkU4?HD=Oe#bf8m>qVv#^R8UBhhZn2En(2A^T{>j%TY zV5Oe7r46YusYp&?H}Nl7Of!kDEvX@IN|3RnWcGD4(`4{h zZ#w?IXsG@RN2MoW7(|xTnp<~fJ$0`M4(iCIT4|`;j_NtSx_yvP@rO}VU!cQWG8O9X zUt^N=tCVDcLc_!mJ}iVkGYg{G^cPwfPyWE#Z#iP4;-h}xzi2iVQahpob*H1&-R;E( zZRLJyae*?CY8?avR$0#*S?xRpLJ>)d7)AW3NY_6hQgFPgaJLJ*&ZJvq>u5hY;Qyip{vY=;&>C0tx^F5R)yB3;L=o@jC z#Tk^}o!xg3dU86U>Whk~RPp6dy_QpTD|Ho|@7-#&(Tf&_aQ#jo{ zol{QF8R}f4vWFF{<+hyUabjqF53x9HIU4=6i`k`5VRq+qX5PWxcC+qQ)wW1MS{x&(*#t`1(i!dB}q^X5cIkU+TMcp6h0PTN#YR-5s|W1z_Tpsd2Vlpf~lpm zNUf}In7XZnUD~FWiEJC2rAR1QW+-fQgw2j%ZfvebKC5Oi^63bh9RYoe$j7kPBA<@1 zNy1<$S1uUYQohKCQPlJKlAT^z*Fr%zzu4QYn_9*;%&ij^t&lOdiZ)X3ovIz)wVtW;f~~FM z8g7*>8y7WyVqC#6^XYYdy=Pp(urYx+xIjBPi;JJ-(mx?l(T6&eIgx3E{8i` z;}?2H(bh5w>su$LGqqycw6t>3K+^nj&oC=8QtycvtS!sd@+XpoeMQ4eV;Xyx>bY*( zC5*biOdp@YkRE=AYeF=;i$eH)8-DM_pJ0jEuRBkvDtiAxP!xroxRiJ-K6tEGiFaSI nW44pyqn>xoOco`^I#*ndvpCfx_AY6-FFyXkCn+*kwQ=@8^F)Ed literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/struct.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/struct.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e201629e2333bb20450d7954fce69bca2457630e GIT binary patch literal 353 zcmYk1zfQw25Qpu!P1F2&2i7n&Ls7+m5DOzLMMAQWEaNk6gi}WsXDDyPD`jQk6_~iB zMZ%K5`+m0WWUq@NP1(f@=Zt-^e=8xsqupH-fB}aH1k7L#F)Vh8WRSqp@u#t-jyI8v z_~;qAkb*qlva*ng(av=Bhn2Hdn|HY!sp>=UL);&xqwG}G8~R3Ob+D+;H}N)LZ^AIQ zh#tS`C9LEFza(VJIIGcUv$qr%N`W^@J(jc4wR1|zh3ck$oKqvlginU!$0q#TSLl7H z+PY~Uj@!Pq_^bovW7zvcwc4QuXaAzBUpH6huwHGd)8tiq9Fm*HL+|XZpvhfMNO>e8 J5sQT9{1;EzUw8lj literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/tarfile.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/tarfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ce7df4bb2085657aefef8dea8332a931dc80bca GIT binary patch literal 62688 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 A+yDRo literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/tempfile.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/tempfile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aea868f057f8d1e9e0769934782db950ceafb435 GIT binary patch literal 22268 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/__pycache__/tokenize.cpython-36.pyc b/python/.gradle/python/lib/python3.6/__pycache__/tokenize.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc317910304b5f847a55c08160143e0c79ae3618 GIT binary patch literal 18688 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 kq``7~@eBY$uhkpr&LOH6NsXzY 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

i{RVg= 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 L8I74EXdn7t4ndpA literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/_bootlocale.py b/python/.gradle/python/lib/python3.6/_bootlocale.py new file mode 120000 index 0000000..88d8868 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/_bootlocale.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/_bootlocale.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/_collections_abc.py b/python/.gradle/python/lib/python3.6/_collections_abc.py new file mode 120000 index 0000000..db4771b --- /dev/null +++ b/python/.gradle/python/lib/python3.6/_collections_abc.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/_collections_abc.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/_dummy_thread.py b/python/.gradle/python/lib/python3.6/_dummy_thread.py new file mode 120000 index 0000000..d6b455c --- /dev/null +++ b/python/.gradle/python/lib/python3.6/_dummy_thread.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/_dummy_thread.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/_weakrefset.py b/python/.gradle/python/lib/python3.6/_weakrefset.py new file mode 120000 index 0000000..9bb5110 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/_weakrefset.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/_weakrefset.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/abc.py b/python/.gradle/python/lib/python3.6/abc.py new file mode 120000 index 0000000..ad8993c --- /dev/null +++ b/python/.gradle/python/lib/python3.6/abc.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/abc.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/base64.py b/python/.gradle/python/lib/python3.6/base64.py new file mode 120000 index 0000000..cfb5707 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/base64.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/base64.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/bisect.py b/python/.gradle/python/lib/python3.6/bisect.py new file mode 120000 index 0000000..3f13d14 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/bisect.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/bisect.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/codecs.py b/python/.gradle/python/lib/python3.6/codecs.py new file mode 120000 index 0000000..8bcde96 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/codecs.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/codecs.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/collections b/python/.gradle/python/lib/python3.6/collections new file mode 120000 index 0000000..7474fca --- /dev/null +++ b/python/.gradle/python/lib/python3.6/collections @@ -0,0 +1 @@ +/usr/lib64/python3.6/collections \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/config-3.6m-x86_64-linux-gnu b/python/.gradle/python/lib/python3.6/config-3.6m-x86_64-linux-gnu new file mode 120000 index 0000000..12a3719 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/config-3.6m-x86_64-linux-gnu @@ -0,0 +1 @@ +/usr/lib64/python3.6/config-3.6m-x86_64-linux-gnu \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/copy.py b/python/.gradle/python/lib/python3.6/copy.py new file mode 120000 index 0000000..734edd5 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/copy.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/copy.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/copyreg.py b/python/.gradle/python/lib/python3.6/copyreg.py new file mode 120000 index 0000000..4e66899 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/copyreg.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/copyreg.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/distutils/__init__.py b/python/.gradle/python/lib/python3.6/distutils/__init__.py new file mode 100644 index 0000000..b9b0f24 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/distutils/__init__.py @@ -0,0 +1,134 @@ +import os +import sys +import warnings + +# opcode is not a virtualenv module, so we can use it to find the stdlib +# Important! To work on pypy, this must be a module that resides in the +# lib-python/modified-x.y.z directory +import opcode + +dirname = os.path.dirname + +distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") +if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): + warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") +else: + __path__.insert(0, distutils_path) # noqa: F821 + if sys.version_info < (3, 4): + import imp + + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + else: + import importlib.machinery + + distutils_path = os.path.join(distutils_path, "__init__.py") + loader = importlib.machinery.SourceFileLoader("_virtualenv_distutils", distutils_path) + if sys.version_info < (3, 5): + import types + + real_distutils = types.ModuleType(loader.name) + else: + import importlib.util + + spec = importlib.util.spec_from_loader(loader.name, loader) + real_distutils = importlib.util.module_from_spec(spec) + loader.exec_module(real_distutils) + + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig # isort:skip + +try: + basestring +except NameError: + basestring = str + +# patch build_ext (distutils doesn't know how to get the libs directory +# path on windows - it hardcodes the paths around the patched sys.prefix) + +if sys.platform == "win32": + from distutils.command.build_ext import build_ext as old_build_ext + + class build_ext(old_build_ext): + def finalize_options(self): + if self.library_dirs is None: + self.library_dirs = [] + elif isinstance(self.library_dirs, basestring): + self.library_dirs = self.library_dirs.split(os.pathsep) + + self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) + old_build_ext.finalize_options(self) + + from distutils.command import build_ext as build_ext_module + + build_ext_module.build_ext = build_ext + +# distutils.dist patches: + +old_find_config_files = dist.Distribution.find_config_files + + +def find_config_files(self): + found = old_find_config_files(self) + if os.name == "posix": + user_filename = ".pydistutils.cfg" + else: + user_filename = "pydistutils.cfg" + user_filename = os.path.join(sys.prefix, user_filename) + if os.path.isfile(user_filename): + for item in list(found): + if item.endswith("pydistutils.cfg"): + found.remove(item) + found.append(user_filename) + return found + + +dist.Distribution.find_config_files = find_config_files + +# distutils.sysconfig patches: + +old_get_python_inc = sysconfig.get_python_inc + + +def sysconfig_get_python_inc(plat_specific=0, prefix=None): + if prefix is None: + prefix = sys.real_prefix + return old_get_python_inc(plat_specific, prefix) + + +sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ +sysconfig.get_python_inc = sysconfig_get_python_inc + +old_get_python_lib = sysconfig.get_python_lib + + +def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + if standard_lib and prefix is None: + prefix = sys.real_prefix + return old_get_python_lib(plat_specific, standard_lib, prefix) + + +sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ +sysconfig.get_python_lib = sysconfig_get_python_lib + +old_get_config_vars = sysconfig.get_config_vars + + +def sysconfig_get_config_vars(*args): + real_vars = old_get_config_vars(*args) + if sys.platform == "win32": + lib_dir = os.path.join(sys.real_prefix, "libs") + if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: + real_vars["LIBDIR"] = lib_dir # asked for all + elif isinstance(real_vars, list) and "LIBDIR" in args: + real_vars = real_vars + [lib_dir] # asked for list + return real_vars + + +sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ +sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/python/.gradle/python/lib/python3.6/distutils/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/distutils/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..815f8840849ac4d77f689b489bb14add14244c6b GIT binary patch literal 3182 zcma)8TXWmS6~+P}2vQV9N!G=3F03mhVdPM*Bs+k zzdUbQKU?RXOPK#2Z{D^oOIng879W2ZXXV=FcKLORPc;)aqy<}>S&GH8a^=v{|0qvt@}_FWbJCMc z`LZgjShaf2$mR2?E-e=L;v@!N!UIlTj4#DY(j$L-x%9URfB!12SNMuriC5Kfe0jv+ zW4)BF!N+2JC4PtGY8m_9E!Xd;5`l?{Dx8?DN$J%)+iU?E0|WH5l(wAMp<+J6YV3Glw=j{)GLF zmpm5sw+0tdb|~1=f9D2vh~v9*VT2Bi0f)2 zzQMQUWjQYwUNU}DZO6Y=Hw9j`A#Oms!#|a4a#3D__Llk-+FQ`xf_4Ym+x(7PlFRUT zSKWc`E_8RHyDixht8?WQL1)+0WRw?2MU>=cdruEk`#93YQIM$gxINXh2SIok?5lQA zv^Vm0Fc_#n=j|eE@2Pf_whQdbgT87fSr`;imbL?ENqCwUs{h8(?_N1L^p%T&FNrrt ziRn?sI-3z9N~1!E?%?!Q1*RR_xMW~z@E2xjFWNVi=TW+Sqr*&X?2Rcj1h~2mRmdh==u3xvhByBf!_bP+J%_$t*vDL0={p4@S%Lo0 zU7E#CfgTz`DoX1ZD2JpP`$Y}i0Xyo50^KpR2z}DRvCgihqqzGx+RHn$ypcqEI?$&` zfzC}m%A+(df;3d7z8B;wFLadR=jMYXDvX`wraB0UgIo=a2TP?3^nCni|y{t*0hXU=W3{z;r9;Syn(@Db>_1MYuRh; zY;77?_hMYT9oP6mq=1zWrY=N3lSc{78$$d5gpM_(^D^>t!(|*(R`)iYN>K3G+tnrn z5){j7Czuqd;E26o1&aX_Fx;xNU)ZTDofkG_PV5$y*c+mvlXVqyrVmcm3x5bsd}#f3 z^@THZ;u^7{elTQleOU724-cMMSj~_opySY4ho0s`HnjKI3Or7r ztZO)h17dqQ_a1-o;NchFbn0gDb)hDZJ;sGG2B%NO>SelL0{9$ssla*$1F?Nr=&P7^ z9ODLhKj*cQ)5r_2;wWOviwV2@c8Sj&d3&R+jEw%te(yMRK8Mda3X)5&VIROH5 zVrl{)eJ6{1o~>_Ji;sN|in}wW-k5-bhI6!IR(LwlDiqnC@we)34zE82x?^A5e zsh=+W?_k_=Y*7n}p3eGWvfm|%X-&Ah)RdALbpp$=n1j%@I>yb1-zrS=4+ZYLy`w^X zu63pj{vCLo2%(8Mbd?652D(s8Z5K2(wsmk_>MaQQm1!cnVb<@X*SgcYro0OD5}D2a z!i=}3cGLJCfB-zFm6fw1HcQx!sHA(i}`2`ZtlkqI>{pCipVjOs3_ z2#@D*P1LCAHZ%UcakB0c6!RViAAIFkeA~BIS(`QN2Jr0LYgji+#>E$N;^4YtL)QXV lcy`OSv9HDIl?L{->J8g-eaD~kUC*g|U_krL*Prp(e*qgUNlpL& literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/distutils/distutils.cfg b/python/.gradle/python/lib/python3.6/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/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/python/.gradle/python/lib/python3.6/encodings b/python/.gradle/python/lib/python3.6/encodings new file mode 120000 index 0000000..fa146c6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/encodings @@ -0,0 +1 @@ +/usr/lib64/python3.6/encodings \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/enum.py b/python/.gradle/python/lib/python3.6/enum.py new file mode 120000 index 0000000..d881eda --- /dev/null +++ b/python/.gradle/python/lib/python3.6/enum.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/enum.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/fnmatch.py b/python/.gradle/python/lib/python3.6/fnmatch.py new file mode 120000 index 0000000..1bfc742 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/fnmatch.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/fnmatch.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/functools.py b/python/.gradle/python/lib/python3.6/functools.py new file mode 120000 index 0000000..cd26387 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/functools.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/functools.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/genericpath.py b/python/.gradle/python/lib/python3.6/genericpath.py new file mode 120000 index 0000000..2bb5fc6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/genericpath.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/genericpath.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/hashlib.py b/python/.gradle/python/lib/python3.6/hashlib.py new file mode 120000 index 0000000..e93fcfb --- /dev/null +++ b/python/.gradle/python/lib/python3.6/hashlib.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/hashlib.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/heapq.py b/python/.gradle/python/lib/python3.6/heapq.py new file mode 120000 index 0000000..1dac698 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/heapq.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/heapq.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/hmac.py b/python/.gradle/python/lib/python3.6/hmac.py new file mode 120000 index 0000000..f5a63c8 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/hmac.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/hmac.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/imp.py b/python/.gradle/python/lib/python3.6/imp.py new file mode 120000 index 0000000..3d046d7 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/imp.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/imp.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/importlib b/python/.gradle/python/lib/python3.6/importlib new file mode 120000 index 0000000..d154091 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/importlib @@ -0,0 +1 @@ +/usr/lib64/python3.6/importlib \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/io.py b/python/.gradle/python/lib/python3.6/io.py new file mode 120000 index 0000000..930d980 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/io.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/io.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/keyword.py b/python/.gradle/python/lib/python3.6/keyword.py new file mode 120000 index 0000000..6dd2072 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/keyword.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/keyword.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/lib-dynload b/python/.gradle/python/lib/python3.6/lib-dynload new file mode 120000 index 0000000..80a1ccf --- /dev/null +++ b/python/.gradle/python/lib/python3.6/lib-dynload @@ -0,0 +1 @@ +/usr/lib64/python3.6/lib-dynload \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/linecache.py b/python/.gradle/python/lib/python3.6/linecache.py new file mode 120000 index 0000000..44ba043 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/linecache.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/linecache.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/locale.py b/python/.gradle/python/lib/python3.6/locale.py new file mode 120000 index 0000000..e960a21 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/locale.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/locale.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/no-global-site-packages.txt b/python/.gradle/python/lib/python3.6/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/python/.gradle/python/lib/python3.6/ntpath.py b/python/.gradle/python/lib/python3.6/ntpath.py new file mode 120000 index 0000000..f811ee9 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/ntpath.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/ntpath.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/operator.py b/python/.gradle/python/lib/python3.6/operator.py new file mode 120000 index 0000000..c57f5e1 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/operator.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/operator.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/orig-prefix.txt b/python/.gradle/python/lib/python3.6/orig-prefix.txt new file mode 100644 index 0000000..e25db58 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/orig-prefix.txt @@ -0,0 +1 @@ +/usr \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/os.py b/python/.gradle/python/lib/python3.6/os.py new file mode 120000 index 0000000..0a1739b --- /dev/null +++ b/python/.gradle/python/lib/python3.6/os.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/os.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/posixpath.py b/python/.gradle/python/lib/python3.6/posixpath.py new file mode 120000 index 0000000..fe85850 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/posixpath.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/posixpath.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/random.py b/python/.gradle/python/lib/python3.6/random.py new file mode 120000 index 0000000..d70b048 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/random.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/random.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/re.py b/python/.gradle/python/lib/python3.6/re.py new file mode 120000 index 0000000..0bd28e6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/re.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/re.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/reprlib.py b/python/.gradle/python/lib/python3.6/reprlib.py new file mode 120000 index 0000000..1def0fd --- /dev/null +++ b/python/.gradle/python/lib/python3.6/reprlib.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/reprlib.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/rlcompleter.py b/python/.gradle/python/lib/python3.6/rlcompleter.py new file mode 120000 index 0000000..5c8d7ac --- /dev/null +++ b/python/.gradle/python/lib/python3.6/rlcompleter.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/rlcompleter.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/shutil.py b/python/.gradle/python/lib/python3.6/shutil.py new file mode 120000 index 0000000..c6a5fec --- /dev/null +++ b/python/.gradle/python/lib/python3.6/shutil.py @@ -0,0 +1 @@ +/usr/lib64/python3.6/shutil.py \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/INSTALLER b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/LICENSE b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/LICENSE new file mode 100644 index 0000000..3d82c28 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2017-2020 Ingy döt Net +Copyright (c) 2006-2016 Kirill Simonov + +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. diff --git a/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/METADATA b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/METADATA new file mode 100644 index 0000000..a70dd20 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/METADATA @@ -0,0 +1,41 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 5.3.1 +Summary: YAML parser and emitter for Python +Home-page: https://github.com/yaml/pyyaml +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: https://pypi.org/project/PyYAML/ +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Cython +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +YAML is a data serialization format designed for human readability +and interaction with scripting languages. PyYAML is a YAML parser +and emitter for Python. + +PyYAML features a complete YAML 1.1 parser, Unicode support, pickle +support, capable extension API, and sensible error messages. PyYAML +supports standard YAML tags and provides Python-specific tags that +allow to represent an arbitrary Python object. + +PyYAML is applicable for a broad range of tasks from complex +configuration files to object serialization and persistence. + diff --git a/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/RECORD b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/RECORD new file mode 100644 index 0000000..4a13e7a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/RECORD @@ -0,0 +1,40 @@ +PyYAML-5.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyYAML-5.3.1.dist-info/LICENSE,sha256=xAESRJ8lS5dTBFklJIMT6ScO-jbSJrItgtTMbEPFfyk,1101 +PyYAML-5.3.1.dist-info/METADATA,sha256=xTsZFjd8T4M-5rC2M3BHgx_KTTpEPy5vFDIXrbzRXPQ,1758 +PyYAML-5.3.1.dist-info/RECORD,, +PyYAML-5.3.1.dist-info/WHEEL,sha256=OtOo_3rwwCWAklSC2BhCqBMJ_R3ddO6iBBnDrB96wZw,104 +PyYAML-5.3.1.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 +yaml/__init__.py,sha256=XFUNbKTg4afAd0BETjGQ1mKQ97_g5jbE1C0WoKc74dc,13170 +yaml/__pycache__/__init__.cpython-36.pyc,, +yaml/__pycache__/composer.cpython-36.pyc,, +yaml/__pycache__/constructor.cpython-36.pyc,, +yaml/__pycache__/cyaml.cpython-36.pyc,, +yaml/__pycache__/dumper.cpython-36.pyc,, +yaml/__pycache__/emitter.cpython-36.pyc,, +yaml/__pycache__/error.cpython-36.pyc,, +yaml/__pycache__/events.cpython-36.pyc,, +yaml/__pycache__/loader.cpython-36.pyc,, +yaml/__pycache__/nodes.cpython-36.pyc,, +yaml/__pycache__/parser.cpython-36.pyc,, +yaml/__pycache__/reader.cpython-36.pyc,, +yaml/__pycache__/representer.cpython-36.pyc,, +yaml/__pycache__/resolver.cpython-36.pyc,, +yaml/__pycache__/scanner.cpython-36.pyc,, +yaml/__pycache__/serializer.cpython-36.pyc,, +yaml/__pycache__/tokens.cpython-36.pyc,, +yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 +yaml/constructor.py,sha256=O3Uaf0_J_5GQBoeI9ZNhpJAhtdagr_X2HzDgGbZOMnw,28627 +yaml/cyaml.py,sha256=LiMkvchNonfoy1F6ec9L2BiUz3r0bwF4hympASJX1Ic,3846 +yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837 +yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006 +yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 +yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 +yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061 +yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 +yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 +yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794 +yaml/representer.py,sha256=82UM3ZxUQKqsKAF4ltWOxCS6jGPIFtXpGs7mvqyv4Xs,14184 +yaml/resolver.py,sha256=DJCjpQr8YQCEYYjKEYqTl0GrsZil2H4aFOI9b0Oe-U4,8970 +yaml/scanner.py,sha256=KeQIKGNlSyPE8QDwionHxy9CgbqE5teJEz05FR9-nAg,51277 +yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 +yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/WHEEL b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/WHEEL new file mode 100644 index 0000000..8797eaa --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: false +Tag: cp36-cp36m-linux_x86_64 + diff --git a/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/top_level.txt b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/top_level.txt new file mode 100644 index 0000000..e6475e9 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/PyYAML-5.3.1.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_yaml +yaml diff --git a/python/.gradle/python/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/__pycache__/easy_install.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b28366e5025807f24156b64eaca649de0106ad1 GIT binary patch literal 277 zcmXr!<>lJA@^@Sv0|UcjAcg}bAj<)Wi(GxPF=}x7g$3Q}UDJ<3URD5_41I%+2)?X6YlFp;u6Oi^C>2KczG$ S)s7KpP%+3f7A6ix9!3C5z)o`j literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/INSTALLER b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/LICENSE b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/LICENSE new file mode 100644 index 0000000..aca943e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/LICENSE @@ -0,0 +1,22 @@ +---------------------------------------------------------------------------- +Copyright (c) 2010 Raymond L. Buvel +Copyright (c) 2010 Craig McQueen + +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. +---------------------------------------------------------------------------- diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/METADATA b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/METADATA new file mode 100644 index 0000000..931dc0f --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/METADATA @@ -0,0 +1,159 @@ +Metadata-Version: 2.1 +Name: crcmod +Version: 1.7 +Summary: CRC Generator +Home-page: http://crcmod.sourceforge.net/ +Author: Ray Buvel +Author-email: rlbuvel@gmail.com +License: MIT +Download-URL: http://sourceforge.net/projects/crcmod +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: Intended Audience :: End Users/Desktop +Classifier: Intended Audience :: Information Technology +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: C +Classifier: Programming Language :: C++ +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +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: Topic :: Communications +Classifier: Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator +Classifier: Topic :: Scientific/Engineering :: Mathematics +Classifier: Topic :: Utilities + +=========================== +crcmod for Calculating CRCs +=========================== + +The software in this package is a Python module for generating objects that +compute the Cyclic Redundancy Check (CRC). There is no attempt in this package +to explain how the CRC works. There are a number of resources on the web that +give a good explanation of the algorithms. Just do a Google search for "crc +calculation" and browse till you find what you need. Another resource can be +found in chapter 20 of the book "Numerical Recipes in C" by Press et. al. + +This package allows the use of any 8, 16, 24, 32, or 64 bit CRC. You can +generate a Python function for the selected polynomial or an instance of the +Crc class which provides the same interface as the ``md5`` and ``sha`` modules +from the Python standard library. A ``Crc`` class instance can also generate +C/C++ source code that can be used in another application. + +---------- +Guidelines +---------- + +Documentation is available from the doc strings. It is up to you to decide +what polynomials to use in your application. If someone has not specified the +polynomials to use, you will need to do some research to find one suitable for +your application. Examples are available in the unit test script ``test.py``. +You may also use the ``predefined`` module to select one of the standard +polynomials. + +If you need to generate code for another language, I suggest you subclass the +``Crc`` class and replace the method ``generateCode``. Use ``generateCode`` as +a model for the new version. + +------------ +Dependencies +------------ + +Python Version +^^^^^^^^^^^^^^ + +The package has separate code to support the 2.x and 3.x Python series. + +For the 2.x versions of Python, these versions have been tested: + +* 2.4 +* 2.5 +* 2.6 +* 2.7 + +It may still work on earlier versions of Python 2.x, but these have not been +recently tested. + +For the 3.x versions of Python, these versions have been tested: + +* 3.1 + +Building C extension +^^^^^^^^^^^^^^^^^^^^ + +To build the C extension, the appropriate compiler tools for your platform must +be installed. Refer to the Python documentation for building C extensions for +details. + +------------ +Installation +------------ + +The crcmod package is installed using ``distutils``. +Run the following command:: + + python setup.py install + +If the extension module builds, it will be installed. Otherwise, the +installation will include the pure Python version. This will run significantly +slower than the extension module but will allow the package to be used. + +For Windows users who want to use the mingw32 compiler, run this command:: + + python setup.py build --compiler=mingw32 install + +For Python 3.x, the install process is the same but you need to use the 3.x +interpreter. + +------------ +Unit Testing +------------ + +The ``crcmod`` package has a module ``crcmod.test``, which contains unit +tests for both ``crcmod`` and ``crcmod.predefined``. + +When you first install ``crcmod``, you should run the unit tests to make sure +everything is installed properly. The test script performs a number of tests +including a comparison to the direct method which uses a class implementing +polynomials over the integers mod 2. + +To run the unit tests on Python >=2.5:: + + python -m crcmod.test + +Alternatively, in the ``test`` directory run:: + + python test_crcmod.py + +--------------- +Code Generation +--------------- + +The crcmod package is capable of generating C functions that can be compiled +with a C or C++ compiler. In the test directory, there is an examples.py +script that demonstrates how to use the code generator. The result of this is +written out to the file ``examples.c``. The generated code was checked to make +sure it compiles with the GCC compiler. + +------- +License +------- + +The ``crcmod`` package is released under the MIT license. See the ``LICENSE`` +file for details. + +------------ +Contributors +------------ + +Craig McQueen + + diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/RECORD b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/RECORD new file mode 100644 index 0000000..fc8edcb --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/RECORD @@ -0,0 +1,16 @@ +crcmod-1.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +crcmod-1.7.dist-info/LICENSE,sha256=iUgHaIJvQI2uofPK_wUJwsyWBuEPa7DM_RKj1gSELDU,1249 +crcmod-1.7.dist-info/METADATA,sha256=B4GgBRlVGbZa7btv6djXnbxaK0Rsy7P6D0VgFM3Lavs,5229 +crcmod-1.7.dist-info/RECORD,, +crcmod-1.7.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +crcmod-1.7.dist-info/top_level.txt,sha256=cAzaN03P6VQ8WGDLTMMtjwtm-Nm-xzRFhEdYAVSHLY0,7 +crcmod/__init__.py,sha256=CPAYCR1UEkQ-odKmeqN0rEW2DRUNyAl94O7DGFgv3Wo,194 +crcmod/__pycache__/__init__.cpython-36.pyc,, +crcmod/__pycache__/_crcfunpy.cpython-36.pyc,, +crcmod/__pycache__/crcmod.cpython-36.pyc,, +crcmod/__pycache__/predefined.cpython-36.pyc,, +crcmod/__pycache__/test.cpython-36.pyc,, +crcmod/_crcfunpy.py,sha256=BGuKDD40o5kgI12HjlAi7WlR33QDFFStr1i95GUuqiA,3702 +crcmod/crcmod.py,sha256=LONNVL0hChZ4UWHVyuC5GJSkuoVF6KbwR7sIIJpnKds,16610 +crcmod/predefined.py,sha256=aVdEmg0NEgRjoqrfMxYakpkegUNip39czHo4pNcaj54,9606 +crcmod/test.py,sha256=ByPQWhOjaagmG2UIE1iTKlTnkFtsUMQoGkKjUQ9_GRo,18433 diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/WHEEL b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/WHEEL new file mode 100644 index 0000000..b552003 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/top_level.txt b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/top_level.txt new file mode 100644 index 0000000..3bb3157 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod-1.7.dist-info/top_level.txt @@ -0,0 +1 @@ +crcmod diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/crcmod/__init__.py new file mode 100644 index 0000000..80f2ac3 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod/__init__.py @@ -0,0 +1,8 @@ +try: + from crcmod.crcmod import * + import crcmod.predefined +except ImportError: + # Make this backward compatible + from crcmod import * + import predefined +__doc__ = crcmod.__doc__ diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7b1ed461b93ab0760b26a237dfd66bd3079609e GIT binary patch literal 293 zcmYLD!AiqG5S`g3HKa{N@Dsd5NF(&(LBxX|ym(Pi_uwMg5z{8S%O+L(N#bAl8M%7$ z7xd!T6rJI{H#0mQGfR?q`|bPg9RNNUe>LLigwdQbt#&nNtl$b*MTJsagV_s!28-Aq zBK-E+AvTUc2Df0u4Um|JGSuP{(!nPuL5dyjU!+5s6uzjfp7tVlHmmcb>7g{F<*+|> zqx0HX-=2AIy^Q}2-Ih|?7D~N>4>@{GU$eZeUG7SkEseV`7NoQ1N1`etd+_qqn0emE h=1P^OY?Ye2RTmxcE6a+Gk#m|clfVeaI1v#}@COG4OTYjC literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/_crcfunpy.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/_crcfunpy.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aea0fd889645c42f248fcff222146a16e51fac53 GIT binary patch literal 2601 zcmcJROK;Oa5XX1@$g8wX%Nq*hfDn-gEooF$0+m7miA#le2nhjE;@K9L#13nxG{_Ya z<;x(xk*}Qc72ptNCeWmYTtcw5JNxji=QscLu9v5$bF*K6yxyG=;+q({3@oo>3SMFc z0_11$LVy7#S_u}|Xbng~8m$Q#$fC6%2UBQmI0n;bQ!oRwXw#5~IkXv=hvR6oZ~{)E z&B3WBqIlYo_zJq{ohGIYOu-Unp@>8%4-7pY8XynkCmEWNIFS1?k~W(Z*3`kI4Z#YhAM#DR9@ivUNIHtTx<-&n&+t43_=}epLSa6zSh2ub4}Isb!XRA z?_5ckBZ{Js?#krl~1;w<*OJNI00h>gu|4@VXao;ps4 ze!UZ_plHVy)WTY9qLZ;5*6IzVGx%UE_ZYLE<*3Cbkku<#45%*H+ZmacdLC;N_Eu9! zetD~>scdUp>_X2{mZyx|)N_=P9z%|%*il`=)}*J$vF(Vb6kCq#11$Uz*QLX_Uj7|d zFm4Ml*9FBF<8Q19u&6c^YkSk}VX(XGAaS??tN#LXW2J)A9D%tk^+{~|JIvbOV6Gm* zEDT@{LCo7nA*?!45Id}I2bCNXZT=$lD^1*uPs1Q=5d3)Qd_YNQCHC%U|5NDZbz zNqXZV@%k!P?k0&)k~1TTCM8KvOh%G&ML$depd@EU0!&nr2JLOVkG+qk=u*rEOxz>5 zXUrAH@+_AhCFxL}^CRgdBF_-j0BB4K{%)4b`gsxqMOqk%F_q`{&0oa%%EZ9m#t0W2vb_v@yi&K2|@@c8* wAmR<2H$mPv_}k+p$^vWR=aEC_8=rK18fR|dzeT&D*7yg4Ht0+?lTO}00peTEEdT%j literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/crcmod.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/crcmod.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bed676ee6284f2216b004d9bf57d8dd5c4158bca GIT binary patch literal 11111 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/predefined.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/predefined.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34e2a1ad01b1004970cd4787723806447cc5ed67 GIT binary patch literal 4537 zcmai1TaX-88Sb9$x$Nwf&1JJdNGCwT1ZJ~4dr80qNp?3}LYA;eNNgcvZ~tdz&+g3h zq`PNtY)HrkVnif>iV7ll$0%rNRVXdXDy*`s@&XSQRkl27sl*pwe1ekrozuO$vm{ma z)SNkA|KIul|9s~g%ndEm0~5;R7oSf7&BuO zH#JI_IwdJZ4NQk!rF1b#jnqWVOp~|;xRu)I8ra+MW)<*iS|j;uX)SdCucJ=7HsT9> z9bFH*M(e@90eAx$v@x=80=|)MqMIYU8F&lb0vyKA0B@yRCB6;qv%p=njk;m)!AHc; zQ7`qOeLp?}z}smDurBfKz<1CmXs7hoPrHEcq)*Ctf`1qAZrTI8Xs^;B@DL44ychUx z;Ctv^x-ZISAMpLOpGG450Pq2NFv`E5Mu88~A=zGq$HTx6(UB;=N=Jb|MP?LVrB4Gt zOpio-m5u@D=`)fq^09!&$d;IZ8E}D$G>-TjcmjBmN>m1}06V}{Ixevb>;d~!qbaHH zG|d3d(j2hRcbXmro~IM^SY$s5e2N~Y(-B?(K0{AP{xn)V34E458{ug>2mCpDiasCd z@ig!k=ouML@XrH3OV82sk^PInU!pJ53(~(zUjhCqeT`m}_Lu1Ez%SD`=oQ#sLi<;X z$zsNg(>Li`XB0ER6*Gx%s;HO^^lkbMeV4vR->28;2gRhBo;k+iL&_r$nT@Q8HM2Bp zT!<~GW(#YWXk{%6s;aOAYb3Q(!P_?0#*&kX^O}1-yM``Iw6nGabwNF?vKE$PZ95hG zrois$RCX%oW5?e+qR)~x$3ySafMrHlm$$^xk9aC8@sNgb(JR%ETuB&+Iwr2TQ;FZ zwl}vav)tS+S)O;*_A6S~HNCQ%PN1tn;|Qi4N!=i)+y9j1I zQijL_;LWELg}?nWXtD=A16g9WFO%pQ7($hwi>t~dBocK)Fe+84BnXu%XSf+vRt0Yg>OGVf5< zw}$H6lx?@rH!~AO+8-kRtOH7Ol#R==N}Z_dqZ07_7(M=uUFXQ}>CO@_M6^Ra-9x;< zFFu8I{(^B@>YC3=jJP*xHp`3-MUcPn3Yb4_1yjyBBwq8zBBc&{WBj*2gGrys=K9S9 zS{}{y^U8SzyW$M?7Zy&Nqq53>-6P(kF60q&a=)zd?fb<0N#>S$I7s_sm7m+Vn4fKP z-_I7TlE-9zg97grkpCnDl2pX16|<5kySlqplq}x59*X?_?_kOKmg|%AE!W3Cy#Gm+ z|53lF@YvfMmAN*dYOXI^D6tvWn$21=Qm$`rhp_?=p=d+K{B(x~_O25r&*PJk}D6 z779X^tE?!;rZ=}ARsPR^Old*9>Uexc4*CI6aOZvi*9rjSci=rY{%-bg-}|2T0@ww-fKTo z9P3C#io?N#Q(>M|e4y_>QI~FB>whlu?maJ;t_|Bg?yhPwAKr1eNwLKiA|CN8hIJ5M z?@ko+%7n6@oDjd_#u{6QMRjed9wU80b?=y0eB5;xREj?l>y#~UN+;$n$Ww2WQO#!Z z43_6J_qkIsDi)4t-!Ux1!>LljddB&UW2_vW#o|2PYLuL5=GvCWq@(a1S>8DF440Li zDMob$uWH#>HCUBdgI5sNDjAz_71(5WzAFyFdLJLC*+BU~H3AL8J(AIbxC|a7T~;l@ zagg?W%k{l!Tpx2Gne!04>%B$I01({4T%1)0nR?0G`duGb3 zOl*T=Y#iIFOP7SM>TJ-GkNQ8G7v8uKzX^qsN~ulwq}4Xny%yN*KoO)lv5GI$as$2U zlx9VOQ_S^Ppo=~R$r;DZJ2gLu+vCihoZCE9gSximGXo9XS$S31@@V&oEzm>`if@gT z*wQSBAsxGPmY% zWpeTMC5Kyv%_M?#c}S68o(x`oEbM)t6`3!48{BX;PF?3y``GNT>pE_b5VOYeGqE5g z+=@s+dfB-gov`Q>3U=fXqb~Sj>~k=N%0qD-%Ij*2>fVC4Hoi-b&_+Do^(dHve|d@- zJF67r3OSQ9wX@g+OdSenuF%pJg?L26MD*)*qv9*`kn2RuR~M9t*nCV}pHX4~q10rl zcPbQrT2~>pSWqLb2$ zQu(}K=Gb#Cp7J73q5%eZha z)X(RGbUu%%UMq=uQ$ByZW|cyV^cOTok!&3Pi_yd)%BZgRH|>gnlIlH&iYF9IsViov z5OPr1wxWQLn0Y5uUxkbq2S|tAN|r)Kl_DAcpM)-sVZ{|5-CI#CYA1GabS6lZCm}Cx z^_keRY#*Clt{CN)@LiHCvo1*H^W@m*XCDj#S)$iwa&-8i;n9P`X5+{MBl$(J_KJBg z*Jro|;4-1OH=;1xK29@N$v2XmA7>U}gY(SB5X+Sx;E%2C2O17xQ`}DL)-Z_*L~-dn}FhnwC3e3#MtimTG8EB6i|`7fR+^ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/test.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/crcmod/__pycache__/test.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7da00abf56f502de6334ac53a844b5a52c898fb4 GIT binary patch literal 14679 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 F{|929``!Qm literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/_crcfunpy.py b/python/.gradle/python/lib/python3.6/site-packages/crcmod/_crcfunpy.py new file mode 100644 index 0000000..01476ca --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod/_crcfunpy.py @@ -0,0 +1,107 @@ +#----------------------------------------------------------------------------- +# Low level CRC functions for use by crcmod. This version is implemented in +# Python for a couple of reasons. 1) Provide a reference implememtation. +# 2) Provide a version that can be used on systems where a C compiler is not +# available for building extension modules. +# +# Copyright (c) 2009 Raymond L. Buvel +# Copyright (c) 2010 Craig McQueen +# +# 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. +#----------------------------------------------------------------------------- + +def _get_buffer_view(in_obj): + if isinstance(in_obj, str): + raise TypeError('Unicode-objects must be encoded before calculating a CRC') + mv = memoryview(in_obj) + if mv.ndim > 1: + raise BufferError('Buffer must be single dimension') + return mv + + +def _crc8(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFF + for x in mv.tobytes(): + crc = table[x ^ crc] + return crc + +def _crc8r(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFF + for x in mv.tobytes(): + crc = table[x ^ crc] + return crc + +def _crc16(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFFFF + for x in mv.tobytes(): + crc = table[x ^ ((crc>>8) & 0xFF)] ^ ((crc << 8) & 0xFF00) + return crc + +def _crc16r(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFFFF + for x in mv.tobytes(): + crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8) + return crc + +def _crc24(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFFFFFF + for x in mv.tobytes(): + crc = table[x ^ (crc>>16 & 0xFF)] ^ ((crc << 8) & 0xFFFF00) + return crc + +def _crc24r(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFFFFFF + for x in mv.tobytes(): + crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8) + return crc + +def _crc32(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFFFFFFFF + for x in mv.tobytes(): + crc = table[x ^ ((crc>>24) & 0xFF)] ^ ((crc << 8) & 0xFFFFFF00) + return crc + +def _crc32r(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFFFFFFFF + for x in mv.tobytes(): + crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8) + return crc + +def _crc64(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFFFFFFFFFFFFFFFF + for x in mv.tobytes(): + crc = table[x ^ ((crc>>56) & 0xFF)] ^ ((crc << 8) & 0xFFFFFFFFFFFFFF00) + return crc + +def _crc64r(data, crc, table): + mv = _get_buffer_view(data) + crc = crc & 0xFFFFFFFFFFFFFFFF + for x in mv.tobytes(): + crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8) + return crc + diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/crcmod.py b/python/.gradle/python/lib/python3.6/site-packages/crcmod/crcmod.py new file mode 100644 index 0000000..ec5adaf --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod/crcmod.py @@ -0,0 +1,457 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2010 Raymond L. Buvel +# Copyright (c) 2010 Craig McQueen +# +# 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. +#----------------------------------------------------------------------------- +'''crcmod is a Python module for gererating objects that compute the Cyclic +Redundancy Check. Any 8, 16, 24, 32, or 64 bit polynomial can be used. + +The following are the public components of this module. + +Crc -- a class that creates instances providing the same interface as the +algorithms in the hashlib module in the Python standard library. These +instances also provide a method for generating a C/C++ function to compute +the CRC. + +mkCrcFun -- create a Python function to compute the CRC using the specified +polynomial and initial value. This provides a much simpler interface if +all you need is a function for CRC calculation. +''' + +__all__ = '''mkCrcFun Crc +'''.split() + +# Select the appropriate set of low-level CRC functions for this installation. +# If the extension module was not built, drop back to the Python implementation +# even though it is significantly slower. +try: + import crcmod._crcfunext as _crcfun + _usingExtension = True +except ImportError: + import crcmod._crcfunpy as _crcfun + _usingExtension = False + +import sys, struct + +#----------------------------------------------------------------------------- +class Crc: + '''Compute a Cyclic Redundancy Check (CRC) using the specified polynomial. + + Instances of this class have the same interface as the algorithms in the + hashlib module in the Python standard library. See the documentation of + this module for examples of how to use a Crc instance. + + The string representation of a Crc instance identifies the polynomial, + initial value, XOR out value, and the current CRC value. The print + statement can be used to output this information. + + If you need to generate a C/C++ function for use in another application, + use the generateCode method. If you need to generate code for another + language, subclass Crc and override the generateCode method. + + The following are the parameters supplied to the constructor. + + poly -- The generator polynomial to use in calculating the CRC. The value + is specified as a Python integer. The bits in this integer are the + coefficients of the polynomial. The only polynomials allowed are those + that generate 8, 16, 24, 32, or 64 bit CRCs. + + initCrc -- Initial value used to start the CRC calculation. This initial + value should be the initial shift register value XORed with the final XOR + value. That is equivalent to the CRC result the algorithm should return for + a zero-length string. Defaults to all bits set because that starting value + will take leading zero bytes into account. Starting with zero will ignore + all leading zero bytes. + + rev -- A flag that selects a bit reversed algorithm when True. Defaults to + True because the bit reversed algorithms are more efficient. + + xorOut -- Final value to XOR with the calculated CRC value. Used by some + CRC algorithms. Defaults to zero. + ''' + def __init__(self, poly, initCrc=~0, rev=True, xorOut=0, initialize=True): + if not initialize: + # Don't want to perform the initialization when using new or copy + # to create a new instance. + return + + (sizeBits, initCrc, xorOut) = _verifyParams(poly, initCrc, xorOut) + self.digest_size = sizeBits//8 + self.initCrc = initCrc + self.xorOut = xorOut + + self.poly = poly + self.reverse = rev + + (crcfun, table) = _mkCrcFun(poly, sizeBits, initCrc, rev, xorOut) + self._crc = crcfun + self.table = table + + self.crcValue = self.initCrc + + def __str__(self): + lst = [] + lst.append('poly = 0x%X' % self.poly) + lst.append('reverse = %s' % self.reverse) + fmt = '0x%%0%dX' % (self.digest_size*2) + lst.append('initCrc = %s' % (fmt % self.initCrc)) + lst.append('xorOut = %s' % (fmt % self.xorOut)) + lst.append('crcValue = %s' % (fmt % self.crcValue)) + return '\n'.join(lst) + + def new(self, arg=None): + '''Create a new instance of the Crc class initialized to the same + values as the original instance. The current CRC is set to the initial + value. If a string is provided in the optional arg parameter, it is + passed to the update method. + ''' + n = Crc(poly=None, initialize=False) + n._crc = self._crc + n.digest_size = self.digest_size + n.initCrc = self.initCrc + n.xorOut = self.xorOut + n.table = self.table + n.crcValue = self.initCrc + n.reverse = self.reverse + n.poly = self.poly + if arg is not None: + n.update(arg) + return n + + def copy(self): + '''Create a new instance of the Crc class initialized to the same + values as the original instance. The current CRC is set to the current + value. This allows multiple CRC calculations using a common initial + string. + ''' + c = self.new() + c.crcValue = self.crcValue + return c + + def update(self, data): + '''Update the current CRC value using the string specified as the data + parameter. + ''' + self.crcValue = self._crc(data, self.crcValue) + + def digest(self): + '''Return the current CRC value as a string of bytes. The length of + this string is specified in the digest_size attribute. + ''' + n = self.digest_size + crc = self.crcValue + lst = [] + while n > 0: + lst.append(crc & 0xFF) + crc = crc >> 8 + n -= 1 + lst.reverse() + return bytes(lst) + + def hexdigest(self): + '''Return the current CRC value as a string of hex digits. The length + of this string is twice the digest_size attribute. + ''' + n = self.digest_size + crc = self.crcValue + lst = [] + while n > 0: + lst.append('%02X' % (crc & 0xFF)) + crc = crc >> 8 + n -= 1 + lst.reverse() + return ''.join(lst) + + def generateCode(self, functionName, out, dataType=None, crcType=None): + '''Generate a C/C++ function. + + functionName -- String specifying the name of the function. + + out -- An open file-like object with a write method. This specifies + where the generated code is written. + + dataType -- An optional parameter specifying the data type of the input + data to the function. Defaults to UINT8. + + crcType -- An optional parameter specifying the data type of the CRC + value. Defaults to one of UINT8, UINT16, UINT32, or UINT64 depending + on the size of the CRC value. + ''' + if dataType is None: + dataType = 'UINT8' + + if crcType is None: + size = 8*self.digest_size + if size == 24: + size = 32 + crcType = 'UINT%d' % size + + if self.digest_size == 1: + # Both 8-bit CRC algorithms are the same + crcAlgor = 'table[*data ^ (%s)crc]' + elif self.reverse: + # The bit reverse algorithms are all the same except for the data + # type of the crc variable which is specified elsewhere. + crcAlgor = 'table[*data ^ (%s)crc] ^ (crc >> 8)' + else: + # The forward CRC algorithms larger than 8 bits have an extra shift + # operation to get the high byte. + shift = 8*(self.digest_size - 1) + crcAlgor = 'table[*data ^ (%%s)(crc >> %d)] ^ (crc << 8)' % shift + + fmt = '0x%%0%dX' % (2*self.digest_size) + if self.digest_size <= 4: + fmt = fmt + 'U,' + else: + # Need the long long type identifier to keep gcc from complaining. + fmt = fmt + 'ULL,' + + # Select the number of entries per row in the output code. + n = {1:8, 2:8, 3:4, 4:4, 8:2}[self.digest_size] + + lst = [] + for i, val in enumerate(self.table): + if (i % n) == 0: + lst.append('\n ') + lst.append(fmt % val) + + poly = 'polynomial: 0x%X' % self.poly + if self.reverse: + poly = poly + ', bit reverse algorithm' + + if self.xorOut: + # Need to remove the comma from the format. + preCondition = '\n crc = crc ^ %s;' % (fmt[:-1] % self.xorOut) + postCondition = preCondition + else: + preCondition = '' + postCondition = '' + + if self.digest_size == 3: + # The 24-bit CRC needs to be conditioned so that only 24-bits are + # used from the 32-bit variable. + if self.reverse: + preCondition += '\n crc = crc & 0xFFFFFFU;' + else: + postCondition += '\n crc = crc & 0xFFFFFFU;' + + + parms = { + 'dataType' : dataType, + 'crcType' : crcType, + 'name' : functionName, + 'crcAlgor' : crcAlgor % dataType, + 'crcTable' : ''.join(lst), + 'poly' : poly, + 'preCondition' : preCondition, + 'postCondition' : postCondition, + } + out.write(_codeTemplate % parms) + +#----------------------------------------------------------------------------- +def mkCrcFun(poly, initCrc=~0, rev=True, xorOut=0): + '''Return a function that computes the CRC using the specified polynomial. + + poly -- integer representation of the generator polynomial + initCrc -- default initial CRC value + rev -- when true, indicates that the data is processed bit reversed. + xorOut -- the final XOR value + + The returned function has the following user interface + def crcfun(data, crc=initCrc): + ''' + + # First we must verify the params + (sizeBits, initCrc, xorOut) = _verifyParams(poly, initCrc, xorOut) + # Make the function (and table), return the function + return _mkCrcFun(poly, sizeBits, initCrc, rev, xorOut)[0] + +#----------------------------------------------------------------------------- +# Naming convention: +# All function names ending with r are bit reverse variants of the ones +# without the r. + +#----------------------------------------------------------------------------- +# Check the polynomial to make sure that it is acceptable and return the number +# of bits in the CRC. + +def _verifyPoly(poly): + msg = 'The degree of the polynomial must be 8, 16, 24, 32 or 64' + for n in (8,16,24,32,64): + low = 1<> 1 + return y + +#----------------------------------------------------------------------------- +# The following functions compute the CRC for a single byte. These are used +# to build up the tables needed in the CRC algorithm. Assumes the high order +# bit of the polynomial has been stripped off. + +def _bytecrc(crc, poly, n): + mask = 1<<(n-1) + for i in range(8): + if crc & mask: + crc = (crc << 1) ^ poly + else: + crc = crc << 1 + mask = (1<> 1) ^ poly + else: + crc = crc >> 1 + mask = (1< 0) + { + crc = %(crcAlgor)s; + data++; + len--; + }%(postCondition)s + return crc; +} +''' + diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/predefined.py b/python/.gradle/python/lib/python3.6/site-packages/crcmod/predefined.py new file mode 100644 index 0000000..21e2b32 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod/predefined.py @@ -0,0 +1,162 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2010 Craig McQueen +# +# 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. +#----------------------------------------------------------------------------- +''' +crcmod.predefined defines some well-known CRC algorithms. + +To use it, e.g.: + import crcmod.predefined + + crc32func = crcmod.predefined.mkPredefinedCrcFun("crc-32") + crc32class = crcmod.predefined.PredefinedCrc("crc-32") + +crcmod.predefined.Crc is an alias for crcmod.predefined.PredefinedCrc +But if doing 'from crc.predefined import *', only PredefinedCrc is imported. +''' + +# local imports +import crcmod + +__all__ = [ + 'PredefinedCrc', + 'mkPredefinedCrcFun', +] + +REVERSE = True +NON_REVERSE = False + +# The following table defines the parameters of well-known CRC algorithms. +# The "Check" value is the CRC for the ASCII byte sequence b"123456789". It +# can be used for unit tests. +_crc_definitions_table = [ +# Name Identifier-name, Poly Reverse Init-value XOR-out Check + [ 'crc-8', 'Crc8', 0x107, NON_REVERSE, 0x00, 0x00, 0xF4, ], + [ 'crc-8-darc', 'Crc8Darc', 0x139, REVERSE, 0x00, 0x00, 0x15, ], + [ 'crc-8-i-code', 'Crc8ICode', 0x11D, NON_REVERSE, 0xFD, 0x00, 0x7E, ], + [ 'crc-8-itu', 'Crc8Itu', 0x107, NON_REVERSE, 0x55, 0x55, 0xA1, ], + [ 'crc-8-maxim', 'Crc8Maxim', 0x131, REVERSE, 0x00, 0x00, 0xA1, ], + [ 'crc-8-rohc', 'Crc8Rohc', 0x107, REVERSE, 0xFF, 0x00, 0xD0, ], + [ 'crc-8-wcdma', 'Crc8Wcdma', 0x19B, REVERSE, 0x00, 0x00, 0x25, ], + + [ 'crc-16', 'Crc16', 0x18005, REVERSE, 0x0000, 0x0000, 0xBB3D, ], + [ 'crc-16-buypass', 'Crc16Buypass', 0x18005, NON_REVERSE, 0x0000, 0x0000, 0xFEE8, ], + [ 'crc-16-dds-110', 'Crc16Dds110', 0x18005, NON_REVERSE, 0x800D, 0x0000, 0x9ECF, ], + [ 'crc-16-dect', 'Crc16Dect', 0x10589, NON_REVERSE, 0x0001, 0x0001, 0x007E, ], + [ 'crc-16-dnp', 'Crc16Dnp', 0x13D65, REVERSE, 0xFFFF, 0xFFFF, 0xEA82, ], + [ 'crc-16-en-13757', 'Crc16En13757', 0x13D65, NON_REVERSE, 0xFFFF, 0xFFFF, 0xC2B7, ], + [ 'crc-16-genibus', 'Crc16Genibus', 0x11021, NON_REVERSE, 0x0000, 0xFFFF, 0xD64E, ], + [ 'crc-16-maxim', 'Crc16Maxim', 0x18005, REVERSE, 0xFFFF, 0xFFFF, 0x44C2, ], + [ 'crc-16-mcrf4xx', 'Crc16Mcrf4xx', 0x11021, REVERSE, 0xFFFF, 0x0000, 0x6F91, ], + [ 'crc-16-riello', 'Crc16Riello', 0x11021, REVERSE, 0x554D, 0x0000, 0x63D0, ], + [ 'crc-16-t10-dif', 'Crc16T10Dif', 0x18BB7, NON_REVERSE, 0x0000, 0x0000, 0xD0DB, ], + [ 'crc-16-teledisk', 'Crc16Teledisk', 0x1A097, NON_REVERSE, 0x0000, 0x0000, 0x0FB3, ], + [ 'crc-16-usb', 'Crc16Usb', 0x18005, REVERSE, 0x0000, 0xFFFF, 0xB4C8, ], + [ 'x-25', 'CrcX25', 0x11021, REVERSE, 0x0000, 0xFFFF, 0x906E, ], + [ 'xmodem', 'CrcXmodem', 0x11021, NON_REVERSE, 0x0000, 0x0000, 0x31C3, ], + [ 'modbus', 'CrcModbus', 0x18005, REVERSE, 0xFFFF, 0x0000, 0x4B37, ], + + # Note definitions of CCITT are disputable. See: + # http://homepages.tesco.net/~rainstorm/crc-catalogue.htm + # http://web.archive.org/web/20071229021252/http://www.joegeluso.com/software/articles/ccitt.htm + [ 'kermit', 'CrcKermit', 0x11021, REVERSE, 0x0000, 0x0000, 0x2189, ], + [ 'crc-ccitt-false', 'CrcCcittFalse', 0x11021, NON_REVERSE, 0xFFFF, 0x0000, 0x29B1, ], + [ 'crc-aug-ccitt', 'CrcAugCcitt', 0x11021, NON_REVERSE, 0x1D0F, 0x0000, 0xE5CC, ], + + [ 'crc-24', 'Crc24', 0x1864CFB, NON_REVERSE, 0xB704CE, 0x000000, 0x21CF02, ], + [ 'crc-24-flexray-a', 'Crc24FlexrayA', 0x15D6DCB, NON_REVERSE, 0xFEDCBA, 0x000000, 0x7979BD, ], + [ 'crc-24-flexray-b', 'Crc24FlexrayB', 0x15D6DCB, NON_REVERSE, 0xABCDEF, 0x000000, 0x1F23B8, ], + + [ 'crc-32', 'Crc32', 0x104C11DB7, REVERSE, 0x00000000, 0xFFFFFFFF, 0xCBF43926, ], + [ 'crc-32-bzip2', 'Crc32Bzip2', 0x104C11DB7, NON_REVERSE, 0x00000000, 0xFFFFFFFF, 0xFC891918, ], + [ 'crc-32c', 'Crc32C', 0x11EDC6F41, REVERSE, 0x00000000, 0xFFFFFFFF, 0xE3069283, ], + [ 'crc-32d', 'Crc32D', 0x1A833982B, REVERSE, 0x00000000, 0xFFFFFFFF, 0x87315576, ], + [ 'crc-32-mpeg', 'Crc32Mpeg', 0x104C11DB7, NON_REVERSE, 0xFFFFFFFF, 0x00000000, 0x0376E6E7, ], + [ 'posix', 'CrcPosix', 0x104C11DB7, NON_REVERSE, 0xFFFFFFFF, 0xFFFFFFFF, 0x765E7680, ], + [ 'crc-32q', 'Crc32Q', 0x1814141AB, NON_REVERSE, 0x00000000, 0x00000000, 0x3010BF7F, ], + [ 'jamcrc', 'CrcJamCrc', 0x104C11DB7, REVERSE, 0xFFFFFFFF, 0x00000000, 0x340BC6D9, ], + [ 'xfer', 'CrcXfer', 0x1000000AF, NON_REVERSE, 0x00000000, 0x00000000, 0xBD0BE338, ], + +# 64-bit +# Name Identifier-name, Poly Reverse Init-value XOR-out Check + [ 'crc-64', 'Crc64', 0x1000000000000001B, REVERSE, 0x0000000000000000, 0x0000000000000000, 0x46A5A9388A5BEFFE, ], + [ 'crc-64-we', 'Crc64We', 0x142F0E1EBA9EA3693, NON_REVERSE, 0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x62EC59E3F1A4F00A, ], + [ 'crc-64-jones', 'Crc64Jones', 0x1AD93D23594C935A9, REVERSE, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xCAA717168609F281, ], +] + + +def _simplify_name(name): + """ + Reduce CRC definition name to a simplified form: + * lowercase + * dashes removed + * spaces removed + * any initial "CRC" string removed + """ + name = name.lower() + name = name.replace('-', '') + name = name.replace(' ', '') + if name.startswith('crc'): + name = name[len('crc'):] + return name + + +_crc_definitions_by_name = {} +_crc_definitions_by_identifier = {} +_crc_definitions = [] + +_crc_table_headings = [ 'name', 'identifier', 'poly', 'reverse', 'init', 'xor_out', 'check' ] + +for table_entry in _crc_definitions_table: + crc_definition = dict(zip(_crc_table_headings, table_entry)) + _crc_definitions.append(crc_definition) + name = _simplify_name(table_entry[0]) + if name in _crc_definitions_by_name: + raise Exception("Duplicate entry for '{0}' in CRC table".format(name)) + _crc_definitions_by_name[name] = crc_definition + _crc_definitions_by_identifier[table_entry[1]] = crc_definition + + +def _get_definition_by_name(crc_name): + definition = _crc_definitions_by_name.get(_simplify_name(crc_name), None) + if not definition: + definition = _crc_definitions_by_identifier.get(crc_name, None) + if not definition: + raise KeyError("Unkown CRC name '{0}'".format(crc_name)) + return definition + + +class PredefinedCrc(crcmod.Crc): + def __init__(self, crc_name): + definition = _get_definition_by_name(crc_name) + super().__init__(poly=definition['poly'], initCrc=definition['init'], rev=definition['reverse'], xorOut=definition['xor_out']) + + +# crcmod.predefined.Crc is an alias for crcmod.predefined.PredefinedCrc +Crc = PredefinedCrc + + +def mkPredefinedCrcFun(crc_name): + definition = _get_definition_by_name(crc_name) + return crcmod.mkCrcFun(poly=definition['poly'], initCrc=definition['init'], rev=definition['reverse'], xorOut=definition['xor_out']) + + +# crcmod.predefined.mkCrcFun is an alias for crcmod.predefined.mkPredefinedCrcFun +mkCrcFun = mkPredefinedCrcFun diff --git a/python/.gradle/python/lib/python3.6/site-packages/crcmod/test.py b/python/.gradle/python/lib/python3.6/site-packages/crcmod/test.py new file mode 100644 index 0000000..0190bb7 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/crcmod/test.py @@ -0,0 +1,540 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2010 Raymond L. Buvel +# Copyright (c) 2010 Craig McQueen +# +# 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. +#----------------------------------------------------------------------------- +'''Unit tests for crcmod functionality''' + + +import unittest + +from array import array +import binascii + +from .crcmod import mkCrcFun, Crc +from .crcmod import _usingExtension +from .predefined import PredefinedCrc +from .predefined import mkPredefinedCrcFun +from .predefined import _crc_definitions as _predefined_crc_definitions + + +#----------------------------------------------------------------------------- +# This polynomial was chosen because it is the product of two irreducible +# polynomials. +# g8 = (x^7+x+1)*(x+1) +g8 = 0x185 + +#----------------------------------------------------------------------------- +# The following reproduces all of the entries in the Numerical Recipes table. +# This is the standard CCITT polynomial. +g16 = 0x11021 + +#----------------------------------------------------------------------------- +g24 = 0x15D6DCB + +#----------------------------------------------------------------------------- +# This is the standard AUTODIN-II polynomial which appears to be used in a +# wide variety of standards and applications. +g32 = 0x104C11DB7 + + +#----------------------------------------------------------------------------- +# I was able to locate a couple of 64-bit polynomials on the web. To make it +# easier to input the representation, define a function that builds a +# polynomial from a list of the bits that need to be turned on. + +def polyFromBits(bits): + p = 0 + for n in bits: + p = p | (1 << n) + return p + +# The following is from the paper "An Improved 64-bit Cyclic Redundancy Check +# for Protein Sequences" by David T. Jones + +g64a = polyFromBits([64, 63, 61, 59, 58, 56, 55, 52, 49, 48, 47, 46, 44, 41, + 37, 36, 34, 32, 31, 28, 26, 23, 22, 19, 16, 13, 12, 10, 9, 6, 4, + 3, 0]) + +# The following is from Standard ECMA-182 "Data Interchange on 12,7 mm 48-Track +# Magnetic Tape Cartridges -DLT1 Format-", December 1992. + +g64b = polyFromBits([64, 62, 57, 55, 54, 53, 52, 47, 46, 45, 40, 39, 38, 37, + 35, 33, 32, 31, 29, 27, 24, 23, 22, 21, 19, 17, 13, 12, 10, 9, 7, + 4, 1, 0]) + +#----------------------------------------------------------------------------- +# This class is used to check the CRC calculations against a direct +# implementation using polynomial division. + +class poly: + '''Class implementing polynomials over the field of integers mod 2''' + def __init__(self,p): + p = int(p) + if p < 0: raise ValueError('invalid polynomial') + self.p = p + + def __int__(self): + return self.p + + def __eq__(self,other): + return self.p == other.p + + def __ne__(self,other): + return self.p != other.p + + # To allow sorting of polynomials, use their long integer form for + # comparison + def __cmp__(self,other): + return cmp(self.p, other.p) + + def __bool__(self): + return self.p != 0 + + def __neg__(self): + return self # These polynomials are their own inverse under addition + + def __invert__(self): + n = max(self.deg() + 1, 1) + x = (1 << n) - 1 + return poly(self.p ^ x) + + def __add__(self,other): + return poly(self.p ^ other.p) + + def __sub__(self,other): + return poly(self.p ^ other.p) + + def __mul__(self,other): + a = self.p + b = other.p + if a == 0 or b == 0: return poly(0) + x = 0 + while b: + if b&1: + x = x ^ a + a = a<<1 + b = b>>1 + return poly(x) + + def __divmod__(self,other): + u = self.p + m = self.deg() + v = other.p + n = other.deg() + if v == 0: raise ZeroDivisionError('polynomial division by zero') + if n == 0: return (self,poly(0)) + if m < n: return (poly(0),self) + k = m-n + a = 1 << m + v = v << k + q = 0 + while k > 0: + if a & u: + u = u ^ v + q = q | 1 + q = q << 1 + a = a >> 1 + v = v >> 1 + k -= 1 + if a & u: + u = u ^ v + q = q | 1 + return (poly(q),poly(u)) + + def __div__(self,other): + return self.__divmod__(other)[0] + + def __mod__(self,other): + return self.__divmod__(other)[1] + + def __repr__(self): + return 'poly(0x%XL)' % self.p + + def __str__(self): + p = self.p + if p == 0: return '0' + lst = { 0:[], 1:['1'], 2:['x'], 3:['1','x'] }[p&3] + p = p>>2 + n = 2 + while p: + if p&1: lst.append('x^%d' % n) + p = p>>1 + n += 1 + lst.reverse() + return '+'.join(lst) + + def deg(self): + '''return the degree of the polynomial''' + a = self.p + if a == 0: return -1 + n = 0 + while a >= 0x10000: + n += 16 + a = a >> 16 + a = int(a) + while a > 1: + n += 1 + a = a >> 1 + return n + +#----------------------------------------------------------------------------- +# The following functions compute the CRC using direct polynomial division. +# These functions are checked against the result of the table driven +# algorithms. + +g8p = poly(g8) +x8p = poly(1<<8) +def crc8p(d): + p = 0 + for i in d: + p = p*256 + i + p = poly(p) + return int(p*x8p%g8p) + +g16p = poly(g16) +x16p = poly(1<<16) +def crc16p(d): + p = 0 + for i in d: + p = p*256 + i + p = poly(p) + return int(p*x16p%g16p) + +g24p = poly(g24) +x24p = poly(1<<24) +def crc24p(d): + p = 0 + for i in d: + p = p*256 + i + p = poly(p) + return int(p*x24p%g24p) + +g32p = poly(g32) +x32p = poly(1<<32) +def crc32p(d): + p = 0 + for i in d: + p = p*256 + i + p = poly(p) + return int(p*x32p%g32p) + +g64ap = poly(g64a) +x64p = poly(1<<64) +def crc64ap(d): + p = 0 + for i in d: + p = p*256 + i + p = poly(p) + return int(p*x64p%g64ap) + +g64bp = poly(g64b) +def crc64bp(d): + p = 0 + for i in d: + p = p*256 + i + p = poly(p) + return int(p*x64p%g64bp) + + +class KnownAnswerTests(unittest.TestCase): + test_messages = [ + b'T', + b'CatMouse987654321', + ] + + known_answers = [ + [ (g8,0,0), (0xFE, 0x9D) ], + [ (g8,-1,1), (0x4F, 0x9B) ], + [ (g8,0,1), (0xFE, 0x62) ], + [ (g16,0,0), (0x1A71, 0xE556) ], + [ (g16,-1,1), (0x1B26, 0xF56E) ], + [ (g16,0,1), (0x14A1, 0xC28D) ], + [ (g24,0,0), (0xBCC49D, 0xC4B507) ], + [ (g24,-1,1), (0x59BD0E, 0x0AAA37) ], + [ (g24,0,1), (0xD52B0F, 0x1523AB) ], + [ (g32,0,0), (0x6B93DDDB, 0x12DCA0F4) ], + [ (g32,0xFFFFFFFF,1), (0x41FB859F, 0xF7B400A7) ], + [ (g32,0,1), (0x6C0695ED, 0xC1A40EE5) ], + [ (g32,0,1,0xFFFFFFFF), (0xBE047A60, 0x084BFF58) ], + ] + + def test_known_answers(self): + for crcfun_params, v in self.known_answers: + crcfun = mkCrcFun(*crcfun_params) + self.assertEqual(crcfun(b'',0), 0, "Wrong answer for CRC parameters %s, input ''" % (crcfun_params,)) + for i, msg in enumerate(self.test_messages): + self.assertEqual(crcfun(msg), v[i], "Wrong answer for CRC parameters %s, input '%s'" % (crcfun_params,msg)) + self.assertEqual(crcfun(msg[4:], crcfun(msg[:4])), v[i], "Wrong answer for CRC parameters %s, input '%s'" % (crcfun_params,msg)) + self.assertEqual(crcfun(msg[-1:], crcfun(msg[:-1])), v[i], "Wrong answer for CRC parameters %s, input '%s'" % (crcfun_params,msg)) + + +class CompareReferenceCrcTest(unittest.TestCase): + test_messages = [ + b'', + b'T', + b'123456789', + b'CatMouse987654321', + ] + + test_poly_crcs = [ + [ (g8,0,0), crc8p ], + [ (g16,0,0), crc16p ], + [ (g24,0,0), crc24p ], + [ (g32,0,0), crc32p ], + [ (g64a,0,0), crc64ap ], + [ (g64b,0,0), crc64bp ], + ] + + @staticmethod + def reference_crc32(d, crc=0): + """This function modifies the return value of binascii.crc32 + to be an unsigned 32-bit value. I.e. in the range 0 to 2**32-1.""" + # Work around the future warning on constants. + if crc > 0x7FFFFFFF: + x = int(crc & 0x7FFFFFFF) + crc = x | -2147483648 + x = binascii.crc32(d,crc) + return int(x) & 0xFFFFFFFF + + def test_compare_crc32(self): + """The binascii module has a 32-bit CRC function that is used in a wide range + of applications including the checksum used in the ZIP file format. + This test compares the CRC-32 implementation of this crcmod module to + that of binascii.crc32.""" + # The following function should produce the same result as + # self.reference_crc32 which is derived from binascii.crc32. + crc32 = mkCrcFun(g32,0,1,0xFFFFFFFF) + + for msg in self.test_messages: + self.assertEqual(crc32(msg), self.reference_crc32(msg)) + + def test_compare_poly(self): + """Compare various CRCs of this crcmod module to a pure + polynomial-based implementation.""" + for crcfun_params, crc_poly_fun in self.test_poly_crcs: + # The following function should produce the same result as + # the associated polynomial CRC function. + crcfun = mkCrcFun(*crcfun_params) + + for msg in self.test_messages: + self.assertEqual(crcfun(msg), crc_poly_fun(msg)) + + +class CrcClassTest(unittest.TestCase): + """Verify the Crc class""" + + msg = b'CatMouse987654321' + + def test_simple_crc32_class(self): + """Verify the CRC class when not using xorOut""" + crc = Crc(g32) + + str_rep = \ +'''poly = 0x104C11DB7 +reverse = True +initCrc = 0xFFFFFFFF +xorOut = 0x00000000 +crcValue = 0xFFFFFFFF''' + self.assertEqual(str(crc), str_rep) + self.assertEqual(crc.digest(), b'\xff\xff\xff\xff') + self.assertEqual(crc.hexdigest(), 'FFFFFFFF') + + crc.update(self.msg) + self.assertEqual(crc.crcValue, 0xF7B400A7) + self.assertEqual(crc.digest(), b'\xf7\xb4\x00\xa7') + self.assertEqual(crc.hexdigest(), 'F7B400A7') + + # Verify the .copy() method + x = crc.copy() + self.assertTrue(x is not crc) + str_rep = \ +'''poly = 0x104C11DB7 +reverse = True +initCrc = 0xFFFFFFFF +xorOut = 0x00000000 +crcValue = 0xF7B400A7''' + self.assertEqual(str(crc), str_rep) + self.assertEqual(str(x), str_rep) + + def test_full_crc32_class(self): + """Verify the CRC class when using xorOut""" + + crc = Crc(g32, initCrc=0, xorOut= ~0) + + str_rep = \ +'''poly = 0x104C11DB7 +reverse = True +initCrc = 0x00000000 +xorOut = 0xFFFFFFFF +crcValue = 0x00000000''' + self.assertEqual(str(crc), str_rep) + self.assertEqual(crc.digest(), b'\x00\x00\x00\x00') + self.assertEqual(crc.hexdigest(), '00000000') + + crc.update(self.msg) + self.assertEqual(crc.crcValue, 0x84BFF58) + self.assertEqual(crc.digest(), b'\x08\x4b\xff\x58') + self.assertEqual(crc.hexdigest(), '084BFF58') + + # Verify the .copy() method + x = crc.copy() + self.assertTrue(x is not crc) + str_rep = \ +'''poly = 0x104C11DB7 +reverse = True +initCrc = 0x00000000 +xorOut = 0xFFFFFFFF +crcValue = 0x084BFF58''' + self.assertEqual(str(crc), str_rep) + self.assertEqual(str(x), str_rep) + + # Verify the .new() method + y = crc.new() + self.assertTrue(y is not crc) + self.assertTrue(y is not x) + str_rep = \ +'''poly = 0x104C11DB7 +reverse = True +initCrc = 0x00000000 +xorOut = 0xFFFFFFFF +crcValue = 0x00000000''' + self.assertEqual(str(y), str_rep) + + +class PredefinedCrcTest(unittest.TestCase): + """Verify the predefined CRCs""" + + test_messages_for_known_answers = [ + b'', # Test cases below depend on this first entry being the empty string. + b'T', + b'CatMouse987654321', + ] + + known_answers = [ + [ 'crc-aug-ccitt', (0x1D0F, 0xD6ED, 0x5637) ], + [ 'x-25', (0x0000, 0xE4D9, 0x0A91) ], + [ 'crc-32', (0x00000000, 0xBE047A60, 0x084BFF58) ], + ] + + def test_known_answers(self): + for crcfun_name, v in self.known_answers: + crcfun = mkPredefinedCrcFun(crcfun_name) + self.assertEqual(crcfun(b'',0), 0, "Wrong answer for CRC '%s', input ''" % crcfun_name) + for i, msg in enumerate(self.test_messages_for_known_answers): + self.assertEqual(crcfun(msg), v[i], "Wrong answer for CRC %s, input '%s'" % (crcfun_name,msg)) + self.assertEqual(crcfun(msg[4:], crcfun(msg[:4])), v[i], "Wrong answer for CRC %s, input '%s'" % (crcfun_name,msg)) + self.assertEqual(crcfun(msg[-1:], crcfun(msg[:-1])), v[i], "Wrong answer for CRC %s, input '%s'" % (crcfun_name,msg)) + + def test_class_with_known_answers(self): + for crcfun_name, v in self.known_answers: + for i, msg in enumerate(self.test_messages_for_known_answers): + crc1 = PredefinedCrc(crcfun_name) + crc1.update(msg) + self.assertEqual(crc1.crcValue, v[i], "Wrong answer for crc1 %s, input '%s'" % (crcfun_name,msg)) + + crc2 = crc1.new() + # Check that crc1 maintains its same value, after .new() call. + self.assertEqual(crc1.crcValue, v[i], "Wrong state for crc1 %s, input '%s'" % (crcfun_name,msg)) + # Check that the new class instance created by .new() contains the initialisation value. + # This depends on the first string in self.test_messages_for_known_answers being + # the empty string. + self.assertEqual(crc2.crcValue, v[0], "Wrong state for crc2 %s, input '%s'" % (crcfun_name,msg)) + + crc2.update(msg) + # Check that crc1 maintains its same value, after crc2 has called .update() + self.assertEqual(crc1.crcValue, v[i], "Wrong state for crc1 %s, input '%s'" % (crcfun_name,msg)) + # Check that crc2 contains the right value after calling .update() + self.assertEqual(crc2.crcValue, v[i], "Wrong state for crc2 %s, input '%s'" % (crcfun_name,msg)) + + def test_function_predefined_table(self): + for table_entry in _predefined_crc_definitions: + # Check predefined function + crc_func = mkPredefinedCrcFun(table_entry['name']) + calc_value = crc_func(b"123456789") + self.assertEqual(calc_value, table_entry['check'], "Wrong answer for CRC '%s'" % table_entry['name']) + + def test_class_predefined_table(self): + for table_entry in _predefined_crc_definitions: + # Check predefined class + crc1 = PredefinedCrc(table_entry['name']) + crc1.update(b"123456789") + self.assertEqual(crc1.crcValue, table_entry['check'], "Wrong answer for CRC '%s'" % table_entry['name']) + + +class InputTypesTest(unittest.TestCase): + """Check the various input types that CRC functions can accept.""" + + msg = b'CatMouse987654321' + + check_crc_names = [ + 'crc-aug-ccitt', + 'x-25', + 'crc-32', + ] + + array_check_types = [ + 'B', + 'H', + 'I', + 'L', + ] + + def test_bytearray_input(self): + """Test that bytearray inputs are accepted, as an example + of a type that implements the buffer protocol.""" + for crc_name in self.check_crc_names: + crcfun = mkPredefinedCrcFun(crc_name) + for i in range(len(self.msg) + 1): + test_msg = self.msg[:i] + bytes_answer = crcfun(test_msg) + bytearray_answer = crcfun(bytearray(test_msg)) + self.assertEqual(bytes_answer, bytearray_answer) + + def test_array_input(self): + """Test that array inputs are accepted, as an example + of a type that implements the buffer protocol.""" + for crc_name in self.check_crc_names: + crcfun = mkPredefinedCrcFun(crc_name) + for i in range(len(self.msg) + 1): + test_msg = self.msg[:i] + bytes_answer = crcfun(test_msg) + for array_type in self.array_check_types: + if i % array(array_type).itemsize == 0: + test_array = array(array_type, test_msg) + array_answer = crcfun(test_array) + self.assertEqual(bytes_answer, array_answer) + + def test_unicode_input(self): + """Test that Unicode input raises TypeError""" + for crc_name in self.check_crc_names: + crcfun = mkPredefinedCrcFun(crc_name) + with self.assertRaises(TypeError): + crcfun("123456789") + + +def runtests(): + print("Using extension:", _usingExtension) + print() + unittest.main() + + +if __name__ == '__main__': + runtests() diff --git a/python/.gradle/python/lib/python3.6/site-packages/easy_install.py b/python/.gradle/python/lib/python3.6/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/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/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/INSTALLER b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/LICENSE.txt b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..4c904db --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2013-2019 Python Charmers Pty Ltd, Australia + +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. diff --git a/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/METADATA b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/METADATA new file mode 100644 index 0000000..d34ff2b --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/METADATA @@ -0,0 +1,109 @@ +Metadata-Version: 2.1 +Name: future +Version: 0.18.2 +Summary: Clean single-source support for Python 3 and 2 +Home-page: https://python-future.org +Author: Ed Schofield +Author-email: ed@pythoncharmers.com +License: MIT +Keywords: future past python3 migration futurize backport six 2to3 modernize pasteurize 3to2 +Platform: UNKNOWN +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: License :: OSI Approved +Classifier: License :: OSI Approved :: MIT License +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.* + + +future: Easy, safe support for Python 2/3 compatibility +======================================================= + +``future`` is the missing compatibility layer between Python 2 and Python +3. It allows you to use a single, clean Python 3.x-compatible codebase to +support both Python 2 and Python 3 with minimal overhead. + +It is designed to be used as follows:: + + from __future__ import (absolute_import, division, + print_function, unicode_literals) + from builtins import ( + bytes, dict, int, list, object, range, str, + ascii, chr, hex, input, next, oct, open, + pow, round, super, + filter, map, zip) + +followed by predominantly standard, idiomatic Python 3 code that then runs +similarly on Python 2.6/2.7 and Python 3.3+. + +The imports have no effect on Python 3. On Python 2, they shadow the +corresponding builtins, which normally have different semantics on Python 3 +versus 2, to provide their Python 3 semantics. + + +Standard library reorganization +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``future`` supports the standard library reorganization (PEP 3108) through the +following Py3 interfaces: + + >>> # Top-level packages with Py3 names provided on Py2: + >>> import html.parser + >>> import queue + >>> import tkinter.dialog + >>> import xmlrpc.client + >>> # etc. + + >>> # Aliases provided for extensions to existing Py2 module names: + >>> from future.standard_library import install_aliases + >>> install_aliases() + + >>> from collections import Counter, OrderedDict # backported to Py2.6 + >>> from collections import UserDict, UserList, UserString + >>> import urllib.request + >>> from itertools import filterfalse, zip_longest + >>> from subprocess import getoutput, getstatusoutput + + +Automatic conversion +-------------------- + +An included script called `futurize +`_ aids in converting +code (from either Python 2 or Python 3) to code compatible with both +platforms. It is similar to ``python-modernize`` but goes further in +providing Python 3 compatibility through the use of the backported types +and builtin functions in ``future``. + + +Documentation +------------- + +See: http://python-future.org + + +Credits +------- + +:Author: Ed Schofield, Jordan M. Adler, et al +:Sponsor: Python Charmers Pty Ltd, Australia, and Python Charmers Pte + Ltd, Singapore. http://pythoncharmers.com +:Others: See docs/credits.rst or http://python-future.org/credits.html + + +Licensing +--------- +Copyright 2013-2019 Python Charmers Pty Ltd, Australia. +The software is distributed under an MIT licence. See LICENSE.txt. + + + diff --git a/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/RECORD b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/RECORD new file mode 100644 index 0000000..b6a55a5 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/RECORD @@ -0,0 +1,415 @@ +../../../bin/futurize,sha256=fRQMMR485To5l3pQl0WR6_Kcm2voEHZvP9i3tTNmHTU,253 +../../../bin/pasteurize,sha256=X4DpuyBmWBfwAVwWJIwkKdnZnyZbXtgHrGm5eFo2n90,255 +future-0.18.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +future-0.18.2.dist-info/LICENSE.txt,sha256=kW5WE5LUhHG5wjQ39W4mUvMgyzsRnOqhYu30EBb3Rrk,1083 +future-0.18.2.dist-info/METADATA,sha256=fkY-mhLBh40f490kVFZ3hkvu2OVGdLIp5x-oJpqF91k,3703 +future-0.18.2.dist-info/RECORD,, +future-0.18.2.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +future-0.18.2.dist-info/entry_points.txt,sha256=-ATQtLUC2gkzrCYqc1Twac093xrI164NuMwsRALJWnM,89 +future-0.18.2.dist-info/top_level.txt,sha256=DT0C3az2gb-uJaj-fs0h4WwHYlJVDp0EvLdud1y5Zyw,38 +future/__init__.py,sha256=TsDq1XoGk6Jfach_rEhwAi07zR5OKYZ6hhUlG5Bj6Ag,2991 +future/__pycache__/__init__.cpython-36.pyc,, +future/backports/__init__.py,sha256=5QXvQ_jc5Xx6p4dSaHnZXPZazBEunKDKhbUjxZ0XD1I,530 +future/backports/__pycache__/__init__.cpython-36.pyc,, +future/backports/__pycache__/_markupbase.cpython-36.pyc,, +future/backports/__pycache__/datetime.cpython-36.pyc,, +future/backports/__pycache__/misc.cpython-36.pyc,, +future/backports/__pycache__/socket.cpython-36.pyc,, +future/backports/__pycache__/socketserver.cpython-36.pyc,, +future/backports/__pycache__/total_ordering.cpython-36.pyc,, +future/backports/_markupbase.py,sha256=MDPTCykLq4J7Aea3PvYotATEE0CG4R_SjlxfJaLXTJM,16215 +future/backports/datetime.py,sha256=I214Vu0cRY8mi8J5aIcsAyQJnWmOKXeLV-QTWSn7VQU,75552 +future/backports/email/__init__.py,sha256=eH3AJr3FkuBy_D6yS1V2K76Q2CQ93y2zmAMWmn8FbHI,2269 +future/backports/email/__pycache__/__init__.cpython-36.pyc,, +future/backports/email/__pycache__/_encoded_words.cpython-36.pyc,, +future/backports/email/__pycache__/_header_value_parser.cpython-36.pyc,, +future/backports/email/__pycache__/_parseaddr.cpython-36.pyc,, +future/backports/email/__pycache__/_policybase.cpython-36.pyc,, +future/backports/email/__pycache__/base64mime.cpython-36.pyc,, +future/backports/email/__pycache__/charset.cpython-36.pyc,, +future/backports/email/__pycache__/encoders.cpython-36.pyc,, +future/backports/email/__pycache__/errors.cpython-36.pyc,, +future/backports/email/__pycache__/feedparser.cpython-36.pyc,, +future/backports/email/__pycache__/generator.cpython-36.pyc,, +future/backports/email/__pycache__/header.cpython-36.pyc,, +future/backports/email/__pycache__/headerregistry.cpython-36.pyc,, +future/backports/email/__pycache__/iterators.cpython-36.pyc,, +future/backports/email/__pycache__/message.cpython-36.pyc,, +future/backports/email/__pycache__/parser.cpython-36.pyc,, +future/backports/email/__pycache__/policy.cpython-36.pyc,, +future/backports/email/__pycache__/quoprimime.cpython-36.pyc,, +future/backports/email/__pycache__/utils.cpython-36.pyc,, +future/backports/email/_encoded_words.py,sha256=m1vTRfxAQdg4VyWO7PF-1ih1mmq97V-BPyHHkuEwSME,8443 +future/backports/email/_header_value_parser.py,sha256=cj_1ce1voLn8H98r9cKqiSLgfFSxCv3_UL3sSvjqgjk,104692 +future/backports/email/_parseaddr.py,sha256=KewEnos0YDM-SYX503z7E1MmVbG5VRaKjxjcl0Ipjbs,17389 +future/backports/email/_policybase.py,sha256=2lJD9xouiz4uHvWGQ6j1nwlwWVQGwwzpy5JZoeQqhUc,14647 +future/backports/email/base64mime.py,sha256=sey6iJA9pHIOdFgoV1p7QAwYVjt8CEkDhITt304-nyI,3729 +future/backports/email/charset.py,sha256=CfE4iV2zAq6MQC0CHXHLnwTNW71zmhNITbzOcfxE4vY,17439 +future/backports/email/encoders.py,sha256=Nn4Pcx1rOdRgoSIzB6T5RWHl5zxClbf32wgE6D0tUt8,2800 +future/backports/email/errors.py,sha256=tRX8PP5g7mk2bAxL1jTCYrbfhD2gPZFNrh4_GJRM8OQ,3680 +future/backports/email/feedparser.py,sha256=bvmhb4cdY-ipextPK2K2sDgMsNvTspmuQfYyCxc4zSc,22736 +future/backports/email/generator.py,sha256=lpaLhZHneguvZ2QgRu7Figkjb7zmY28AGhj9iZTdI7s,19520 +future/backports/email/header.py,sha256=uBHbNKO-yx5I9KBflernJpyy3fX4gImCB1QE7ICApLs,24448 +future/backports/email/headerregistry.py,sha256=ZPbvLKXD0NMLSU4jXlVHfGyGcLMrFm-GQVURu_XHj88,20637 +future/backports/email/iterators.py,sha256=kMRYFGy3SVVpo7HG7JJr2ZAlOoaX6CVPzKYwDSvLfV0,2348 +future/backports/email/message.py,sha256=I6WW5cZDza7uwLOGJSvsDhGZC9K_Q570Lk2gt_vDUXM,35237 +future/backports/email/mime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +future/backports/email/mime/__pycache__/__init__.cpython-36.pyc,, +future/backports/email/mime/__pycache__/application.cpython-36.pyc,, +future/backports/email/mime/__pycache__/audio.cpython-36.pyc,, +future/backports/email/mime/__pycache__/base.cpython-36.pyc,, +future/backports/email/mime/__pycache__/image.cpython-36.pyc,, +future/backports/email/mime/__pycache__/message.cpython-36.pyc,, +future/backports/email/mime/__pycache__/multipart.cpython-36.pyc,, +future/backports/email/mime/__pycache__/nonmultipart.cpython-36.pyc,, +future/backports/email/mime/__pycache__/text.cpython-36.pyc,, +future/backports/email/mime/application.py,sha256=m-5a4mSxu2E32XAImnp9x9eMVX5Vme2iNgn2dMMNyss,1401 +future/backports/email/mime/audio.py,sha256=2ognalFRadcsUYQYMUZbjv5i1xJbFhQN643doMuI7M4,2815 +future/backports/email/mime/base.py,sha256=wV3ClQyMsOqmkXSXbk_wd_zPoPTvBx8kAIzq3rdM4lE,875 +future/backports/email/mime/image.py,sha256=DpQk1sB-IMmO43AF4uadsXyf_y5TdEzJLfyhqR48bIw,1907 +future/backports/email/mime/message.py,sha256=pFsMhXW07aRjsLq1peO847PApWFAl28-Z2Z7BP1Dn74,1429 +future/backports/email/mime/multipart.py,sha256=j4Lf_sJmuwTbfgdQ6R35_t1_ha2DynJBJDvpjwbNObE,1699 +future/backports/email/mime/nonmultipart.py,sha256=Ciba1Z8d2yLDDpxgDJuk3Bb-TqcpE9HCd8KfbW5vgl4,832 +future/backports/email/mime/text.py,sha256=zV98BjoR4S_nX8c47x43LnsnifeGhIfNGwSAh575bs0,1552 +future/backports/email/parser.py,sha256=-115SC3DHZ6lLijWFTxuOnE-GiM2BOYaUSz-QpmvYSo,5312 +future/backports/email/policy.py,sha256=gpcbhVRXuCohkK6MUqopTs1lv4E4-ZVUO6OVncoGEJE,8823 +future/backports/email/quoprimime.py,sha256=w93W5XgdFpyGaDqDBJrnXF_v_npH5r20WuAxmrAzyQg,10923 +future/backports/email/utils.py,sha256=vpfN0E8UjNbNw-2NFBQGCo4TNgrghMsqzpEYW5C_fBs,14270 +future/backports/html/__init__.py,sha256=FKwqFtWMCoGNkhU97OPnR1fZSh6etAKfN1FU1KvXcV8,924 +future/backports/html/__pycache__/__init__.cpython-36.pyc,, +future/backports/html/__pycache__/entities.cpython-36.pyc,, +future/backports/html/__pycache__/parser.cpython-36.pyc,, +future/backports/html/entities.py,sha256=kzoRnQyGk_3DgoucHLhL5QL1pglK9nvmxhPIGZFDTnc,75428 +future/backports/html/parser.py,sha256=G2tUObvbHSotNt06JLY-BP1swaZNfDYFd_ENWDjPmRg,19770 +future/backports/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +future/backports/http/__pycache__/__init__.cpython-36.pyc,, +future/backports/http/__pycache__/client.cpython-36.pyc,, +future/backports/http/__pycache__/cookiejar.cpython-36.pyc,, +future/backports/http/__pycache__/cookies.cpython-36.pyc,, +future/backports/http/__pycache__/server.cpython-36.pyc,, +future/backports/http/client.py,sha256=76EbhEZOtvdHFcU-jrjivoff13oQ9IMbdkZEdf5kQzQ,47602 +future/backports/http/cookiejar.py,sha256=_Vy4BPT-h0ZT0R_utGQAFXzuOAdmU9KedGFffyX9wN4,76559 +future/backports/http/cookies.py,sha256=DsyDUGDEbCXAA9Jq6suswSc76uSZqUu39adDDNj8XGw,21581 +future/backports/http/server.py,sha256=1CaMxgzHf9lYhmTJyE7topgjRIlIn9cnjgw8YEvwJV4,45523 +future/backports/misc.py,sha256=AkbED6BdHKnYCmIAontT4zHKTqdPPfJfn35HIs6LDrg,32682 +future/backports/socket.py,sha256=DH1V6IjKPpJ0tln8bYvxvQ7qnvZG-UoQtMA5yVleHiU,15663 +future/backports/socketserver.py,sha256=Twvyk5FqVnOeiNcbVsyMDPTF1mNlkKfyofG7tKxTdD8,24286 +future/backports/test/__init__.py,sha256=9dXxIZnkI095YfHC-XIaVF6d31GjeY1Ag8TEzcFgepM,264 +future/backports/test/__pycache__/__init__.cpython-36.pyc,, +future/backports/test/__pycache__/pystone.cpython-36.pyc,, +future/backports/test/__pycache__/ssl_servers.cpython-36.pyc,, +future/backports/test/__pycache__/support.cpython-36.pyc,, +future/backports/test/badcert.pem,sha256=JioQeRZkHH8hGsWJjAF3U1zQvcWqhyzG6IOEJpTY9SE,1928 +future/backports/test/badkey.pem,sha256=gaBK9px_gG7DmrLKxfD6f6i-toAmARBTVfs-YGFRQF0,2162 +future/backports/test/dh512.pem,sha256=dUTsjtLbK-femrorUrTGF8qvLjhTiT_n4Uo5V6u__Gs,402 +future/backports/test/https_svn_python_org_root.pem,sha256=wOB3Onnc62Iu9kEFd8GcHhd_suucYjpJNA3jyfHeJWA,2569 +future/backports/test/keycert.passwd.pem,sha256=ZBfnVLpbBtAOf_2gCdiQ-yrBHmRsNzSf8VC3UpQZIjg,1830 +future/backports/test/keycert.pem,sha256=xPXi5idPcQVbrhgxBqF2TNGm6sSZ2aLVVEt6DWzplL8,1783 +future/backports/test/keycert2.pem,sha256=DB46FEAYv8BWwQJ-5RzC696FxPN7CON-Qsi-R4poJgc,1795 +future/backports/test/nokia.pem,sha256=s00x0uPDSaa5DHJ_CwzlVhg3OVdJ47f4zgqQdd0SAfQ,1923 +future/backports/test/nullbytecert.pem,sha256=NFRYWhmP_qT3jGfVjR6-iaC-EQdhIFjiXtTLN5ZPKnE,5435 +future/backports/test/nullcert.pem,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +future/backports/test/pystone.py,sha256=fvyoJ_tVovTNaxbJmdJMwr9F6SngY-U4ibULnd_wUqA,7427 +future/backports/test/sha256.pem,sha256=3wB-GQqEc7jq-PYwYAQaPbtTvvr7stk_DVmZxFgehfA,8344 +future/backports/test/ssl_cert.pem,sha256=M607jJNeIeHG9BlTf_jaQkPJI4nOxSJPn-zmEAaW43M,867 +future/backports/test/ssl_key.passwd.pem,sha256=I_WH4sBw9Vs9Z-BvmuXY0aw8tx8avv6rm5UL4S_pP00,963 +future/backports/test/ssl_key.pem,sha256=VKGU-R3UYaZpVTXl7chWl4vEYEDeob69SfvRTQ8aq_4,916 +future/backports/test/ssl_servers.py,sha256=-pd7HMZljuZfFRAbCAiAP_2G04orITJFj-S9ddr6o84,7209 +future/backports/test/support.py,sha256=zJrb-pz-Wu2dZwnNodg1v3w96zVq7ORuN-hOGOHbdA8,70881 +future/backports/total_ordering.py,sha256=O3M57_IisQ-zW5hW20uxkfk4fTGsr0EF2tAKx3BksQo,1929 +future/backports/urllib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +future/backports/urllib/__pycache__/__init__.cpython-36.pyc,, +future/backports/urllib/__pycache__/error.cpython-36.pyc,, +future/backports/urllib/__pycache__/parse.cpython-36.pyc,, +future/backports/urllib/__pycache__/request.cpython-36.pyc,, +future/backports/urllib/__pycache__/response.cpython-36.pyc,, +future/backports/urllib/__pycache__/robotparser.cpython-36.pyc,, +future/backports/urllib/error.py,sha256=ktikuK9ag4lS4f8Z0k5p1F11qF40N2AiOtjbXiF97ew,2715 +future/backports/urllib/parse.py,sha256=67avrYqV1UK7i_22goRUrvJ8SffzjRdTja9wzq_ynXY,35792 +future/backports/urllib/request.py,sha256=aR9ZMzfhV1C2Qk3wFsGvkwxqtdPTdsJVGRt5DUCwgJ8,96276 +future/backports/urllib/response.py,sha256=ooQyswwbb-9N6IVi1Kwjss1aR-Kvm8ZNezoyVEonp8c,3180 +future/backports/urllib/robotparser.py,sha256=pnAGTbKhdbCq_9yMZp7m8hj5q_NJpyQX6oQIZuYcnkw,6865 +future/backports/xmlrpc/__init__.py,sha256=h61ciVTdVvu8oEUXv4dHf_Tc5XUXDH3RKB1-8fQhSsg,38 +future/backports/xmlrpc/__pycache__/__init__.cpython-36.pyc,, +future/backports/xmlrpc/__pycache__/client.cpython-36.pyc,, +future/backports/xmlrpc/__pycache__/server.cpython-36.pyc,, +future/backports/xmlrpc/client.py,sha256=6a6Pvx_RVC9gIHDkFOVdREeGaZckOOiWd7T6GyzU3qU,48133 +future/backports/xmlrpc/server.py,sha256=W_RW5hgYbNV2LGbnvngzm7akacRdK-XFY-Cy2HL-qsY,37285 +future/builtins/__init__.py,sha256=jSdOucWfCsfkfTR8Jd4-Ls-YQpJ0AnzUomBxgwuoxNs,1687 +future/builtins/__pycache__/__init__.cpython-36.pyc,, +future/builtins/__pycache__/disabled.cpython-36.pyc,, +future/builtins/__pycache__/iterators.cpython-36.pyc,, +future/builtins/__pycache__/misc.cpython-36.pyc,, +future/builtins/__pycache__/new_min_max.cpython-36.pyc,, +future/builtins/__pycache__/newnext.cpython-36.pyc,, +future/builtins/__pycache__/newround.cpython-36.pyc,, +future/builtins/__pycache__/newsuper.cpython-36.pyc,, +future/builtins/disabled.py,sha256=Ysq74bsmwntpq7dzkwTAD7IHKrkXy66vJlPshVwgVBI,2109 +future/builtins/iterators.py,sha256=l1Zawm2x82oqOuGGtCZRE76Ej98sMlHQwu9fZLK5RrA,1396 +future/builtins/misc.py,sha256=hctlKKWUyN0Eoodxg4ySQHEqARTukOLR4L5K5c6PW9k,4550 +future/builtins/new_min_max.py,sha256=7qQ4iiG4GDgRzjPzzzmg9pdby35Mtt6xNOOsyqHnIGY,1757 +future/builtins/newnext.py,sha256=oxXB8baXqJv29YG40aCS9UXk9zObyoOjya8BJ7NdBJM,2009 +future/builtins/newround.py,sha256=l2EXPAFU3fAsZigJxUH6x66B7jhNaB076-L5FR617R8,3181 +future/builtins/newsuper.py,sha256=LmiUQ_f6NXDIz6v6sDPkoTWl-2Zccy7PpZfQKYtscac,4146 +future/moves/__init__.py,sha256=MsAW69Xp_fqUo4xODufcKM6AZf-ozHaz44WPZdsDFJA,220 +future/moves/__pycache__/__init__.cpython-36.pyc,, +future/moves/__pycache__/_dummy_thread.cpython-36.pyc,, +future/moves/__pycache__/_markupbase.cpython-36.pyc,, +future/moves/__pycache__/_thread.cpython-36.pyc,, +future/moves/__pycache__/builtins.cpython-36.pyc,, +future/moves/__pycache__/collections.cpython-36.pyc,, +future/moves/__pycache__/configparser.cpython-36.pyc,, +future/moves/__pycache__/copyreg.cpython-36.pyc,, +future/moves/__pycache__/itertools.cpython-36.pyc,, +future/moves/__pycache__/pickle.cpython-36.pyc,, +future/moves/__pycache__/queue.cpython-36.pyc,, +future/moves/__pycache__/reprlib.cpython-36.pyc,, +future/moves/__pycache__/socketserver.cpython-36.pyc,, +future/moves/__pycache__/subprocess.cpython-36.pyc,, +future/moves/__pycache__/sys.cpython-36.pyc,, +future/moves/__pycache__/winreg.cpython-36.pyc,, +future/moves/_dummy_thread.py,sha256=c8ZRUd8ffvyvGKGGgve5NKc8VdtAWquu8-4FnO2EdvA,175 +future/moves/_markupbase.py,sha256=W9wh_Gu3jDAMIhVBV1ZnCkJwYLHRk_v_su_HLALBkZQ,171 +future/moves/_thread.py,sha256=rwY7L4BZMFPlrp_i6T2Un4_iKYwnrXJ-yV6FJZN8YDo,163 +future/moves/builtins.py,sha256=4sjjKiylecJeL9da_RaBZjdymX2jtMs84oA9lCqb4Ug,281 +future/moves/collections.py,sha256=OKQ-TfUgms_2bnZRn4hrclLDoiN2i-HSWcjs3BC2iY8,417 +future/moves/configparser.py,sha256=TNy226uCbljjU-DjAVo7j7Effbj5zxXvDh0SdXehbzk,146 +future/moves/copyreg.py,sha256=Y3UjLXIMSOxZggXtvZucE9yv4tkKZtVan45z8eix4sU,438 +future/moves/dbm/__init__.py,sha256=_VkvQHC2UcIgZFPRroiX_P0Fs7HNqS_69flR0-oq2B8,488 +future/moves/dbm/__pycache__/__init__.cpython-36.pyc,, +future/moves/dbm/__pycache__/dumb.cpython-36.pyc,, +future/moves/dbm/__pycache__/gnu.cpython-36.pyc,, +future/moves/dbm/__pycache__/ndbm.cpython-36.pyc,, +future/moves/dbm/dumb.py,sha256=HKdjjtO3EyP9EKi1Hgxh_eUU6yCQ0fBX9NN3n-zb8JE,166 +future/moves/dbm/gnu.py,sha256=XoCSEpZ2QaOgo2h1m80GW7NUgj_b93BKtbcuwgtnaKo,162 +future/moves/dbm/ndbm.py,sha256=OFnreyo_1YHDBl5YUm9gCzKlN1MHgWbfSQAZVls2jaM,162 +future/moves/html/__init__.py,sha256=BSUFSHxXf2kGvHozlnrB1nn6bPE6p4PpN3DwA_Z5geo,1016 +future/moves/html/__pycache__/__init__.cpython-36.pyc,, +future/moves/html/__pycache__/entities.cpython-36.pyc,, +future/moves/html/__pycache__/parser.cpython-36.pyc,, +future/moves/html/entities.py,sha256=lVvchdjK_RzRj759eg4RMvGWHfgBbj0tKGOoZ8dbRyY,177 +future/moves/html/parser.py,sha256=V2XpHLKLCxQum3N9xlO3IUccAD7BIykZMqdEcWET3vY,167 +future/moves/http/__init__.py,sha256=Mx1v_Tcks4udHCtDM8q2xnYUiQ01gD7EpPyeQwsP3-Q,71 +future/moves/http/__pycache__/__init__.cpython-36.pyc,, +future/moves/http/__pycache__/client.cpython-36.pyc,, +future/moves/http/__pycache__/cookiejar.cpython-36.pyc,, +future/moves/http/__pycache__/cookies.cpython-36.pyc,, +future/moves/http/__pycache__/server.cpython-36.pyc,, +future/moves/http/client.py,sha256=hqEBq7GDXZidd1AscKnSyjSoMcuj8rERqGTmD7VheDQ,165 +future/moves/http/cookiejar.py,sha256=Frr9ZZCg-145ymy0VGpiPJhvBEpJtVqRBYPaKhgT1Z4,173 +future/moves/http/cookies.py,sha256=PPrHa1_oDbu3D_BhJGc6PvMgY1KoxyYq1jqeJwEcMvE,233 +future/moves/http/server.py,sha256=8YQlSCShjAsB5rr5foVvZgp3IzwYFvTmGZCHhBSDtaI,606 +future/moves/itertools.py,sha256=PVxFHRlBQl9ElS0cuGFPcUtj53eHX7Z1DmggzGfgQ6c,158 +future/moves/pickle.py,sha256=r8j9skzfE8ZCeHyh_OB-WucOkRTIHN7zpRM7l7V3qS4,229 +future/moves/queue.py,sha256=uxvLCChF-zxWWgrY1a_wxt8rp2jILdwO4PrnkBW6VTE,160 +future/moves/reprlib.py,sha256=Nt5sUgMQ3jeVIukqSHOvB0UIsl6Y5t-mmT_13mpZmiY,161 +future/moves/socketserver.py,sha256=v8ZLurDxHOgsubYm1iefjlpnnJQcx2VuRUGt9FCJB9k,174 +future/moves/subprocess.py,sha256=oqRSMfFZkxM4MXkt3oD5N6eBwmmJ6rQ9KPhvSQKT_hM,251 +future/moves/sys.py,sha256=HOMRX4Loim75FMbWawd3oEwuGNJR-ClMREEFkVpBsRs,132 +future/moves/test/__init__.py,sha256=yB9F-fDQpzu1v8cBoKgIrL2ScUNqjlkqEztYrGVCQ-0,110 +future/moves/test/__pycache__/__init__.cpython-36.pyc,, +future/moves/test/__pycache__/support.cpython-36.pyc,, +future/moves/test/support.py,sha256=6zGgTTXcERyBJIQ04-X-sAe781tVgLVHp3HzmQPy52g,259 +future/moves/tkinter/__init__.py,sha256=jV9vDx3wRl0bsoclU8oSe-5SqHQ3YpCbStmqtXnq1p4,620 +future/moves/tkinter/__pycache__/__init__.cpython-36.pyc,, +future/moves/tkinter/__pycache__/colorchooser.cpython-36.pyc,, +future/moves/tkinter/__pycache__/commondialog.cpython-36.pyc,, +future/moves/tkinter/__pycache__/constants.cpython-36.pyc,, +future/moves/tkinter/__pycache__/dialog.cpython-36.pyc,, +future/moves/tkinter/__pycache__/dnd.cpython-36.pyc,, +future/moves/tkinter/__pycache__/filedialog.cpython-36.pyc,, +future/moves/tkinter/__pycache__/font.cpython-36.pyc,, +future/moves/tkinter/__pycache__/messagebox.cpython-36.pyc,, +future/moves/tkinter/__pycache__/scrolledtext.cpython-36.pyc,, +future/moves/tkinter/__pycache__/simpledialog.cpython-36.pyc,, +future/moves/tkinter/__pycache__/tix.cpython-36.pyc,, +future/moves/tkinter/__pycache__/ttk.cpython-36.pyc,, +future/moves/tkinter/colorchooser.py,sha256=kprlmpRtvDbW5Gq43H1mi2KmNJ2kuzLQOba0a5EwDkU,333 +future/moves/tkinter/commondialog.py,sha256=mdUbq1IZqOGaSA7_8R367IukDCsMfzXiVHrTQQpp7Z0,333 +future/moves/tkinter/constants.py,sha256=0qRUrZLRPdVxueABL9KTzzEWEsk6xM1rOjxK6OHxXtA,324 +future/moves/tkinter/dialog.py,sha256=ksp-zvs-_A90P9RNHS8S27f1k8f48zG2Bel2jwZV5y0,311 +future/moves/tkinter/dnd.py,sha256=C_Ah0Urnyf2XKE5u-oP6mWi16RzMSXgMA1uhBSAwKY8,306 +future/moves/tkinter/filedialog.py,sha256=RSJFDGOP2AJ4T0ZscJ2hyF9ssOWp9t_S_DtnOmT-WZ8,323 +future/moves/tkinter/font.py,sha256=TXarflhJRxqepaRNSDw6JFUVGz5P1T1C4_uF9VRqj3w,309 +future/moves/tkinter/messagebox.py,sha256=WJt4t83kLmr_UnpCWFuLoyazZr3wAUOEl6ADn3osoEA,327 +future/moves/tkinter/scrolledtext.py,sha256=DRzN8aBAlDBUo1B2KDHzdpRSzXBfH4rOOz0iuHXbQcg,329 +future/moves/tkinter/simpledialog.py,sha256=6MhuVhZCJV4XfPpPSUWKlDLLGEi0Y2ZlGQ9TbsmJFL0,329 +future/moves/tkinter/tix.py,sha256=aNeOfbWSGmcN69UmEGf4tJ-QIxLT6SU5ynzm1iWgepA,302 +future/moves/tkinter/ttk.py,sha256=rRrJpDjcP2gjQNukECu4F026P-CkW-3Ca2tN6Oia-Fw,302 +future/moves/urllib/__init__.py,sha256=yB9F-fDQpzu1v8cBoKgIrL2ScUNqjlkqEztYrGVCQ-0,110 +future/moves/urllib/__pycache__/__init__.cpython-36.pyc,, +future/moves/urllib/__pycache__/error.cpython-36.pyc,, +future/moves/urllib/__pycache__/parse.cpython-36.pyc,, +future/moves/urllib/__pycache__/request.cpython-36.pyc,, +future/moves/urllib/__pycache__/response.cpython-36.pyc,, +future/moves/urllib/__pycache__/robotparser.cpython-36.pyc,, +future/moves/urllib/error.py,sha256=gfrKzv-6W5OjzNIfjvJaQkxABRLym2KwjfKFXSdDB60,479 +future/moves/urllib/parse.py,sha256=xLLUMIIB5MreCdYzRZ5zIRWrhTRCoMO8RZEH4WPFQDY,1045 +future/moves/urllib/request.py,sha256=ttIzq60PwjRyrLQUGdAtfYvs4fziVwvcLe2Kw-hvE0g,3496 +future/moves/urllib/response.py,sha256=ZEZML0FpbB--GIeBFPvSzbtlVJ6EsR4tCI4qB7D8sFQ,342 +future/moves/urllib/robotparser.py,sha256=j24p6dMNzUpGZtT3BQxwRoE-F88iWmBpKgu0tRV61FQ,179 +future/moves/winreg.py,sha256=2zNAG59QI7vFlCj7kqDh0JrAYTpexOnI55PEAIjYhqo,163 +future/moves/xmlrpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +future/moves/xmlrpc/__pycache__/__init__.cpython-36.pyc,, +future/moves/xmlrpc/__pycache__/client.cpython-36.pyc,, +future/moves/xmlrpc/__pycache__/server.cpython-36.pyc,, +future/moves/xmlrpc/client.py,sha256=2PfnL5IbKVwdKP7C8B1OUviEtuBObwoH4pAPfvHIvQc,143 +future/moves/xmlrpc/server.py,sha256=ESDXdpUgTKyeFmCDSnJmBp8zONjJklsRJOvy4OtaALc,143 +future/standard_library/__init__.py,sha256=7paz9IsD5qv_tvk5Rre3YrlA2_2aS1FJfI7UlrzAtWY,27743 +future/standard_library/__pycache__/__init__.cpython-36.pyc,, +future/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +future/tests/__pycache__/__init__.cpython-36.pyc,, +future/tests/__pycache__/base.cpython-36.pyc,, +future/tests/base.py,sha256=7LTAKHJgUxOwmffD1kgcErVt2VouKcldPnq4iruqk_k,19956 +future/types/__init__.py,sha256=5fBxWqf_OTQ8jZ7k2TS34rFH14togeR488F4zBHIQ-s,6831 +future/types/__pycache__/__init__.cpython-36.pyc,, +future/types/__pycache__/newbytes.cpython-36.pyc,, +future/types/__pycache__/newdict.cpython-36.pyc,, +future/types/__pycache__/newint.cpython-36.pyc,, +future/types/__pycache__/newlist.cpython-36.pyc,, +future/types/__pycache__/newmemoryview.cpython-36.pyc,, +future/types/__pycache__/newobject.cpython-36.pyc,, +future/types/__pycache__/newopen.cpython-36.pyc,, +future/types/__pycache__/newrange.cpython-36.pyc,, +future/types/__pycache__/newstr.cpython-36.pyc,, +future/types/newbytes.py,sha256=D_kNDD9sbNJir2cUxxePiAuw2OW5irxVnu55uHmuK9E,16303 +future/types/newdict.py,sha256=2N7P44cWmWtiDHvlK5ir15mW492gg6uP2n65d5bsDy4,3100 +future/types/newint.py,sha256=hJiv9qUDrjl1xkfzNFNLzafsRMPoFcRFceoivUzVIek,13286 +future/types/newlist.py,sha256=-H5-fXodd-UQgTFnZBJdwE68CrgIL_jViYdv4w7q2rU,2284 +future/types/newmemoryview.py,sha256=LnARgiKqQ2zLwwDZ3owu1atoonPQkOneWMfxJCwB4_o,712 +future/types/newobject.py,sha256=AX_n8GwlDR2IY-xIwZCvu0Olj_Ca2aS57nlTihnFr-I,3358 +future/types/newopen.py,sha256=lcRNHWZ1UjEn_0_XKis1ZA5U6l-4c-CHlC0WX1sY4NI,810 +future/types/newrange.py,sha256=7sgJaRaC4WIUtZ40K-c1d5QWruyaCWGgTVFadKo8qYA,5294 +future/types/newstr.py,sha256=e0brkurI0IK--4ToQEO4Cz1FECZav4CyUGMKxlrcmK4,15758 +future/utils/__init__.py,sha256=wsvXsKx-DXZichQ10Rdml-CWMqS79RNNynmdvfISpCU,21828 +future/utils/__pycache__/__init__.cpython-36.pyc,, +future/utils/__pycache__/surrogateescape.cpython-36.pyc,, +future/utils/surrogateescape.py,sha256=7u4V4XlW83P5YSAJS2f92YUF8vsWthsiTnmAshOJL_M,6097 +libfuturize/__init__.py,sha256=CZA_KgvTQOPAY1_MrlJeQ6eMh2Eei4_KIv4JuyAkpfw,31 +libfuturize/__pycache__/__init__.cpython-36.pyc,, +libfuturize/__pycache__/fixer_util.cpython-36.pyc,, +libfuturize/__pycache__/main.cpython-36.pyc,, +libfuturize/fixer_util.py,sha256=Zhms5G97l40pyG1krQM2lCp-TxnocBdJkB2AbkAFnKY,17494 +libfuturize/fixes/__init__.py,sha256=5KEpUnjVsFCCsr_-zrikvJbLf9zslEJnFTH_5pBc33I,5236 +libfuturize/fixes/__pycache__/__init__.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_UserDict.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_absolute_import.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_add__future__imports_except_unicode_literals.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_basestring.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_bytes.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_cmp.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_division.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_division_safe.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_execfile.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_future_builtins.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_future_standard_library.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_future_standard_library_urllib.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_input.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_metaclass.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_next_call.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_object.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_oldstr_wrap.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_order___future__imports.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_print.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_print_with_import.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_raise.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_remove_old__future__imports.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_unicode_keep_u.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_unicode_literals_import.cpython-36.pyc,, +libfuturize/fixes/__pycache__/fix_xrange_with_import.cpython-36.pyc,, +libfuturize/fixes/fix_UserDict.py,sha256=jL4jXnGaUQTkG8RKfGXbU_HVTkB3MWZMQwUkqMAjB6I,3840 +libfuturize/fixes/fix_absolute_import.py,sha256=vkrF2FyQR5lSz2WmdqywzkEJVTC0eq4gh_REWBKHh7w,3140 +libfuturize/fixes/fix_add__future__imports_except_unicode_literals.py,sha256=Fr219VAzR8KWXc2_bfiqLl10EgxAWjL6cI3Mowt--VU,662 +libfuturize/fixes/fix_basestring.py,sha256=bHkKuMzhr5FMXwjXlMOjsod4S3rQkVdbzhoWV4-tl3Y,394 +libfuturize/fixes/fix_bytes.py,sha256=AhzOJes6EnPwgzboDjvURANbWKqciG6ZGaYW07PYQK8,685 +libfuturize/fixes/fix_cmp.py,sha256=Blq_Z0IGkYiKS83QzZ5wUgpJyZfQiZoEsWJ1VPyXgFY,701 +libfuturize/fixes/fix_division.py,sha256=gnrAi7stquiVUyi_De1H8q--43iQaSUX0CjnOmQ6O2w,228 +libfuturize/fixes/fix_division_safe.py,sha256=Y_HUfQJAxRClXkcfqWP5SFCsRYZOsLUsNjLXlGOA3cQ,3292 +libfuturize/fixes/fix_execfile.py,sha256=I5AcJ6vPZ7i70TChaq9inxqnZ4C04-yJyfAItGa8E3c,921 +libfuturize/fixes/fix_future_builtins.py,sha256=QBCRpD9XA7tbtfP4wmOF2DXquB4lq-eupkQj-QAxp0s,2027 +libfuturize/fixes/fix_future_standard_library.py,sha256=FVtflFt38efHe_SEX6k3m6IYAtKWjA4rAPZrlCv6yA0,733 +libfuturize/fixes/fix_future_standard_library_urllib.py,sha256=Rf81XcAXA-vwNvrhskf5sLExbR--Wkr5fiUcMYGAKzs,1001 +libfuturize/fixes/fix_input.py,sha256=bhaPNtMrZNbjWIDQCR7Iue5BxBj4rf0RJQ9_jiwvb-s,687 +libfuturize/fixes/fix_metaclass.py,sha256=GLB76wbuyUVciDgW9bgNNOBEnLeS_AR-fKABcPBZk6M,9568 +libfuturize/fixes/fix_next_call.py,sha256=01STG86Av9o5QcpQDJ6UbPhvxt9kKrkatiPeddXRgvA,3158 +libfuturize/fixes/fix_object.py,sha256=qalFIjn0VTWXG5sGOOoCvO65omjX5_9d40SUpwUjBdw,407 +libfuturize/fixes/fix_oldstr_wrap.py,sha256=UCR6Q2l-pVqJSrRTnQAWMlaqBoX7oX1VpG_w6Q0XcyY,1214 +libfuturize/fixes/fix_order___future__imports.py,sha256=ACUCw5NEGWvj6XA9rNj8BYha3ktxLvkM5Ssh5cyV644,829 +libfuturize/fixes/fix_print.py,sha256=92s1w2t9SynA3Y1_85-lexSBbgEWJM6lBrhCxVacfDc,3384 +libfuturize/fixes/fix_print_with_import.py,sha256=hVWn70Q1DPMUiHMyEqgUx-6sM1AylLj78v9pMc4LFw8,735 +libfuturize/fixes/fix_raise.py,sha256=mEXpM9sS6tenMmxayfqM-Kp9gUvaztTY61vFaqyMUuo,3884 +libfuturize/fixes/fix_remove_old__future__imports.py,sha256=j4EC1KEVgXhuQAqhYHnAruUjW6uczPjV_fTCSOLMuAw,851 +libfuturize/fixes/fix_unicode_keep_u.py,sha256=M8fcFxHeFnWVOKoQRpkMsnpd9qmUFubI2oFhO4ZPk7A,779 +libfuturize/fixes/fix_unicode_literals_import.py,sha256=wq-hb-9Yx3Az4ol-ylXZJPEDZ81EaPZeIy5VvpA0CEY,367 +libfuturize/fixes/fix_xrange_with_import.py,sha256=f074qStjMz3OtLjt1bKKZSxQnRbbb7HzEbqHt9wgqdw,479 +libfuturize/main.py,sha256=feICmcv0dzWhutvwz0unnIVxusbSlQZFDaxObkHebs8,13733 +libpasteurize/__init__.py,sha256=CZA_KgvTQOPAY1_MrlJeQ6eMh2Eei4_KIv4JuyAkpfw,31 +libpasteurize/__pycache__/__init__.cpython-36.pyc,, +libpasteurize/__pycache__/main.cpython-36.pyc,, +libpasteurize/fixes/__init__.py,sha256=ccdv-2MGjQMbq8XuEZBndHmbzGRrZnabksjXZLUv044,3719 +libpasteurize/fixes/__pycache__/__init__.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/feature_base.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_add_all__future__imports.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_add_all_future_builtins.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_add_future_standard_library_import.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_annotations.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_division.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_features.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_fullargspec.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_future_builtins.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_getcwd.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_imports.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_imports2.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_kwargs.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_memoryview.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_metaclass.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_newstyle.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_next.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_printfunction.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_raise.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_raise_.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_throw.cpython-36.pyc,, +libpasteurize/fixes/__pycache__/fix_unpacking.cpython-36.pyc,, +libpasteurize/fixes/feature_base.py,sha256=v7yLjBDBUPeNUc-YHGGlIsJDOQzFAM4Vo0RN5F1JHVU,1723 +libpasteurize/fixes/fix_add_all__future__imports.py,sha256=mHet1LgbHn9GfgCYGNZXKo-rseDWreAvUcAjZwdgeTE,676 +libpasteurize/fixes/fix_add_all_future_builtins.py,sha256=scfkY-Sz5j0yDtLYls2ENOcqEMPVxeDm9gFYYPINPB8,1269 +libpasteurize/fixes/fix_add_future_standard_library_import.py,sha256=thTRbkBzy_SJjZ0bJteTp0sBTx8Wr69xFakH4styf7Y,663 +libpasteurize/fixes/fix_annotations.py,sha256=VT_AorKY9AYWYZUZ17_CeUrJlEA7VGkwVLDQlwD1Bxo,1581 +libpasteurize/fixes/fix_division.py,sha256=_TD_c5KniAYqEm11O7NJF0v2WEhYSNkRGcKG_94ZOas,904 +libpasteurize/fixes/fix_features.py,sha256=NZn0n34_MYZpLNwyP1Tf51hOiN58Rg7A8tA9pK1S8-c,2675 +libpasteurize/fixes/fix_fullargspec.py,sha256=VlZuIU6QNrClmRuvC4mtLICL3yMCi-RcGCnS9fD4b-Q,438 +libpasteurize/fixes/fix_future_builtins.py,sha256=SlCK9I9u05m19Lr1wxlJxF8toZ5yu0yXBeDLxUN9_fw,1450 +libpasteurize/fixes/fix_getcwd.py,sha256=uebvTvFboLqsROFCwdnzoP6ThziM0skz9TDXHoJcFsQ,873 +libpasteurize/fixes/fix_imports.py,sha256=U4lIs_5Xp1qqM8mN72ieDkkIdiyALZFyCZsRC8ZmXlM,4944 +libpasteurize/fixes/fix_imports2.py,sha256=bs2V5Yv0v_8xLx-lNj9kNEAK2dLYXUXkZ2hxECg01CU,8580 +libpasteurize/fixes/fix_kwargs.py,sha256=NB_Ap8YJk-9ncoJRbOiPY_VMIigFgVB8m8AuY29DDhE,5991 +libpasteurize/fixes/fix_memoryview.py,sha256=Fwayx_ezpr22tbJ0-QrKdJ-FZTpU-m7y78l1h_N4xxc,551 +libpasteurize/fixes/fix_metaclass.py,sha256=IcE2KjaDG8jUR3FYXECzOC_cr2pr5r95W1NTbMrK8Wc,3260 +libpasteurize/fixes/fix_newstyle.py,sha256=78sazKOHm9DUoMyW4VdvQpMXZhicbXzorVPRhBpSUrM,888 +libpasteurize/fixes/fix_next.py,sha256=VHqcyORRNVqKJ51jJ1OkhwxHuXRgp8qaldyqcMvA4J0,1233 +libpasteurize/fixes/fix_printfunction.py,sha256=NDIfqVmUJBG3H9E6nrnN0cWZK8ch9pL4F-nMexdsa38,401 +libpasteurize/fixes/fix_raise.py,sha256=zQ_AcMsGmCbtKMgrxZGcHLYNscw6tqXFvHQxgqtNbU8,1099 +libpasteurize/fixes/fix_raise_.py,sha256=9STp633frUfYASjYzqhwxx_MXePNmMhfJClowRj8FLY,1225 +libpasteurize/fixes/fix_throw.py,sha256=_ZREVre-WttUvk4sWjrqUNqm9Q1uFaATECN0_-PXKbk,835 +libpasteurize/fixes/fix_unpacking.py,sha256=eMqRe44Nfq8lo0YFL9oKW75dGARmBSmklj4BCS_q1Lo,5946 +libpasteurize/main.py,sha256=dVHYTQQeJonuOFDNrenJZl-rKHgOQKRMPP1OqnJogWQ,8186 +past/__init__.py,sha256=wIiXaAvXl3svDi-fzuy6HDD0VsuCVr4cnqnCr8XINGI,2918 +past/__pycache__/__init__.cpython-36.pyc,, +past/builtins/__init__.py,sha256=7j_4OsUlN6q2eKr14do7mRQ1GwXRoXAMUR0A1fJpAls,1805 +past/builtins/__pycache__/__init__.cpython-36.pyc,, +past/builtins/__pycache__/misc.cpython-36.pyc,, +past/builtins/__pycache__/noniterators.cpython-36.pyc,, +past/builtins/misc.py,sha256=nw62HVSxuAgT-Q2lD3lmgRB9zmFXopS14dZHEv5xpDQ,2627 +past/builtins/noniterators.py,sha256=LtdELnd7KyYdXg7GkW25cgkEPUC0ggZ5AYMtDe9N95I,9370 +past/translation/__init__.py,sha256=j2e6mLeK74KEICqH6P_-tpKqSNZoMwip2toThhSmKpU,17646 +past/translation/__pycache__/__init__.cpython-36.pyc,, +past/types/__init__.py,sha256=RyJlgqg9uJ8oF-kJT9QlfhfdmhiMh3fShmtvd2CQycY,879 +past/types/__pycache__/__init__.cpython-36.pyc,, +past/types/__pycache__/basestring.cpython-36.pyc,, +past/types/__pycache__/olddict.cpython-36.pyc,, +past/types/__pycache__/oldstr.cpython-36.pyc,, +past/types/basestring.py,sha256=qrImcr24wvdDCMvF9x0Tyx8S1lCt6GIwRvzuAmvg_Tg,728 +past/types/olddict.py,sha256=0YtffZ55VY6AyQ_rwu4DZ4vcRsp6dz-dQzczeyN8hLk,2721 +past/types/oldstr.py,sha256=J2sJPC5jWEdpqXPcFwJFNDKn51TKhi86PsLFmJtQr-M,4332 +past/utils/__init__.py,sha256=e8l1sOfdiDJ3dkckBWLNWvC1ahC5BX5haHC2TGdNgA8,2633 +past/utils/__pycache__/__init__.cpython-36.pyc,, diff --git a/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/WHEEL b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/WHEEL new file mode 100644 index 0000000..b552003 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/entry_points.txt b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/entry_points.txt new file mode 100644 index 0000000..45d1a88 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/entry_points.txt @@ -0,0 +1,4 @@ +[console_scripts] +futurize = libfuturize.main:main +pasteurize = libpasteurize.main:main + diff --git a/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/top_level.txt b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/top_level.txt new file mode 100644 index 0000000..58f5843 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future-0.18.2.dist-info/top_level.txt @@ -0,0 +1,4 @@ +future +libfuturize +libpasteurize +past diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/__init__.py new file mode 100644 index 0000000..ad419d6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/__init__.py @@ -0,0 +1,93 @@ +""" +future: Easy, safe support for Python 2/3 compatibility +======================================================= + +``future`` is the missing compatibility layer between Python 2 and Python +3. It allows you to use a single, clean Python 3.x-compatible codebase to +support both Python 2 and Python 3 with minimal overhead. + +It is designed to be used as follows:: + + from __future__ import (absolute_import, division, + print_function, unicode_literals) + from builtins import ( + bytes, dict, int, list, object, range, str, + ascii, chr, hex, input, next, oct, open, + pow, round, super, + filter, map, zip) + +followed by predominantly standard, idiomatic Python 3 code that then runs +similarly on Python 2.6/2.7 and Python 3.3+. + +The imports have no effect on Python 3. On Python 2, they shadow the +corresponding builtins, which normally have different semantics on Python 3 +versus 2, to provide their Python 3 semantics. + + +Standard library reorganization +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``future`` supports the standard library reorganization (PEP 3108) through the +following Py3 interfaces: + + >>> # Top-level packages with Py3 names provided on Py2: + >>> import html.parser + >>> import queue + >>> import tkinter.dialog + >>> import xmlrpc.client + >>> # etc. + + >>> # Aliases provided for extensions to existing Py2 module names: + >>> from future.standard_library import install_aliases + >>> install_aliases() + + >>> from collections import Counter, OrderedDict # backported to Py2.6 + >>> from collections import UserDict, UserList, UserString + >>> import urllib.request + >>> from itertools import filterfalse, zip_longest + >>> from subprocess import getoutput, getstatusoutput + + +Automatic conversion +-------------------- + +An included script called `futurize +`_ aids in converting +code (from either Python 2 or Python 3) to code compatible with both +platforms. It is similar to ``python-modernize`` but goes further in +providing Python 3 compatibility through the use of the backported types +and builtin functions in ``future``. + + +Documentation +------------- + +See: http://python-future.org + + +Credits +------- + +:Author: Ed Schofield, Jordan M. Adler, et al +:Sponsor: Python Charmers Pty Ltd, Australia, and Python Charmers Pte + Ltd, Singapore. http://pythoncharmers.com +:Others: See docs/credits.rst or http://python-future.org/credits.html + + +Licensing +--------- +Copyright 2013-2019 Python Charmers Pty Ltd, Australia. +The software is distributed under an MIT licence. See LICENSE.txt. + +""" + +__title__ = 'future' +__author__ = 'Ed Schofield' +__license__ = 'MIT' +__copyright__ = 'Copyright 2013-2019 Python Charmers Pty Ltd' +__ver_major__ = 0 +__ver_minor__ = 18 +__ver_patch__ = 2 +__ver_sub__ = '' +__version__ = "%d.%d.%d%s" % (__ver_major__, __ver_minor__, + __ver_patch__, __ver_sub__) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ddd619c9b178440e23e32b9fa1136bb248de404 GIT binary patch literal 3102 zcmbVOOK;mo5SAUkvZ*gc(enU702`60)C$s6NR1kf4=LQlsMCuMrB~dgxCzN+c9)jv zL;p|FL;sJjJ>@U7mwro9535OEv_u>P0 zPjM2RQAeze*2MZ~UECSn5gVfou{qilTca(pJ=zvKqaATqZptmWEqCIL&pV^Lf}MBv z@9~&*IxH?-Y2=VjxUITmc`V76MWKzOSQ|R4T%vP2=np8;S;3tet5ms)ef|Fq#x5?J zB`+>WS#pV_Oj)b)$?XLw<&`uvmToF#K97TVF4`M52dkUUB~}x1%<;L?Y?kp@yW~Sl(SW83uQHXZjHje8rAZ_g0b_^&X$Wc6 zB$vX6FqS?FLEHktI=JDGF~SiWolzJz`G+B?tj2kdkF8EiC&T7JmxQ`hR_VN3n|ad@ z9feW3gSR|#{#z<@<&z3gA8B}M_ZN$fOO-m6+xe2W9giy~tzR~BU4qjtrOM*0$8V&6 zWOzOSoYt9@h`5cE0?vu)QX;RsaZ$n`msj50+v-BD=27S=eCje6@L3je)oYAk@sKiJ zbm>|Z`;0Y60@ZOvg^@y|6g+ong`hwQZs1A@r86)znw8LVR-nKMcb;fDnKHM`s!XNa zz!b!u@jH0ZKM1~DViyg9!9&#dH3-_2#ZtmACFPoA90Qgmb1?DM!dKTXhQJao^weLo zNE;(

yGRJ}X9-riqFYcr+jt;;H=$1@A`Yj;zd(qKfSDN(|JqrKJO`q5*}zRCS6{ z&6{cGE$of&($@s(mDI-?~hv@+crwmw=?8F;+Xc%PR?lX#iOVD z00HHmBsCaKDLoKp)xfh&nwUq@woP()cu4o@wJv(8yp$;wJbKF~(l#CFO>&;$woP3$ z;2aEVMtkG7s}h%`LBWlcX7$y(QkHV{p?h105(vdpJz0Hwm8GVLf+$s}%>3njk}d+q zzB`+^k5UCqS&Gh!D4Id$zMp{`*mH&6YSKTTOp6j?RHw8^p%#ipCW0BtXzQkYZGPxx z2iAnVS#ci2%JV%m&n&#!Z3ImMd+TUgSI20@y5U|K0qTk8&;i)or!lbi64eOXS#=OR z`A26z0C4Z1OaAJ#))9Yo?jTox!L>9g@(PSZP3!{LI#MrVPV028T8%EmkT!@BbRkSN zbZOPhmSb=Ogqqt;q|>FVg$b8{&6T!!fc7{lU8@?A&V6(Fp6Gqxz^6Ir8l|NG9yT(n za1@~gxNBybx|Zx&;#@K8_ltUP_Szz%;re{GP`Fqq@GL#N2#G6!aB~QjkHOOeqJhTV ztC5fxJ{X2Gv7*Ib9-y~$BXdi$tsYi>n6V<|4iwC6Ju5M(TJ`f*7Z+`iAfYtS1BsbD zE*(uY7#x?TUR33*X|;y3^>$!oGqBv=^#sa-V|0%}mv0M2V$S^(zft9nf5;8VKg%fRtL??pIqeRC_rWhCBY9p{a_%5I$ zk@|5X{bqs<&!N-Sf8WA=oN$wY7j)(-I(4u-DlrLt-*uM<#?p6|2!z~EFxUT{F7Ie6??7nMZ{F9toFzWNs#2K4~6I(AcTFbT2MK}Q<}nt=A0;Gm@k@x^OQ0W2CJLm&O=i{q1* z=O=-?a;WIdR?`R9pDdT)<_^rRAO45H-ebetdH<

bjlxn>VUQ2#%$FZbEab{GP; zFub`NhEBOu;*y0SS`Q4s^}P@>>ap=Jc0+Vx3rZM{aEsOpGycYZI=@vI&x>2^fTIMr zaO6LR)-+yQ;RwT@J7yQ5)u-PFeU}yeLKVF-_j62&-ZYUi?LB@xjcxVrZNI^#ABNaj ex-bli>SpIzGZYTLhadYHP8;hRYq$Tl*8T)%Q2ZkR literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/__init__.py new file mode 100644 index 0000000..c71e065 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/__init__.py @@ -0,0 +1,26 @@ +""" +future.backports package +""" + +from __future__ import absolute_import + +import sys + +__future_module__ = True +from future.standard_library import import_top_level_modules + + +if sys.version_info[0] >= 3: + import_top_level_modules() + + +from .misc import (ceil, + OrderedDict, + Counter, + ChainMap, + check_output, + count, + recursive_repr, + _count_elements, + cmp_to_key + ) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f34d5d60d3cb1b15ce3e578cf73c4edaf70b8d1d GIT binary patch literal 601 zcmYk3J&zMH5Qe=U+1+e*H=$)i)<1rKyo?F?N&XvtOgbvx|# zFpO4>)=j#Q;2MqHs0}|LXjIzG;cpyJpv2x9S9VhQ^03F_^3vr1Z0G=732^QRK!=BQ zi8&g&c!-{D0?^0*8aKA>S*sZczR|5d>d=6z4(N*yJ@9@zxKwh}>CA8FJfH}e29yD_ zfGVI4Xgt0X{V3>wU$<*3)mm}28vF3N$X53|M6tTQzTcYTm;L(eW&Q98Yw(4+1-Md2 ZSKORUzYNYyxIK-lxQNrJN}4E3{s5D3t}Orn literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/_markupbase.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/_markupbase.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70e22ac027f39ce06ca868159e7158c91116cd57 GIT binary patch literal 9586 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/datetime.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/datetime.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3e4476b6e9ce312813d3c2b502caf538f3d3fba GIT binary patch literal 50967 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/socket.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/socket.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ec2e0b153c110f03cdd3deeedde48a784302559 GIT binary patch literal 14259 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/socketserver.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/__pycache__/socketserver.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5186e34a74d1085895cdd023606001b26bbcd703 GIT binary patch literal 22422 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/_markupbase.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/_markupbase.py new file mode 100644 index 0000000..d51bfc7 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/_markupbase.py @@ -0,0 +1,422 @@ +"""Shared support for scanning document type declarations in HTML and XHTML. + +Backported for python-future from Python 3.3. Reason: ParserBase is an +old-style class in the Python 2.7 source of markupbase.py, which I suspect +might be the cause of sporadic unit-test failures on travis-ci.org with +test_htmlparser.py. The test failures look like this: + + ====================================================================== + +ERROR: test_attr_entity_replacement (future.tests.test_htmlparser.AttributesStrictTestCase) + +---------------------------------------------------------------------- + +Traceback (most recent call last): + File "/home/travis/build/edschofield/python-future/future/tests/test_htmlparser.py", line 661, in test_attr_entity_replacement + [("starttag", "a", [("b", "&><\"'")])]) + File "/home/travis/build/edschofield/python-future/future/tests/test_htmlparser.py", line 93, in _run_check + collector = self.get_collector() + File "/home/travis/build/edschofield/python-future/future/tests/test_htmlparser.py", line 617, in get_collector + return EventCollector(strict=True) + File "/home/travis/build/edschofield/python-future/future/tests/test_htmlparser.py", line 27, in __init__ + html.parser.HTMLParser.__init__(self, *args, **kw) + File "/home/travis/build/edschofield/python-future/future/backports/html/parser.py", line 135, in __init__ + self.reset() + File "/home/travis/build/edschofield/python-future/future/backports/html/parser.py", line 143, in reset + _markupbase.ParserBase.reset(self) + +TypeError: unbound method reset() must be called with ParserBase instance as first argument (got EventCollector instance instead) + +This module is used as a foundation for the html.parser module. It has no +documented public API and should not be used directly. + +""" + +import re + +_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9]*\s*').match +_declstringlit_match = re.compile(r'(\'[^\']*\'|"[^"]*")\s*').match +_commentclose = re.compile(r'--\s*>') +_markedsectionclose = re.compile(r']\s*]\s*>') + +# An analysis of the MS-Word extensions is available at +# http://www.planetpublish.com/xmlarena/xap/Thursday/WordtoXML.pdf + +_msmarkedsectionclose = re.compile(r']\s*>') + +del re + + +class ParserBase(object): + """Parser base class which provides some common support methods used + by the SGML/HTML and XHTML parsers.""" + + def __init__(self): + if self.__class__ is ParserBase: + raise RuntimeError( + "_markupbase.ParserBase must be subclassed") + + def error(self, message): + raise NotImplementedError( + "subclasses of ParserBase must override error()") + + def reset(self): + self.lineno = 1 + self.offset = 0 + + def getpos(self): + """Return current line number and offset.""" + return self.lineno, self.offset + + # Internal -- update line number and offset. This should be + # called for each piece of data exactly once, in order -- in other + # words the concatenation of all the input strings to this + # function should be exactly the entire input. + def updatepos(self, i, j): + if i >= j: + return j + rawdata = self.rawdata + nlines = rawdata.count("\n", i, j) + if nlines: + self.lineno = self.lineno + nlines + pos = rawdata.rindex("\n", i, j) # Should not fail + self.offset = j-(pos+1) + else: + self.offset = self.offset + j-i + return j + + _decl_otherchars = '' + + # Internal -- parse declaration (for use by subclasses). + def parse_declaration(self, i): + # This is some sort of declaration; in "HTML as + # deployed," this should only be the document type + # declaration (""). + # ISO 8879:1986, however, has more complex + # declaration syntax for elements in , including: + # --comment-- + # [marked section] + # name in the following list: ENTITY, DOCTYPE, ELEMENT, + # ATTLIST, NOTATION, SHORTREF, USEMAP, + # LINKTYPE, LINK, IDLINK, USELINK, SYSTEM + rawdata = self.rawdata + j = i + 2 + assert rawdata[i:j] == "": + # the empty comment + return j + 1 + if rawdata[j:j+1] in ("-", ""): + # Start of comment followed by buffer boundary, + # or just a buffer boundary. + return -1 + # A simple, practical version could look like: ((name|stringlit) S*) + '>' + n = len(rawdata) + if rawdata[j:j+2] == '--': #comment + # Locate --.*-- as the body of the comment + return self.parse_comment(i) + elif rawdata[j] == '[': #marked section + # Locate [statusWord [...arbitrary SGML...]] as the body of the marked section + # Where statusWord is one of TEMP, CDATA, IGNORE, INCLUDE, RCDATA + # Note that this is extended by Microsoft Office "Save as Web" function + # to include [if...] and [endif]. + return self.parse_marked_section(i) + else: #all other declaration elements + decltype, j = self._scan_name(j, i) + if j < 0: + return j + if decltype == "doctype": + self._decl_otherchars = '' + while j < n: + c = rawdata[j] + if c == ">": + # end of declaration syntax + data = rawdata[i+2:j] + if decltype == "doctype": + self.handle_decl(data) + else: + # According to the HTML5 specs sections "8.2.4.44 Bogus + # comment state" and "8.2.4.45 Markup declaration open + # state", a comment token should be emitted. + # Calling unknown_decl provides more flexibility though. + self.unknown_decl(data) + return j + 1 + if c in "\"'": + m = _declstringlit_match(rawdata, j) + if not m: + return -1 # incomplete + j = m.end() + elif c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ": + name, j = self._scan_name(j, i) + elif c in self._decl_otherchars: + j = j + 1 + elif c == "[": + # this could be handled in a separate doctype parser + if decltype == "doctype": + j = self._parse_doctype_subset(j + 1, i) + elif decltype in set(["attlist", "linktype", "link", "element"]): + # must tolerate []'d groups in a content model in an element declaration + # also in data attribute specifications of attlist declaration + # also link type declaration subsets in linktype declarations + # also link attribute specification lists in link declarations + self.error("unsupported '[' char in %s declaration" % decltype) + else: + self.error("unexpected '[' char in declaration") + else: + self.error( + "unexpected %r char in declaration" % rawdata[j]) + if j < 0: + return j + return -1 # incomplete + + # Internal -- parse a marked section + # Override this to handle MS-word extension syntax content + def parse_marked_section(self, i, report=1): + rawdata= self.rawdata + assert rawdata[i:i+3] == ' ending + match= _markedsectionclose.search(rawdata, i+3) + elif sectName in set(["if", "else", "endif"]): + # look for MS Office ]> ending + match= _msmarkedsectionclose.search(rawdata, i+3) + else: + self.error('unknown status keyword %r in marked section' % rawdata[i+3:j]) + if not match: + return -1 + if report: + j = match.start(0) + self.unknown_decl(rawdata[i+3: j]) + return match.end(0) + + # Internal -- parse comment, return length or -1 if not terminated + def parse_comment(self, i, report=1): + rawdata = self.rawdata + if rawdata[i:i+4] != ' delimiter transport-padding + # --> CRLF body-part + for body_part in msgtexts: + # delimiter transport-padding CRLF + self.write(self._NL + '--' + boundary + self._NL) + # body-part + self._fp.write(body_part) + # close-delimiter transport-padding + self.write(self._NL + '--' + boundary + '--') + if msg.epilogue is not None: + self.write(self._NL) + if self._mangle_from_: + epilogue = fcre.sub('>From ', msg.epilogue) + else: + epilogue = msg.epilogue + self._write_lines(epilogue) + + def _handle_multipart_signed(self, msg): + # The contents of signed parts has to stay unmodified in order to keep + # the signature intact per RFC1847 2.1, so we disable header wrapping. + # RDM: This isn't enough to completely preserve the part, but it helps. + p = self.policy + self.policy = p.clone(max_line_length=0) + try: + self._handle_multipart(msg) + finally: + self.policy = p + + def _handle_message_delivery_status(self, msg): + # We can't just write the headers directly to self's file object + # because this will leave an extra newline between the last header + # block and the boundary. Sigh. + blocks = [] + for part in msg.get_payload(): + s = self._new_buffer() + g = self.clone(s) + g.flatten(part, unixfrom=False, linesep=self._NL) + text = s.getvalue() + lines = text.split(self._encoded_NL) + # Strip off the unnecessary trailing empty line + if lines and lines[-1] == self._encoded_EMPTY: + blocks.append(self._encoded_NL.join(lines[:-1])) + else: + blocks.append(text) + # Now join all the blocks with an empty line. This has the lovely + # effect of separating each block with an empty line, but not adding + # an extra one after the last one. + self._fp.write(self._encoded_NL.join(blocks)) + + def _handle_message(self, msg): + s = self._new_buffer() + g = self.clone(s) + # The payload of a message/rfc822 part should be a multipart sequence + # of length 1. The zeroth element of the list should be the Message + # object for the subpart. Extract that object, stringify it, and + # write it out. + # Except, it turns out, when it's a string instead, which happens when + # and only when HeaderParser is used on a message of mime type + # message/rfc822. Such messages are generated by, for example, + # Groupwise when forwarding unadorned messages. (Issue 7970.) So + # in that case we just emit the string body. + payload = msg._payload + if isinstance(payload, list): + g.flatten(msg.get_payload(0), unixfrom=False, linesep=self._NL) + payload = s.getvalue() + else: + payload = self._encode(payload) + self._fp.write(payload) + + # This used to be a module level function; we use a classmethod for this + # and _compile_re so we can continue to provide the module level function + # for backward compatibility by doing + # _make_boudary = Generator._make_boundary + # at the end of the module. It *is* internal, so we could drop that... + @classmethod + def _make_boundary(cls, text=None): + # Craft a random boundary. If text is given, ensure that the chosen + # boundary doesn't appear in the text. + token = random.randrange(sys.maxsize) + boundary = ('=' * 15) + (_fmt % token) + '==' + if text is None: + return boundary + b = boundary + counter = 0 + while True: + cre = cls._compile_re('^--' + re.escape(b) + '(--)?$', re.MULTILINE) + if not cre.search(text): + break + b = boundary + '.' + str(counter) + counter += 1 + return b + + @classmethod + def _compile_re(cls, s, flags): + return re.compile(s, flags) + +class BytesGenerator(Generator): + """Generates a bytes version of a Message object tree. + + Functionally identical to the base Generator except that the output is + bytes and not string. When surrogates were used in the input to encode + bytes, these are decoded back to bytes for output. If the policy has + cte_type set to 7bit, then the message is transformed such that the + non-ASCII bytes are properly content transfer encoded, using the charset + unknown-8bit. + + The outfp object must accept bytes in its write method. + """ + + # Bytes versions of this constant for use in manipulating data from + # the BytesIO buffer. + _encoded_EMPTY = b'' + + def write(self, s): + self._fp.write(str(s).encode('ascii', 'surrogateescape')) + + def _new_buffer(self): + return BytesIO() + + def _encode(self, s): + return s.encode('ascii') + + def _write_headers(self, msg): + # This is almost the same as the string version, except for handling + # strings with 8bit bytes. + for h, v in msg.raw_items(): + self._fp.write(self.policy.fold_binary(h, v)) + # A blank line always separates headers from body + self.write(self._NL) + + def _handle_text(self, msg): + # If the string has surrogates the original source was bytes, so + # just write it back out. + if msg._payload is None: + return + if _has_surrogates(msg._payload) and not self.policy.cte_type=='7bit': + if self._mangle_from_: + msg._payload = fcre.sub(">From ", msg._payload) + self._write_lines(msg._payload) + else: + super(BytesGenerator,self)._handle_text(msg) + + # Default body handler + _writeBody = _handle_text + + @classmethod + def _compile_re(cls, s, flags): + return re.compile(s.encode('ascii'), flags) + + +_FMT = '[Non-text (%(type)s) part of message omitted, filename %(filename)s]' + +class DecodedGenerator(Generator): + """Generates a text representation of a message. + + Like the Generator base class, except that non-text parts are substituted + with a format string representing the part. + """ + def __init__(self, outfp, mangle_from_=True, maxheaderlen=78, fmt=None): + """Like Generator.__init__() except that an additional optional + argument is allowed. + + Walks through all subparts of a message. If the subpart is of main + type `text', then it prints the decoded payload of the subpart. + + Otherwise, fmt is a format string that is used instead of the message + payload. fmt is expanded with the following keywords (in + %(keyword)s format): + + type : Full MIME type of the non-text part + maintype : Main MIME type of the non-text part + subtype : Sub-MIME type of the non-text part + filename : Filename of the non-text part + description: Description associated with the non-text part + encoding : Content transfer encoding of the non-text part + + The default value for fmt is None, meaning + + [Non-text (%(type)s) part of message omitted, filename %(filename)s] + """ + Generator.__init__(self, outfp, mangle_from_, maxheaderlen) + if fmt is None: + self._fmt = _FMT + else: + self._fmt = fmt + + def _dispatch(self, msg): + for part in msg.walk(): + maintype = part.get_content_maintype() + if maintype == 'text': + print(part.get_payload(decode=False), file=self) + elif maintype == 'multipart': + # Just skip this + pass + else: + print(self._fmt % { + 'type' : part.get_content_type(), + 'maintype' : part.get_content_maintype(), + 'subtype' : part.get_content_subtype(), + 'filename' : part.get_filename('[no filename]'), + 'description': part.get('Content-Description', + '[no description]'), + 'encoding' : part.get('Content-Transfer-Encoding', + '[no encoding]'), + }, file=self) + + +# Helper used by Generator._make_boundary +_width = len(repr(sys.maxsize-1)) +_fmt = '%%0%dd' % _width + +# Backward compatibility +_make_boundary = Generator._make_boundary diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/header.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/header.py new file mode 100644 index 0000000..63bf038 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/header.py @@ -0,0 +1,581 @@ +# Copyright (C) 2002-2007 Python Software Foundation +# Author: Ben Gertzfield, Barry Warsaw +# Contact: email-sig@python.org + +"""Header encoding and decoding functionality.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from future.builtins import bytes, range, str, super, zip + +__all__ = [ + 'Header', + 'decode_header', + 'make_header', + ] + +import re +import binascii + +from future.backports import email +from future.backports.email import base64mime +from future.backports.email.errors import HeaderParseError +import future.backports.email.charset as _charset + +# Helpers +from future.backports.email.quoprimime import _max_append, header_decode + +Charset = _charset.Charset + +NL = '\n' +SPACE = ' ' +BSPACE = b' ' +SPACE8 = ' ' * 8 +EMPTYSTRING = '' +MAXLINELEN = 78 +FWS = ' \t' + +USASCII = Charset('us-ascii') +UTF8 = Charset('utf-8') + +# Match encoded-word strings in the form =?charset?q?Hello_World?= +ecre = re.compile(r''' + =\? # literal =? + (?P[^?]*?) # non-greedy up to the next ? is the charset + \? # literal ? + (?P[qb]) # either a "q" or a "b", case insensitive + \? # literal ? + (?P.*?) # non-greedy up to the next ?= is the encoded string + \?= # literal ?= + ''', re.VERBOSE | re.IGNORECASE | re.MULTILINE) + +# Field name regexp, including trailing colon, but not separating whitespace, +# according to RFC 2822. Character range is from tilde to exclamation mark. +# For use with .match() +fcre = re.compile(r'[\041-\176]+:$') + +# Find a header embedded in a putative header value. Used to check for +# header injection attack. +_embeded_header = re.compile(r'\n[^ \t]+:') + + +def decode_header(header): + """Decode a message header value without converting charset. + + Returns a list of (string, charset) pairs containing each of the decoded + parts of the header. Charset is None for non-encoded parts of the header, + otherwise a lower-case string containing the name of the character set + specified in the encoded string. + + header may be a string that may or may not contain RFC2047 encoded words, + or it may be a Header object. + + An email.errors.HeaderParseError may be raised when certain decoding error + occurs (e.g. a base64 decoding exception). + """ + # If it is a Header object, we can just return the encoded chunks. + if hasattr(header, '_chunks'): + return [(_charset._encode(string, str(charset)), str(charset)) + for string, charset in header._chunks] + # If no encoding, just return the header with no charset. + if not ecre.search(header): + return [(header, None)] + # First step is to parse all the encoded parts into triplets of the form + # (encoded_string, encoding, charset). For unencoded strings, the last + # two parts will be None. + words = [] + for line in header.splitlines(): + parts = ecre.split(line) + first = True + while parts: + unencoded = parts.pop(0) + if first: + unencoded = unencoded.lstrip() + first = False + if unencoded: + words.append((unencoded, None, None)) + if parts: + charset = parts.pop(0).lower() + encoding = parts.pop(0).lower() + encoded = parts.pop(0) + words.append((encoded, encoding, charset)) + # Now loop over words and remove words that consist of whitespace + # between two encoded strings. + import sys + droplist = [] + for n, w in enumerate(words): + if n>1 and w[1] and words[n-2][1] and words[n-1][0].isspace(): + droplist.append(n-1) + for d in reversed(droplist): + del words[d] + + # The next step is to decode each encoded word by applying the reverse + # base64 or quopri transformation. decoded_words is now a list of the + # form (decoded_word, charset). + decoded_words = [] + for encoded_string, encoding, charset in words: + if encoding is None: + # This is an unencoded word. + decoded_words.append((encoded_string, charset)) + elif encoding == 'q': + word = header_decode(encoded_string) + decoded_words.append((word, charset)) + elif encoding == 'b': + paderr = len(encoded_string) % 4 # Postel's law: add missing padding + if paderr: + encoded_string += '==='[:4 - paderr] + try: + word = base64mime.decode(encoded_string) + except binascii.Error: + raise HeaderParseError('Base64 decoding error') + else: + decoded_words.append((word, charset)) + else: + raise AssertionError('Unexpected encoding: ' + encoding) + # Now convert all words to bytes and collapse consecutive runs of + # similarly encoded words. + collapsed = [] + last_word = last_charset = None + for word, charset in decoded_words: + if isinstance(word, str): + word = bytes(word, 'raw-unicode-escape') + if last_word is None: + last_word = word + last_charset = charset + elif charset != last_charset: + collapsed.append((last_word, last_charset)) + last_word = word + last_charset = charset + elif last_charset is None: + last_word += BSPACE + word + else: + last_word += word + collapsed.append((last_word, last_charset)) + return collapsed + + +def make_header(decoded_seq, maxlinelen=None, header_name=None, + continuation_ws=' '): + """Create a Header from a sequence of pairs as returned by decode_header() + + decode_header() takes a header value string and returns a sequence of + pairs of the format (decoded_string, charset) where charset is the string + name of the character set. + + This function takes one of those sequence of pairs and returns a Header + instance. Optional maxlinelen, header_name, and continuation_ws are as in + the Header constructor. + """ + h = Header(maxlinelen=maxlinelen, header_name=header_name, + continuation_ws=continuation_ws) + for s, charset in decoded_seq: + # None means us-ascii but we can simply pass it on to h.append() + if charset is not None and not isinstance(charset, Charset): + charset = Charset(charset) + h.append(s, charset) + return h + + +class Header(object): + def __init__(self, s=None, charset=None, + maxlinelen=None, header_name=None, + continuation_ws=' ', errors='strict'): + """Create a MIME-compliant header that can contain many character sets. + + Optional s is the initial header value. If None, the initial header + value is not set. You can later append to the header with .append() + method calls. s may be a byte string or a Unicode string, but see the + .append() documentation for semantics. + + Optional charset serves two purposes: it has the same meaning as the + charset argument to the .append() method. It also sets the default + character set for all subsequent .append() calls that omit the charset + argument. If charset is not provided in the constructor, the us-ascii + charset is used both as s's initial charset and as the default for + subsequent .append() calls. + + The maximum line length can be specified explicitly via maxlinelen. For + splitting the first line to a shorter value (to account for the field + header which isn't included in s, e.g. `Subject') pass in the name of + the field in header_name. The default maxlinelen is 78 as recommended + by RFC 2822. + + continuation_ws must be RFC 2822 compliant folding whitespace (usually + either a space or a hard tab) which will be prepended to continuation + lines. + + errors is passed through to the .append() call. + """ + if charset is None: + charset = USASCII + elif not isinstance(charset, Charset): + charset = Charset(charset) + self._charset = charset + self._continuation_ws = continuation_ws + self._chunks = [] + if s is not None: + self.append(s, charset, errors) + if maxlinelen is None: + maxlinelen = MAXLINELEN + self._maxlinelen = maxlinelen + if header_name is None: + self._headerlen = 0 + else: + # Take the separating colon and space into account. + self._headerlen = len(header_name) + 2 + + def __str__(self): + """Return the string value of the header.""" + self._normalize() + uchunks = [] + lastcs = None + lastspace = None + for string, charset in self._chunks: + # We must preserve spaces between encoded and non-encoded word + # boundaries, which means for us we need to add a space when we go + # from a charset to None/us-ascii, or from None/us-ascii to a + # charset. Only do this for the second and subsequent chunks. + # Don't add a space if the None/us-ascii string already has + # a space (trailing or leading depending on transition) + nextcs = charset + if nextcs == _charset.UNKNOWN8BIT: + original_bytes = string.encode('ascii', 'surrogateescape') + string = original_bytes.decode('ascii', 'replace') + if uchunks: + hasspace = string and self._nonctext(string[0]) + if lastcs not in (None, 'us-ascii'): + if nextcs in (None, 'us-ascii') and not hasspace: + uchunks.append(SPACE) + nextcs = None + elif nextcs not in (None, 'us-ascii') and not lastspace: + uchunks.append(SPACE) + lastspace = string and self._nonctext(string[-1]) + lastcs = nextcs + uchunks.append(string) + return EMPTYSTRING.join(uchunks) + + # Rich comparison operators for equality only. BAW: does it make sense to + # have or explicitly disable <, <=, >, >= operators? + def __eq__(self, other): + # other may be a Header or a string. Both are fine so coerce + # ourselves to a unicode (of the unencoded header value), swap the + # args and do another comparison. + return other == str(self) + + def __ne__(self, other): + return not self == other + + def append(self, s, charset=None, errors='strict'): + """Append a string to the MIME header. + + Optional charset, if given, should be a Charset instance or the name + of a character set (which will be converted to a Charset instance). A + value of None (the default) means that the charset given in the + constructor is used. + + s may be a byte string or a Unicode string. If it is a byte string + (i.e. isinstance(s, str) is false), then charset is the encoding of + that byte string, and a UnicodeError will be raised if the string + cannot be decoded with that charset. If s is a Unicode string, then + charset is a hint specifying the character set of the characters in + the string. In either case, when producing an RFC 2822 compliant + header using RFC 2047 rules, the string will be encoded using the + output codec of the charset. If the string cannot be encoded to the + output codec, a UnicodeError will be raised. + + Optional `errors' is passed as the errors argument to the decode + call if s is a byte string. + """ + if charset is None: + charset = self._charset + elif not isinstance(charset, Charset): + charset = Charset(charset) + if not isinstance(s, str): + input_charset = charset.input_codec or 'us-ascii' + if input_charset == _charset.UNKNOWN8BIT: + s = s.decode('us-ascii', 'surrogateescape') + else: + s = s.decode(input_charset, errors) + # Ensure that the bytes we're storing can be decoded to the output + # character set, otherwise an early error is raised. + output_charset = charset.output_codec or 'us-ascii' + if output_charset != _charset.UNKNOWN8BIT: + try: + s.encode(output_charset, errors) + except UnicodeEncodeError: + if output_charset!='us-ascii': + raise + charset = UTF8 + self._chunks.append((s, charset)) + + def _nonctext(self, s): + """True if string s is not a ctext character of RFC822. + """ + return s.isspace() or s in ('(', ')', '\\') + + def encode(self, splitchars=';, \t', maxlinelen=None, linesep='\n'): + r"""Encode a message header into an RFC-compliant format. + + There are many issues involved in converting a given string for use in + an email header. Only certain character sets are readable in most + email clients, and as header strings can only contain a subset of + 7-bit ASCII, care must be taken to properly convert and encode (with + Base64 or quoted-printable) header strings. In addition, there is a + 75-character length limit on any given encoded header field, so + line-wrapping must be performed, even with double-byte character sets. + + Optional maxlinelen specifies the maximum length of each generated + line, exclusive of the linesep string. Individual lines may be longer + than maxlinelen if a folding point cannot be found. The first line + will be shorter by the length of the header name plus ": " if a header + name was specified at Header construction time. The default value for + maxlinelen is determined at header construction time. + + Optional splitchars is a string containing characters which should be + given extra weight by the splitting algorithm during normal header + wrapping. This is in very rough support of RFC 2822's `higher level + syntactic breaks': split points preceded by a splitchar are preferred + during line splitting, with the characters preferred in the order in + which they appear in the string. Space and tab may be included in the + string to indicate whether preference should be given to one over the + other as a split point when other split chars do not appear in the line + being split. Splitchars does not affect RFC 2047 encoded lines. + + Optional linesep is a string to be used to separate the lines of + the value. The default value is the most useful for typical + Python applications, but it can be set to \r\n to produce RFC-compliant + line separators when needed. + """ + self._normalize() + if maxlinelen is None: + maxlinelen = self._maxlinelen + # A maxlinelen of 0 means don't wrap. For all practical purposes, + # choosing a huge number here accomplishes that and makes the + # _ValueFormatter algorithm much simpler. + if maxlinelen == 0: + maxlinelen = 1000000 + formatter = _ValueFormatter(self._headerlen, maxlinelen, + self._continuation_ws, splitchars) + lastcs = None + hasspace = lastspace = None + for string, charset in self._chunks: + if hasspace is not None: + hasspace = string and self._nonctext(string[0]) + import sys + if lastcs not in (None, 'us-ascii'): + if not hasspace or charset not in (None, 'us-ascii'): + formatter.add_transition() + elif charset not in (None, 'us-ascii') and not lastspace: + formatter.add_transition() + lastspace = string and self._nonctext(string[-1]) + lastcs = charset + hasspace = False + lines = string.splitlines() + if lines: + formatter.feed('', lines[0], charset) + else: + formatter.feed('', '', charset) + for line in lines[1:]: + formatter.newline() + if charset.header_encoding is not None: + formatter.feed(self._continuation_ws, ' ' + line.lstrip(), + charset) + else: + sline = line.lstrip() + fws = line[:len(line)-len(sline)] + formatter.feed(fws, sline, charset) + if len(lines) > 1: + formatter.newline() + if self._chunks: + formatter.add_transition() + value = formatter._str(linesep) + if _embeded_header.search(value): + raise HeaderParseError("header value appears to contain " + "an embedded header: {!r}".format(value)) + return value + + def _normalize(self): + # Step 1: Normalize the chunks so that all runs of identical charsets + # get collapsed into a single unicode string. + chunks = [] + last_charset = None + last_chunk = [] + for string, charset in self._chunks: + if charset == last_charset: + last_chunk.append(string) + else: + if last_charset is not None: + chunks.append((SPACE.join(last_chunk), last_charset)) + last_chunk = [string] + last_charset = charset + if last_chunk: + chunks.append((SPACE.join(last_chunk), last_charset)) + self._chunks = chunks + + +class _ValueFormatter(object): + def __init__(self, headerlen, maxlen, continuation_ws, splitchars): + self._maxlen = maxlen + self._continuation_ws = continuation_ws + self._continuation_ws_len = len(continuation_ws) + self._splitchars = splitchars + self._lines = [] + self._current_line = _Accumulator(headerlen) + + def _str(self, linesep): + self.newline() + return linesep.join(self._lines) + + def __str__(self): + return self._str(NL) + + def newline(self): + end_of_line = self._current_line.pop() + if end_of_line != (' ', ''): + self._current_line.push(*end_of_line) + if len(self._current_line) > 0: + if self._current_line.is_onlyws(): + self._lines[-1] += str(self._current_line) + else: + self._lines.append(str(self._current_line)) + self._current_line.reset() + + def add_transition(self): + self._current_line.push(' ', '') + + def feed(self, fws, string, charset): + # If the charset has no header encoding (i.e. it is an ASCII encoding) + # then we must split the header at the "highest level syntactic break" + # possible. Note that we don't have a lot of smarts about field + # syntax; we just try to break on semi-colons, then commas, then + # whitespace. Eventually, this should be pluggable. + if charset.header_encoding is None: + self._ascii_split(fws, string, self._splitchars) + return + # Otherwise, we're doing either a Base64 or a quoted-printable + # encoding which means we don't need to split the line on syntactic + # breaks. We can basically just find enough characters to fit on the + # current line, minus the RFC 2047 chrome. What makes this trickier + # though is that we have to split at octet boundaries, not character + # boundaries but it's only safe to split at character boundaries so at + # best we can only get close. + encoded_lines = charset.header_encode_lines(string, self._maxlengths()) + # The first element extends the current line, but if it's None then + # nothing more fit on the current line so start a new line. + try: + first_line = encoded_lines.pop(0) + except IndexError: + # There are no encoded lines, so we're done. + return + if first_line is not None: + self._append_chunk(fws, first_line) + try: + last_line = encoded_lines.pop() + except IndexError: + # There was only one line. + return + self.newline() + self._current_line.push(self._continuation_ws, last_line) + # Everything else are full lines in themselves. + for line in encoded_lines: + self._lines.append(self._continuation_ws + line) + + def _maxlengths(self): + # The first line's length. + yield self._maxlen - len(self._current_line) + while True: + yield self._maxlen - self._continuation_ws_len + + def _ascii_split(self, fws, string, splitchars): + # The RFC 2822 header folding algorithm is simple in principle but + # complex in practice. Lines may be folded any place where "folding + # white space" appears by inserting a linesep character in front of the + # FWS. The complication is that not all spaces or tabs qualify as FWS, + # and we are also supposed to prefer to break at "higher level + # syntactic breaks". We can't do either of these without intimate + # knowledge of the structure of structured headers, which we don't have + # here. So the best we can do here is prefer to break at the specified + # splitchars, and hope that we don't choose any spaces or tabs that + # aren't legal FWS. (This is at least better than the old algorithm, + # where we would sometimes *introduce* FWS after a splitchar, or the + # algorithm before that, where we would turn all white space runs into + # single spaces or tabs.) + parts = re.split("(["+FWS+"]+)", fws+string) + if parts[0]: + parts[:0] = [''] + else: + parts.pop(0) + for fws, part in zip(*[iter(parts)]*2): + self._append_chunk(fws, part) + + def _append_chunk(self, fws, string): + self._current_line.push(fws, string) + if len(self._current_line) > self._maxlen: + # Find the best split point, working backward from the end. + # There might be none, on a long first line. + for ch in self._splitchars: + for i in range(self._current_line.part_count()-1, 0, -1): + if ch.isspace(): + fws = self._current_line[i][0] + if fws and fws[0]==ch: + break + prevpart = self._current_line[i-1][1] + if prevpart and prevpart[-1]==ch: + break + else: + continue + break + else: + fws, part = self._current_line.pop() + if self._current_line._initial_size > 0: + # There will be a header, so leave it on a line by itself. + self.newline() + if not fws: + # We don't use continuation_ws here because the whitespace + # after a header should always be a space. + fws = ' ' + self._current_line.push(fws, part) + return + remainder = self._current_line.pop_from(i) + self._lines.append(str(self._current_line)) + self._current_line.reset(remainder) + + +class _Accumulator(list): + + def __init__(self, initial_size=0): + self._initial_size = initial_size + super().__init__() + + def push(self, fws, string): + self.append((fws, string)) + + def pop_from(self, i=0): + popped = self[i:] + self[i:] = [] + return popped + + def pop(self): + if self.part_count()==0: + return ('', '') + return super().pop() + + def __len__(self): + return sum((len(fws)+len(part) for fws, part in self), + self._initial_size) + + def __str__(self): + return EMPTYSTRING.join((EMPTYSTRING.join((fws, part)) + for fws, part in self)) + + def reset(self, startval=None): + if startval is None: + startval = [] + self[:] = startval + self._initial_size = 0 + + def is_onlyws(self): + return self._initial_size==0 and (not self or str(self).isspace()) + + def part_count(self): + return super().__len__() diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/headerregistry.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/headerregistry.py new file mode 100644 index 0000000..9aaad65 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/headerregistry.py @@ -0,0 +1,592 @@ +"""Representing and manipulating email headers via custom objects. + +This module provides an implementation of the HeaderRegistry API. +The implementation is designed to flexibly follow RFC5322 rules. + +Eventually HeaderRegistry will be a public API, but it isn't yet, +and will probably change some before that happens. + +""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +from future.builtins import super +from future.builtins import str +from future.utils import text_to_native_str +from future.backports.email import utils +from future.backports.email import errors +from future.backports.email import _header_value_parser as parser + +class Address(object): + + def __init__(self, display_name='', username='', domain='', addr_spec=None): + """Create an object represeting a full email address. + + An address can have a 'display_name', a 'username', and a 'domain'. In + addition to specifying the username and domain separately, they may be + specified together by using the addr_spec keyword *instead of* the + username and domain keywords. If an addr_spec string is specified it + must be properly quoted according to RFC 5322 rules; an error will be + raised if it is not. + + An Address object has display_name, username, domain, and addr_spec + attributes, all of which are read-only. The addr_spec and the string + value of the object are both quoted according to RFC5322 rules, but + without any Content Transfer Encoding. + + """ + # This clause with its potential 'raise' may only happen when an + # application program creates an Address object using an addr_spec + # keyword. The email library code itself must always supply username + # and domain. + if addr_spec is not None: + if username or domain: + raise TypeError("addrspec specified when username and/or " + "domain also specified") + a_s, rest = parser.get_addr_spec(addr_spec) + if rest: + raise ValueError("Invalid addr_spec; only '{}' " + "could be parsed from '{}'".format( + a_s, addr_spec)) + if a_s.all_defects: + raise a_s.all_defects[0] + username = a_s.local_part + domain = a_s.domain + self._display_name = display_name + self._username = username + self._domain = domain + + @property + def display_name(self): + return self._display_name + + @property + def username(self): + return self._username + + @property + def domain(self): + return self._domain + + @property + def addr_spec(self): + """The addr_spec (username@domain) portion of the address, quoted + according to RFC 5322 rules, but with no Content Transfer Encoding. + """ + nameset = set(self.username) + if len(nameset) > len(nameset-parser.DOT_ATOM_ENDS): + lp = parser.quote_string(self.username) + else: + lp = self.username + if self.domain: + return lp + '@' + self.domain + if not lp: + return '<>' + return lp + + def __repr__(self): + return "Address(display_name={!r}, username={!r}, domain={!r})".format( + self.display_name, self.username, self.domain) + + def __str__(self): + nameset = set(self.display_name) + if len(nameset) > len(nameset-parser.SPECIALS): + disp = parser.quote_string(self.display_name) + else: + disp = self.display_name + if disp: + addr_spec = '' if self.addr_spec=='<>' else self.addr_spec + return "{} <{}>".format(disp, addr_spec) + return self.addr_spec + + def __eq__(self, other): + if type(other) != type(self): + return False + return (self.display_name == other.display_name and + self.username == other.username and + self.domain == other.domain) + + +class Group(object): + + def __init__(self, display_name=None, addresses=None): + """Create an object representing an address group. + + An address group consists of a display_name followed by colon and an + list of addresses (see Address) terminated by a semi-colon. The Group + is created by specifying a display_name and a possibly empty list of + Address objects. A Group can also be used to represent a single + address that is not in a group, which is convenient when manipulating + lists that are a combination of Groups and individual Addresses. In + this case the display_name should be set to None. In particular, the + string representation of a Group whose display_name is None is the same + as the Address object, if there is one and only one Address object in + the addresses list. + + """ + self._display_name = display_name + self._addresses = tuple(addresses) if addresses else tuple() + + @property + def display_name(self): + return self._display_name + + @property + def addresses(self): + return self._addresses + + def __repr__(self): + return "Group(display_name={!r}, addresses={!r}".format( + self.display_name, self.addresses) + + def __str__(self): + if self.display_name is None and len(self.addresses)==1: + return str(self.addresses[0]) + disp = self.display_name + if disp is not None: + nameset = set(disp) + if len(nameset) > len(nameset-parser.SPECIALS): + disp = parser.quote_string(disp) + adrstr = ", ".join(str(x) for x in self.addresses) + adrstr = ' ' + adrstr if adrstr else adrstr + return "{}:{};".format(disp, adrstr) + + def __eq__(self, other): + if type(other) != type(self): + return False + return (self.display_name == other.display_name and + self.addresses == other.addresses) + + +# Header Classes # + +class BaseHeader(str): + + """Base class for message headers. + + Implements generic behavior and provides tools for subclasses. + + A subclass must define a classmethod named 'parse' that takes an unfolded + value string and a dictionary as its arguments. The dictionary will + contain one key, 'defects', initialized to an empty list. After the call + the dictionary must contain two additional keys: parse_tree, set to the + parse tree obtained from parsing the header, and 'decoded', set to the + string value of the idealized representation of the data from the value. + (That is, encoded words are decoded, and values that have canonical + representations are so represented.) + + The defects key is intended to collect parsing defects, which the message + parser will subsequently dispose of as appropriate. The parser should not, + insofar as practical, raise any errors. Defects should be added to the + list instead. The standard header parsers register defects for RFC + compliance issues, for obsolete RFC syntax, and for unrecoverable parsing + errors. + + The parse method may add additional keys to the dictionary. In this case + the subclass must define an 'init' method, which will be passed the + dictionary as its keyword arguments. The method should use (usually by + setting them as the value of similarly named attributes) and remove all the + extra keys added by its parse method, and then use super to call its parent + class with the remaining arguments and keywords. + + The subclass should also make sure that a 'max_count' attribute is defined + that is either None or 1. XXX: need to better define this API. + + """ + + def __new__(cls, name, value): + kwds = {'defects': []} + cls.parse(value, kwds) + if utils._has_surrogates(kwds['decoded']): + kwds['decoded'] = utils._sanitize(kwds['decoded']) + self = str.__new__(cls, kwds['decoded']) + # del kwds['decoded'] + self.init(name, **kwds) + return self + + def init(self, name, **_3to2kwargs): + defects = _3to2kwargs['defects']; del _3to2kwargs['defects'] + parse_tree = _3to2kwargs['parse_tree']; del _3to2kwargs['parse_tree'] + self._name = name + self._parse_tree = parse_tree + self._defects = defects + + @property + def name(self): + return self._name + + @property + def defects(self): + return tuple(self._defects) + + def __reduce__(self): + return ( + _reconstruct_header, + ( + self.__class__.__name__, + self.__class__.__bases__, + str(self), + ), + self.__dict__) + + @classmethod + def _reconstruct(cls, value): + return str.__new__(cls, value) + + def fold(self, **_3to2kwargs): + policy = _3to2kwargs['policy']; del _3to2kwargs['policy'] + """Fold header according to policy. + + The parsed representation of the header is folded according to + RFC5322 rules, as modified by the policy. If the parse tree + contains surrogateescaped bytes, the bytes are CTE encoded using + the charset 'unknown-8bit". + + Any non-ASCII characters in the parse tree are CTE encoded using + charset utf-8. XXX: make this a policy setting. + + The returned value is an ASCII-only string possibly containing linesep + characters, and ending with a linesep character. The string includes + the header name and the ': ' separator. + + """ + # At some point we need to only put fws here if it was in the source. + header = parser.Header([ + parser.HeaderLabel([ + parser.ValueTerminal(self.name, 'header-name'), + parser.ValueTerminal(':', 'header-sep')]), + parser.CFWSList([parser.WhiteSpaceTerminal(' ', 'fws')]), + self._parse_tree]) + return header.fold(policy=policy) + + +def _reconstruct_header(cls_name, bases, value): + return type(text_to_native_str(cls_name), bases, {})._reconstruct(value) + + +class UnstructuredHeader(object): + + max_count = None + value_parser = staticmethod(parser.get_unstructured) + + @classmethod + def parse(cls, value, kwds): + kwds['parse_tree'] = cls.value_parser(value) + kwds['decoded'] = str(kwds['parse_tree']) + + +class UniqueUnstructuredHeader(UnstructuredHeader): + + max_count = 1 + + +class DateHeader(object): + + """Header whose value consists of a single timestamp. + + Provides an additional attribute, datetime, which is either an aware + datetime using a timezone, or a naive datetime if the timezone + in the input string is -0000. Also accepts a datetime as input. + The 'value' attribute is the normalized form of the timestamp, + which means it is the output of format_datetime on the datetime. + """ + + max_count = None + + # This is used only for folding, not for creating 'decoded'. + value_parser = staticmethod(parser.get_unstructured) + + @classmethod + def parse(cls, value, kwds): + if not value: + kwds['defects'].append(errors.HeaderMissingRequiredValue()) + kwds['datetime'] = None + kwds['decoded'] = '' + kwds['parse_tree'] = parser.TokenList() + return + if isinstance(value, str): + value = utils.parsedate_to_datetime(value) + kwds['datetime'] = value + kwds['decoded'] = utils.format_datetime(kwds['datetime']) + kwds['parse_tree'] = cls.value_parser(kwds['decoded']) + + def init(self, *args, **kw): + self._datetime = kw.pop('datetime') + super().init(*args, **kw) + + @property + def datetime(self): + return self._datetime + + +class UniqueDateHeader(DateHeader): + + max_count = 1 + + +class AddressHeader(object): + + max_count = None + + @staticmethod + def value_parser(value): + address_list, value = parser.get_address_list(value) + assert not value, 'this should not happen' + return address_list + + @classmethod + def parse(cls, value, kwds): + if isinstance(value, str): + # We are translating here from the RFC language (address/mailbox) + # to our API language (group/address). + kwds['parse_tree'] = address_list = cls.value_parser(value) + groups = [] + for addr in address_list.addresses: + groups.append(Group(addr.display_name, + [Address(mb.display_name or '', + mb.local_part or '', + mb.domain or '') + for mb in addr.all_mailboxes])) + defects = list(address_list.all_defects) + else: + # Assume it is Address/Group stuff + if not hasattr(value, '__iter__'): + value = [value] + groups = [Group(None, [item]) if not hasattr(item, 'addresses') + else item + for item in value] + defects = [] + kwds['groups'] = groups + kwds['defects'] = defects + kwds['decoded'] = ', '.join([str(item) for item in groups]) + if 'parse_tree' not in kwds: + kwds['parse_tree'] = cls.value_parser(kwds['decoded']) + + def init(self, *args, **kw): + self._groups = tuple(kw.pop('groups')) + self._addresses = None + super().init(*args, **kw) + + @property + def groups(self): + return self._groups + + @property + def addresses(self): + if self._addresses is None: + self._addresses = tuple([address for group in self._groups + for address in group.addresses]) + return self._addresses + + +class UniqueAddressHeader(AddressHeader): + + max_count = 1 + + +class SingleAddressHeader(AddressHeader): + + @property + def address(self): + if len(self.addresses)!=1: + raise ValueError(("value of single address header {} is not " + "a single address").format(self.name)) + return self.addresses[0] + + +class UniqueSingleAddressHeader(SingleAddressHeader): + + max_count = 1 + + +class MIMEVersionHeader(object): + + max_count = 1 + + value_parser = staticmethod(parser.parse_mime_version) + + @classmethod + def parse(cls, value, kwds): + kwds['parse_tree'] = parse_tree = cls.value_parser(value) + kwds['decoded'] = str(parse_tree) + kwds['defects'].extend(parse_tree.all_defects) + kwds['major'] = None if parse_tree.minor is None else parse_tree.major + kwds['minor'] = parse_tree.minor + if parse_tree.minor is not None: + kwds['version'] = '{}.{}'.format(kwds['major'], kwds['minor']) + else: + kwds['version'] = None + + def init(self, *args, **kw): + self._version = kw.pop('version') + self._major = kw.pop('major') + self._minor = kw.pop('minor') + super().init(*args, **kw) + + @property + def major(self): + return self._major + + @property + def minor(self): + return self._minor + + @property + def version(self): + return self._version + + +class ParameterizedMIMEHeader(object): + + # Mixin that handles the params dict. Must be subclassed and + # a property value_parser for the specific header provided. + + max_count = 1 + + @classmethod + def parse(cls, value, kwds): + kwds['parse_tree'] = parse_tree = cls.value_parser(value) + kwds['decoded'] = str(parse_tree) + kwds['defects'].extend(parse_tree.all_defects) + if parse_tree.params is None: + kwds['params'] = {} + else: + # The MIME RFCs specify that parameter ordering is arbitrary. + kwds['params'] = dict((utils._sanitize(name).lower(), + utils._sanitize(value)) + for name, value in parse_tree.params) + + def init(self, *args, **kw): + self._params = kw.pop('params') + super().init(*args, **kw) + + @property + def params(self): + return self._params.copy() + + +class ContentTypeHeader(ParameterizedMIMEHeader): + + value_parser = staticmethod(parser.parse_content_type_header) + + def init(self, *args, **kw): + super().init(*args, **kw) + self._maintype = utils._sanitize(self._parse_tree.maintype) + self._subtype = utils._sanitize(self._parse_tree.subtype) + + @property + def maintype(self): + return self._maintype + + @property + def subtype(self): + return self._subtype + + @property + def content_type(self): + return self.maintype + '/' + self.subtype + + +class ContentDispositionHeader(ParameterizedMIMEHeader): + + value_parser = staticmethod(parser.parse_content_disposition_header) + + def init(self, *args, **kw): + super().init(*args, **kw) + cd = self._parse_tree.content_disposition + self._content_disposition = cd if cd is None else utils._sanitize(cd) + + @property + def content_disposition(self): + return self._content_disposition + + +class ContentTransferEncodingHeader(object): + + max_count = 1 + + value_parser = staticmethod(parser.parse_content_transfer_encoding_header) + + @classmethod + def parse(cls, value, kwds): + kwds['parse_tree'] = parse_tree = cls.value_parser(value) + kwds['decoded'] = str(parse_tree) + kwds['defects'].extend(parse_tree.all_defects) + + def init(self, *args, **kw): + super().init(*args, **kw) + self._cte = utils._sanitize(self._parse_tree.cte) + + @property + def cte(self): + return self._cte + + +# The header factory # + +_default_header_map = { + 'subject': UniqueUnstructuredHeader, + 'date': UniqueDateHeader, + 'resent-date': DateHeader, + 'orig-date': UniqueDateHeader, + 'sender': UniqueSingleAddressHeader, + 'resent-sender': SingleAddressHeader, + 'to': UniqueAddressHeader, + 'resent-to': AddressHeader, + 'cc': UniqueAddressHeader, + 'resent-cc': AddressHeader, + 'bcc': UniqueAddressHeader, + 'resent-bcc': AddressHeader, + 'from': UniqueAddressHeader, + 'resent-from': AddressHeader, + 'reply-to': UniqueAddressHeader, + 'mime-version': MIMEVersionHeader, + 'content-type': ContentTypeHeader, + 'content-disposition': ContentDispositionHeader, + 'content-transfer-encoding': ContentTransferEncodingHeader, + } + +class HeaderRegistry(object): + + """A header_factory and header registry.""" + + def __init__(self, base_class=BaseHeader, default_class=UnstructuredHeader, + use_default_map=True): + """Create a header_factory that works with the Policy API. + + base_class is the class that will be the last class in the created + header class's __bases__ list. default_class is the class that will be + used if "name" (see __call__) does not appear in the registry. + use_default_map controls whether or not the default mapping of names to + specialized classes is copied in to the registry when the factory is + created. The default is True. + + """ + self.registry = {} + self.base_class = base_class + self.default_class = default_class + if use_default_map: + self.registry.update(_default_header_map) + + def map_to_type(self, name, cls): + """Register cls as the specialized class for handling "name" headers. + + """ + self.registry[name.lower()] = cls + + def __getitem__(self, name): + cls = self.registry.get(name.lower(), self.default_class) + return type(text_to_native_str('_'+cls.__name__), (cls, self.base_class), {}) + + def __call__(self, name, value): + """Create a header instance for header 'name' from 'value'. + + Creates a header instance by creating a specialized class for parsing + and representing the specified header by combining the factory + base_class with a specialized class from the registry or the + default_class, and passing the name and value to the constructed + class's constructor. + + """ + return self[name](name, value) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/iterators.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/iterators.py new file mode 100644 index 0000000..82d320f --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/iterators.py @@ -0,0 +1,74 @@ +# Copyright (C) 2001-2006 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Various types of useful iterators and generators.""" +from __future__ import print_function +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +__all__ = [ + 'body_line_iterator', + 'typed_subpart_iterator', + 'walk', + # Do not include _structure() since it's part of the debugging API. + ] + +import sys +from io import StringIO + + +# This function will become a method of the Message class +def walk(self): + """Walk over the message tree, yielding each subpart. + + The walk is performed in depth-first order. This method is a + generator. + """ + yield self + if self.is_multipart(): + for subpart in self.get_payload(): + for subsubpart in subpart.walk(): + yield subsubpart + + +# These two functions are imported into the Iterators.py interface module. +def body_line_iterator(msg, decode=False): + """Iterate over the parts, returning string payloads line-by-line. + + Optional decode (default False) is passed through to .get_payload(). + """ + for subpart in msg.walk(): + payload = subpart.get_payload(decode=decode) + if isinstance(payload, str): + for line in StringIO(payload): + yield line + + +def typed_subpart_iterator(msg, maintype='text', subtype=None): + """Iterate over the subparts with a given MIME type. + + Use `maintype' as the main MIME type to match against; this defaults to + "text". Optional `subtype' is the MIME subtype to match against; if + omitted, only the main type is matched. + """ + for subpart in msg.walk(): + if subpart.get_content_maintype() == maintype: + if subtype is None or subpart.get_content_subtype() == subtype: + yield subpart + + +def _structure(msg, fp=None, level=0, include_default=False): + """A handy debugging aid""" + if fp is None: + fp = sys.stdout + tab = ' ' * (level * 4) + print(tab + msg.get_content_type(), end='', file=fp) + if include_default: + print(' [%s]' % msg.get_default_type(), file=fp) + else: + print(file=fp) + if msg.is_multipart(): + for subpart in msg.get_payload(): + _structure(subpart, fp, level+1, include_default) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/message.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/message.py new file mode 100644 index 0000000..d8d9615 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/message.py @@ -0,0 +1,882 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2001-2007 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Basic message object for the email package object model.""" +from __future__ import absolute_import, division, unicode_literals +from future.builtins import list, range, str, zip + +__all__ = ['Message'] + +import re +import uu +import base64 +import binascii +from io import BytesIO, StringIO + +# Intrapackage imports +from future.utils import as_native_str +from future.backports.email import utils +from future.backports.email import errors +from future.backports.email._policybase import compat32 +from future.backports.email import charset as _charset +from future.backports.email._encoded_words import decode_b +Charset = _charset.Charset + +SEMISPACE = '; ' + +# Regular expression that matches `special' characters in parameters, the +# existence of which force quoting of the parameter value. +tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]') + + +def _splitparam(param): + # Split header parameters. BAW: this may be too simple. It isn't + # strictly RFC 2045 (section 5.1) compliant, but it catches most headers + # found in the wild. We may eventually need a full fledged parser. + # RDM: we might have a Header here; for now just stringify it. + a, sep, b = str(param).partition(';') + if not sep: + return a.strip(), None + return a.strip(), b.strip() + +def _formatparam(param, value=None, quote=True): + """Convenience function to format and return a key=value pair. + + This will quote the value if needed or if quote is true. If value is a + three tuple (charset, language, value), it will be encoded according + to RFC2231 rules. If it contains non-ascii characters it will likewise + be encoded according to RFC2231 rules, using the utf-8 charset and + a null language. + """ + if value is not None and len(value) > 0: + # A tuple is used for RFC 2231 encoded parameter values where items + # are (charset, language, value). charset is a string, not a Charset + # instance. RFC 2231 encoded values are never quoted, per RFC. + if isinstance(value, tuple): + # Encode as per RFC 2231 + param += '*' + value = utils.encode_rfc2231(value[2], value[0], value[1]) + return '%s=%s' % (param, value) + else: + try: + value.encode('ascii') + except UnicodeEncodeError: + param += '*' + value = utils.encode_rfc2231(value, 'utf-8', '') + return '%s=%s' % (param, value) + # BAW: Please check this. I think that if quote is set it should + # force quoting even if not necessary. + if quote or tspecials.search(value): + return '%s="%s"' % (param, utils.quote(value)) + else: + return '%s=%s' % (param, value) + else: + return param + +def _parseparam(s): + # RDM This might be a Header, so for now stringify it. + s = ';' + str(s) + plist = [] + while s[:1] == ';': + s = s[1:] + end = s.find(';') + while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2: + end = s.find(';', end + 1) + if end < 0: + end = len(s) + f = s[:end] + if '=' in f: + i = f.index('=') + f = f[:i].strip().lower() + '=' + f[i+1:].strip() + plist.append(f.strip()) + s = s[end:] + return plist + + +def _unquotevalue(value): + # This is different than utils.collapse_rfc2231_value() because it doesn't + # try to convert the value to a unicode. Message.get_param() and + # Message.get_params() are both currently defined to return the tuple in + # the face of RFC 2231 parameters. + if isinstance(value, tuple): + return value[0], value[1], utils.unquote(value[2]) + else: + return utils.unquote(value) + + +class Message(object): + """Basic message object. + + A message object is defined as something that has a bunch of RFC 2822 + headers and a payload. It may optionally have an envelope header + (a.k.a. Unix-From or From_ header). If the message is a container (i.e. a + multipart or a message/rfc822), then the payload is a list of Message + objects, otherwise it is a string. + + Message objects implement part of the `mapping' interface, which assumes + there is exactly one occurrence of the header per message. Some headers + do in fact appear multiple times (e.g. Received) and for those headers, + you must use the explicit API to set or get all the headers. Not all of + the mapping methods are implemented. + """ + def __init__(self, policy=compat32): + self.policy = policy + self._headers = list() + self._unixfrom = None + self._payload = None + self._charset = None + # Defaults for multipart messages + self.preamble = self.epilogue = None + self.defects = [] + # Default content type + self._default_type = 'text/plain' + + @as_native_str(encoding='utf-8') + def __str__(self): + """Return the entire formatted message as a string. + This includes the headers, body, and envelope header. + """ + return self.as_string() + + def as_string(self, unixfrom=False, maxheaderlen=0): + """Return the entire formatted message as a (unicode) string. + Optional `unixfrom' when True, means include the Unix From_ envelope + header. + + This is a convenience method and may not generate the message exactly + as you intend. For more flexibility, use the flatten() method of a + Generator instance. + """ + from future.backports.email.generator import Generator + fp = StringIO() + g = Generator(fp, mangle_from_=False, maxheaderlen=maxheaderlen) + g.flatten(self, unixfrom=unixfrom) + return fp.getvalue() + + def is_multipart(self): + """Return True if the message consists of multiple parts.""" + return isinstance(self._payload, list) + + # + # Unix From_ line + # + def set_unixfrom(self, unixfrom): + self._unixfrom = unixfrom + + def get_unixfrom(self): + return self._unixfrom + + # + # Payload manipulation. + # + def attach(self, payload): + """Add the given payload to the current payload. + + The current payload will always be a list of objects after this method + is called. If you want to set the payload to a scalar object, use + set_payload() instead. + """ + if self._payload is None: + self._payload = [payload] + else: + self._payload.append(payload) + + def get_payload(self, i=None, decode=False): + """Return a reference to the payload. + + The payload will either be a list object or a string. If you mutate + the list object, you modify the message's payload in place. Optional + i returns that index into the payload. + + Optional decode is a flag indicating whether the payload should be + decoded or not, according to the Content-Transfer-Encoding header + (default is False). + + When True and the message is not a multipart, the payload will be + decoded if this header's value is `quoted-printable' or `base64'. If + some other encoding is used, or the header is missing, or if the + payload has bogus data (i.e. bogus base64 or uuencoded data), the + payload is returned as-is. + + If the message is a multipart and the decode flag is True, then None + is returned. + """ + # Here is the logic table for this code, based on the email5.0.0 code: + # i decode is_multipart result + # ------ ------ ------------ ------------------------------ + # None True True None + # i True True None + # None False True _payload (a list) + # i False True _payload element i (a Message) + # i False False error (not a list) + # i True False error (not a list) + # None False False _payload + # None True False _payload decoded (bytes) + # Note that Barry planned to factor out the 'decode' case, but that + # isn't so easy now that we handle the 8 bit data, which needs to be + # converted in both the decode and non-decode path. + if self.is_multipart(): + if decode: + return None + if i is None: + return self._payload + else: + return self._payload[i] + # For backward compatibility, Use isinstance and this error message + # instead of the more logical is_multipart test. + if i is not None and not isinstance(self._payload, list): + raise TypeError('Expected list, got %s' % type(self._payload)) + payload = self._payload + # cte might be a Header, so for now stringify it. + cte = str(self.get('content-transfer-encoding', '')).lower() + # payload may be bytes here. + if isinstance(payload, str): + payload = str(payload) # for Python-Future, so surrogateescape works + if utils._has_surrogates(payload): + bpayload = payload.encode('ascii', 'surrogateescape') + if not decode: + try: + payload = bpayload.decode(self.get_param('charset', 'ascii'), 'replace') + except LookupError: + payload = bpayload.decode('ascii', 'replace') + elif decode: + try: + bpayload = payload.encode('ascii') + except UnicodeError: + # This won't happen for RFC compliant messages (messages + # containing only ASCII codepoints in the unicode input). + # If it does happen, turn the string into bytes in a way + # guaranteed not to fail. + bpayload = payload.encode('raw-unicode-escape') + if not decode: + return payload + if cte == 'quoted-printable': + return utils._qdecode(bpayload) + elif cte == 'base64': + # XXX: this is a bit of a hack; decode_b should probably be factored + # out somewhere, but I haven't figured out where yet. + value, defects = decode_b(b''.join(bpayload.splitlines())) + for defect in defects: + self.policy.handle_defect(self, defect) + return value + elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): + in_file = BytesIO(bpayload) + out_file = BytesIO() + try: + uu.decode(in_file, out_file, quiet=True) + return out_file.getvalue() + except uu.Error: + # Some decoding problem + return bpayload + if isinstance(payload, str): + return bpayload + return payload + + def set_payload(self, payload, charset=None): + """Set the payload to the given value. + + Optional charset sets the message's default character set. See + set_charset() for details. + """ + self._payload = payload + if charset is not None: + self.set_charset(charset) + + def set_charset(self, charset): + """Set the charset of the payload to a given character set. + + charset can be a Charset instance, a string naming a character set, or + None. If it is a string it will be converted to a Charset instance. + If charset is None, the charset parameter will be removed from the + Content-Type field. Anything else will generate a TypeError. + + The message will be assumed to be of type text/* encoded with + charset.input_charset. It will be converted to charset.output_charset + and encoded properly, if needed, when generating the plain text + representation of the message. MIME headers (MIME-Version, + Content-Type, Content-Transfer-Encoding) will be added as needed. + """ + if charset is None: + self.del_param('charset') + self._charset = None + return + if not isinstance(charset, Charset): + charset = Charset(charset) + self._charset = charset + if 'MIME-Version' not in self: + self.add_header('MIME-Version', '1.0') + if 'Content-Type' not in self: + self.add_header('Content-Type', 'text/plain', + charset=charset.get_output_charset()) + else: + self.set_param('charset', charset.get_output_charset()) + if charset != charset.get_output_charset(): + self._payload = charset.body_encode(self._payload) + if 'Content-Transfer-Encoding' not in self: + cte = charset.get_body_encoding() + try: + cte(self) + except TypeError: + self._payload = charset.body_encode(self._payload) + self.add_header('Content-Transfer-Encoding', cte) + + def get_charset(self): + """Return the Charset instance associated with the message's payload. + """ + return self._charset + + # + # MAPPING INTERFACE (partial) + # + def __len__(self): + """Return the total number of headers, including duplicates.""" + return len(self._headers) + + def __getitem__(self, name): + """Get a header value. + + Return None if the header is missing instead of raising an exception. + + Note that if the header appeared multiple times, exactly which + occurrence gets returned is undefined. Use get_all() to get all + the values matching a header field name. + """ + return self.get(name) + + def __setitem__(self, name, val): + """Set the value of a header. + + Note: this does not overwrite an existing header with the same field + name. Use __delitem__() first to delete any existing headers. + """ + max_count = self.policy.header_max_count(name) + if max_count: + lname = name.lower() + found = 0 + for k, v in self._headers: + if k.lower() == lname: + found += 1 + if found >= max_count: + raise ValueError("There may be at most {} {} headers " + "in a message".format(max_count, name)) + self._headers.append(self.policy.header_store_parse(name, val)) + + def __delitem__(self, name): + """Delete all occurrences of a header, if present. + + Does not raise an exception if the header is missing. + """ + name = name.lower() + newheaders = list() + for k, v in self._headers: + if k.lower() != name: + newheaders.append((k, v)) + self._headers = newheaders + + def __contains__(self, name): + return name.lower() in [k.lower() for k, v in self._headers] + + def __iter__(self): + for field, value in self._headers: + yield field + + def keys(self): + """Return a list of all the message's header field names. + + These will be sorted in the order they appeared in the original + message, or were added to the message, and may contain duplicates. + Any fields deleted and re-inserted are always appended to the header + list. + """ + return [k for k, v in self._headers] + + def values(self): + """Return a list of all the message's header values. + + These will be sorted in the order they appeared in the original + message, or were added to the message, and may contain duplicates. + Any fields deleted and re-inserted are always appended to the header + list. + """ + return [self.policy.header_fetch_parse(k, v) + for k, v in self._headers] + + def items(self): + """Get all the message's header fields and values. + + These will be sorted in the order they appeared in the original + message, or were added to the message, and may contain duplicates. + Any fields deleted and re-inserted are always appended to the header + list. + """ + return [(k, self.policy.header_fetch_parse(k, v)) + for k, v in self._headers] + + def get(self, name, failobj=None): + """Get a header value. + + Like __getitem__() but return failobj instead of None when the field + is missing. + """ + name = name.lower() + for k, v in self._headers: + if k.lower() == name: + return self.policy.header_fetch_parse(k, v) + return failobj + + # + # "Internal" methods (public API, but only intended for use by a parser + # or generator, not normal application code. + # + + def set_raw(self, name, value): + """Store name and value in the model without modification. + + This is an "internal" API, intended only for use by a parser. + """ + self._headers.append((name, value)) + + def raw_items(self): + """Return the (name, value) header pairs without modification. + + This is an "internal" API, intended only for use by a generator. + """ + return iter(self._headers.copy()) + + # + # Additional useful stuff + # + + def get_all(self, name, failobj=None): + """Return a list of all the values for the named field. + + These will be sorted in the order they appeared in the original + message, and may contain duplicates. Any fields deleted and + re-inserted are always appended to the header list. + + If no such fields exist, failobj is returned (defaults to None). + """ + values = [] + name = name.lower() + for k, v in self._headers: + if k.lower() == name: + values.append(self.policy.header_fetch_parse(k, v)) + if not values: + return failobj + return values + + def add_header(self, _name, _value, **_params): + """Extended header setting. + + name is the header field to add. keyword arguments can be used to set + additional parameters for the header field, with underscores converted + to dashes. Normally the parameter will be added as key="value" unless + value is None, in which case only the key will be added. If a + parameter value contains non-ASCII characters it can be specified as a + three-tuple of (charset, language, value), in which case it will be + encoded according to RFC2231 rules. Otherwise it will be encoded using + the utf-8 charset and a language of ''. + + Examples: + + msg.add_header('content-disposition', 'attachment', filename='bud.gif') + msg.add_header('content-disposition', 'attachment', + filename=('utf-8', '', 'Fußballer.ppt')) + msg.add_header('content-disposition', 'attachment', + filename='Fußballer.ppt')) + """ + parts = [] + for k, v in _params.items(): + if v is None: + parts.append(k.replace('_', '-')) + else: + parts.append(_formatparam(k.replace('_', '-'), v)) + if _value is not None: + parts.insert(0, _value) + self[_name] = SEMISPACE.join(parts) + + def replace_header(self, _name, _value): + """Replace a header. + + Replace the first matching header found in the message, retaining + header order and case. If no matching header was found, a KeyError is + raised. + """ + _name = _name.lower() + for i, (k, v) in zip(range(len(self._headers)), self._headers): + if k.lower() == _name: + self._headers[i] = self.policy.header_store_parse(k, _value) + break + else: + raise KeyError(_name) + + # + # Use these three methods instead of the three above. + # + + def get_content_type(self): + """Return the message's content type. + + The returned string is coerced to lower case of the form + `maintype/subtype'. If there was no Content-Type header in the + message, the default type as given by get_default_type() will be + returned. Since according to RFC 2045, messages always have a default + type this will always return a value. + + RFC 2045 defines a message's default type to be text/plain unless it + appears inside a multipart/digest container, in which case it would be + message/rfc822. + """ + missing = object() + value = self.get('content-type', missing) + if value is missing: + # This should have no parameters + return self.get_default_type() + ctype = _splitparam(value)[0].lower() + # RFC 2045, section 5.2 says if its invalid, use text/plain + if ctype.count('/') != 1: + return 'text/plain' + return ctype + + def get_content_maintype(self): + """Return the message's main content type. + + This is the `maintype' part of the string returned by + get_content_type(). + """ + ctype = self.get_content_type() + return ctype.split('/')[0] + + def get_content_subtype(self): + """Returns the message's sub-content type. + + This is the `subtype' part of the string returned by + get_content_type(). + """ + ctype = self.get_content_type() + return ctype.split('/')[1] + + def get_default_type(self): + """Return the `default' content type. + + Most messages have a default content type of text/plain, except for + messages that are subparts of multipart/digest containers. Such + subparts have a default content type of message/rfc822. + """ + return self._default_type + + def set_default_type(self, ctype): + """Set the `default' content type. + + ctype should be either "text/plain" or "message/rfc822", although this + is not enforced. The default content type is not stored in the + Content-Type header. + """ + self._default_type = ctype + + def _get_params_preserve(self, failobj, header): + # Like get_params() but preserves the quoting of values. BAW: + # should this be part of the public interface? + missing = object() + value = self.get(header, missing) + if value is missing: + return failobj + params = [] + for p in _parseparam(value): + try: + name, val = p.split('=', 1) + name = name.strip() + val = val.strip() + except ValueError: + # Must have been a bare attribute + name = p.strip() + val = '' + params.append((name, val)) + params = utils.decode_params(params) + return params + + def get_params(self, failobj=None, header='content-type', unquote=True): + """Return the message's Content-Type parameters, as a list. + + The elements of the returned list are 2-tuples of key/value pairs, as + split on the `=' sign. The left hand side of the `=' is the key, + while the right hand side is the value. If there is no `=' sign in + the parameter the value is the empty string. The value is as + described in the get_param() method. + + Optional failobj is the object to return if there is no Content-Type + header. Optional header is the header to search instead of + Content-Type. If unquote is True, the value is unquoted. + """ + missing = object() + params = self._get_params_preserve(missing, header) + if params is missing: + return failobj + if unquote: + return [(k, _unquotevalue(v)) for k, v in params] + else: + return params + + def get_param(self, param, failobj=None, header='content-type', + unquote=True): + """Return the parameter value if found in the Content-Type header. + + Optional failobj is the object to return if there is no Content-Type + header, or the Content-Type header has no such parameter. Optional + header is the header to search instead of Content-Type. + + Parameter keys are always compared case insensitively. The return + value can either be a string, or a 3-tuple if the parameter was RFC + 2231 encoded. When it's a 3-tuple, the elements of the value are of + the form (CHARSET, LANGUAGE, VALUE). Note that both CHARSET and + LANGUAGE can be None, in which case you should consider VALUE to be + encoded in the us-ascii charset. You can usually ignore LANGUAGE. + The parameter value (either the returned string, or the VALUE item in + the 3-tuple) is always unquoted, unless unquote is set to False. + + If your application doesn't care whether the parameter was RFC 2231 + encoded, it can turn the return value into a string as follows: + + param = msg.get_param('foo') + param = email.utils.collapse_rfc2231_value(rawparam) + + """ + if header not in self: + return failobj + for k, v in self._get_params_preserve(failobj, header): + if k.lower() == param.lower(): + if unquote: + return _unquotevalue(v) + else: + return v + return failobj + + def set_param(self, param, value, header='Content-Type', requote=True, + charset=None, language=''): + """Set a parameter in the Content-Type header. + + If the parameter already exists in the header, its value will be + replaced with the new value. + + If header is Content-Type and has not yet been defined for this + message, it will be set to "text/plain" and the new parameter and + value will be appended as per RFC 2045. + + An alternate header can specified in the header argument, and all + parameters will be quoted as necessary unless requote is False. + + If charset is specified, the parameter will be encoded according to RFC + 2231. Optional language specifies the RFC 2231 language, defaulting + to the empty string. Both charset and language should be strings. + """ + if not isinstance(value, tuple) and charset: + value = (charset, language, value) + + if header not in self and header.lower() == 'content-type': + ctype = 'text/plain' + else: + ctype = self.get(header) + if not self.get_param(param, header=header): + if not ctype: + ctype = _formatparam(param, value, requote) + else: + ctype = SEMISPACE.join( + [ctype, _formatparam(param, value, requote)]) + else: + ctype = '' + for old_param, old_value in self.get_params(header=header, + unquote=requote): + append_param = '' + if old_param.lower() == param.lower(): + append_param = _formatparam(param, value, requote) + else: + append_param = _formatparam(old_param, old_value, requote) + if not ctype: + ctype = append_param + else: + ctype = SEMISPACE.join([ctype, append_param]) + if ctype != self.get(header): + del self[header] + self[header] = ctype + + def del_param(self, param, header='content-type', requote=True): + """Remove the given parameter completely from the Content-Type header. + + The header will be re-written in place without the parameter or its + value. All values will be quoted as necessary unless requote is + False. Optional header specifies an alternative to the Content-Type + header. + """ + if header not in self: + return + new_ctype = '' + for p, v in self.get_params(header=header, unquote=requote): + if p.lower() != param.lower(): + if not new_ctype: + new_ctype = _formatparam(p, v, requote) + else: + new_ctype = SEMISPACE.join([new_ctype, + _formatparam(p, v, requote)]) + if new_ctype != self.get(header): + del self[header] + self[header] = new_ctype + + def set_type(self, type, header='Content-Type', requote=True): + """Set the main type and subtype for the Content-Type header. + + type must be a string in the form "maintype/subtype", otherwise a + ValueError is raised. + + This method replaces the Content-Type header, keeping all the + parameters in place. If requote is False, this leaves the existing + header's quoting as is. Otherwise, the parameters will be quoted (the + default). + + An alternative header can be specified in the header argument. When + the Content-Type header is set, we'll always also add a MIME-Version + header. + """ + # BAW: should we be strict? + if not type.count('/') == 1: + raise ValueError + # Set the Content-Type, you get a MIME-Version + if header.lower() == 'content-type': + del self['mime-version'] + self['MIME-Version'] = '1.0' + if header not in self: + self[header] = type + return + params = self.get_params(header=header, unquote=requote) + del self[header] + self[header] = type + # Skip the first param; it's the old type. + for p, v in params[1:]: + self.set_param(p, v, header, requote) + + def get_filename(self, failobj=None): + """Return the filename associated with the payload if present. + + The filename is extracted from the Content-Disposition header's + `filename' parameter, and it is unquoted. If that header is missing + the `filename' parameter, this method falls back to looking for the + `name' parameter. + """ + missing = object() + filename = self.get_param('filename', missing, 'content-disposition') + if filename is missing: + filename = self.get_param('name', missing, 'content-type') + if filename is missing: + return failobj + return utils.collapse_rfc2231_value(filename).strip() + + def get_boundary(self, failobj=None): + """Return the boundary associated with the payload if present. + + The boundary is extracted from the Content-Type header's `boundary' + parameter, and it is unquoted. + """ + missing = object() + boundary = self.get_param('boundary', missing) + if boundary is missing: + return failobj + # RFC 2046 says that boundaries may begin but not end in w/s + return utils.collapse_rfc2231_value(boundary).rstrip() + + def set_boundary(self, boundary): + """Set the boundary parameter in Content-Type to 'boundary'. + + This is subtly different than deleting the Content-Type header and + adding a new one with a new boundary parameter via add_header(). The + main difference is that using the set_boundary() method preserves the + order of the Content-Type header in the original message. + + HeaderParseError is raised if the message has no Content-Type header. + """ + missing = object() + params = self._get_params_preserve(missing, 'content-type') + if params is missing: + # There was no Content-Type header, and we don't know what type + # to set it to, so raise an exception. + raise errors.HeaderParseError('No Content-Type header found') + newparams = list() + foundp = False + for pk, pv in params: + if pk.lower() == 'boundary': + newparams.append(('boundary', '"%s"' % boundary)) + foundp = True + else: + newparams.append((pk, pv)) + if not foundp: + # The original Content-Type header had no boundary attribute. + # Tack one on the end. BAW: should we raise an exception + # instead??? + newparams.append(('boundary', '"%s"' % boundary)) + # Replace the existing Content-Type header with the new value + newheaders = list() + for h, v in self._headers: + if h.lower() == 'content-type': + parts = list() + for k, v in newparams: + if v == '': + parts.append(k) + else: + parts.append('%s=%s' % (k, v)) + val = SEMISPACE.join(parts) + newheaders.append(self.policy.header_store_parse(h, val)) + + else: + newheaders.append((h, v)) + self._headers = newheaders + + def get_content_charset(self, failobj=None): + """Return the charset parameter of the Content-Type header. + + The returned string is always coerced to lower case. If there is no + Content-Type header, or if that header has no charset parameter, + failobj is returned. + """ + missing = object() + charset = self.get_param('charset', missing) + if charset is missing: + return failobj + if isinstance(charset, tuple): + # RFC 2231 encoded, so decode it, and it better end up as ascii. + pcharset = charset[0] or 'us-ascii' + try: + # LookupError will be raised if the charset isn't known to + # Python. UnicodeError will be raised if the encoded text + # contains a character not in the charset. + as_bytes = charset[2].encode('raw-unicode-escape') + charset = str(as_bytes, pcharset) + except (LookupError, UnicodeError): + charset = charset[2] + # charset characters must be in us-ascii range + try: + charset.encode('us-ascii') + except UnicodeError: + return failobj + # RFC 2046, $4.1.2 says charsets are not case sensitive + return charset.lower() + + def get_charsets(self, failobj=None): + """Return a list containing the charset(s) used in this message. + + The returned list of items describes the Content-Type headers' + charset parameter for this message and all the subparts in its + payload. + + Each item will either be a string (the value of the charset parameter + in the Content-Type header of that part) or the value of the + 'failobj' parameter (defaults to None), if the part does not have a + main MIME type of "text", or the charset is not defined. + + The list will contain one string for each part of the message, plus + one for the container message (i.e. self), so that a non-multipart + message will still return a list of length 1. + """ + return [part.get_content_charset(failobj) for part in self.walk()] + + # I.e. def walk(self): ... + from future.backports.email.iterators import walk diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d887d44a2bc60b5c0b87ecb6cac41e51e96d472 GIT binary patch literal 155 zcmXr!<>lgC{X32U2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUmp4;xdr+KnFYF~ zc?F5d*{LbIq) d%)HE!_;|g7%3B;Zx%nxjIjMFa8;XIL0RSp2C;tEd literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/application.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/application.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64fe134b4acb2ed0d6c2037c70df85c1ee3872be GIT binary patch literal 1584 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 F?tflJ9k2iZ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/base.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/base.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..457ca4a32002697e8780bda32330263c5e75e633 GIT binary patch literal 1108 zcma)5%We}f6t!n2nQ4?l5vXG61zlv335c$$3YC`-LhXi%#VoMgvC~X4ui74}jKZp2 z^B;&mnk_4S0ffZ8lZT?Nuw?7n*FNXmWBd8;Zg2O;pU*Rwke_6$c@UpKH#kTV5lN+! z(#(mR%#Ga4i#&>JZraJZQ5RzGl1BbJB0JK%g_-J3gBv&6k=>7E;MY%H38Pq?3S-!~ z(Cqa6>04$>6(=H1YGIQiH{mbfA_KR%FD^`xR#x#OD+_I#Kqg-j1ACgiDo^44C(K?n3(ibjILT z+d42}`~kW-gu#+2ojMD0L(!cDT{vTBpM3QeWD0Z(Z|p4GZ~)b_mD}O@yi`X_#m_Ihm9&L`^5vE>#9 z3|7ok&c?dPn1yXT6G?6Xx<%%uy1>Z>N$ATe19lTK_EO3OFG-}V6k22o++W_LMd>RF zq17FZ4cJW0uL}+OH=vtT-8nF$15@|6tF7H<;nTXmUF_Mw)985PpRO;Q^CV9!=S>d` z<4YBTPU9Jsj-#DTeNC_~uJL)R-!z>Vi~UaYJ%IfEW@NK+R3_!H%1aT?lpJ19luCz( zhu32>znYE4m94ZIT|g4wq!}r2FCAq`hKojpohN7T-FR>&&FxX<}jCDK*K=Uf&s=Pht6bZbDO_R;o{5kG7|J?CuD(+?p=)TLxN zj$c6IL)Ew~+FvHZO)X(t%gS8NMVi7PANS*@*y2R5G!i$#@lx{(ypgtEk3OP(r|bR$ D${#UE literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/image.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/image.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc7f9fed0385ea502dcef5f829e0ecfc215bc36b GIT binary patch literal 2029 zcmah~&u`;I6t*4bN3$(dg@x+~A+bT*M2Kon2rX0Z}8Lix3XR{C7ljZX|b-arGZukB39nT;LGA3GO({ zE#u5OLwU-yay(aLx`kwhFSl@vW{w%VoS`2J=(EMju<2AXA&Gy%rYpbJI<5paf_=Ag z3$56Xc{yJQ^ARhxs0;a+CMjxK99vJlK9+e=5FoFeF2Qrgi(2s3QLUN>j+(LZ|T(itAwpr<#k%zXDSw3rg^LCy!!Ry0qe}LUZwG1g!{WU+ZzYMamXj z&82szS;3t4pWC14>piE(CyAEl!&z3UVgR=>?T3QGiO)l%^(mh-8ajN^7A_ z#_z*YGNVqj!hX*|kdQNu(!Qq?JbcNmd~&vzpfA*lyvZpop#Da#mKt*0Q3%x=$toOG z&{VVa6c{X{1qk)$Ir8J~K)? zHm?z2lX!nVHWJ))eW8weo8Gp5Ht}-7arTkyFO1Q~;KUC$gEU3ix-{K9*h}fCyNRtV zX36lr-Z6EDJxCi3Z~Bl0ByN8V%n9KBx|q1KnpAmpTC0j@H&UD~7g83dXJ^ZqUA?%O z%xcgeCsPcPbnQfzJTE3?UdoAgd0ef`A+R3ev2URX9uC68aDe+H9EP_i?dd(<`9A7X z915j|IEHDuJt<%xrs)fmPcza_Q~W*B)bs$lIoigMQtqCd`7M16d(AtT=TC8p&C;qt z7)Mb!IyCPS1h(3S1I&o#(jUUmi49^>oIdD3z*q9#cG|d&dhDb2jwFx%eQ->ajFnd9 n?q}pP=Kb08kz6z6=w|TQHtx^qw_%Ub#NZ8g)QbiY-kpB{uxM7C literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/message.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/message.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a5ba94f9db0b1f82f03feece867466cac8fd0ce GIT binary patch literal 1462 zcmb7E&5qkP5EdoblAY{!(H1Sx6S0RPE_Nkgn?nypkYbSrJ?s`}bJC#%Ez&j}iBd>v z7hd>O=M{SC8x(ybU3=;)w3p7%KXHIuDlcb89P*oQz9IGX$;tTS&wqdUZ4d;11xHT| z{&N_%03(7T5JZF(sly^9=ttm3MdbY${J4n0AIwQHfatIq)=820Xi}y1s2GvpWgt>9 zcnhoKXcHAl7xZnm%xPj(p)3M03TzUeBb zT5ep4IrdKk&T|;{3otS$2xt)sQbb}XA`!nOMJxtTM`A$1;QtlV56!In=IW}%B>3Qe z6#g29eFnw_OR@&J*Wm`FcHx@1Xc=!pd+r7z+>l@W`*OGr)?@>XSqIBRL>mIa$3SYp ze7>Ti(Zy{$& zOG^QQ?&km-U&}^24ng3#ZFNTJtA#uwG~>`_Omx20{+vE>3wVXUEv}%`mB;cY4=WVh zhzlz3q=xyXn=cMG;-ULw*Oz{D5V;?6=Xkm3 z&#ZI|YDPgA3OkAV*ve|w$9Mt&b|>y1f%zEn{PQw*b(^=Uz3g<$%hys|-Y=xAE}uTV zpV`%$*ZHh-osszzf_Uj{E^Dr;yjHc$_YG-RW&~)Tz_4R5!T6LsCTVmUK74v~N3(rV zw-aJgST-48p_SZF9?#b?_U*`dbF*XZRgo_si%p#Yg~biMz?_{MoAN9<5! agB1Jp+ii8v@S9>!!Ni~u{K8=fHu?`JTbxJ$ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/multipart.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/multipart.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c57f30e31702ffd3f51d0b77f2059b63760dc6f9 GIT binary patch literal 1663 zcmb7EPmdcl6t`z4f0f-lx459@139 zshs%|oDg4x&oEa`dRK-iFDL z55GXu(VO^!SwT|8tR*XL$kpZ5rz9(tlLa$w{tY%htlie*yA14tHf%w4mAmIP9uX~w%E%+k!HT45(jlBIieD)Pg4qf94s#@VySVcc$ zjMk_^G^j#z{`yfBeuBO|{jpb}>#*v*1@G+#U!y887qAjlfnVVP&QGqRO#Lkgn{VLFJHI(H&>voC$iSk9Yf&b|`H zH-&5j<6s`8q_$i(?Uk0ejUb1=de!{xP60_<;N~ox9capYO`PtMf8P-N@CbgX%bYW_ zBYXHeyv}2t0hpMOJM~05*wDeIOr@oQGIGK!$%Wv8ALZ~8{6V!o2_shAmLg9D0SPjf zPBP_HwGsY!dzl5>Da|-!y>wlkthA0Sec6Bjoam(jkma>Vp&hnNH$FQfN?Hf|zR@K~ zA(E*r+udF)Rj@^iytc=cl&Q98m*lo3e`k8f^!TGS{2~?th8xKX5`JN$d5`oBl z)HLn@>QUFa#k6PqrKyLM`T|o5*1n*1zZFzZtZ?+u<7vN+tWYb6+n=v`cz7a-ZI&7ljRc1&re zd8xcTq4c(7YVR3P%5_RGV)GNmX@NE;D%V&g_^?8U;O6-{HBBu9z8Xydcj!)Gn=kNwMOCon~L;(tLun1ufT DPG90@ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/nonmultipart.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/nonmultipart.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2336be677d0af2813d9a77b9984a569a31ea4c07 GIT binary patch literal 929 zcmZuwL2uJA6t*mvCvqTr_b{b~cOe_e;U_X3ZQi^S zP9?b(&LvA@llh1FdE(c#N=oINxKu9jE8!DiRZ17+&Vy%sk--tbc6Td!YzO1vlsAo-8i~LH-+3iXxJv%vh}TvVM;8@E1m+h;Cl~{~GCbYBBA#1I{Z^D$d&x=cSR2 z#(K>8btClOPRzM9Ip=l)fF0|-G{!xAlS7E^&H;^r#q_{FgAGL8@`vMSyoLV(u}G~2 zSfMrN?8SB>-6>2vg`J};dAymTd^q8hjS&$U?6E>?EmCU-CtFo-aiV+jh>r0S^aIG@ EAJOLfwEzGB literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/text.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/__pycache__/text.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f822c2cb2fb5ae57d1e9fb13b923c298df93b41 GIT binary patch literal 1443 zcmah}&2Hm15GEzrR^L;bqm&eD^@t^^QT9Rh6Tg!Kkb@)ud2maU0ceMMSd5ZUryc3AI7*Hv`G$y44Bmm2 zJbLt#NF04fCeb>+)ZAKTWNoCCrBmfCbMjX=`;56&E!p+A*H=tbSyO=0#(zUTWJ251 zrc_xaWU7^uhHDFZp-{gltEv*@r+i^6-8h-5qOOcDL)E`qxX^df)f0M z|JMJBl-`fTd3XMXh+yO8z8GwLMSq7=8*&$H=*EBS3JFOM`EL{=8Ofbw{Qca=QN*?* z#R4&9nOjO`oxz$RTDOF~LR!mjC94*9GINKgY_sS}x;@xc7WP7%gmfFKuN-m^{8N0!} zw{Za!L~ZPp+f1o*(9SC$#x1#H+yX&X2|1N{4&a`n@4dTy48u#COEbN~E<+rBAoifN zX3(k?TL5hmxY-dpUx&Mh>p|o4>5Dc%j@!`|>}1dm`=)KrzVAD~^DeK9sf-yxpR{3` zs#3W$ZJ&ViwB{>aaWM(nz)GDbgRW{|wJifkTjzfea|RCnc|CJQJ*!ncZOWQw_fkwB zmQw2J#l=HzS8wiTdE*)*XA4l`rLr?waHVI3D&!3Fjq8;;23OCpZ_y`t8d8r&G^8gq z^2RXNAM7q-yvujunGj6p01_~iP(Q#BrD;)#Mx#7V(>D#*Tg@m<;XO#xE>f5I!Ge*y zTX+hB#d{Rez?)B=m=8fluRR7h?x87OZG&blxaC@>Y4S;L5${pP9m=@p-&g~WB}qPg sj}>wemsMHpUXrdjT}lUOA~yzeZNsm7m@o0^uqUttbc~-j1ir@pe;qB6#{d8T literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/application.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/application.py new file mode 100644 index 0000000..5cbfb17 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/application.py @@ -0,0 +1,39 @@ +# Copyright (C) 2001-2006 Python Software Foundation +# Author: Keith Dart +# Contact: email-sig@python.org + +"""Class representing application/* type MIME documents.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +from future.backports.email import encoders +from future.backports.email.mime.nonmultipart import MIMENonMultipart + +__all__ = ["MIMEApplication"] + + +class MIMEApplication(MIMENonMultipart): + """Class for generating application/* MIME documents.""" + + def __init__(self, _data, _subtype='octet-stream', + _encoder=encoders.encode_base64, **_params): + """Create an application/* type MIME document. + + _data is a string containing the raw application data. + + _subtype is the MIME content type subtype, defaulting to + 'octet-stream'. + + _encoder is a function which will perform the actual encoding for + transport of the application data, defaulting to base64 encoding. + + Any additional keyword arguments are passed to the base class + constructor, which turns them into parameters on the Content-Type + header. + """ + if _subtype is None: + raise TypeError('Invalid application MIME subtype') + MIMENonMultipart.__init__(self, 'application', _subtype, **_params) + self.set_payload(_data) + _encoder(self) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/audio.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/audio.py new file mode 100644 index 0000000..4989c11 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/audio.py @@ -0,0 +1,74 @@ +# Copyright (C) 2001-2007 Python Software Foundation +# Author: Anthony Baxter +# Contact: email-sig@python.org + +"""Class representing audio/* type MIME documents.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +__all__ = ['MIMEAudio'] + +import sndhdr + +from io import BytesIO +from future.backports.email import encoders +from future.backports.email.mime.nonmultipart import MIMENonMultipart + + +_sndhdr_MIMEmap = {'au' : 'basic', + 'wav' :'x-wav', + 'aiff':'x-aiff', + 'aifc':'x-aiff', + } + +# There are others in sndhdr that don't have MIME types. :( +# Additional ones to be added to sndhdr? midi, mp3, realaudio, wma?? +def _whatsnd(data): + """Try to identify a sound file type. + + sndhdr.what() has a pretty cruddy interface, unfortunately. This is why + we re-do it here. It would be easier to reverse engineer the Unix 'file' + command and use the standard 'magic' file, as shipped with a modern Unix. + """ + hdr = data[:512] + fakefile = BytesIO(hdr) + for testfn in sndhdr.tests: + res = testfn(hdr, fakefile) + if res is not None: + return _sndhdr_MIMEmap.get(res[0]) + return None + + +class MIMEAudio(MIMENonMultipart): + """Class for generating audio/* MIME documents.""" + + def __init__(self, _audiodata, _subtype=None, + _encoder=encoders.encode_base64, **_params): + """Create an audio/* type MIME document. + + _audiodata is a string containing the raw audio data. If this data + can be decoded by the standard Python `sndhdr' module, then the + subtype will be automatically included in the Content-Type header. + Otherwise, you can specify the specific audio subtype via the + _subtype parameter. If _subtype is not given, and no subtype can be + guessed, a TypeError is raised. + + _encoder is a function which will perform the actual encoding for + transport of the image data. It takes one argument, which is this + Image instance. It should use get_payload() and set_payload() to + change the payload to the encoded form. It should also add any + Content-Transfer-Encoding or other headers to the message as + necessary. The default encoding is Base64. + + Any additional keyword arguments are passed to the base class + constructor, which turns them into parameters on the Content-Type + header. + """ + if _subtype is None: + _subtype = _whatsnd(_audiodata) + if _subtype is None: + raise TypeError('Could not find audio MIME subtype') + MIMENonMultipart.__init__(self, 'audio', _subtype, **_params) + self.set_payload(_audiodata) + _encoder(self) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/base.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/base.py new file mode 100644 index 0000000..e77f3ca --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/base.py @@ -0,0 +1,25 @@ +# Copyright (C) 2001-2006 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Base class for MIME specializations.""" +from __future__ import absolute_import, division, unicode_literals +from future.backports.email import message + +__all__ = ['MIMEBase'] + + +class MIMEBase(message.Message): + """Base class for MIME specializations.""" + + def __init__(self, _maintype, _subtype, **_params): + """This constructor adds a Content-Type: and a MIME-Version: header. + + The Content-Type: header is taken from the _maintype and _subtype + arguments. Additional parameters for this header are taken from the + keyword arguments. + """ + message.Message.__init__(self) + ctype = '%s/%s' % (_maintype, _subtype) + self.add_header('Content-Type', ctype, **_params) + self['MIME-Version'] = '1.0' diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/image.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/image.py new file mode 100644 index 0000000..a036024 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/image.py @@ -0,0 +1,48 @@ +# Copyright (C) 2001-2006 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Class representing image/* type MIME documents.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +__all__ = ['MIMEImage'] + +import imghdr + +from future.backports.email import encoders +from future.backports.email.mime.nonmultipart import MIMENonMultipart + + +class MIMEImage(MIMENonMultipart): + """Class for generating image/* type MIME documents.""" + + def __init__(self, _imagedata, _subtype=None, + _encoder=encoders.encode_base64, **_params): + """Create an image/* type MIME document. + + _imagedata is a string containing the raw image data. If this data + can be decoded by the standard Python `imghdr' module, then the + subtype will be automatically included in the Content-Type header. + Otherwise, you can specify the specific image subtype via the _subtype + parameter. + + _encoder is a function which will perform the actual encoding for + transport of the image data. It takes one argument, which is this + Image instance. It should use get_payload() and set_payload() to + change the payload to the encoded form. It should also add any + Content-Transfer-Encoding or other headers to the message as + necessary. The default encoding is Base64. + + Any additional keyword arguments are passed to the base class + constructor, which turns them into parameters on the Content-Type + header. + """ + if _subtype is None: + _subtype = imghdr.what(None, _imagedata) + if _subtype is None: + raise TypeError('Could not guess image MIME subtype') + MIMENonMultipart.__init__(self, 'image', _subtype, **_params) + self.set_payload(_imagedata) + _encoder(self) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/message.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/message.py new file mode 100644 index 0000000..7f92075 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/message.py @@ -0,0 +1,36 @@ +# Copyright (C) 2001-2006 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Class representing message/* MIME documents.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +__all__ = ['MIMEMessage'] + +from future.backports.email import message +from future.backports.email.mime.nonmultipart import MIMENonMultipart + + +class MIMEMessage(MIMENonMultipart): + """Class representing message/* MIME documents.""" + + def __init__(self, _msg, _subtype='rfc822'): + """Create a message/* type MIME document. + + _msg is a message object and must be an instance of Message, or a + derived class of Message, otherwise a TypeError is raised. + + Optional _subtype defines the subtype of the contained message. The + default is "rfc822" (this is defined by the MIME standard, even though + the term "rfc822" is technically outdated by RFC 2822). + """ + MIMENonMultipart.__init__(self, 'message', _subtype) + if not isinstance(_msg, message.Message): + raise TypeError('Argument is not an instance of Message') + # It's convenient to use this base class method. We need to do it + # this way or we'll get an exception + message.Message.attach(self, _msg) + # And be sure our default type is set correctly + self.set_default_type('message/rfc822') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/multipart.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/multipart.py new file mode 100644 index 0000000..6d7ed3d --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/multipart.py @@ -0,0 +1,49 @@ +# Copyright (C) 2002-2006 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Base class for MIME multipart/* type messages.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +__all__ = ['MIMEMultipart'] + +from future.backports.email.mime.base import MIMEBase + + +class MIMEMultipart(MIMEBase): + """Base class for MIME multipart/* type messages.""" + + def __init__(self, _subtype='mixed', boundary=None, _subparts=None, + **_params): + """Creates a multipart/* type message. + + By default, creates a multipart/mixed message, with proper + Content-Type and MIME-Version headers. + + _subtype is the subtype of the multipart content type, defaulting to + `mixed'. + + boundary is the multipart boundary string. By default it is + calculated as needed. + + _subparts is a sequence of initial subparts for the payload. It + must be an iterable object, such as a list. You can always + attach new subparts to the message by using the attach() method. + + Additional parameters for the Content-Type header are taken from the + keyword arguments (or passed into the _params argument). + """ + MIMEBase.__init__(self, 'multipart', _subtype, **_params) + + # Initialise _payload to an empty list as the Message superclass's + # implementation of is_multipart assumes that _payload is a list for + # multipart messages. + self._payload = [] + + if _subparts: + for p in _subparts: + self.attach(p) + if boundary: + self.set_boundary(boundary) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/nonmultipart.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/nonmultipart.py new file mode 100644 index 0000000..08c37c3 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/nonmultipart.py @@ -0,0 +1,24 @@ +# Copyright (C) 2002-2006 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Base class for MIME type messages that are not multipart.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +__all__ = ['MIMENonMultipart'] + +from future.backports.email import errors +from future.backports.email.mime.base import MIMEBase + + +class MIMENonMultipart(MIMEBase): + """Base class for MIME multipart/* type messages.""" + + def attach(self, payload): + # The public API prohibits attaching multiple subparts to MIMEBase + # derived subtypes since none of them are, by definition, of content + # type multipart/* + raise errors.MultipartConversionError( + 'Cannot attach additional subparts to non-multipart/*') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/text.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/text.py new file mode 100644 index 0000000..6269f4a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/mime/text.py @@ -0,0 +1,44 @@ +# Copyright (C) 2001-2006 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Class representing text/* type MIME documents.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +__all__ = ['MIMEText'] + +from future.backports.email.encoders import encode_7or8bit +from future.backports.email.mime.nonmultipart import MIMENonMultipart + + +class MIMEText(MIMENonMultipart): + """Class for generating text/* type MIME documents.""" + + def __init__(self, _text, _subtype='plain', _charset=None): + """Create a text/* type MIME document. + + _text is the string for this message object. + + _subtype is the MIME sub content type, defaulting to "plain". + + _charset is the character set parameter added to the Content-Type + header. This defaults to "us-ascii". Note that as a side-effect, the + Content-Transfer-Encoding header will also be set. + """ + + # If no _charset was specified, check to see if there are non-ascii + # characters present. If not, use 'us-ascii', otherwise use utf-8. + # XXX: This can be removed once #7304 is fixed. + if _charset is None: + try: + _text.encode('us-ascii') + _charset = 'us-ascii' + except UnicodeEncodeError: + _charset = 'utf-8' + + MIMENonMultipart.__init__(self, 'text', _subtype, + **{'charset': _charset}) + + self.set_payload(_text, _charset) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/parser.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/parser.py new file mode 100644 index 0000000..df1c6e2 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/parser.py @@ -0,0 +1,135 @@ +# Copyright (C) 2001-2007 Python Software Foundation +# Author: Barry Warsaw, Thomas Wouters, Anthony Baxter +# Contact: email-sig@python.org + +"""A parser of RFC 2822 and MIME email messages.""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import + +__all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser'] + +import warnings +from io import StringIO, TextIOWrapper + +from future.backports.email.feedparser import FeedParser, BytesFeedParser +from future.backports.email.message import Message +from future.backports.email._policybase import compat32 + + +class Parser(object): + def __init__(self, _class=Message, **_3to2kwargs): + """Parser of RFC 2822 and MIME email messages. + + Creates an in-memory object tree representing the email message, which + can then be manipulated and turned over to a Generator to return the + textual representation of the message. + + The string must be formatted as a block of RFC 2822 headers and header + continuation lines, optionally preceeded by a `Unix-from' header. The + header block is terminated either by the end of the string or by a + blank line. + + _class is the class to instantiate for new message objects when they + must be created. This class must have a constructor that can take + zero arguments. Default is Message.Message. + + The policy keyword specifies a policy object that controls a number of + aspects of the parser's operation. The default policy maintains + backward compatibility. + + """ + if 'policy' in _3to2kwargs: policy = _3to2kwargs['policy']; del _3to2kwargs['policy'] + else: policy = compat32 + self._class = _class + self.policy = policy + + def parse(self, fp, headersonly=False): + """Create a message structure from the data in a file. + + Reads all the data from the file and returns the root of the message + structure. Optional headersonly is a flag specifying whether to stop + parsing after reading the headers or not. The default is False, + meaning it parses the entire contents of the file. + """ + feedparser = FeedParser(self._class, policy=self.policy) + if headersonly: + feedparser._set_headersonly() + while True: + data = fp.read(8192) + if not data: + break + feedparser.feed(data) + return feedparser.close() + + def parsestr(self, text, headersonly=False): + """Create a message structure from a string. + + Returns the root of the message structure. Optional headersonly is a + flag specifying whether to stop parsing after reading the headers or + not. The default is False, meaning it parses the entire contents of + the file. + """ + return self.parse(StringIO(text), headersonly=headersonly) + + + +class HeaderParser(Parser): + def parse(self, fp, headersonly=True): + return Parser.parse(self, fp, True) + + def parsestr(self, text, headersonly=True): + return Parser.parsestr(self, text, True) + + +class BytesParser(object): + + def __init__(self, *args, **kw): + """Parser of binary RFC 2822 and MIME email messages. + + Creates an in-memory object tree representing the email message, which + can then be manipulated and turned over to a Generator to return the + textual representation of the message. + + The input must be formatted as a block of RFC 2822 headers and header + continuation lines, optionally preceeded by a `Unix-from' header. The + header block is terminated either by the end of the input or by a + blank line. + + _class is the class to instantiate for new message objects when they + must be created. This class must have a constructor that can take + zero arguments. Default is Message.Message. + """ + self.parser = Parser(*args, **kw) + + def parse(self, fp, headersonly=False): + """Create a message structure from the data in a binary file. + + Reads all the data from the file and returns the root of the message + structure. Optional headersonly is a flag specifying whether to stop + parsing after reading the headers or not. The default is False, + meaning it parses the entire contents of the file. + """ + fp = TextIOWrapper(fp, encoding='ascii', errors='surrogateescape') + with fp: + return self.parser.parse(fp, headersonly) + + + def parsebytes(self, text, headersonly=False): + """Create a message structure from a byte string. + + Returns the root of the message structure. Optional headersonly is a + flag specifying whether to stop parsing after reading the headers or + not. The default is False, meaning it parses the entire contents of + the file. + """ + text = text.decode('ASCII', errors='surrogateescape') + return self.parser.parsestr(text, headersonly) + + +class BytesHeaderParser(BytesParser): + def parse(self, fp, headersonly=True): + return BytesParser.parse(self, fp, headersonly=True) + + def parsebytes(self, text, headersonly=True): + return BytesParser.parsebytes(self, text, headersonly=True) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/policy.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/policy.py new file mode 100644 index 0000000..2f609a2 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/policy.py @@ -0,0 +1,193 @@ +"""This will be the home for the policy that hooks in the new +code that adds all the email6 features. +""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from future.builtins import super + +from future.standard_library.email._policybase import (Policy, Compat32, + compat32, _extend_docstrings) +from future.standard_library.email.utils import _has_surrogates +from future.standard_library.email.headerregistry import HeaderRegistry as HeaderRegistry + +__all__ = [ + 'Compat32', + 'compat32', + 'Policy', + 'EmailPolicy', + 'default', + 'strict', + 'SMTP', + 'HTTP', + ] + +@_extend_docstrings +class EmailPolicy(Policy): + + """+ + PROVISIONAL + + The API extensions enabled by this policy are currently provisional. + Refer to the documentation for details. + + This policy adds new header parsing and folding algorithms. Instead of + simple strings, headers are custom objects with custom attributes + depending on the type of the field. The folding algorithm fully + implements RFCs 2047 and 5322. + + In addition to the settable attributes listed above that apply to + all Policies, this policy adds the following additional attributes: + + refold_source -- if the value for a header in the Message object + came from the parsing of some source, this attribute + indicates whether or not a generator should refold + that value when transforming the message back into + stream form. The possible values are: + + none -- all source values use original folding + long -- source values that have any line that is + longer than max_line_length will be + refolded + all -- all values are refolded. + + The default is 'long'. + + header_factory -- a callable that takes two arguments, 'name' and + 'value', where 'name' is a header field name and + 'value' is an unfolded header field value, and + returns a string-like object that represents that + header. A default header_factory is provided that + understands some of the RFC5322 header field types. + (Currently address fields and date fields have + special treatment, while all other fields are + treated as unstructured. This list will be + completed before the extension is marked stable.) + """ + + refold_source = 'long' + header_factory = HeaderRegistry() + + def __init__(self, **kw): + # Ensure that each new instance gets a unique header factory + # (as opposed to clones, which share the factory). + if 'header_factory' not in kw: + object.__setattr__(self, 'header_factory', HeaderRegistry()) + super().__init__(**kw) + + def header_max_count(self, name): + """+ + The implementation for this class returns the max_count attribute from + the specialized header class that would be used to construct a header + of type 'name'. + """ + return self.header_factory[name].max_count + + # The logic of the next three methods is chosen such that it is possible to + # switch a Message object between a Compat32 policy and a policy derived + # from this class and have the results stay consistent. This allows a + # Message object constructed with this policy to be passed to a library + # that only handles Compat32 objects, or to receive such an object and + # convert it to use the newer style by just changing its policy. It is + # also chosen because it postpones the relatively expensive full rfc5322 + # parse until as late as possible when parsing from source, since in many + # applications only a few headers will actually be inspected. + + def header_source_parse(self, sourcelines): + """+ + The name is parsed as everything up to the ':' and returned unmodified. + The value is determined by stripping leading whitespace off the + remainder of the first line, joining all subsequent lines together, and + stripping any trailing carriage return or linefeed characters. (This + is the same as Compat32). + + """ + name, value = sourcelines[0].split(':', 1) + value = value.lstrip(' \t') + ''.join(sourcelines[1:]) + return (name, value.rstrip('\r\n')) + + def header_store_parse(self, name, value): + """+ + The name is returned unchanged. If the input value has a 'name' + attribute and it matches the name ignoring case, the value is returned + unchanged. Otherwise the name and value are passed to header_factory + method, and the resulting custom header object is returned as the + value. In this case a ValueError is raised if the input value contains + CR or LF characters. + + """ + if hasattr(value, 'name') and value.name.lower() == name.lower(): + return (name, value) + if isinstance(value, str) and len(value.splitlines())>1: + raise ValueError("Header values may not contain linefeed " + "or carriage return characters") + return (name, self.header_factory(name, value)) + + def header_fetch_parse(self, name, value): + """+ + If the value has a 'name' attribute, it is returned to unmodified. + Otherwise the name and the value with any linesep characters removed + are passed to the header_factory method, and the resulting custom + header object is returned. Any surrogateescaped bytes get turned + into the unicode unknown-character glyph. + + """ + if hasattr(value, 'name'): + return value + return self.header_factory(name, ''.join(value.splitlines())) + + def fold(self, name, value): + """+ + Header folding is controlled by the refold_source policy setting. A + value is considered to be a 'source value' if and only if it does not + have a 'name' attribute (having a 'name' attribute means it is a header + object of some sort). If a source value needs to be refolded according + to the policy, it is converted into a custom header object by passing + the name and the value with any linesep characters removed to the + header_factory method. Folding of a custom header object is done by + calling its fold method with the current policy. + + Source values are split into lines using splitlines. If the value is + not to be refolded, the lines are rejoined using the linesep from the + policy and returned. The exception is lines containing non-ascii + binary data. In that case the value is refolded regardless of the + refold_source setting, which causes the binary data to be CTE encoded + using the unknown-8bit charset. + + """ + return self._fold(name, value, refold_binary=True) + + def fold_binary(self, name, value): + """+ + The same as fold if cte_type is 7bit, except that the returned value is + bytes. + + If cte_type is 8bit, non-ASCII binary data is converted back into + bytes. Headers with binary data are not refolded, regardless of the + refold_header setting, since there is no way to know whether the binary + data consists of single byte characters or multibyte characters. + + """ + folded = self._fold(name, value, refold_binary=self.cte_type=='7bit') + return folded.encode('ascii', 'surrogateescape') + + def _fold(self, name, value, refold_binary=False): + if hasattr(value, 'name'): + return value.fold(policy=self) + maxlen = self.max_line_length if self.max_line_length else float('inf') + lines = value.splitlines() + refold = (self.refold_source == 'all' or + self.refold_source == 'long' and + (lines and len(lines[0])+len(name)+2 > maxlen or + any(len(x) > maxlen for x in lines[1:]))) + if refold or refold_binary and _has_surrogates(value): + return self.header_factory(name, ''.join(lines)).fold(policy=self) + return name + ': ' + self.linesep.join(lines) + self.linesep + + +default = EmailPolicy() +# Make the default policy use the class default header_factory +del default.header_factory +strict = default.clone(raise_on_defect=True) +SMTP = default.clone(linesep='\r\n') +HTTP = default.clone(linesep='\r\n', max_line_length=None) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/quoprimime.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/quoprimime.py new file mode 100644 index 0000000..b69d158 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/quoprimime.py @@ -0,0 +1,326 @@ +# Copyright (C) 2001-2006 Python Software Foundation +# Author: Ben Gertzfield +# Contact: email-sig@python.org + +"""Quoted-printable content transfer encoding per RFCs 2045-2047. + +This module handles the content transfer encoding method defined in RFC 2045 +to encode US ASCII-like 8-bit data called `quoted-printable'. It is used to +safely encode text that is in a character set similar to the 7-bit US ASCII +character set, but that includes some 8-bit characters that are normally not +allowed in email bodies or headers. + +Quoted-printable is very space-inefficient for encoding binary files; use the +email.base64mime module for that instead. + +This module provides an interface to encode and decode both headers and bodies +with quoted-printable encoding. + +RFC 2045 defines a method for including character set information in an +`encoded-word' in a header. This method is commonly used for 8-bit real names +in To:/From:/Cc: etc. fields, as well as Subject: lines. + +This module does not do the line wrapping or end-of-line character +conversion necessary for proper internationalized headers; it only +does dumb encoding and decoding. To deal with the various line +wrapping issues, use the email.header module. +""" +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from future.builtins import bytes, chr, dict, int, range, super + +__all__ = [ + 'body_decode', + 'body_encode', + 'body_length', + 'decode', + 'decodestring', + 'header_decode', + 'header_encode', + 'header_length', + 'quote', + 'unquote', + ] + +import re +import io + +from string import ascii_letters, digits, hexdigits + +CRLF = '\r\n' +NL = '\n' +EMPTYSTRING = '' + +# Build a mapping of octets to the expansion of that octet. Since we're only +# going to have 256 of these things, this isn't terribly inefficient +# space-wise. Remember that headers and bodies have different sets of safe +# characters. Initialize both maps with the full expansion, and then override +# the safe bytes with the more compact form. +_QUOPRI_HEADER_MAP = dict((c, '=%02X' % c) for c in range(256)) +_QUOPRI_BODY_MAP = _QUOPRI_HEADER_MAP.copy() + +# Safe header bytes which need no encoding. +for c in bytes(b'-!*+/' + ascii_letters.encode('ascii') + digits.encode('ascii')): + _QUOPRI_HEADER_MAP[c] = chr(c) +# Headers have one other special encoding; spaces become underscores. +_QUOPRI_HEADER_MAP[ord(' ')] = '_' + +# Safe body bytes which need no encoding. +for c in bytes(b' !"#$%&\'()*+,-./0123456789:;<>' + b'?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`' + b'abcdefghijklmnopqrstuvwxyz{|}~\t'): + _QUOPRI_BODY_MAP[c] = chr(c) + + + +# Helpers +def header_check(octet): + """Return True if the octet should be escaped with header quopri.""" + return chr(octet) != _QUOPRI_HEADER_MAP[octet] + + +def body_check(octet): + """Return True if the octet should be escaped with body quopri.""" + return chr(octet) != _QUOPRI_BODY_MAP[octet] + + +def header_length(bytearray): + """Return a header quoted-printable encoding length. + + Note that this does not include any RFC 2047 chrome added by + `header_encode()`. + + :param bytearray: An array of bytes (a.k.a. octets). + :return: The length in bytes of the byte array when it is encoded with + quoted-printable for headers. + """ + return sum(len(_QUOPRI_HEADER_MAP[octet]) for octet in bytearray) + + +def body_length(bytearray): + """Return a body quoted-printable encoding length. + + :param bytearray: An array of bytes (a.k.a. octets). + :return: The length in bytes of the byte array when it is encoded with + quoted-printable for bodies. + """ + return sum(len(_QUOPRI_BODY_MAP[octet]) for octet in bytearray) + + +def _max_append(L, s, maxlen, extra=''): + if not isinstance(s, str): + s = chr(s) + if not L: + L.append(s.lstrip()) + elif len(L[-1]) + len(s) <= maxlen: + L[-1] += extra + s + else: + L.append(s.lstrip()) + + +def unquote(s): + """Turn a string in the form =AB to the ASCII character with value 0xab""" + return chr(int(s[1:3], 16)) + + +def quote(c): + return '=%02X' % ord(c) + + + +def header_encode(header_bytes, charset='iso-8859-1'): + """Encode a single header line with quoted-printable (like) encoding. + + Defined in RFC 2045, this `Q' encoding is similar to quoted-printable, but + used specifically for email header fields to allow charsets with mostly 7 + bit characters (and some 8 bit) to remain more or less readable in non-RFC + 2045 aware mail clients. + + charset names the character set to use in the RFC 2046 header. It + defaults to iso-8859-1. + """ + # Return empty headers as an empty string. + if not header_bytes: + return '' + # Iterate over every byte, encoding if necessary. + encoded = [] + for octet in header_bytes: + encoded.append(_QUOPRI_HEADER_MAP[octet]) + # Now add the RFC chrome to each encoded chunk and glue the chunks + # together. + return '=?%s?q?%s?=' % (charset, EMPTYSTRING.join(encoded)) + + +class _body_accumulator(io.StringIO): + + def __init__(self, maxlinelen, eol, *args, **kw): + super().__init__(*args, **kw) + self.eol = eol + self.maxlinelen = self.room = maxlinelen + + def write_str(self, s): + """Add string s to the accumulated body.""" + self.write(s) + self.room -= len(s) + + def newline(self): + """Write eol, then start new line.""" + self.write_str(self.eol) + self.room = self.maxlinelen + + def write_soft_break(self): + """Write a soft break, then start a new line.""" + self.write_str('=') + self.newline() + + def write_wrapped(self, s, extra_room=0): + """Add a soft line break if needed, then write s.""" + if self.room < len(s) + extra_room: + self.write_soft_break() + self.write_str(s) + + def write_char(self, c, is_last_char): + if not is_last_char: + # Another character follows on this line, so we must leave + # extra room, either for it or a soft break, and whitespace + # need not be quoted. + self.write_wrapped(c, extra_room=1) + elif c not in ' \t': + # For this and remaining cases, no more characters follow, + # so there is no need to reserve extra room (since a hard + # break will immediately follow). + self.write_wrapped(c) + elif self.room >= 3: + # It's a whitespace character at end-of-line, and we have room + # for the three-character quoted encoding. + self.write(quote(c)) + elif self.room == 2: + # There's room for the whitespace character and a soft break. + self.write(c) + self.write_soft_break() + else: + # There's room only for a soft break. The quoted whitespace + # will be the only content on the subsequent line. + self.write_soft_break() + self.write(quote(c)) + + +def body_encode(body, maxlinelen=76, eol=NL): + """Encode with quoted-printable, wrapping at maxlinelen characters. + + Each line of encoded text will end with eol, which defaults to "\\n". Set + this to "\\r\\n" if you will be using the result of this function directly + in an email. + + Each line will be wrapped at, at most, maxlinelen characters before the + eol string (maxlinelen defaults to 76 characters, the maximum value + permitted by RFC 2045). Long lines will have the 'soft line break' + quoted-printable character "=" appended to them, so the decoded text will + be identical to the original text. + + The minimum maxlinelen is 4 to have room for a quoted character ("=XX") + followed by a soft line break. Smaller values will generate a + ValueError. + + """ + + if maxlinelen < 4: + raise ValueError("maxlinelen must be at least 4") + if not body: + return body + + # The last line may or may not end in eol, but all other lines do. + last_has_eol = (body[-1] in '\r\n') + + # This accumulator will make it easier to build the encoded body. + encoded_body = _body_accumulator(maxlinelen, eol) + + lines = body.splitlines() + last_line_no = len(lines) - 1 + for line_no, line in enumerate(lines): + last_char_index = len(line) - 1 + for i, c in enumerate(line): + if body_check(ord(c)): + c = quote(c) + encoded_body.write_char(c, i==last_char_index) + # Add an eol if input line had eol. All input lines have eol except + # possibly the last one. + if line_no < last_line_no or last_has_eol: + encoded_body.newline() + + return encoded_body.getvalue() + + + +# BAW: I'm not sure if the intent was for the signature of this function to be +# the same as base64MIME.decode() or not... +def decode(encoded, eol=NL): + """Decode a quoted-printable string. + + Lines are separated with eol, which defaults to \\n. + """ + if not encoded: + return encoded + # BAW: see comment in encode() above. Again, we're building up the + # decoded string with string concatenation, which could be done much more + # efficiently. + decoded = '' + + for line in encoded.splitlines(): + line = line.rstrip() + if not line: + decoded += eol + continue + + i = 0 + n = len(line) + while i < n: + c = line[i] + if c != '=': + decoded += c + i += 1 + # Otherwise, c == "=". Are we at the end of the line? If so, add + # a soft line break. + elif i+1 == n: + i += 1 + continue + # Decode if in form =AB + elif i+2 < n and line[i+1] in hexdigits and line[i+2] in hexdigits: + decoded += unquote(line[i:i+3]) + i += 3 + # Otherwise, not in form =AB, pass literally + else: + decoded += c + i += 1 + + if i == n: + decoded += eol + # Special case if original string did not end with eol + if encoded[-1] not in '\r\n' and decoded.endswith(eol): + decoded = decoded[:-1] + return decoded + + +# For convenience and backwards compatibility w/ standard base64 module +body_decode = decode +decodestring = decode + + + +def _unquote_match(match): + """Turn a match in the form =AB to the ASCII character with value 0xab""" + s = match.group(0) + return unquote(s) + + +# Header decoding is done a bit differently +def header_decode(s): + """Decode a string encoded with RFC 2045 MIME header `Q' encoding. + + This function does not parse a full MIME header value encoded with + quoted-printable (like =?iso-8895-1?q?Hello_World?=) -- please use + the high level email.header class for that functionality. + """ + s = s.replace('_', ' ') + return re.sub(r'=[a-fA-F0-9]{2}', _unquote_match, s, re.ASCII) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/utils.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/utils.py new file mode 100644 index 0000000..4abebf7 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/email/utils.py @@ -0,0 +1,400 @@ +# Copyright (C) 2001-2010 Python Software Foundation +# Author: Barry Warsaw +# Contact: email-sig@python.org + +"""Miscellaneous utilities.""" + +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from future import utils +from future.builtins import bytes, int, str + +__all__ = [ + 'collapse_rfc2231_value', + 'decode_params', + 'decode_rfc2231', + 'encode_rfc2231', + 'formataddr', + 'formatdate', + 'format_datetime', + 'getaddresses', + 'make_msgid', + 'mktime_tz', + 'parseaddr', + 'parsedate', + 'parsedate_tz', + 'parsedate_to_datetime', + 'unquote', + ] + +import os +import re +if utils.PY2: + re.ASCII = 0 +import time +import base64 +import random +import socket +from future.backports import datetime +from future.backports.urllib.parse import quote as url_quote, unquote as url_unquote +import warnings +from io import StringIO + +from future.backports.email._parseaddr import quote +from future.backports.email._parseaddr import AddressList as _AddressList +from future.backports.email._parseaddr import mktime_tz + +from future.backports.email._parseaddr import parsedate, parsedate_tz, _parsedate_tz + +from quopri import decodestring as _qdecode + +# Intrapackage imports +from future.backports.email.encoders import _bencode, _qencode +from future.backports.email.charset import Charset + +COMMASPACE = ', ' +EMPTYSTRING = '' +UEMPTYSTRING = '' +CRLF = '\r\n' +TICK = "'" + +specialsre = re.compile(r'[][\\()<>@,:;".]') +escapesre = re.compile(r'[\\"]') + +# How to figure out if we are processing strings that come from a byte +# source with undecodable characters. +_has_surrogates = re.compile( + '([^\ud800-\udbff]|\A)[\udc00-\udfff]([^\udc00-\udfff]|\Z)').search + +# How to deal with a string containing bytes before handing it to the +# application through the 'normal' interface. +def _sanitize(string): + # Turn any escaped bytes into unicode 'unknown' char. + original_bytes = string.encode('ascii', 'surrogateescape') + return original_bytes.decode('ascii', 'replace') + + +# Helpers + +def formataddr(pair, charset='utf-8'): + """The inverse of parseaddr(), this takes a 2-tuple of the form + (realname, email_address) and returns the string value suitable + for an RFC 2822 From, To or Cc header. + + If the first element of pair is false, then the second element is + returned unmodified. + + Optional charset if given is the character set that is used to encode + realname in case realname is not ASCII safe. Can be an instance of str or + a Charset-like object which has a header_encode method. Default is + 'utf-8'. + """ + name, address = pair + # The address MUST (per RFC) be ascii, so raise an UnicodeError if it isn't. + address.encode('ascii') + if name: + try: + name.encode('ascii') + except UnicodeEncodeError: + if isinstance(charset, str): + charset = Charset(charset) + encoded_name = charset.header_encode(name) + return "%s <%s>" % (encoded_name, address) + else: + quotes = '' + if specialsre.search(name): + quotes = '"' + name = escapesre.sub(r'\\\g<0>', name) + return '%s%s%s <%s>' % (quotes, name, quotes, address) + return address + + + +def getaddresses(fieldvalues): + """Return a list of (REALNAME, EMAIL) for each fieldvalue.""" + all = COMMASPACE.join(fieldvalues) + a = _AddressList(all) + return a.addresslist + + + +ecre = re.compile(r''' + =\? # literal =? + (?P[^?]*?) # non-greedy up to the next ? is the charset + \? # literal ? + (?P[qb]) # either a "q" or a "b", case insensitive + \? # literal ? + (?P.*?) # non-greedy up to the next ?= is the atom + \?= # literal ?= + ''', re.VERBOSE | re.IGNORECASE) + + +def _format_timetuple_and_zone(timetuple, zone): + return '%s, %02d %s %04d %02d:%02d:%02d %s' % ( + ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][timetuple[6]], + timetuple[2], + ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][timetuple[1] - 1], + timetuple[0], timetuple[3], timetuple[4], timetuple[5], + zone) + +def formatdate(timeval=None, localtime=False, usegmt=False): + """Returns a date string as specified by RFC 2822, e.g.: + + Fri, 09 Nov 2001 01:08:47 -0000 + + Optional timeval if given is a floating point time value as accepted by + gmtime() and localtime(), otherwise the current time is used. + + Optional localtime is a flag that when True, interprets timeval, and + returns a date relative to the local timezone instead of UTC, properly + taking daylight savings time into account. + + Optional argument usegmt means that the timezone is written out as + an ascii string, not numeric one (so "GMT" instead of "+0000"). This + is needed for HTTP, and is only used when localtime==False. + """ + # Note: we cannot use strftime() because that honors the locale and RFC + # 2822 requires that day and month names be the English abbreviations. + if timeval is None: + timeval = time.time() + if localtime: + now = time.localtime(timeval) + # Calculate timezone offset, based on whether the local zone has + # daylight savings time, and whether DST is in effect. + if time.daylight and now[-1]: + offset = time.altzone + else: + offset = time.timezone + hours, minutes = divmod(abs(offset), 3600) + # Remember offset is in seconds west of UTC, but the timezone is in + # minutes east of UTC, so the signs differ. + if offset > 0: + sign = '-' + else: + sign = '+' + zone = '%s%02d%02d' % (sign, hours, minutes // 60) + else: + now = time.gmtime(timeval) + # Timezone offset is always -0000 + if usegmt: + zone = 'GMT' + else: + zone = '-0000' + return _format_timetuple_and_zone(now, zone) + +def format_datetime(dt, usegmt=False): + """Turn a datetime into a date string as specified in RFC 2822. + + If usegmt is True, dt must be an aware datetime with an offset of zero. In + this case 'GMT' will be rendered instead of the normal +0000 required by + RFC2822. This is to support HTTP headers involving date stamps. + """ + now = dt.timetuple() + if usegmt: + if dt.tzinfo is None or dt.tzinfo != datetime.timezone.utc: + raise ValueError("usegmt option requires a UTC datetime") + zone = 'GMT' + elif dt.tzinfo is None: + zone = '-0000' + else: + zone = dt.strftime("%z") + return _format_timetuple_and_zone(now, zone) + + +def make_msgid(idstring=None, domain=None): + """Returns a string suitable for RFC 2822 compliant Message-ID, e.g: + + <20020201195627.33539.96671@nightshade.la.mastaler.com> + + Optional idstring if given is a string used to strengthen the + uniqueness of the message id. Optional domain if given provides the + portion of the message id after the '@'. It defaults to the locally + defined hostname. + """ + timeval = time.time() + utcdate = time.strftime('%Y%m%d%H%M%S', time.gmtime(timeval)) + pid = os.getpid() + randint = random.randrange(100000) + if idstring is None: + idstring = '' + else: + idstring = '.' + idstring + if domain is None: + domain = socket.getfqdn() + msgid = '<%s.%s.%s%s@%s>' % (utcdate, pid, randint, idstring, domain) + return msgid + + +def parsedate_to_datetime(data): + _3to2list = list(_parsedate_tz(data)) + dtuple, tz, = [_3to2list[:-1]] + _3to2list[-1:] + if tz is None: + return datetime.datetime(*dtuple[:6]) + return datetime.datetime(*dtuple[:6], + tzinfo=datetime.timezone(datetime.timedelta(seconds=tz))) + + +def parseaddr(addr): + addrs = _AddressList(addr).addresslist + if not addrs: + return '', '' + return addrs[0] + + +# rfc822.unquote() doesn't properly de-backslash-ify in Python pre-2.3. +def unquote(str): + """Remove quotes from a string.""" + if len(str) > 1: + if str.startswith('"') and str.endswith('"'): + return str[1:-1].replace('\\\\', '\\').replace('\\"', '"') + if str.startswith('<') and str.endswith('>'): + return str[1:-1] + return str + + + +# RFC2231-related functions - parameter encoding and decoding +def decode_rfc2231(s): + """Decode string according to RFC 2231""" + parts = s.split(TICK, 2) + if len(parts) <= 2: + return None, None, s + return parts + + +def encode_rfc2231(s, charset=None, language=None): + """Encode string according to RFC 2231. + + If neither charset nor language is given, then s is returned as-is. If + charset is given but not language, the string is encoded using the empty + string for language. + """ + s = url_quote(s, safe='', encoding=charset or 'ascii') + if charset is None and language is None: + return s + if language is None: + language = '' + return "%s'%s'%s" % (charset, language, s) + + +rfc2231_continuation = re.compile(r'^(?P\w+)\*((?P[0-9]+)\*?)?$', + re.ASCII) + +def decode_params(params): + """Decode parameters list according to RFC 2231. + + params is a sequence of 2-tuples containing (param name, string value). + """ + # Copy params so we don't mess with the original + params = params[:] + new_params = [] + # Map parameter's name to a list of continuations. The values are a + # 3-tuple of the continuation number, the string value, and a flag + # specifying whether a particular segment is %-encoded. + rfc2231_params = {} + name, value = params.pop(0) + new_params.append((name, value)) + while params: + name, value = params.pop(0) + if name.endswith('*'): + encoded = True + else: + encoded = False + value = unquote(value) + mo = rfc2231_continuation.match(name) + if mo: + name, num = mo.group('name', 'num') + if num is not None: + num = int(num) + rfc2231_params.setdefault(name, []).append((num, value, encoded)) + else: + new_params.append((name, '"%s"' % quote(value))) + if rfc2231_params: + for name, continuations in rfc2231_params.items(): + value = [] + extended = False + # Sort by number + continuations.sort() + # And now append all values in numerical order, converting + # %-encodings for the encoded segments. If any of the + # continuation names ends in a *, then the entire string, after + # decoding segments and concatenating, must have the charset and + # language specifiers at the beginning of the string. + for num, s, encoded in continuations: + if encoded: + # Decode as "latin-1", so the characters in s directly + # represent the percent-encoded octet values. + # collapse_rfc2231_value treats this as an octet sequence. + s = url_unquote(s, encoding="latin-1") + extended = True + value.append(s) + value = quote(EMPTYSTRING.join(value)) + if extended: + charset, language, value = decode_rfc2231(value) + new_params.append((name, (charset, language, '"%s"' % value))) + else: + new_params.append((name, '"%s"' % value)) + return new_params + +def collapse_rfc2231_value(value, errors='replace', + fallback_charset='us-ascii'): + if not isinstance(value, tuple) or len(value) != 3: + return unquote(value) + # While value comes to us as a unicode string, we need it to be a bytes + # object. We do not want bytes() normal utf-8 decoder, we want a straight + # interpretation of the string as character bytes. + charset, language, text = value + rawbytes = bytes(text, 'raw-unicode-escape') + try: + return str(rawbytes, charset, errors) + except LookupError: + # charset is not a known codec. + return unquote(text) + + +# +# datetime doesn't provide a localtime function yet, so provide one. Code +# adapted from the patch in issue 9527. This may not be perfect, but it is +# better than not having it. +# + +def localtime(dt=None, isdst=-1): + """Return local time as an aware datetime object. + + If called without arguments, return current time. Otherwise *dt* + argument should be a datetime instance, and it is converted to the + local time zone according to the system time zone database. If *dt* is + naive (that is, dt.tzinfo is None), it is assumed to be in local time. + In this case, a positive or zero value for *isdst* causes localtime to + presume initially that summer time (for example, Daylight Saving Time) + is or is not (respectively) in effect for the specified time. A + negative value for *isdst* causes the localtime() function to attempt + to divine whether summer time is in effect for the specified time. + + """ + if dt is None: + return datetime.datetime.now(datetime.timezone.utc).astimezone() + if dt.tzinfo is not None: + return dt.astimezone() + # We have a naive datetime. Convert to a (localtime) timetuple and pass to + # system mktime together with the isdst hint. System mktime will return + # seconds since epoch. + tm = dt.timetuple()[:-1] + (isdst,) + seconds = time.mktime(tm) + localtm = time.localtime(seconds) + try: + delta = datetime.timedelta(seconds=localtm.tm_gmtoff) + tz = datetime.timezone(delta, localtm.tm_zone) + except AttributeError: + # Compute UTC offset and compare with the value implied by tm_isdst. + # If the values match, use the zone name implied by tm_isdst. + delta = dt - datetime.datetime(*time.gmtime(seconds)[:6]) + dst = time.daylight and localtm.tm_isdst > 0 + gmtoff = -(time.altzone if dst else time.timezone) + if delta == datetime.timedelta(seconds=gmtoff): + tz = datetime.timezone(delta, time.tzname[dst]) + else: + tz = datetime.timezone(delta) + return dt.replace(tzinfo=tz) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__init__.py new file mode 100644 index 0000000..58e133f --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__init__.py @@ -0,0 +1,27 @@ +""" +General functions for HTML manipulation, backported from Py3. + +Note that this uses Python 2.7 code with the corresponding Python 3 +module names and locations. +""" + +from __future__ import unicode_literals + + +_escape_map = {ord('&'): '&', ord('<'): '<', ord('>'): '>'} +_escape_map_full = {ord('&'): '&', ord('<'): '<', ord('>'): '>', + ord('"'): '"', ord('\''): '''} + +# NB: this is a candidate for a bytes/string polymorphic interface + +def escape(s, quote=True): + """ + Replace special characters "&", "<" and ">" to HTML-safe sequences. + If the optional flag quote is true (the default), the quotation mark + characters, both double quote (") and single quote (') characters are also + translated. + """ + assert not isinstance(s, bytes), 'Pass a unicode string' + if quote: + return s.translate(_escape_map_full) + return s.translate(_escape_map) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c19a54712d9e6df2ebbdf64b43e505d73aee10a0 GIT binary patch literal 1019 zcmZuw%TC-d6t$CiK$w96QK^eAtW+9^G!F@oSb$I;s@h5|LWR{VYMIz!Qj$2>j_8b7 zb@~}ybX)b0vhAuL&<)-6I#bFlYAN@gT-ztd=Q_LXw%7jt`~4Rep&w{rcz~b4qaz3$ zjS$D&NpR|n9E^m^-5KUJ$aTmK$W6#gu{*N0|IR^u8P<4^S0K0I`l!y=`6^%gj7JUL zIYq(7^sDz$WJ0loL`4>wSZ10;Qju3@Z{LuVWpQ34%$9rPoQ0RUR7P+TDVdU!$?m}O zj-?UAjG2KDYf@;TVaAMQMs^1KB$Ql`>)4E8TELr9LgzB$advUHY}ZRAFA_mAmcnM1 zagxZe`ludwKfw(Y;IdO>u_dEPY^+{=i@Vc$m!>r$kjwOR(Gx(35!=rl;47x!E&zu(0o5taIhCksOto$4F!8NrRK81Ne;61qJ zOn-R<#ygQGEEGiNB8-@+6+{~aTtTDsVj$Iq!I{eX z`NRlau0GXTD0`w8N=a2N|6?mVROpc9f~G8|QIRC&%0eY@O03IzrTH6D9q7*Ov!O}z zVIJrGBFo_#3f{jS3z78q_O2s6xw;%ig(;L6-rZ3>9Gf&5QW|Hmp>&W>%EtVo>$c@f z5Kway*RY4x2H@iWp9RgbNhy~hrKLwfm}R6?*~?P8QgPJ=q*^xEJ(aYDV42IM!}(=C TYQUSe|8&i1xsUKeyjlALeDNyI literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__pycache__/entities.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/__pycache__/entities.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15e1fe8d81fbb79e430e976881d10437fcddb5ab GIT binary patch literal 50640 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 YEllYXATM literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/entities.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/entities.py new file mode 100644 index 0000000..5c73f69 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/entities.py @@ -0,0 +1,2514 @@ +"""HTML character entity references. + +Backported for python-future from Python 3.3 +""" + +from __future__ import (absolute_import, division, + print_function, unicode_literals) +from future.builtins import * + + +# maps the HTML entity name to the Unicode codepoint +name2codepoint = { + 'AElig': 0x00c6, # latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1 + 'Aacute': 0x00c1, # latin capital letter A with acute, U+00C1 ISOlat1 + 'Acirc': 0x00c2, # latin capital letter A with circumflex, U+00C2 ISOlat1 + 'Agrave': 0x00c0, # latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1 + 'Alpha': 0x0391, # greek capital letter alpha, U+0391 + 'Aring': 0x00c5, # latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1 + 'Atilde': 0x00c3, # latin capital letter A with tilde, U+00C3 ISOlat1 + 'Auml': 0x00c4, # latin capital letter A with diaeresis, U+00C4 ISOlat1 + 'Beta': 0x0392, # greek capital letter beta, U+0392 + 'Ccedil': 0x00c7, # latin capital letter C with cedilla, U+00C7 ISOlat1 + 'Chi': 0x03a7, # greek capital letter chi, U+03A7 + 'Dagger': 0x2021, # double dagger, U+2021 ISOpub + 'Delta': 0x0394, # greek capital letter delta, U+0394 ISOgrk3 + 'ETH': 0x00d0, # latin capital letter ETH, U+00D0 ISOlat1 + 'Eacute': 0x00c9, # latin capital letter E with acute, U+00C9 ISOlat1 + 'Ecirc': 0x00ca, # latin capital letter E with circumflex, U+00CA ISOlat1 + 'Egrave': 0x00c8, # latin capital letter E with grave, U+00C8 ISOlat1 + 'Epsilon': 0x0395, # greek capital letter epsilon, U+0395 + 'Eta': 0x0397, # greek capital letter eta, U+0397 + 'Euml': 0x00cb, # latin capital letter E with diaeresis, U+00CB ISOlat1 + 'Gamma': 0x0393, # greek capital letter gamma, U+0393 ISOgrk3 + 'Iacute': 0x00cd, # latin capital letter I with acute, U+00CD ISOlat1 + 'Icirc': 0x00ce, # latin capital letter I with circumflex, U+00CE ISOlat1 + 'Igrave': 0x00cc, # latin capital letter I with grave, U+00CC ISOlat1 + 'Iota': 0x0399, # greek capital letter iota, U+0399 + 'Iuml': 0x00cf, # latin capital letter I with diaeresis, U+00CF ISOlat1 + 'Kappa': 0x039a, # greek capital letter kappa, U+039A + 'Lambda': 0x039b, # greek capital letter lambda, U+039B ISOgrk3 + 'Mu': 0x039c, # greek capital letter mu, U+039C + 'Ntilde': 0x00d1, # latin capital letter N with tilde, U+00D1 ISOlat1 + 'Nu': 0x039d, # greek capital letter nu, U+039D + 'OElig': 0x0152, # latin capital ligature OE, U+0152 ISOlat2 + 'Oacute': 0x00d3, # latin capital letter O with acute, U+00D3 ISOlat1 + 'Ocirc': 0x00d4, # latin capital letter O with circumflex, U+00D4 ISOlat1 + 'Ograve': 0x00d2, # latin capital letter O with grave, U+00D2 ISOlat1 + 'Omega': 0x03a9, # greek capital letter omega, U+03A9 ISOgrk3 + 'Omicron': 0x039f, # greek capital letter omicron, U+039F + 'Oslash': 0x00d8, # latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1 + 'Otilde': 0x00d5, # latin capital letter O with tilde, U+00D5 ISOlat1 + 'Ouml': 0x00d6, # latin capital letter O with diaeresis, U+00D6 ISOlat1 + 'Phi': 0x03a6, # greek capital letter phi, U+03A6 ISOgrk3 + 'Pi': 0x03a0, # greek capital letter pi, U+03A0 ISOgrk3 + 'Prime': 0x2033, # double prime = seconds = inches, U+2033 ISOtech + 'Psi': 0x03a8, # greek capital letter psi, U+03A8 ISOgrk3 + 'Rho': 0x03a1, # greek capital letter rho, U+03A1 + 'Scaron': 0x0160, # latin capital letter S with caron, U+0160 ISOlat2 + 'Sigma': 0x03a3, # greek capital letter sigma, U+03A3 ISOgrk3 + 'THORN': 0x00de, # latin capital letter THORN, U+00DE ISOlat1 + 'Tau': 0x03a4, # greek capital letter tau, U+03A4 + 'Theta': 0x0398, # greek capital letter theta, U+0398 ISOgrk3 + 'Uacute': 0x00da, # latin capital letter U with acute, U+00DA ISOlat1 + 'Ucirc': 0x00db, # latin capital letter U with circumflex, U+00DB ISOlat1 + 'Ugrave': 0x00d9, # latin capital letter U with grave, U+00D9 ISOlat1 + 'Upsilon': 0x03a5, # greek capital letter upsilon, U+03A5 ISOgrk3 + 'Uuml': 0x00dc, # latin capital letter U with diaeresis, U+00DC ISOlat1 + 'Xi': 0x039e, # greek capital letter xi, U+039E ISOgrk3 + 'Yacute': 0x00dd, # latin capital letter Y with acute, U+00DD ISOlat1 + 'Yuml': 0x0178, # latin capital letter Y with diaeresis, U+0178 ISOlat2 + 'Zeta': 0x0396, # greek capital letter zeta, U+0396 + 'aacute': 0x00e1, # latin small letter a with acute, U+00E1 ISOlat1 + 'acirc': 0x00e2, # latin small letter a with circumflex, U+00E2 ISOlat1 + 'acute': 0x00b4, # acute accent = spacing acute, U+00B4 ISOdia + 'aelig': 0x00e6, # latin small letter ae = latin small ligature ae, U+00E6 ISOlat1 + 'agrave': 0x00e0, # latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1 + 'alefsym': 0x2135, # alef symbol = first transfinite cardinal, U+2135 NEW + 'alpha': 0x03b1, # greek small letter alpha, U+03B1 ISOgrk3 + 'amp': 0x0026, # ampersand, U+0026 ISOnum + 'and': 0x2227, # logical and = wedge, U+2227 ISOtech + 'ang': 0x2220, # angle, U+2220 ISOamso + 'aring': 0x00e5, # latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1 + 'asymp': 0x2248, # almost equal to = asymptotic to, U+2248 ISOamsr + 'atilde': 0x00e3, # latin small letter a with tilde, U+00E3 ISOlat1 + 'auml': 0x00e4, # latin small letter a with diaeresis, U+00E4 ISOlat1 + 'bdquo': 0x201e, # double low-9 quotation mark, U+201E NEW + 'beta': 0x03b2, # greek small letter beta, U+03B2 ISOgrk3 + 'brvbar': 0x00a6, # broken bar = broken vertical bar, U+00A6 ISOnum + 'bull': 0x2022, # bullet = black small circle, U+2022 ISOpub + 'cap': 0x2229, # intersection = cap, U+2229 ISOtech + 'ccedil': 0x00e7, # latin small letter c with cedilla, U+00E7 ISOlat1 + 'cedil': 0x00b8, # cedilla = spacing cedilla, U+00B8 ISOdia + 'cent': 0x00a2, # cent sign, U+00A2 ISOnum + 'chi': 0x03c7, # greek small letter chi, U+03C7 ISOgrk3 + 'circ': 0x02c6, # modifier letter circumflex accent, U+02C6 ISOpub + 'clubs': 0x2663, # black club suit = shamrock, U+2663 ISOpub + 'cong': 0x2245, # approximately equal to, U+2245 ISOtech + 'copy': 0x00a9, # copyright sign, U+00A9 ISOnum + 'crarr': 0x21b5, # downwards arrow with corner leftwards = carriage return, U+21B5 NEW + 'cup': 0x222a, # union = cup, U+222A ISOtech + 'curren': 0x00a4, # currency sign, U+00A4 ISOnum + 'dArr': 0x21d3, # downwards double arrow, U+21D3 ISOamsa + 'dagger': 0x2020, # dagger, U+2020 ISOpub + 'darr': 0x2193, # downwards arrow, U+2193 ISOnum + 'deg': 0x00b0, # degree sign, U+00B0 ISOnum + 'delta': 0x03b4, # greek small letter delta, U+03B4 ISOgrk3 + 'diams': 0x2666, # black diamond suit, U+2666 ISOpub + 'divide': 0x00f7, # division sign, U+00F7 ISOnum + 'eacute': 0x00e9, # latin small letter e with acute, U+00E9 ISOlat1 + 'ecirc': 0x00ea, # latin small letter e with circumflex, U+00EA ISOlat1 + 'egrave': 0x00e8, # latin small letter e with grave, U+00E8 ISOlat1 + 'empty': 0x2205, # empty set = null set = diameter, U+2205 ISOamso + 'emsp': 0x2003, # em space, U+2003 ISOpub + 'ensp': 0x2002, # en space, U+2002 ISOpub + 'epsilon': 0x03b5, # greek small letter epsilon, U+03B5 ISOgrk3 + 'equiv': 0x2261, # identical to, U+2261 ISOtech + 'eta': 0x03b7, # greek small letter eta, U+03B7 ISOgrk3 + 'eth': 0x00f0, # latin small letter eth, U+00F0 ISOlat1 + 'euml': 0x00eb, # latin small letter e with diaeresis, U+00EB ISOlat1 + 'euro': 0x20ac, # euro sign, U+20AC NEW + 'exist': 0x2203, # there exists, U+2203 ISOtech + 'fnof': 0x0192, # latin small f with hook = function = florin, U+0192 ISOtech + 'forall': 0x2200, # for all, U+2200 ISOtech + 'frac12': 0x00bd, # vulgar fraction one half = fraction one half, U+00BD ISOnum + 'frac14': 0x00bc, # vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum + 'frac34': 0x00be, # vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum + 'frasl': 0x2044, # fraction slash, U+2044 NEW + 'gamma': 0x03b3, # greek small letter gamma, U+03B3 ISOgrk3 + 'ge': 0x2265, # greater-than or equal to, U+2265 ISOtech + 'gt': 0x003e, # greater-than sign, U+003E ISOnum + 'hArr': 0x21d4, # left right double arrow, U+21D4 ISOamsa + 'harr': 0x2194, # left right arrow, U+2194 ISOamsa + 'hearts': 0x2665, # black heart suit = valentine, U+2665 ISOpub + 'hellip': 0x2026, # horizontal ellipsis = three dot leader, U+2026 ISOpub + 'iacute': 0x00ed, # latin small letter i with acute, U+00ED ISOlat1 + 'icirc': 0x00ee, # latin small letter i with circumflex, U+00EE ISOlat1 + 'iexcl': 0x00a1, # inverted exclamation mark, U+00A1 ISOnum + 'igrave': 0x00ec, # latin small letter i with grave, U+00EC ISOlat1 + 'image': 0x2111, # blackletter capital I = imaginary part, U+2111 ISOamso + 'infin': 0x221e, # infinity, U+221E ISOtech + 'int': 0x222b, # integral, U+222B ISOtech + 'iota': 0x03b9, # greek small letter iota, U+03B9 ISOgrk3 + 'iquest': 0x00bf, # inverted question mark = turned question mark, U+00BF ISOnum + 'isin': 0x2208, # element of, U+2208 ISOtech + 'iuml': 0x00ef, # latin small letter i with diaeresis, U+00EF ISOlat1 + 'kappa': 0x03ba, # greek small letter kappa, U+03BA ISOgrk3 + 'lArr': 0x21d0, # leftwards double arrow, U+21D0 ISOtech + 'lambda': 0x03bb, # greek small letter lambda, U+03BB ISOgrk3 + 'lang': 0x2329, # left-pointing angle bracket = bra, U+2329 ISOtech + 'laquo': 0x00ab, # left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum + 'larr': 0x2190, # leftwards arrow, U+2190 ISOnum + 'lceil': 0x2308, # left ceiling = apl upstile, U+2308 ISOamsc + 'ldquo': 0x201c, # left double quotation mark, U+201C ISOnum + 'le': 0x2264, # less-than or equal to, U+2264 ISOtech + 'lfloor': 0x230a, # left floor = apl downstile, U+230A ISOamsc + 'lowast': 0x2217, # asterisk operator, U+2217 ISOtech + 'loz': 0x25ca, # lozenge, U+25CA ISOpub + 'lrm': 0x200e, # left-to-right mark, U+200E NEW RFC 2070 + 'lsaquo': 0x2039, # single left-pointing angle quotation mark, U+2039 ISO proposed + 'lsquo': 0x2018, # left single quotation mark, U+2018 ISOnum + 'lt': 0x003c, # less-than sign, U+003C ISOnum + 'macr': 0x00af, # macron = spacing macron = overline = APL overbar, U+00AF ISOdia + 'mdash': 0x2014, # em dash, U+2014 ISOpub + 'micro': 0x00b5, # micro sign, U+00B5 ISOnum + 'middot': 0x00b7, # middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum + 'minus': 0x2212, # minus sign, U+2212 ISOtech + 'mu': 0x03bc, # greek small letter mu, U+03BC ISOgrk3 + 'nabla': 0x2207, # nabla = backward difference, U+2207 ISOtech + 'nbsp': 0x00a0, # no-break space = non-breaking space, U+00A0 ISOnum + 'ndash': 0x2013, # en dash, U+2013 ISOpub + 'ne': 0x2260, # not equal to, U+2260 ISOtech + 'ni': 0x220b, # contains as member, U+220B ISOtech + 'not': 0x00ac, # not sign, U+00AC ISOnum + 'notin': 0x2209, # not an element of, U+2209 ISOtech + 'nsub': 0x2284, # not a subset of, U+2284 ISOamsn + 'ntilde': 0x00f1, # latin small letter n with tilde, U+00F1 ISOlat1 + 'nu': 0x03bd, # greek small letter nu, U+03BD ISOgrk3 + 'oacute': 0x00f3, # latin small letter o with acute, U+00F3 ISOlat1 + 'ocirc': 0x00f4, # latin small letter o with circumflex, U+00F4 ISOlat1 + 'oelig': 0x0153, # latin small ligature oe, U+0153 ISOlat2 + 'ograve': 0x00f2, # latin small letter o with grave, U+00F2 ISOlat1 + 'oline': 0x203e, # overline = spacing overscore, U+203E NEW + 'omega': 0x03c9, # greek small letter omega, U+03C9 ISOgrk3 + 'omicron': 0x03bf, # greek small letter omicron, U+03BF NEW + 'oplus': 0x2295, # circled plus = direct sum, U+2295 ISOamsb + 'or': 0x2228, # logical or = vee, U+2228 ISOtech + 'ordf': 0x00aa, # feminine ordinal indicator, U+00AA ISOnum + 'ordm': 0x00ba, # masculine ordinal indicator, U+00BA ISOnum + 'oslash': 0x00f8, # latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1 + 'otilde': 0x00f5, # latin small letter o with tilde, U+00F5 ISOlat1 + 'otimes': 0x2297, # circled times = vector product, U+2297 ISOamsb + 'ouml': 0x00f6, # latin small letter o with diaeresis, U+00F6 ISOlat1 + 'para': 0x00b6, # pilcrow sign = paragraph sign, U+00B6 ISOnum + 'part': 0x2202, # partial differential, U+2202 ISOtech + 'permil': 0x2030, # per mille sign, U+2030 ISOtech + 'perp': 0x22a5, # up tack = orthogonal to = perpendicular, U+22A5 ISOtech + 'phi': 0x03c6, # greek small letter phi, U+03C6 ISOgrk3 + 'pi': 0x03c0, # greek small letter pi, U+03C0 ISOgrk3 + 'piv': 0x03d6, # greek pi symbol, U+03D6 ISOgrk3 + 'plusmn': 0x00b1, # plus-minus sign = plus-or-minus sign, U+00B1 ISOnum + 'pound': 0x00a3, # pound sign, U+00A3 ISOnum + 'prime': 0x2032, # prime = minutes = feet, U+2032 ISOtech + 'prod': 0x220f, # n-ary product = product sign, U+220F ISOamsb + 'prop': 0x221d, # proportional to, U+221D ISOtech + 'psi': 0x03c8, # greek small letter psi, U+03C8 ISOgrk3 + 'quot': 0x0022, # quotation mark = APL quote, U+0022 ISOnum + 'rArr': 0x21d2, # rightwards double arrow, U+21D2 ISOtech + 'radic': 0x221a, # square root = radical sign, U+221A ISOtech + 'rang': 0x232a, # right-pointing angle bracket = ket, U+232A ISOtech + 'raquo': 0x00bb, # right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum + 'rarr': 0x2192, # rightwards arrow, U+2192 ISOnum + 'rceil': 0x2309, # right ceiling, U+2309 ISOamsc + 'rdquo': 0x201d, # right double quotation mark, U+201D ISOnum + 'real': 0x211c, # blackletter capital R = real part symbol, U+211C ISOamso + 'reg': 0x00ae, # registered sign = registered trade mark sign, U+00AE ISOnum + 'rfloor': 0x230b, # right floor, U+230B ISOamsc + 'rho': 0x03c1, # greek small letter rho, U+03C1 ISOgrk3 + 'rlm': 0x200f, # right-to-left mark, U+200F NEW RFC 2070 + 'rsaquo': 0x203a, # single right-pointing angle quotation mark, U+203A ISO proposed + 'rsquo': 0x2019, # right single quotation mark, U+2019 ISOnum + 'sbquo': 0x201a, # single low-9 quotation mark, U+201A NEW + 'scaron': 0x0161, # latin small letter s with caron, U+0161 ISOlat2 + 'sdot': 0x22c5, # dot operator, U+22C5 ISOamsb + 'sect': 0x00a7, # section sign, U+00A7 ISOnum + 'shy': 0x00ad, # soft hyphen = discretionary hyphen, U+00AD ISOnum + 'sigma': 0x03c3, # greek small letter sigma, U+03C3 ISOgrk3 + 'sigmaf': 0x03c2, # greek small letter final sigma, U+03C2 ISOgrk3 + 'sim': 0x223c, # tilde operator = varies with = similar to, U+223C ISOtech + 'spades': 0x2660, # black spade suit, U+2660 ISOpub + 'sub': 0x2282, # subset of, U+2282 ISOtech + 'sube': 0x2286, # subset of or equal to, U+2286 ISOtech + 'sum': 0x2211, # n-ary sumation, U+2211 ISOamsb + 'sup': 0x2283, # superset of, U+2283 ISOtech + 'sup1': 0x00b9, # superscript one = superscript digit one, U+00B9 ISOnum + 'sup2': 0x00b2, # superscript two = superscript digit two = squared, U+00B2 ISOnum + 'sup3': 0x00b3, # superscript three = superscript digit three = cubed, U+00B3 ISOnum + 'supe': 0x2287, # superset of or equal to, U+2287 ISOtech + 'szlig': 0x00df, # latin small letter sharp s = ess-zed, U+00DF ISOlat1 + 'tau': 0x03c4, # greek small letter tau, U+03C4 ISOgrk3 + 'there4': 0x2234, # therefore, U+2234 ISOtech + 'theta': 0x03b8, # greek small letter theta, U+03B8 ISOgrk3 + 'thetasym': 0x03d1, # greek small letter theta symbol, U+03D1 NEW + 'thinsp': 0x2009, # thin space, U+2009 ISOpub + 'thorn': 0x00fe, # latin small letter thorn with, U+00FE ISOlat1 + 'tilde': 0x02dc, # small tilde, U+02DC ISOdia + 'times': 0x00d7, # multiplication sign, U+00D7 ISOnum + 'trade': 0x2122, # trade mark sign, U+2122 ISOnum + 'uArr': 0x21d1, # upwards double arrow, U+21D1 ISOamsa + 'uacute': 0x00fa, # latin small letter u with acute, U+00FA ISOlat1 + 'uarr': 0x2191, # upwards arrow, U+2191 ISOnum + 'ucirc': 0x00fb, # latin small letter u with circumflex, U+00FB ISOlat1 + 'ugrave': 0x00f9, # latin small letter u with grave, U+00F9 ISOlat1 + 'uml': 0x00a8, # diaeresis = spacing diaeresis, U+00A8 ISOdia + 'upsih': 0x03d2, # greek upsilon with hook symbol, U+03D2 NEW + 'upsilon': 0x03c5, # greek small letter upsilon, U+03C5 ISOgrk3 + 'uuml': 0x00fc, # latin small letter u with diaeresis, U+00FC ISOlat1 + 'weierp': 0x2118, # script capital P = power set = Weierstrass p, U+2118 ISOamso + 'xi': 0x03be, # greek small letter xi, U+03BE ISOgrk3 + 'yacute': 0x00fd, # latin small letter y with acute, U+00FD ISOlat1 + 'yen': 0x00a5, # yen sign = yuan sign, U+00A5 ISOnum + 'yuml': 0x00ff, # latin small letter y with diaeresis, U+00FF ISOlat1 + 'zeta': 0x03b6, # greek small letter zeta, U+03B6 ISOgrk3 + 'zwj': 0x200d, # zero width joiner, U+200D NEW RFC 2070 + 'zwnj': 0x200c, # zero width non-joiner, U+200C NEW RFC 2070 +} + + +# maps the HTML5 named character references to the equivalent Unicode character(s) +html5 = { + 'Aacute': '\xc1', + 'aacute': '\xe1', + 'Aacute;': '\xc1', + 'aacute;': '\xe1', + 'Abreve;': '\u0102', + 'abreve;': '\u0103', + 'ac;': '\u223e', + 'acd;': '\u223f', + 'acE;': '\u223e\u0333', + 'Acirc': '\xc2', + 'acirc': '\xe2', + 'Acirc;': '\xc2', + 'acirc;': '\xe2', + 'acute': '\xb4', + 'acute;': '\xb4', + 'Acy;': '\u0410', + 'acy;': '\u0430', + 'AElig': '\xc6', + 'aelig': '\xe6', + 'AElig;': '\xc6', + 'aelig;': '\xe6', + 'af;': '\u2061', + 'Afr;': '\U0001d504', + 'afr;': '\U0001d51e', + 'Agrave': '\xc0', + 'agrave': '\xe0', + 'Agrave;': '\xc0', + 'agrave;': '\xe0', + 'alefsym;': '\u2135', + 'aleph;': '\u2135', + 'Alpha;': '\u0391', + 'alpha;': '\u03b1', + 'Amacr;': '\u0100', + 'amacr;': '\u0101', + 'amalg;': '\u2a3f', + 'AMP': '&', + 'amp': '&', + 'AMP;': '&', + 'amp;': '&', + 'And;': '\u2a53', + '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;': '\u0104', + 'aogon;': '\u0105', + 'Aopf;': '\U0001d538', + 'aopf;': '\U0001d552', + 'ap;': '\u2248', + 'apacir;': '\u2a6f', + 'apE;': '\u2a70', + 'ape;': '\u224a', + 'apid;': '\u224b', + 'apos;': "'", + 'ApplyFunction;': '\u2061', + 'approx;': '\u2248', + 'approxeq;': '\u224a', + 'Aring': '\xc5', + 'aring': '\xe5', + 'Aring;': '\xc5', + 'aring;': '\xe5', + 'Ascr;': '\U0001d49c', + 'ascr;': '\U0001d4b6', + 'Assign;': '\u2254', + 'ast;': '*', + 'asymp;': '\u2248', + 'asympeq;': '\u224d', + 'Atilde': '\xc3', + 'atilde': '\xe3', + 'Atilde;': '\xc3', + 'atilde;': '\xe3', + 'Auml': '\xc4', + 'auml': '\xe4', + 'Auml;': '\xc4', + 'auml;': '\xe4', + 'awconint;': '\u2233', + 'awint;': '\u2a11', + 'backcong;': '\u224c', + 'backepsilon;': '\u03f6', + 'backprime;': '\u2035', + 'backsim;': '\u223d', + 'backsimeq;': '\u22cd', + 'Backslash;': '\u2216', + 'Barv;': '\u2ae7', + 'barvee;': '\u22bd', + 'Barwed;': '\u2306', + 'barwed;': '\u2305', + 'barwedge;': '\u2305', + 'bbrk;': '\u23b5', + 'bbrktbrk;': '\u23b6', + 'bcong;': '\u224c', + 'Bcy;': '\u0411', + 'bcy;': '\u0431', + 'bdquo;': '\u201e', + 'becaus;': '\u2235', + 'Because;': '\u2235', + 'because;': '\u2235', + 'bemptyv;': '\u29b0', + 'bepsi;': '\u03f6', + 'bernou;': '\u212c', + 'Bernoullis;': '\u212c', + 'Beta;': '\u0392', + 'beta;': '\u03b2', + 'beth;': '\u2136', + 'between;': '\u226c', + 'Bfr;': '\U0001d505', + '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;': '\u2aed', + 'bnot;': '\u2310', + 'Bopf;': '\U0001d539', + 'bopf;': '\U0001d553', + 'bot;': '\u22a5', + 'bottom;': '\u22a5', + 'bowtie;': '\u22c8', + 'boxbox;': '\u29c9', + 'boxDL;': '\u2557', + 'boxDl;': '\u2556', + 'boxdL;': '\u2555', + 'boxdl;': '\u2510', + 'boxDR;': '\u2554', + 'boxDr;': '\u2553', + 'boxdR;': '\u2552', + 'boxdr;': '\u250c', + 'boxH;': '\u2550', + 'boxh;': '\u2500', + 'boxHD;': '\u2566', + 'boxHd;': '\u2564', + 'boxhD;': '\u2565', + 'boxhd;': '\u252c', + 'boxHU;': '\u2569', + 'boxHu;': '\u2567', + 'boxhU;': '\u2568', + 'boxhu;': '\u2534', + 'boxminus;': '\u229f', + 'boxplus;': '\u229e', + 'boxtimes;': '\u22a0', + 'boxUL;': '\u255d', + 'boxUl;': '\u255c', + 'boxuL;': '\u255b', + 'boxul;': '\u2518', + 'boxUR;': '\u255a', + 'boxUr;': '\u2559', + 'boxuR;': '\u2558', + 'boxur;': '\u2514', + 'boxV;': '\u2551', + 'boxv;': '\u2502', + 'boxVH;': '\u256c', + 'boxVh;': '\u256b', + 'boxvH;': '\u256a', + 'boxvh;': '\u253c', + 'boxVL;': '\u2563', + 'boxVl;': '\u2562', + 'boxvL;': '\u2561', + 'boxvl;': '\u2524', + 'boxVR;': '\u2560', + 'boxVr;': '\u255f', + 'boxvR;': '\u255e', + 'boxvr;': '\u251c', + 'bprime;': '\u2035', + 'Breve;': '\u02d8', + 'breve;': '\u02d8', + 'brvbar': '\xa6', + 'brvbar;': '\xa6', + 'Bscr;': '\u212c', + 'bscr;': '\U0001d4b7', + 'bsemi;': '\u204f', + 'bsim;': '\u223d', + 'bsime;': '\u22cd', + 'bsol;': '\\', + 'bsolb;': '\u29c5', + 'bsolhsub;': '\u27c8', + 'bull;': '\u2022', + 'bullet;': '\u2022', + 'bump;': '\u224e', + 'bumpE;': '\u2aae', + 'bumpe;': '\u224f', + 'Bumpeq;': '\u224e', + 'bumpeq;': '\u224f', + 'Cacute;': '\u0106', + 'cacute;': '\u0107', + 'Cap;': '\u22d2', + 'cap;': '\u2229', + 'capand;': '\u2a44', + 'capbrcup;': '\u2a49', + 'capcap;': '\u2a4b', + 'capcup;': '\u2a47', + 'capdot;': '\u2a40', + 'CapitalDifferentialD;': '\u2145', + 'caps;': '\u2229\ufe00', + 'caret;': '\u2041', + 'caron;': '\u02c7', + 'Cayleys;': '\u212d', + 'ccaps;': '\u2a4d', + 'Ccaron;': '\u010c', + 'ccaron;': '\u010d', + 'Ccedil': '\xc7', + 'ccedil': '\xe7', + 'Ccedil;': '\xc7', + 'ccedil;': '\xe7', + 'Ccirc;': '\u0108', + 'ccirc;': '\u0109', + 'Cconint;': '\u2230', + 'ccups;': '\u2a4c', + 'ccupssm;': '\u2a50', + 'Cdot;': '\u010a', + 'cdot;': '\u010b', + 'cedil': '\xb8', + 'cedil;': '\xb8', + 'Cedilla;': '\xb8', + 'cemptyv;': '\u29b2', + 'cent': '\xa2', + 'cent;': '\xa2', + 'CenterDot;': '\xb7', + 'centerdot;': '\xb7', + 'Cfr;': '\u212d', + 'cfr;': '\U0001d520', + 'CHcy;': '\u0427', + 'chcy;': '\u0447', + 'check;': '\u2713', + 'checkmark;': '\u2713', + 'Chi;': '\u03a7', + 'chi;': '\u03c7', + 'cir;': '\u25cb', + 'circ;': '\u02c6', + 'circeq;': '\u2257', + 'circlearrowleft;': '\u21ba', + 'circlearrowright;': '\u21bb', + 'circledast;': '\u229b', + 'circledcirc;': '\u229a', + 'circleddash;': '\u229d', + 'CircleDot;': '\u2299', + 'circledR;': '\xae', + 'circledS;': '\u24c8', + 'CircleMinus;': '\u2296', + 'CirclePlus;': '\u2295', + 'CircleTimes;': '\u2297', + 'cirE;': '\u29c3', + 'cire;': '\u2257', + 'cirfnint;': '\u2a10', + 'cirmid;': '\u2aef', + 'cirscir;': '\u29c2', + 'ClockwiseContourIntegral;': '\u2232', + 'CloseCurlyDoubleQuote;': '\u201d', + 'CloseCurlyQuote;': '\u2019', + 'clubs;': '\u2663', + 'clubsuit;': '\u2663', + 'Colon;': '\u2237', + 'colon;': ':', + 'Colone;': '\u2a74', + 'colone;': '\u2254', + 'coloneq;': '\u2254', + 'comma;': ',', + 'commat;': '@', + 'comp;': '\u2201', + 'compfn;': '\u2218', + 'complement;': '\u2201', + 'complexes;': '\u2102', + 'cong;': '\u2245', + 'congdot;': '\u2a6d', + 'Congruent;': '\u2261', + 'Conint;': '\u222f', + 'conint;': '\u222e', + 'ContourIntegral;': '\u222e', + 'Copf;': '\u2102', + 'copf;': '\U0001d554', + 'coprod;': '\u2210', + 'Coproduct;': '\u2210', + 'COPY': '\xa9', + 'copy': '\xa9', + 'COPY;': '\xa9', + 'copy;': '\xa9', + 'copysr;': '\u2117', + 'CounterClockwiseContourIntegral;': '\u2233', + 'crarr;': '\u21b5', + 'Cross;': '\u2a2f', + 'cross;': '\u2717', + 'Cscr;': '\U0001d49e', + '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;': '\u22d3', + 'cup;': '\u222a', + 'cupbrcap;': '\u2a48', + 'CupCap;': '\u224d', + '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', + 'Dagger;': '\u2021', + 'dagger;': '\u2020', + 'daleth;': '\u2138', + 'Darr;': '\u21a1', + 'dArr;': '\u21d3', + 'darr;': '\u2193', + 'dash;': '\u2010', + 'Dashv;': '\u2ae4', + 'dashv;': '\u22a3', + 'dbkarow;': '\u290f', + 'dblac;': '\u02dd', + 'Dcaron;': '\u010e', + 'dcaron;': '\u010f', + 'Dcy;': '\u0414', + 'dcy;': '\u0434', + 'DD;': '\u2145', + 'dd;': '\u2146', + 'ddagger;': '\u2021', + 'ddarr;': '\u21ca', + 'DDotrahd;': '\u2911', + 'ddotseq;': '\u2a77', + 'deg': '\xb0', + 'deg;': '\xb0', + 'Del;': '\u2207', + 'Delta;': '\u0394', + 'delta;': '\u03b4', + 'demptyv;': '\u29b1', + 'dfisht;': '\u297f', + 'Dfr;': '\U0001d507', + 'dfr;': '\U0001d521', + 'dHar;': '\u2965', + 'dharl;': '\u21c3', + 'dharr;': '\u21c2', + 'DiacriticalAcute;': '\xb4', + 'DiacriticalDot;': '\u02d9', + 'DiacriticalDoubleAcute;': '\u02dd', + 'DiacriticalGrave;': '`', + 'DiacriticalTilde;': '\u02dc', + 'diam;': '\u22c4', + 'Diamond;': '\u22c4', + 'diamond;': '\u22c4', + 'diamondsuit;': '\u2666', + 'diams;': '\u2666', + 'die;': '\xa8', + 'DifferentialD;': '\u2146', + 'digamma;': '\u03dd', + 'disin;': '\u22f2', + 'div;': '\xf7', + 'divide': '\xf7', + 'divide;': '\xf7', + 'divideontimes;': '\u22c7', + 'divonx;': '\u22c7', + 'DJcy;': '\u0402', + 'djcy;': '\u0452', + 'dlcorn;': '\u231e', + 'dlcrop;': '\u230d', + 'dollar;': '$', + 'Dopf;': '\U0001d53b', + 'dopf;': '\U0001d555', + 'Dot;': '\xa8', + 'dot;': '\u02d9', + 'DotDot;': '\u20dc', + 'doteq;': '\u2250', + 'doteqdot;': '\u2251', + 'DotEqual;': '\u2250', + 'dotminus;': '\u2238', + 'dotplus;': '\u2214', + 'dotsquare;': '\u22a1', + 'doublebarwedge;': '\u2306', + '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', + 'Downarrow;': '\u21d3', + 'downarrow;': '\u2193', + 'DownArrowBar;': '\u2913', + 'DownArrowUpArrow;': '\u21f5', + 'DownBreve;': '\u0311', + 'downdownarrows;': '\u21ca', + 'downharpoonleft;': '\u21c3', + 'downharpoonright;': '\u21c2', + 'DownLeftRightVector;': '\u2950', + 'DownLeftTeeVector;': '\u295e', + 'DownLeftVector;': '\u21bd', + 'DownLeftVectorBar;': '\u2956', + 'DownRightTeeVector;': '\u295f', + 'DownRightVector;': '\u21c1', + 'DownRightVectorBar;': '\u2957', + 'DownTee;': '\u22a4', + 'DownTeeArrow;': '\u21a7', + 'drbkarow;': '\u2910', + 'drcorn;': '\u231f', + 'drcrop;': '\u230c', + 'Dscr;': '\U0001d49f', + 'dscr;': '\U0001d4b9', + 'DScy;': '\u0405', + 'dscy;': '\u0455', + 'dsol;': '\u29f6', + 'Dstrok;': '\u0110', + 'dstrok;': '\u0111', + 'dtdot;': '\u22f1', + 'dtri;': '\u25bf', + 'dtrif;': '\u25be', + 'duarr;': '\u21f5', + 'duhar;': '\u296f', + 'dwangle;': '\u29a6', + 'DZcy;': '\u040f', + 'dzcy;': '\u045f', + 'dzigrarr;': '\u27ff', + 'Eacute': '\xc9', + 'eacute': '\xe9', + 'Eacute;': '\xc9', + 'eacute;': '\xe9', + 'easter;': '\u2a6e', + 'Ecaron;': '\u011a', + 'ecaron;': '\u011b', + 'ecir;': '\u2256', + 'Ecirc': '\xca', + 'ecirc': '\xea', + 'Ecirc;': '\xca', + 'ecirc;': '\xea', + 'ecolon;': '\u2255', + 'Ecy;': '\u042d', + 'ecy;': '\u044d', + 'eDDot;': '\u2a77', + 'Edot;': '\u0116', + 'eDot;': '\u2251', + 'edot;': '\u0117', + 'ee;': '\u2147', + 'efDot;': '\u2252', + 'Efr;': '\U0001d508', + 'efr;': '\U0001d522', + 'eg;': '\u2a9a', + 'Egrave': '\xc8', + 'egrave': '\xe8', + 'Egrave;': '\xc8', + 'egrave;': '\xe8', + 'egs;': '\u2a96', + 'egsdot;': '\u2a98', + 'el;': '\u2a99', + 'Element;': '\u2208', + 'elinters;': '\u23e7', + 'ell;': '\u2113', + 'els;': '\u2a95', + 'elsdot;': '\u2a97', + 'Emacr;': '\u0112', + 'emacr;': '\u0113', + 'empty;': '\u2205', + 'emptyset;': '\u2205', + 'EmptySmallSquare;': '\u25fb', + 'emptyv;': '\u2205', + 'EmptyVerySmallSquare;': '\u25ab', + 'emsp13;': '\u2004', + 'emsp14;': '\u2005', + 'emsp;': '\u2003', + 'ENG;': '\u014a', + 'eng;': '\u014b', + 'ensp;': '\u2002', + 'Eogon;': '\u0118', + 'eogon;': '\u0119', + 'Eopf;': '\U0001d53c', + 'eopf;': '\U0001d556', + 'epar;': '\u22d5', + 'eparsl;': '\u29e3', + 'eplus;': '\u2a71', + 'epsi;': '\u03b5', + 'Epsilon;': '\u0395', + 'epsilon;': '\u03b5', + 'epsiv;': '\u03f5', + 'eqcirc;': '\u2256', + 'eqcolon;': '\u2255', + 'eqsim;': '\u2242', + 'eqslantgtr;': '\u2a96', + 'eqslantless;': '\u2a95', + 'Equal;': '\u2a75', + 'equals;': '=', + 'EqualTilde;': '\u2242', + 'equest;': '\u225f', + 'Equilibrium;': '\u21cc', + 'equiv;': '\u2261', + 'equivDD;': '\u2a78', + 'eqvparsl;': '\u29e5', + 'erarr;': '\u2971', + 'erDot;': '\u2253', + 'Escr;': '\u2130', + 'escr;': '\u212f', + 'esdot;': '\u2250', + 'Esim;': '\u2a73', + 'esim;': '\u2242', + 'Eta;': '\u0397', + 'eta;': '\u03b7', + 'ETH': '\xd0', + 'eth': '\xf0', + 'ETH;': '\xd0', + 'eth;': '\xf0', + 'Euml': '\xcb', + 'euml': '\xeb', + 'Euml;': '\xcb', + 'euml;': '\xeb', + 'euro;': '\u20ac', + 'excl;': '!', + 'exist;': '\u2203', + 'Exists;': '\u2203', + 'expectation;': '\u2130', + 'ExponentialE;': '\u2147', + 'exponentiale;': '\u2147', + 'fallingdotseq;': '\u2252', + 'Fcy;': '\u0424', + 'fcy;': '\u0444', + 'female;': '\u2640', + 'ffilig;': '\ufb03', + 'fflig;': '\ufb00', + 'ffllig;': '\ufb04', + 'Ffr;': '\U0001d509', + 'ffr;': '\U0001d523', + 'filig;': '\ufb01', + 'FilledSmallSquare;': '\u25fc', + 'FilledVerySmallSquare;': '\u25aa', + 'fjlig;': 'fj', + 'flat;': '\u266d', + 'fllig;': '\ufb02', + 'fltns;': '\u25b1', + 'fnof;': '\u0192', + 'Fopf;': '\U0001d53d', + 'fopf;': '\U0001d557', + 'ForAll;': '\u2200', + 'forall;': '\u2200', + 'fork;': '\u22d4', + 'forkv;': '\u2ad9', + 'Fouriertrf;': '\u2131', + '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;': '\u2131', + 'fscr;': '\U0001d4bb', + 'gacute;': '\u01f5', + 'Gamma;': '\u0393', + 'gamma;': '\u03b3', + 'Gammad;': '\u03dc', + 'gammad;': '\u03dd', + 'gap;': '\u2a86', + 'Gbreve;': '\u011e', + 'gbreve;': '\u011f', + 'Gcedil;': '\u0122', + 'Gcirc;': '\u011c', + 'gcirc;': '\u011d', + 'Gcy;': '\u0413', + 'gcy;': '\u0433', + 'Gdot;': '\u0120', + 'gdot;': '\u0121', + 'gE;': '\u2267', + 'ge;': '\u2265', + 'gEl;': '\u2a8c', + 'gel;': '\u22db', + 'geq;': '\u2265', + 'geqq;': '\u2267', + 'geqslant;': '\u2a7e', + 'ges;': '\u2a7e', + 'gescc;': '\u2aa9', + 'gesdot;': '\u2a80', + 'gesdoto;': '\u2a82', + 'gesdotol;': '\u2a84', + 'gesl;': '\u22db\ufe00', + 'gesles;': '\u2a94', + 'Gfr;': '\U0001d50a', + 'gfr;': '\U0001d524', + 'Gg;': '\u22d9', + 'gg;': '\u226b', + 'ggg;': '\u22d9', + 'gimel;': '\u2137', + 'GJcy;': '\u0403', + 'gjcy;': '\u0453', + 'gl;': '\u2277', + 'gla;': '\u2aa5', + 'glE;': '\u2a92', + 'glj;': '\u2aa4', + 'gnap;': '\u2a8a', + 'gnapprox;': '\u2a8a', + 'gnE;': '\u2269', + 'gne;': '\u2a88', + 'gneq;': '\u2a88', + 'gneqq;': '\u2269', + 'gnsim;': '\u22e7', + 'Gopf;': '\U0001d53e', + 'gopf;': '\U0001d558', + 'grave;': '`', + 'GreaterEqual;': '\u2265', + 'GreaterEqualLess;': '\u22db', + 'GreaterFullEqual;': '\u2267', + 'GreaterGreater;': '\u2aa2', + 'GreaterLess;': '\u2277', + 'GreaterSlantEqual;': '\u2a7e', + 'GreaterTilde;': '\u2273', + 'Gscr;': '\U0001d4a2', + 'gscr;': '\u210a', + 'gsim;': '\u2273', + 'gsime;': '\u2a8e', + 'gsiml;': '\u2a90', + 'GT': '>', + 'gt': '>', + 'GT;': '>', + 'Gt;': '\u226b', + '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', + 'Hacek;': '\u02c7', + 'hairsp;': '\u200a', + 'half;': '\xbd', + 'hamilt;': '\u210b', + 'HARDcy;': '\u042a', + 'hardcy;': '\u044a', + 'hArr;': '\u21d4', + 'harr;': '\u2194', + 'harrcir;': '\u2948', + 'harrw;': '\u21ad', + 'Hat;': '^', + 'hbar;': '\u210f', + 'Hcirc;': '\u0124', + 'hcirc;': '\u0125', + 'hearts;': '\u2665', + 'heartsuit;': '\u2665', + 'hellip;': '\u2026', + 'hercon;': '\u22b9', + 'Hfr;': '\u210c', + 'hfr;': '\U0001d525', + 'HilbertSpace;': '\u210b', + 'hksearow;': '\u2925', + 'hkswarow;': '\u2926', + 'hoarr;': '\u21ff', + 'homtht;': '\u223b', + 'hookleftarrow;': '\u21a9', + 'hookrightarrow;': '\u21aa', + 'Hopf;': '\u210d', + 'hopf;': '\U0001d559', + 'horbar;': '\u2015', + 'HorizontalLine;': '\u2500', + 'Hscr;': '\u210b', + 'hscr;': '\U0001d4bd', + 'hslash;': '\u210f', + 'Hstrok;': '\u0126', + 'hstrok;': '\u0127', + 'HumpDownHump;': '\u224e', + 'HumpEqual;': '\u224f', + 'hybull;': '\u2043', + 'hyphen;': '\u2010', + 'Iacute': '\xcd', + 'iacute': '\xed', + 'Iacute;': '\xcd', + 'iacute;': '\xed', + 'ic;': '\u2063', + 'Icirc': '\xce', + 'icirc': '\xee', + 'Icirc;': '\xce', + 'icirc;': '\xee', + 'Icy;': '\u0418', + 'icy;': '\u0438', + 'Idot;': '\u0130', + 'IEcy;': '\u0415', + 'iecy;': '\u0435', + 'iexcl': '\xa1', + 'iexcl;': '\xa1', + 'iff;': '\u21d4', + 'Ifr;': '\u2111', + 'ifr;': '\U0001d526', + 'Igrave': '\xcc', + 'igrave': '\xec', + 'Igrave;': '\xcc', + 'igrave;': '\xec', + 'ii;': '\u2148', + 'iiiint;': '\u2a0c', + 'iiint;': '\u222d', + 'iinfin;': '\u29dc', + 'iiota;': '\u2129', + 'IJlig;': '\u0132', + 'ijlig;': '\u0133', + 'Im;': '\u2111', + 'Imacr;': '\u012a', + 'imacr;': '\u012b', + 'image;': '\u2111', + 'ImaginaryI;': '\u2148', + 'imagline;': '\u2110', + 'imagpart;': '\u2111', + 'imath;': '\u0131', + 'imof;': '\u22b7', + 'imped;': '\u01b5', + 'Implies;': '\u21d2', + 'in;': '\u2208', + 'incare;': '\u2105', + 'infin;': '\u221e', + 'infintie;': '\u29dd', + 'inodot;': '\u0131', + 'Int;': '\u222c', + 'int;': '\u222b', + 'intcal;': '\u22ba', + 'integers;': '\u2124', + 'Integral;': '\u222b', + 'intercal;': '\u22ba', + 'Intersection;': '\u22c2', + 'intlarhk;': '\u2a17', + 'intprod;': '\u2a3c', + 'InvisibleComma;': '\u2063', + 'InvisibleTimes;': '\u2062', + 'IOcy;': '\u0401', + 'iocy;': '\u0451', + 'Iogon;': '\u012e', + 'iogon;': '\u012f', + 'Iopf;': '\U0001d540', + 'iopf;': '\U0001d55a', + 'Iota;': '\u0399', + 'iota;': '\u03b9', + 'iprod;': '\u2a3c', + 'iquest': '\xbf', + 'iquest;': '\xbf', + 'Iscr;': '\u2110', + 'iscr;': '\U0001d4be', + 'isin;': '\u2208', + 'isindot;': '\u22f5', + 'isinE;': '\u22f9', + 'isins;': '\u22f4', + 'isinsv;': '\u22f3', + 'isinv;': '\u2208', + 'it;': '\u2062', + 'Itilde;': '\u0128', + 'itilde;': '\u0129', + 'Iukcy;': '\u0406', + 'iukcy;': '\u0456', + 'Iuml': '\xcf', + 'iuml': '\xef', + 'Iuml;': '\xcf', + 'iuml;': '\xef', + 'Jcirc;': '\u0134', + 'jcirc;': '\u0135', + 'Jcy;': '\u0419', + 'jcy;': '\u0439', + 'Jfr;': '\U0001d50d', + 'jfr;': '\U0001d527', + 'jmath;': '\u0237', + 'Jopf;': '\U0001d541', + 'jopf;': '\U0001d55b', + 'Jscr;': '\U0001d4a5', + 'jscr;': '\U0001d4bf', + 'Jsercy;': '\u0408', + 'jsercy;': '\u0458', + 'Jukcy;': '\u0404', + 'jukcy;': '\u0454', + 'Kappa;': '\u039a', + 'kappa;': '\u03ba', + 'kappav;': '\u03f0', + 'Kcedil;': '\u0136', + 'kcedil;': '\u0137', + 'Kcy;': '\u041a', + 'kcy;': '\u043a', + 'Kfr;': '\U0001d50e', + 'kfr;': '\U0001d528', + 'kgreen;': '\u0138', + 'KHcy;': '\u0425', + 'khcy;': '\u0445', + 'KJcy;': '\u040c', + 'kjcy;': '\u045c', + 'Kopf;': '\U0001d542', + 'kopf;': '\U0001d55c', + 'Kscr;': '\U0001d4a6', + 'kscr;': '\U0001d4c0', + 'lAarr;': '\u21da', + 'Lacute;': '\u0139', + 'lacute;': '\u013a', + 'laemptyv;': '\u29b4', + 'lagran;': '\u2112', + 'Lambda;': '\u039b', + 'lambda;': '\u03bb', + 'Lang;': '\u27ea', + 'lang;': '\u27e8', + 'langd;': '\u2991', + 'langle;': '\u27e8', + 'lap;': '\u2a85', + 'Laplacetrf;': '\u2112', + 'laquo': '\xab', + 'laquo;': '\xab', + 'Larr;': '\u219e', + 'lArr;': '\u21d0', + 'larr;': '\u2190', + 'larrb;': '\u21e4', + 'larrbfs;': '\u291f', + 'larrfs;': '\u291d', + 'larrhk;': '\u21a9', + 'larrlp;': '\u21ab', + 'larrpl;': '\u2939', + 'larrsim;': '\u2973', + 'larrtl;': '\u21a2', + 'lat;': '\u2aab', + 'lAtail;': '\u291b', + 'latail;': '\u2919', + 'late;': '\u2aad', + 'lates;': '\u2aad\ufe00', + 'lBarr;': '\u290e', + 'lbarr;': '\u290c', + 'lbbrk;': '\u2772', + 'lbrace;': '{', + 'lbrack;': '[', + 'lbrke;': '\u298b', + 'lbrksld;': '\u298f', + 'lbrkslu;': '\u298d', + 'Lcaron;': '\u013d', + 'lcaron;': '\u013e', + 'Lcedil;': '\u013b', + 'lcedil;': '\u013c', + 'lceil;': '\u2308', + 'lcub;': '{', + 'Lcy;': '\u041b', + 'lcy;': '\u043b', + 'ldca;': '\u2936', + 'ldquo;': '\u201c', + 'ldquor;': '\u201e', + 'ldrdhar;': '\u2967', + 'ldrushar;': '\u294b', + 'ldsh;': '\u21b2', + 'lE;': '\u2266', + 'le;': '\u2264', + 'LeftAngleBracket;': '\u27e8', + 'LeftArrow;': '\u2190', + 'Leftarrow;': '\u21d0', + 'leftarrow;': '\u2190', + 'LeftArrowBar;': '\u21e4', + 'LeftArrowRightArrow;': '\u21c6', + 'leftarrowtail;': '\u21a2', + 'LeftCeiling;': '\u2308', + 'LeftDoubleBracket;': '\u27e6', + 'LeftDownTeeVector;': '\u2961', + 'LeftDownVector;': '\u21c3', + 'LeftDownVectorBar;': '\u2959', + 'LeftFloor;': '\u230a', + 'leftharpoondown;': '\u21bd', + 'leftharpoonup;': '\u21bc', + 'leftleftarrows;': '\u21c7', + 'LeftRightArrow;': '\u2194', + 'Leftrightarrow;': '\u21d4', + 'leftrightarrow;': '\u2194', + 'leftrightarrows;': '\u21c6', + 'leftrightharpoons;': '\u21cb', + 'leftrightsquigarrow;': '\u21ad', + 'LeftRightVector;': '\u294e', + 'LeftTee;': '\u22a3', + 'LeftTeeArrow;': '\u21a4', + 'LeftTeeVector;': '\u295a', + 'leftthreetimes;': '\u22cb', + 'LeftTriangle;': '\u22b2', + 'LeftTriangleBar;': '\u29cf', + 'LeftTriangleEqual;': '\u22b4', + 'LeftUpDownVector;': '\u2951', + 'LeftUpTeeVector;': '\u2960', + 'LeftUpVector;': '\u21bf', + 'LeftUpVectorBar;': '\u2958', + 'LeftVector;': '\u21bc', + 'LeftVectorBar;': '\u2952', + 'lEg;': '\u2a8b', + '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', + 'LessEqualGreater;': '\u22da', + 'LessFullEqual;': '\u2266', + 'LessGreater;': '\u2276', + 'lessgtr;': '\u2276', + 'LessLess;': '\u2aa1', + 'lesssim;': '\u2272', + 'LessSlantEqual;': '\u2a7d', + 'LessTilde;': '\u2272', + 'lfisht;': '\u297c', + 'lfloor;': '\u230a', + 'Lfr;': '\U0001d50f', + 'lfr;': '\U0001d529', + 'lg;': '\u2276', + 'lgE;': '\u2a91', + 'lHar;': '\u2962', + 'lhard;': '\u21bd', + 'lharu;': '\u21bc', + 'lharul;': '\u296a', + 'lhblk;': '\u2584', + 'LJcy;': '\u0409', + 'ljcy;': '\u0459', + 'Ll;': '\u22d8', + 'll;': '\u226a', + 'llarr;': '\u21c7', + 'llcorner;': '\u231e', + 'Lleftarrow;': '\u21da', + 'llhard;': '\u296b', + 'lltri;': '\u25fa', + 'Lmidot;': '\u013f', + 'lmidot;': '\u0140', + 'lmoust;': '\u23b0', + 'lmoustache;': '\u23b0', + 'lnap;': '\u2a89', + 'lnapprox;': '\u2a89', + 'lnE;': '\u2268', + 'lne;': '\u2a87', + 'lneq;': '\u2a87', + 'lneqq;': '\u2268', + 'lnsim;': '\u22e6', + 'loang;': '\u27ec', + 'loarr;': '\u21fd', + 'lobrk;': '\u27e6', + 'LongLeftArrow;': '\u27f5', + 'Longleftarrow;': '\u27f8', + 'longleftarrow;': '\u27f5', + 'LongLeftRightArrow;': '\u27f7', + 'Longleftrightarrow;': '\u27fa', + 'longleftrightarrow;': '\u27f7', + 'longmapsto;': '\u27fc', + 'LongRightArrow;': '\u27f6', + 'Longrightarrow;': '\u27f9', + 'longrightarrow;': '\u27f6', + 'looparrowleft;': '\u21ab', + 'looparrowright;': '\u21ac', + 'lopar;': '\u2985', + 'Lopf;': '\U0001d543', + 'lopf;': '\U0001d55d', + 'loplus;': '\u2a2d', + 'lotimes;': '\u2a34', + 'lowast;': '\u2217', + 'lowbar;': '_', + 'LowerLeftArrow;': '\u2199', + 'LowerRightArrow;': '\u2198', + 'loz;': '\u25ca', + 'lozenge;': '\u25ca', + 'lozf;': '\u29eb', + 'lpar;': '(', + 'lparlt;': '\u2993', + 'lrarr;': '\u21c6', + 'lrcorner;': '\u231f', + 'lrhar;': '\u21cb', + 'lrhard;': '\u296d', + 'lrm;': '\u200e', + 'lrtri;': '\u22bf', + 'lsaquo;': '\u2039', + 'Lscr;': '\u2112', + 'lscr;': '\U0001d4c1', + 'Lsh;': '\u21b0', + 'lsh;': '\u21b0', + 'lsim;': '\u2272', + 'lsime;': '\u2a8d', + 'lsimg;': '\u2a8f', + 'lsqb;': '[', + 'lsquo;': '\u2018', + 'lsquor;': '\u201a', + 'Lstrok;': '\u0141', + 'lstrok;': '\u0142', + 'LT': '<', + 'lt': '<', + 'LT;': '<', + 'Lt;': '\u226a', + 'lt;': '<', + 'ltcc;': '\u2aa6', + 'ltcir;': '\u2a79', + 'ltdot;': '\u22d6', + 'lthree;': '\u22cb', + 'ltimes;': '\u22c9', + 'ltlarr;': '\u2976', + 'ltquest;': '\u2a7b', + 'ltri;': '\u25c3', + 'ltrie;': '\u22b4', + 'ltrif;': '\u25c2', + 'ltrPar;': '\u2996', + 'lurdshar;': '\u294a', + 'luruhar;': '\u2966', + 'lvertneqq;': '\u2268\ufe00', + 'lvnE;': '\u2268\ufe00', + 'macr': '\xaf', + 'macr;': '\xaf', + 'male;': '\u2642', + 'malt;': '\u2720', + 'maltese;': '\u2720', + 'Map;': '\u2905', + 'map;': '\u21a6', + 'mapsto;': '\u21a6', + 'mapstodown;': '\u21a7', + 'mapstoleft;': '\u21a4', + 'mapstoup;': '\u21a5', + 'marker;': '\u25ae', + 'mcomma;': '\u2a29', + 'Mcy;': '\u041c', + 'mcy;': '\u043c', + 'mdash;': '\u2014', + 'mDDot;': '\u223a', + 'measuredangle;': '\u2221', + 'MediumSpace;': '\u205f', + 'Mellintrf;': '\u2133', + 'Mfr;': '\U0001d510', + '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', + 'MinusPlus;': '\u2213', + 'mlcp;': '\u2adb', + 'mldr;': '\u2026', + 'mnplus;': '\u2213', + 'models;': '\u22a7', + 'Mopf;': '\U0001d544', + 'mopf;': '\U0001d55e', + 'mp;': '\u2213', + 'Mscr;': '\u2133', + 'mscr;': '\U0001d4c2', + 'mstpos;': '\u223e', + 'Mu;': '\u039c', + 'mu;': '\u03bc', + 'multimap;': '\u22b8', + 'mumap;': '\u22b8', + 'nabla;': '\u2207', + 'Nacute;': '\u0143', + '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;': '\u0147', + 'ncaron;': '\u0148', + 'Ncedil;': '\u0145', + 'ncedil;': '\u0146', + 'ncong;': '\u2247', + 'ncongdot;': '\u2a6d\u0338', + 'ncup;': '\u2a42', + 'Ncy;': '\u041d', + 'ncy;': '\u043d', + 'ndash;': '\u2013', + 'ne;': '\u2260', + 'nearhk;': '\u2924', + 'neArr;': '\u21d7', + 'nearr;': '\u2197', + 'nearrow;': '\u2197', + 'nedot;': '\u2250\u0338', + 'NegativeMediumSpace;': '\u200b', + 'NegativeThickSpace;': '\u200b', + 'NegativeThinSpace;': '\u200b', + 'NegativeVeryThinSpace;': '\u200b', + 'nequiv;': '\u2262', + 'nesear;': '\u2928', + 'nesim;': '\u2242\u0338', + 'NestedGreaterGreater;': '\u226b', + 'NestedLessLess;': '\u226a', + 'NewLine;': '\n', + 'nexist;': '\u2204', + 'nexists;': '\u2204', + 'Nfr;': '\U0001d511', + 'nfr;': '\U0001d52b', + 'ngE;': '\u2267\u0338', + 'nge;': '\u2271', + 'ngeq;': '\u2271', + 'ngeqq;': '\u2267\u0338', + 'ngeqslant;': '\u2a7e\u0338', + 'nges;': '\u2a7e\u0338', + 'nGg;': '\u22d9\u0338', + 'ngsim;': '\u2275', + 'nGt;': '\u226b\u20d2', + 'ngt;': '\u226f', + 'ngtr;': '\u226f', + 'nGtv;': '\u226b\u0338', + 'nhArr;': '\u21ce', + 'nharr;': '\u21ae', + 'nhpar;': '\u2af2', + 'ni;': '\u220b', + 'nis;': '\u22fc', + 'nisd;': '\u22fa', + 'niv;': '\u220b', + 'NJcy;': '\u040a', + 'njcy;': '\u045a', + 'nlArr;': '\u21cd', + 'nlarr;': '\u219a', + 'nldr;': '\u2025', + 'nlE;': '\u2266\u0338', + 'nle;': '\u2270', + 'nLeftarrow;': '\u21cd', + 'nleftarrow;': '\u219a', + 'nLeftrightarrow;': '\u21ce', + 'nleftrightarrow;': '\u21ae', + 'nleq;': '\u2270', + 'nleqq;': '\u2266\u0338', + 'nleqslant;': '\u2a7d\u0338', + 'nles;': '\u2a7d\u0338', + 'nless;': '\u226e', + 'nLl;': '\u22d8\u0338', + 'nlsim;': '\u2274', + 'nLt;': '\u226a\u20d2', + 'nlt;': '\u226e', + 'nltri;': '\u22ea', + 'nltrie;': '\u22ec', + 'nLtv;': '\u226a\u0338', + 'nmid;': '\u2224', + 'NoBreak;': '\u2060', + 'NonBreakingSpace;': '\xa0', + 'Nopf;': '\u2115', + 'nopf;': '\U0001d55f', + 'not': '\xac', + 'Not;': '\u2aec', + 'not;': '\xac', + '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', + 'notin;': '\u2209', + 'notindot;': '\u22f5\u0338', + 'notinE;': '\u22f9\u0338', + 'notinva;': '\u2209', + 'notinvb;': '\u22f7', + 'notinvc;': '\u22f6', + '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', + 'notni;': '\u220c', + 'notniva;': '\u220c', + 'notnivb;': '\u22fe', + 'notnivc;': '\u22fd', + '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', + '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;': '\u21cf', + 'nrightarrow;': '\u219b', + 'nrtri;': '\u22eb', + 'nrtrie;': '\u22ed', + 'nsc;': '\u2281', + 'nsccue;': '\u22e1', + 'nsce;': '\u2ab0\u0338', + 'Nscr;': '\U0001d4a9', + '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': '\xd1', + 'ntilde': '\xf1', + 'Ntilde;': '\xd1', + 'ntilde;': '\xf1', + 'ntlg;': '\u2278', + 'ntriangleleft;': '\u22ea', + 'ntrianglelefteq;': '\u22ec', + 'ntriangleright;': '\u22eb', + 'ntrianglerighteq;': '\u22ed', + 'Nu;': '\u039d', + 'nu;': '\u03bd', + 'num;': '#', + 'numero;': '\u2116', + 'numsp;': '\u2007', + 'nvap;': '\u224d\u20d2', + 'nVDash;': '\u22af', + 'nVdash;': '\u22ae', + 'nvDash;': '\u22ad', + 'nvdash;': '\u22ac', + 'nvge;': '\u2265\u20d2', + 'nvgt;': '>\u20d2', + 'nvHarr;': '\u2904', + 'nvinfin;': '\u29de', + 'nvlArr;': '\u2902', + 'nvle;': '\u2264\u20d2', + 'nvlt;': '<\u20d2', + 'nvltrie;': '\u22b4\u20d2', + 'nvrArr;': '\u2903', + 'nvrtrie;': '\u22b5\u20d2', + 'nvsim;': '\u223c\u20d2', + 'nwarhk;': '\u2923', + 'nwArr;': '\u21d6', + 'nwarr;': '\u2196', + 'nwarrow;': '\u2196', + 'nwnear;': '\u2927', + 'Oacute': '\xd3', + 'oacute': '\xf3', + 'Oacute;': '\xd3', + 'oacute;': '\xf3', + 'oast;': '\u229b', + 'ocir;': '\u229a', + 'Ocirc': '\xd4', + 'ocirc': '\xf4', + 'Ocirc;': '\xd4', + 'ocirc;': '\xf4', + 'Ocy;': '\u041e', + 'ocy;': '\u043e', + 'odash;': '\u229d', + 'Odblac;': '\u0150', + 'odblac;': '\u0151', + 'odiv;': '\u2a38', + 'odot;': '\u2299', + 'odsold;': '\u29bc', + 'OElig;': '\u0152', + 'oelig;': '\u0153', + 'ofcir;': '\u29bf', + 'Ofr;': '\U0001d512', + 'ofr;': '\U0001d52c', + 'ogon;': '\u02db', + 'Ograve': '\xd2', + 'ograve': '\xf2', + 'Ograve;': '\xd2', + 'ograve;': '\xf2', + 'ogt;': '\u29c1', + 'ohbar;': '\u29b5', + 'ohm;': '\u03a9', + 'oint;': '\u222e', + 'olarr;': '\u21ba', + 'olcir;': '\u29be', + 'olcross;': '\u29bb', + 'oline;': '\u203e', + 'olt;': '\u29c0', + 'Omacr;': '\u014c', + 'omacr;': '\u014d', + 'Omega;': '\u03a9', + 'omega;': '\u03c9', + 'Omicron;': '\u039f', + 'omicron;': '\u03bf', + 'omid;': '\u29b6', + 'ominus;': '\u2296', + 'Oopf;': '\U0001d546', + 'oopf;': '\U0001d560', + 'opar;': '\u29b7', + 'OpenCurlyDoubleQuote;': '\u201c', + 'OpenCurlyQuote;': '\u2018', + 'operp;': '\u29b9', + 'oplus;': '\u2295', + 'Or;': '\u2a54', + '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', + 'oS;': '\u24c8', + 'Oscr;': '\U0001d4aa', + 'oscr;': '\u2134', + 'Oslash': '\xd8', + 'oslash': '\xf8', + 'Oslash;': '\xd8', + 'oslash;': '\xf8', + 'osol;': '\u2298', + 'Otilde': '\xd5', + 'otilde': '\xf5', + 'Otilde;': '\xd5', + 'otilde;': '\xf5', + 'Otimes;': '\u2a37', + 'otimes;': '\u2297', + 'otimesas;': '\u2a36', + 'Ouml': '\xd6', + 'ouml': '\xf6', + 'Ouml;': '\xd6', + 'ouml;': '\xf6', + 'ovbar;': '\u233d', + 'OverBar;': '\u203e', + 'OverBrace;': '\u23de', + 'OverBracket;': '\u23b4', + 'OverParenthesis;': '\u23dc', + 'par;': '\u2225', + 'para': '\xb6', + 'para;': '\xb6', + 'parallel;': '\u2225', + 'parsim;': '\u2af3', + 'parsl;': '\u2afd', + 'part;': '\u2202', + 'PartialD;': '\u2202', + 'Pcy;': '\u041f', + 'pcy;': '\u043f', + 'percnt;': '%', + 'period;': '.', + 'permil;': '\u2030', + 'perp;': '\u22a5', + 'pertenk;': '\u2031', + 'Pfr;': '\U0001d513', + 'pfr;': '\U0001d52d', + 'Phi;': '\u03a6', + 'phi;': '\u03c6', + 'phiv;': '\u03d5', + 'phmmat;': '\u2133', + 'phone;': '\u260e', + 'Pi;': '\u03a0', + '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', + 'PlusMinus;': '\xb1', + 'plusmn': '\xb1', + 'plusmn;': '\xb1', + 'plussim;': '\u2a26', + 'plustwo;': '\u2a27', + 'pm;': '\xb1', + 'Poincareplane;': '\u210c', + 'pointint;': '\u2a15', + 'Popf;': '\u2119', + 'popf;': '\U0001d561', + 'pound': '\xa3', + 'pound;': '\xa3', + 'Pr;': '\u2abb', + 'pr;': '\u227a', + 'prap;': '\u2ab7', + 'prcue;': '\u227c', + 'prE;': '\u2ab3', + 'pre;': '\u2aaf', + 'prec;': '\u227a', + 'precapprox;': '\u2ab7', + 'preccurlyeq;': '\u227c', + 'Precedes;': '\u227a', + 'PrecedesEqual;': '\u2aaf', + 'PrecedesSlantEqual;': '\u227c', + 'PrecedesTilde;': '\u227e', + 'preceq;': '\u2aaf', + 'precnapprox;': '\u2ab9', + 'precneqq;': '\u2ab5', + 'precnsim;': '\u22e8', + 'precsim;': '\u227e', + 'Prime;': '\u2033', + 'prime;': '\u2032', + 'primes;': '\u2119', + 'prnap;': '\u2ab9', + 'prnE;': '\u2ab5', + 'prnsim;': '\u22e8', + 'prod;': '\u220f', + 'Product;': '\u220f', + 'profalar;': '\u232e', + 'profline;': '\u2312', + 'profsurf;': '\u2313', + 'prop;': '\u221d', + 'Proportion;': '\u2237', + 'Proportional;': '\u221d', + 'propto;': '\u221d', + 'prsim;': '\u227e', + 'prurel;': '\u22b0', + 'Pscr;': '\U0001d4ab', + 'pscr;': '\U0001d4c5', + 'Psi;': '\u03a8', + 'psi;': '\u03c8', + 'puncsp;': '\u2008', + 'Qfr;': '\U0001d514', + 'qfr;': '\U0001d52e', + 'qint;': '\u2a0c', + 'Qopf;': '\u211a', + 'qopf;': '\U0001d562', + 'qprime;': '\u2057', + 'Qscr;': '\U0001d4ac', + 'qscr;': '\U0001d4c6', + 'quaternions;': '\u210d', + 'quatint;': '\u2a16', + 'quest;': '?', + 'questeq;': '\u225f', + 'QUOT': '"', + 'quot': '"', + 'QUOT;': '"', + 'quot;': '"', + 'rAarr;': '\u21db', + 'race;': '\u223d\u0331', + 'Racute;': '\u0154', + 'racute;': '\u0155', + 'radic;': '\u221a', + 'raemptyv;': '\u29b3', + 'Rang;': '\u27eb', + 'rang;': '\u27e9', + 'rangd;': '\u2992', + 'range;': '\u29a5', + 'rangle;': '\u27e9', + 'raquo': '\xbb', + 'raquo;': '\xbb', + 'Rarr;': '\u21a0', + 'rArr;': '\u21d2', + 'rarr;': '\u2192', + 'rarrap;': '\u2975', + 'rarrb;': '\u21e5', + 'rarrbfs;': '\u2920', + 'rarrc;': '\u2933', + 'rarrfs;': '\u291e', + 'rarrhk;': '\u21aa', + 'rarrlp;': '\u21ac', + 'rarrpl;': '\u2945', + 'rarrsim;': '\u2974', + 'Rarrtl;': '\u2916', + 'rarrtl;': '\u21a3', + 'rarrw;': '\u219d', + 'rAtail;': '\u291c', + 'ratail;': '\u291a', + 'ratio;': '\u2236', + 'rationals;': '\u211a', + 'RBarr;': '\u2910', + 'rBarr;': '\u290f', + 'rbarr;': '\u290d', + 'rbbrk;': '\u2773', + 'rbrace;': '}', + 'rbrack;': ']', + 'rbrke;': '\u298c', + 'rbrksld;': '\u298e', + 'rbrkslu;': '\u2990', + 'Rcaron;': '\u0158', + 'rcaron;': '\u0159', + 'Rcedil;': '\u0156', + 'rcedil;': '\u0157', + 'rceil;': '\u2309', + 'rcub;': '}', + 'Rcy;': '\u0420', + 'rcy;': '\u0440', + 'rdca;': '\u2937', + 'rdldhar;': '\u2969', + 'rdquo;': '\u201d', + 'rdquor;': '\u201d', + 'rdsh;': '\u21b3', + 'Re;': '\u211c', + 'real;': '\u211c', + 'realine;': '\u211b', + 'realpart;': '\u211c', + 'reals;': '\u211d', + 'rect;': '\u25ad', + 'REG': '\xae', + 'reg': '\xae', + 'REG;': '\xae', + 'reg;': '\xae', + 'ReverseElement;': '\u220b', + 'ReverseEquilibrium;': '\u21cb', + 'ReverseUpEquilibrium;': '\u296f', + 'rfisht;': '\u297d', + 'rfloor;': '\u230b', + 'Rfr;': '\u211c', + 'rfr;': '\U0001d52f', + 'rHar;': '\u2964', + 'rhard;': '\u21c1', + 'rharu;': '\u21c0', + 'rharul;': '\u296c', + 'Rho;': '\u03a1', + 'rho;': '\u03c1', + 'rhov;': '\u03f1', + 'RightAngleBracket;': '\u27e9', + 'RightArrow;': '\u2192', + 'Rightarrow;': '\u21d2', + 'rightarrow;': '\u2192', + 'RightArrowBar;': '\u21e5', + 'RightArrowLeftArrow;': '\u21c4', + 'rightarrowtail;': '\u21a3', + 'RightCeiling;': '\u2309', + 'RightDoubleBracket;': '\u27e7', + 'RightDownTeeVector;': '\u295d', + 'RightDownVector;': '\u21c2', + 'RightDownVectorBar;': '\u2955', + 'RightFloor;': '\u230b', + 'rightharpoondown;': '\u21c1', + 'rightharpoonup;': '\u21c0', + 'rightleftarrows;': '\u21c4', + 'rightleftharpoons;': '\u21cc', + 'rightrightarrows;': '\u21c9', + 'rightsquigarrow;': '\u219d', + 'RightTee;': '\u22a2', + 'RightTeeArrow;': '\u21a6', + 'RightTeeVector;': '\u295b', + 'rightthreetimes;': '\u22cc', + 'RightTriangle;': '\u22b3', + 'RightTriangleBar;': '\u29d0', + 'RightTriangleEqual;': '\u22b5', + 'RightUpDownVector;': '\u294f', + 'RightUpTeeVector;': '\u295c', + 'RightUpVector;': '\u21be', + 'RightUpVectorBar;': '\u2954', + 'RightVector;': '\u21c0', + 'RightVectorBar;': '\u2953', + '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;': '\u211d', + 'ropf;': '\U0001d563', + 'roplus;': '\u2a2e', + 'rotimes;': '\u2a35', + 'RoundImplies;': '\u2970', + 'rpar;': ')', + 'rpargt;': '\u2994', + 'rppolint;': '\u2a12', + 'rrarr;': '\u21c9', + 'Rrightarrow;': '\u21db', + 'rsaquo;': '\u203a', + 'Rscr;': '\u211b', + 'rscr;': '\U0001d4c7', + 'Rsh;': '\u21b1', + 'rsh;': '\u21b1', + 'rsqb;': ']', + 'rsquo;': '\u2019', + 'rsquor;': '\u2019', + 'rthree;': '\u22cc', + 'rtimes;': '\u22ca', + 'rtri;': '\u25b9', + 'rtrie;': '\u22b5', + 'rtrif;': '\u25b8', + 'rtriltri;': '\u29ce', + 'RuleDelayed;': '\u29f4', + 'ruluhar;': '\u2968', + 'rx;': '\u211e', + 'Sacute;': '\u015a', + 'sacute;': '\u015b', + 'sbquo;': '\u201a', + 'Sc;': '\u2abc', + 'sc;': '\u227b', + 'scap;': '\u2ab8', + 'Scaron;': '\u0160', + 'scaron;': '\u0161', + 'sccue;': '\u227d', + 'scE;': '\u2ab4', + 'sce;': '\u2ab0', + 'Scedil;': '\u015e', + 'scedil;': '\u015f', + 'Scirc;': '\u015c', + 'scirc;': '\u015d', + 'scnap;': '\u2aba', + 'scnE;': '\u2ab6', + 'scnsim;': '\u22e9', + 'scpolint;': '\u2a13', + 'scsim;': '\u227f', + 'Scy;': '\u0421', + 'scy;': '\u0441', + 'sdot;': '\u22c5', + 'sdotb;': '\u22a1', + 'sdote;': '\u2a66', + 'searhk;': '\u2925', + 'seArr;': '\u21d8', + 'searr;': '\u2198', + 'searrow;': '\u2198', + 'sect': '\xa7', + 'sect;': '\xa7', + 'semi;': ';', + 'seswar;': '\u2929', + 'setminus;': '\u2216', + 'setmn;': '\u2216', + 'sext;': '\u2736', + 'Sfr;': '\U0001d516', + 'sfr;': '\U0001d530', + 'sfrown;': '\u2322', + 'sharp;': '\u266f', + 'SHCHcy;': '\u0429', + 'shchcy;': '\u0449', + 'SHcy;': '\u0428', + 'shcy;': '\u0448', + 'ShortDownArrow;': '\u2193', + 'ShortLeftArrow;': '\u2190', + 'shortmid;': '\u2223', + 'shortparallel;': '\u2225', + 'ShortRightArrow;': '\u2192', + 'ShortUpArrow;': '\u2191', + 'shy': '\xad', + 'shy;': '\xad', + 'Sigma;': '\u03a3', + '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', + 'SmallCircle;': '\u2218', + 'smallsetminus;': '\u2216', + 'smashp;': '\u2a33', + 'smeparsl;': '\u29e4', + 'smid;': '\u2223', + 'smile;': '\u2323', + 'smt;': '\u2aaa', + 'smte;': '\u2aac', + 'smtes;': '\u2aac\ufe00', + 'SOFTcy;': '\u042c', + 'softcy;': '\u044c', + 'sol;': '/', + 'solb;': '\u29c4', + 'solbar;': '\u233f', + 'Sopf;': '\U0001d54a', + 'sopf;': '\U0001d564', + 'spades;': '\u2660', + 'spadesuit;': '\u2660', + 'spar;': '\u2225', + 'sqcap;': '\u2293', + 'sqcaps;': '\u2293\ufe00', + 'sqcup;': '\u2294', + 'sqcups;': '\u2294\ufe00', + 'Sqrt;': '\u221a', + 'sqsub;': '\u228f', + 'sqsube;': '\u2291', + 'sqsubset;': '\u228f', + 'sqsubseteq;': '\u2291', + 'sqsup;': '\u2290', + 'sqsupe;': '\u2292', + 'sqsupset;': '\u2290', + 'sqsupseteq;': '\u2292', + 'squ;': '\u25a1', + 'Square;': '\u25a1', + 'square;': '\u25a1', + 'SquareIntersection;': '\u2293', + 'SquareSubset;': '\u228f', + 'SquareSubsetEqual;': '\u2291', + 'SquareSuperset;': '\u2290', + 'SquareSupersetEqual;': '\u2292', + 'SquareUnion;': '\u2294', + 'squarf;': '\u25aa', + 'squf;': '\u25aa', + 'srarr;': '\u2192', + 'Sscr;': '\U0001d4ae', + 'sscr;': '\U0001d4c8', + 'ssetmn;': '\u2216', + 'ssmile;': '\u2323', + 'sstarf;': '\u22c6', + 'Star;': '\u22c6', + 'star;': '\u2606', + 'starf;': '\u2605', + 'straightepsilon;': '\u03f5', + 'straightphi;': '\u03d5', + 'strns;': '\xaf', + 'Sub;': '\u22d0', + 'sub;': '\u2282', + 'subdot;': '\u2abd', + 'subE;': '\u2ac5', + 'sube;': '\u2286', + 'subedot;': '\u2ac3', + 'submult;': '\u2ac1', + 'subnE;': '\u2acb', + 'subne;': '\u228a', + 'subplus;': '\u2abf', + 'subrarr;': '\u2979', + 'Subset;': '\u22d0', + 'subset;': '\u2282', + 'subseteq;': '\u2286', + 'subseteqq;': '\u2ac5', + 'SubsetEqual;': '\u2286', + 'subsetneq;': '\u228a', + 'subsetneqq;': '\u2acb', + 'subsim;': '\u2ac7', + 'subsub;': '\u2ad5', + 'subsup;': '\u2ad3', + 'succ;': '\u227b', + 'succapprox;': '\u2ab8', + 'succcurlyeq;': '\u227d', + 'Succeeds;': '\u227b', + 'SucceedsEqual;': '\u2ab0', + 'SucceedsSlantEqual;': '\u227d', + 'SucceedsTilde;': '\u227f', + 'succeq;': '\u2ab0', + 'succnapprox;': '\u2aba', + 'succneqq;': '\u2ab6', + 'succnsim;': '\u22e9', + 'succsim;': '\u227f', + 'SuchThat;': '\u220b', + 'Sum;': '\u2211', + 'sum;': '\u2211', + 'sung;': '\u266a', + 'sup1': '\xb9', + 'sup1;': '\xb9', + 'sup2': '\xb2', + 'sup2;': '\xb2', + 'sup3': '\xb3', + 'sup3;': '\xb3', + 'Sup;': '\u22d1', + 'sup;': '\u2283', + 'supdot;': '\u2abe', + 'supdsub;': '\u2ad8', + 'supE;': '\u2ac6', + 'supe;': '\u2287', + 'supedot;': '\u2ac4', + 'Superset;': '\u2283', + 'SupersetEqual;': '\u2287', + 'suphsol;': '\u27c9', + 'suphsub;': '\u2ad7', + 'suplarr;': '\u297b', + 'supmult;': '\u2ac2', + 'supnE;': '\u2acc', + 'supne;': '\u228b', + 'supplus;': '\u2ac0', + 'Supset;': '\u22d1', + 'supset;': '\u2283', + 'supseteq;': '\u2287', + 'supseteqq;': '\u2ac6', + 'supsetneq;': '\u228b', + 'supsetneqq;': '\u2acc', + 'supsim;': '\u2ac8', + 'supsub;': '\u2ad4', + 'supsup;': '\u2ad6', + 'swarhk;': '\u2926', + 'swArr;': '\u21d9', + 'swarr;': '\u2199', + 'swarrow;': '\u2199', + 'swnwar;': '\u292a', + 'szlig': '\xdf', + 'szlig;': '\xdf', + 'Tab;': '\t', + 'target;': '\u2316', + 'Tau;': '\u03a4', + 'tau;': '\u03c4', + 'tbrk;': '\u23b4', + 'Tcaron;': '\u0164', + 'tcaron;': '\u0165', + 'Tcedil;': '\u0162', + 'tcedil;': '\u0163', + 'Tcy;': '\u0422', + 'tcy;': '\u0442', + 'tdot;': '\u20db', + 'telrec;': '\u2315', + 'Tfr;': '\U0001d517', + 'tfr;': '\U0001d531', + 'there4;': '\u2234', + 'Therefore;': '\u2234', + 'therefore;': '\u2234', + 'Theta;': '\u0398', + 'theta;': '\u03b8', + 'thetasym;': '\u03d1', + 'thetav;': '\u03d1', + 'thickapprox;': '\u2248', + 'thicksim;': '\u223c', + 'ThickSpace;': '\u205f\u200a', + 'thinsp;': '\u2009', + 'ThinSpace;': '\u2009', + 'thkap;': '\u2248', + 'thksim;': '\u223c', + 'THORN': '\xde', + 'thorn': '\xfe', + 'THORN;': '\xde', + 'thorn;': '\xfe', + 'Tilde;': '\u223c', + 'tilde;': '\u02dc', + 'TildeEqual;': '\u2243', + 'TildeFullEqual;': '\u2245', + 'TildeTilde;': '\u2248', + 'times': '\xd7', + 'times;': '\xd7', + 'timesb;': '\u22a0', + 'timesbar;': '\u2a31', + 'timesd;': '\u2a30', + 'tint;': '\u222d', + 'toea;': '\u2928', + 'top;': '\u22a4', + 'topbot;': '\u2336', + 'topcir;': '\u2af1', + 'Topf;': '\U0001d54b', + 'topf;': '\U0001d565', + 'topfork;': '\u2ada', + 'tosa;': '\u2929', + 'tprime;': '\u2034', + 'TRADE;': '\u2122', + 'trade;': '\u2122', + 'triangle;': '\u25b5', + 'triangledown;': '\u25bf', + 'triangleleft;': '\u25c3', + 'trianglelefteq;': '\u22b4', + 'triangleq;': '\u225c', + 'triangleright;': '\u25b9', + 'trianglerighteq;': '\u22b5', + 'tridot;': '\u25ec', + 'trie;': '\u225c', + 'triminus;': '\u2a3a', + 'TripleDot;': '\u20db', + 'triplus;': '\u2a39', + 'trisb;': '\u29cd', + 'tritime;': '\u2a3b', + 'trpezium;': '\u23e2', + 'Tscr;': '\U0001d4af', + 'tscr;': '\U0001d4c9', + 'TScy;': '\u0426', + 'tscy;': '\u0446', + 'TSHcy;': '\u040b', + 'tshcy;': '\u045b', + 'Tstrok;': '\u0166', + 'tstrok;': '\u0167', + 'twixt;': '\u226c', + 'twoheadleftarrow;': '\u219e', + 'twoheadrightarrow;': '\u21a0', + 'Uacute': '\xda', + 'uacute': '\xfa', + 'Uacute;': '\xda', + 'uacute;': '\xfa', + 'Uarr;': '\u219f', + 'uArr;': '\u21d1', + 'uarr;': '\u2191', + 'Uarrocir;': '\u2949', + 'Ubrcy;': '\u040e', + 'ubrcy;': '\u045e', + 'Ubreve;': '\u016c', + 'ubreve;': '\u016d', + 'Ucirc': '\xdb', + 'ucirc': '\xfb', + 'Ucirc;': '\xdb', + 'ucirc;': '\xfb', + 'Ucy;': '\u0423', + 'ucy;': '\u0443', + 'udarr;': '\u21c5', + 'Udblac;': '\u0170', + 'udblac;': '\u0171', + 'udhar;': '\u296e', + 'ufisht;': '\u297e', + 'Ufr;': '\U0001d518', + 'ufr;': '\U0001d532', + 'Ugrave': '\xd9', + 'ugrave': '\xf9', + 'Ugrave;': '\xd9', + 'ugrave;': '\xf9', + 'uHar;': '\u2963', + 'uharl;': '\u21bf', + 'uharr;': '\u21be', + 'uhblk;': '\u2580', + 'ulcorn;': '\u231c', + 'ulcorner;': '\u231c', + 'ulcrop;': '\u230f', + 'ultri;': '\u25f8', + 'Umacr;': '\u016a', + 'umacr;': '\u016b', + 'uml': '\xa8', + 'uml;': '\xa8', + 'UnderBar;': '_', + 'UnderBrace;': '\u23df', + 'UnderBracket;': '\u23b5', + 'UnderParenthesis;': '\u23dd', + 'Union;': '\u22c3', + 'UnionPlus;': '\u228e', + 'Uogon;': '\u0172', + 'uogon;': '\u0173', + 'Uopf;': '\U0001d54c', + 'uopf;': '\U0001d566', + 'UpArrow;': '\u2191', + 'Uparrow;': '\u21d1', + 'uparrow;': '\u2191', + 'UpArrowBar;': '\u2912', + 'UpArrowDownArrow;': '\u21c5', + 'UpDownArrow;': '\u2195', + 'Updownarrow;': '\u21d5', + 'updownarrow;': '\u2195', + 'UpEquilibrium;': '\u296e', + 'upharpoonleft;': '\u21bf', + 'upharpoonright;': '\u21be', + 'uplus;': '\u228e', + 'UpperLeftArrow;': '\u2196', + 'UpperRightArrow;': '\u2197', + 'Upsi;': '\u03d2', + 'upsi;': '\u03c5', + 'upsih;': '\u03d2', + 'Upsilon;': '\u03a5', + 'upsilon;': '\u03c5', + 'UpTee;': '\u22a5', + 'UpTeeArrow;': '\u21a5', + 'upuparrows;': '\u21c8', + 'urcorn;': '\u231d', + 'urcorner;': '\u231d', + 'urcrop;': '\u230e', + 'Uring;': '\u016e', + 'uring;': '\u016f', + 'urtri;': '\u25f9', + 'Uscr;': '\U0001d4b0', + 'uscr;': '\U0001d4ca', + 'utdot;': '\u22f0', + 'Utilde;': '\u0168', + 'utilde;': '\u0169', + 'utri;': '\u25b5', + 'utrif;': '\u25b4', + 'uuarr;': '\u21c8', + 'Uuml': '\xdc', + 'uuml': '\xfc', + 'Uuml;': '\xdc', + 'uuml;': '\xfc', + 'uwangle;': '\u29a7', + 'vangrt;': '\u299c', + 'varepsilon;': '\u03f5', + 'varkappa;': '\u03f0', + 'varnothing;': '\u2205', + 'varphi;': '\u03d5', + 'varpi;': '\u03d6', + 'varpropto;': '\u221d', + 'vArr;': '\u21d5', + 'varr;': '\u2195', + 'varrho;': '\u03f1', + 'varsigma;': '\u03c2', + 'varsubsetneq;': '\u228a\ufe00', + 'varsubsetneqq;': '\u2acb\ufe00', + 'varsupsetneq;': '\u228b\ufe00', + 'varsupsetneqq;': '\u2acc\ufe00', + 'vartheta;': '\u03d1', + 'vartriangleleft;': '\u22b2', + 'vartriangleright;': '\u22b3', + 'Vbar;': '\u2aeb', + 'vBar;': '\u2ae8', + 'vBarv;': '\u2ae9', + 'Vcy;': '\u0412', + 'vcy;': '\u0432', + 'VDash;': '\u22ab', + 'Vdash;': '\u22a9', + 'vDash;': '\u22a8', + 'vdash;': '\u22a2', + 'Vdashl;': '\u2ae6', + 'Vee;': '\u22c1', + 'vee;': '\u2228', + 'veebar;': '\u22bb', + 'veeeq;': '\u225a', + 'vellip;': '\u22ee', + 'Verbar;': '\u2016', + 'verbar;': '|', + 'Vert;': '\u2016', + 'vert;': '|', + 'VerticalBar;': '\u2223', + 'VerticalLine;': '|', + 'VerticalSeparator;': '\u2758', + 'VerticalTilde;': '\u2240', + 'VeryThinSpace;': '\u200a', + 'Vfr;': '\U0001d519', + 'vfr;': '\U0001d533', + 'vltri;': '\u22b2', + 'vnsub;': '\u2282\u20d2', + 'vnsup;': '\u2283\u20d2', + 'Vopf;': '\U0001d54d', + 'vopf;': '\U0001d567', + 'vprop;': '\u221d', + 'vrtri;': '\u22b3', + 'Vscr;': '\U0001d4b1', + 'vscr;': '\U0001d4cb', + 'vsubnE;': '\u2acb\ufe00', + 'vsubne;': '\u228a\ufe00', + 'vsupnE;': '\u2acc\ufe00', + 'vsupne;': '\u228b\ufe00', + 'Vvdash;': '\u22aa', + 'vzigzag;': '\u299a', + 'Wcirc;': '\u0174', + 'wcirc;': '\u0175', + 'wedbar;': '\u2a5f', + 'Wedge;': '\u22c0', + 'wedge;': '\u2227', + 'wedgeq;': '\u2259', + 'weierp;': '\u2118', + 'Wfr;': '\U0001d51a', + 'wfr;': '\U0001d534', + 'Wopf;': '\U0001d54e', + 'wopf;': '\U0001d568', + 'wp;': '\u2118', + 'wr;': '\u2240', + 'wreath;': '\u2240', + 'Wscr;': '\U0001d4b2', + 'wscr;': '\U0001d4cc', + 'xcap;': '\u22c2', + 'xcirc;': '\u25ef', + 'xcup;': '\u22c3', + 'xdtri;': '\u25bd', + 'Xfr;': '\U0001d51b', + 'xfr;': '\U0001d535', + 'xhArr;': '\u27fa', + 'xharr;': '\u27f7', + 'Xi;': '\u039e', + 'xi;': '\u03be', + 'xlArr;': '\u27f8', + 'xlarr;': '\u27f5', + 'xmap;': '\u27fc', + 'xnis;': '\u22fb', + 'xodot;': '\u2a00', + 'Xopf;': '\U0001d54f', + 'xopf;': '\U0001d569', + 'xoplus;': '\u2a01', + 'xotime;': '\u2a02', + 'xrArr;': '\u27f9', + 'xrarr;': '\u27f6', + 'Xscr;': '\U0001d4b3', + 'xscr;': '\U0001d4cd', + 'xsqcup;': '\u2a06', + 'xuplus;': '\u2a04', + 'xutri;': '\u25b3', + 'xvee;': '\u22c1', + 'xwedge;': '\u22c0', + 'Yacute': '\xdd', + 'yacute': '\xfd', + 'Yacute;': '\xdd', + 'yacute;': '\xfd', + 'YAcy;': '\u042f', + 'yacy;': '\u044f', + 'Ycirc;': '\u0176', + 'ycirc;': '\u0177', + 'Ycy;': '\u042b', + 'ycy;': '\u044b', + 'yen': '\xa5', + 'yen;': '\xa5', + 'Yfr;': '\U0001d51c', + 'yfr;': '\U0001d536', + 'YIcy;': '\u0407', + 'yicy;': '\u0457', + 'Yopf;': '\U0001d550', + 'yopf;': '\U0001d56a', + 'Yscr;': '\U0001d4b4', + 'yscr;': '\U0001d4ce', + 'YUcy;': '\u042e', + 'yucy;': '\u044e', + 'yuml': '\xff', + 'Yuml;': '\u0178', + 'yuml;': '\xff', + 'Zacute;': '\u0179', + 'zacute;': '\u017a', + 'Zcaron;': '\u017d', + 'zcaron;': '\u017e', + 'Zcy;': '\u0417', + 'zcy;': '\u0437', + 'Zdot;': '\u017b', + 'zdot;': '\u017c', + 'zeetrf;': '\u2128', + 'ZeroWidthSpace;': '\u200b', + 'Zeta;': '\u0396', + 'zeta;': '\u03b6', + 'Zfr;': '\u2128', + 'zfr;': '\U0001d537', + 'ZHcy;': '\u0416', + 'zhcy;': '\u0436', + 'zigrarr;': '\u21dd', + 'Zopf;': '\u2124', + 'zopf;': '\U0001d56b', + 'Zscr;': '\U0001d4b5', + 'zscr;': '\U0001d4cf', + 'zwj;': '\u200d', + 'zwnj;': '\u200c', +} + +# maps the Unicode codepoint to the HTML entity name +codepoint2name = {} + +# maps the HTML entity name to the character +# (or a character reference if the character is outside the Latin-1 range) +entitydefs = {} + +for (name, codepoint) in name2codepoint.items(): + codepoint2name[codepoint] = name + entitydefs[name] = chr(codepoint) + +del name, codepoint diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/parser.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/parser.py new file mode 100644 index 0000000..fb65263 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/html/parser.py @@ -0,0 +1,536 @@ +"""A parser for HTML and XHTML. + +Backported for python-future from Python 3.3. +""" + +# This file is based on sgmllib.py, but the API is slightly different. + +# XXX There should be a way to distinguish between PCDATA (parsed +# character data -- the normal case), RCDATA (replaceable character +# data -- only char and entity references and end tags are special) +# and CDATA (character data -- only end tags are special). + +from __future__ import (absolute_import, division, + print_function, unicode_literals) +from future.builtins import * +from future.backports import _markupbase +import re +import warnings + +# Regular expressions used for parsing + +interesting_normal = re.compile('[&<]') +incomplete = re.compile('&[a-zA-Z#]') + +entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]') +charref = re.compile('&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]') + +starttagopen = re.compile('<[a-zA-Z]') +piclose = re.compile('>') +commentclose = re.compile(r'--\s*>') +tagfind = re.compile('([a-zA-Z][-.a-zA-Z0-9:_]*)(?:\s|/(?!>))*') +# see http://www.w3.org/TR/html5/tokenization.html#tag-open-state +# and http://www.w3.org/TR/html5/tokenization.html#tag-name-state +tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') +# Note: +# 1) the strict attrfind isn't really strict, but we can't make it +# correctly strict without breaking backward compatibility; +# 2) if you change attrfind remember to update locatestarttagend too; +# 3) if you change attrfind and/or locatestarttagend the parser will +# explode, so don't do it. +attrfind = re.compile( + r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' + r'(\'[^\']*\'|"[^"]*"|[^\s"\'=<>`]*))?') +attrfind_tolerant = re.compile( + r'((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*' + r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*') +locatestarttagend = re.compile(r""" + <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name + (?:\s+ # whitespace before attribute name + (?:[a-zA-Z_][-.:a-zA-Z0-9_]* # attribute name + (?:\s*=\s* # value indicator + (?:'[^']*' # LITA-enclosed value + |\"[^\"]*\" # LIT-enclosed value + |[^'\">\s]+ # bare value + ) + )? + ) + )* + \s* # trailing whitespace +""", re.VERBOSE) +locatestarttagend_tolerant = re.compile(r""" + <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name + (?:[\s/]* # optional whitespace before attribute name + (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name + (?:\s*=+\s* # value indicator + (?:'[^']*' # LITA-enclosed value + |"[^"]*" # LIT-enclosed value + |(?!['"])[^>\s]* # bare value + ) + (?:\s*,)* # possibly followed by a comma + )?(?:\s|/(?!>))* + )* + )? + \s* # trailing whitespace +""", re.VERBOSE) +endendtag = re.compile('>') +# the HTML 5 spec, section 8.1.2.2, doesn't allow spaces between +# ') + + +class HTMLParseError(Exception): + """Exception raised for all parse errors.""" + + def __init__(self, msg, position=(None, None)): + assert msg + self.msg = msg + self.lineno = position[0] + self.offset = position[1] + + def __str__(self): + result = self.msg + if self.lineno is not None: + result = result + ", at line %d" % self.lineno + if self.offset is not None: + result = result + ", column %d" % (self.offset + 1) + return result + + +class HTMLParser(_markupbase.ParserBase): + """Find tags and other markup and call handler functions. + + Usage: + p = HTMLParser() + p.feed(data) + ... + p.close() + + Start tags are handled by calling self.handle_starttag() or + self.handle_startendtag(); end tags by self.handle_endtag(). The + data between tags is passed from the parser to the derived class + by calling self.handle_data() with the data as argument (the data + may be split up in arbitrary chunks). Entity references are + passed by calling self.handle_entityref() with the entity + reference as the argument. Numeric character references are + passed to self.handle_charref() with the string containing the + reference as the argument. + """ + + CDATA_CONTENT_ELEMENTS = ("script", "style") + + def __init__(self, strict=False): + """Initialize and reset this instance. + + If strict is set to False (the default) the parser will parse invalid + markup, otherwise it will raise an error. Note that the strict mode + is deprecated. + """ + if strict: + warnings.warn("The strict mode is deprecated.", + DeprecationWarning, stacklevel=2) + self.strict = strict + self.reset() + + def reset(self): + """Reset this instance. Loses all unprocessed data.""" + self.rawdata = '' + self.lasttag = '???' + self.interesting = interesting_normal + self.cdata_elem = None + _markupbase.ParserBase.reset(self) + + def feed(self, data): + r"""Feed data to the parser. + + Call this as often as you want, with as little or as much text + as you want (may include '\n'). + """ + self.rawdata = self.rawdata + data + self.goahead(0) + + def close(self): + """Handle any buffered data.""" + self.goahead(1) + + def error(self, message): + raise HTMLParseError(message, self.getpos()) + + __starttag_text = None + + def get_starttag_text(self): + """Return full source of start tag: '<...>'.""" + return self.__starttag_text + + def set_cdata_mode(self, elem): + self.cdata_elem = elem.lower() + self.interesting = re.compile(r'' % self.cdata_elem, re.I) + + def clear_cdata_mode(self): + self.interesting = interesting_normal + self.cdata_elem = None + + # Internal -- handle data as far as reasonable. May leave state + # and data to be processed by a subsequent call. If 'end' is + # true, force handling all data as if followed by EOF marker. + def goahead(self, end): + rawdata = self.rawdata + i = 0 + n = len(rawdata) + while i < n: + match = self.interesting.search(rawdata, i) # < or & + if match: + j = match.start() + else: + if self.cdata_elem: + break + j = n + if i < j: self.handle_data(rawdata[i:j]) + i = self.updatepos(i, j) + if i == n: break + startswith = rawdata.startswith + if startswith('<', i): + if starttagopen.match(rawdata, i): # < + letter + k = self.parse_starttag(i) + elif startswith("', i + 1) + if k < 0: + k = rawdata.find('<', i + 1) + if k < 0: + k = i + 1 + else: + k += 1 + self.handle_data(rawdata[i:k]) + i = self.updatepos(i, k) + elif startswith("&#", i): + match = charref.match(rawdata, i) + if match: + name = match.group()[2:-1] + self.handle_charref(name) + k = match.end() + if not startswith(';', k-1): + k = k - 1 + i = self.updatepos(i, k) + continue + else: + if ";" in rawdata[i:]: #bail by consuming &# + self.handle_data(rawdata[0:2]) + i = self.updatepos(i, 2) + break + elif startswith('&', i): + match = entityref.match(rawdata, i) + if match: + name = match.group(1) + self.handle_entityref(name) + k = match.end() + if not startswith(';', k-1): + k = k - 1 + i = self.updatepos(i, k) + continue + match = incomplete.match(rawdata, i) + if match: + # match.group() will contain at least 2 chars + if end and match.group() == rawdata[i:]: + if self.strict: + self.error("EOF in middle of entity or char ref") + else: + if k <= i: + k = n + i = self.updatepos(i, i + 1) + # incomplete + break + elif (i + 1) < n: + # not the end of the buffer, and can't be confused + # with some other construct + self.handle_data("&") + i = self.updatepos(i, i + 1) + else: + break + else: + assert 0, "interesting.search() lied" + # end while + if end and i < n and not self.cdata_elem: + self.handle_data(rawdata[i:n]) + i = self.updatepos(i, n) + self.rawdata = rawdata[i:] + + # Internal -- parse html declarations, return length or -1 if not terminated + # See w3.org/TR/html5/tokenization.html#markup-declaration-open-state + # See also parse_declaration in _markupbase + def parse_html_declaration(self, i): + rawdata = self.rawdata + assert rawdata[i:i+2] == ' + gtpos = rawdata.find('>', i+9) + if gtpos == -1: + return -1 + self.handle_decl(rawdata[i+2:gtpos]) + return gtpos+1 + else: + return self.parse_bogus_comment(i) + + # Internal -- parse bogus comment, return length or -1 if not terminated + # see http://www.w3.org/TR/html5/tokenization.html#bogus-comment-state + def parse_bogus_comment(self, i, report=1): + rawdata = self.rawdata + assert rawdata[i:i+2] in ('', i+2) + if pos == -1: + return -1 + if report: + self.handle_comment(rawdata[i+2:pos]) + return pos + 1 + + # Internal -- parse processing instr, return end or -1 if not terminated + def parse_pi(self, i): + rawdata = self.rawdata + assert rawdata[i:i+2] == ' + if not match: + return -1 + j = match.start() + self.handle_pi(rawdata[i+2: j]) + j = match.end() + return j + + # Internal -- handle starttag, return end or -1 if not terminated + def parse_starttag(self, i): + self.__starttag_text = None + endpos = self.check_for_whole_start_tag(i) + if endpos < 0: + return endpos + rawdata = self.rawdata + self.__starttag_text = rawdata[i:endpos] + + # Now parse the data between i+1 and j into a tag and attrs + attrs = [] + match = tagfind.match(rawdata, i+1) + assert match, 'unexpected call to parse_starttag()' + k = match.end() + self.lasttag = tag = match.group(1).lower() + while k < endpos: + if self.strict: + m = attrfind.match(rawdata, k) + else: + m = attrfind_tolerant.match(rawdata, k) + if not m: + break + attrname, rest, attrvalue = m.group(1, 2, 3) + if not rest: + attrvalue = None + elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ + attrvalue[:1] == '"' == attrvalue[-1:]: + attrvalue = attrvalue[1:-1] + if attrvalue: + attrvalue = self.unescape(attrvalue) + attrs.append((attrname.lower(), attrvalue)) + k = m.end() + + end = rawdata[k:endpos].strip() + if end not in (">", "/>"): + lineno, offset = self.getpos() + if "\n" in self.__starttag_text: + lineno = lineno + self.__starttag_text.count("\n") + offset = len(self.__starttag_text) \ + - self.__starttag_text.rfind("\n") + else: + offset = offset + len(self.__starttag_text) + if self.strict: + self.error("junk characters in start tag: %r" + % (rawdata[k:endpos][:20],)) + self.handle_data(rawdata[i:endpos]) + return endpos + if end.endswith('/>'): + # XHTML-style empty tag: + self.handle_startendtag(tag, attrs) + else: + self.handle_starttag(tag, attrs) + if tag in self.CDATA_CONTENT_ELEMENTS: + self.set_cdata_mode(tag) + return endpos + + # Internal -- check to see if we have a complete starttag; return end + # or -1 if incomplete. + def check_for_whole_start_tag(self, i): + rawdata = self.rawdata + if self.strict: + m = locatestarttagend.match(rawdata, i) + else: + m = locatestarttagend_tolerant.match(rawdata, i) + if m: + j = m.end() + next = rawdata[j:j+1] + if next == ">": + return j + 1 + if next == "/": + if rawdata.startswith("/>", j): + return j + 2 + if rawdata.startswith("/", j): + # buffer boundary + return -1 + # else bogus input + if self.strict: + self.updatepos(i, j + 1) + self.error("malformed empty start tag") + if j > i: + return j + else: + return i + 1 + if next == "": + # end of input + return -1 + if next in ("abcdefghijklmnopqrstuvwxyz=/" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"): + # end of input in or before attribute value, or we have the + # '/' from a '/>' ending + return -1 + if self.strict: + self.updatepos(i, j) + self.error("malformed start tag") + if j > i: + return j + else: + return i + 1 + raise AssertionError("we should not get here!") + + # Internal -- parse endtag, return end or -1 if incomplete + def parse_endtag(self, i): + rawdata = self.rawdata + assert rawdata[i:i+2] == " + if not match: + return -1 + gtpos = match.end() + match = endtagfind.match(rawdata, i) # + if not match: + if self.cdata_elem is not None: + self.handle_data(rawdata[i:gtpos]) + return gtpos + if self.strict: + self.error("bad end tag: %r" % (rawdata[i:gtpos],)) + # find the name: w3.org/TR/html5/tokenization.html#tag-name-state + namematch = tagfind_tolerant.match(rawdata, i+2) + if not namematch: + # w3.org/TR/html5/tokenization.html#end-tag-open-state + if rawdata[i:i+3] == '': + return i+3 + else: + return self.parse_bogus_comment(i) + tagname = namematch.group().lower() + # consume and ignore other stuff between the name and the > + # Note: this is not 100% correct, since we might have things like + # , but looking for > after tha name should cover + # most of the cases and is much simpler + gtpos = rawdata.find('>', namematch.end()) + self.handle_endtag(tagname) + return gtpos+1 + + elem = match.group(1).lower() # script or style + if self.cdata_elem is not None: + if elem != self.cdata_elem: + self.handle_data(rawdata[i:gtpos]) + return gtpos + + self.handle_endtag(elem.lower()) + self.clear_cdata_mode() + return gtpos + + # Overridable -- finish processing of start+end tag: + def handle_startendtag(self, tag, attrs): + self.handle_starttag(tag, attrs) + self.handle_endtag(tag) + + # Overridable -- handle start tag + def handle_starttag(self, tag, attrs): + pass + + # Overridable -- handle end tag + def handle_endtag(self, tag): + pass + + # Overridable -- handle character reference + def handle_charref(self, name): + pass + + # Overridable -- handle entity reference + def handle_entityref(self, name): + pass + + # Overridable -- handle data + def handle_data(self, data): + pass + + # Overridable -- handle comment + def handle_comment(self, data): + pass + + # Overridable -- handle declaration + def handle_decl(self, decl): + pass + + # Overridable -- handle processing instruction + def handle_pi(self, data): + pass + + def unknown_decl(self, data): + if self.strict: + self.error("unknown declaration: %r" % (data,)) + + # Internal -- helper to remove special character quoting + def unescape(self, s): + if '&' not in s: + return s + def replaceEntities(s): + s = s.groups()[0] + try: + if s[0] == "#": + s = s[1:] + if s[0] in ['x','X']: + c = int(s[1:].rstrip(';'), 16) + else: + c = int(s.rstrip(';')) + return chr(c) + except ValueError: + return '&#' + s + else: + from future.backports.html.entities import html5 + if s in html5: + return html5[s] + elif s.endswith(';'): + return '&' + s + for x in range(2, len(s)): + if s[:x] in html5: + return html5[s[:x]] + s[x:] + else: + return '&' + s + + return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+;|\w{1,32};?))", + replaceEntities, s) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85bc0ba4b0dc5b8407e21ec11944e53782f73b13 GIT binary patch literal 149 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 ZwHbTx(Zbz>X+-xV!?a(nd7mB3{BJmW?aTlG literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/cookiejar.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/cookiejar.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8760fda447729b712e3efcf9ab5c2239e070684 GIT binary patch literal 54439 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
hJTod54OXsp~iC= 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 VXN3w2FoD@1z8H{g%ON9B0{|kBBm@8e literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/cookies.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/cookies.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..822a79ff863ceb1e11cb3b2c94291c614fc65b4e GIT binary patch literal 16252 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 Jd?+y*{C_GklOO;9 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/server.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/__pycache__/server.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9800bd429057f076f86ad462221f1515ef20130 GIT binary patch literal 34885 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 E0#XfZ$^ZZW literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/client.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/client.py new file mode 100644 index 0000000..e663d12 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/client.py @@ -0,0 +1,1346 @@ +"""HTTP/1.1 client library + +A backport of the Python 3.3 http/client.py module for python-future. + + + + +HTTPConnection goes through a number of "states", which define when a client +may legally make another request or fetch the response for a particular +request. This diagram details these state transitions: + + (null) + | + | HTTPConnection() + v + Idle + | + | putrequest() + v + Request-started + | + | ( putheader() )* endheaders() + v + Request-sent + | + | response = getresponse() + v + Unread-response [Response-headers-read] + |\____________________ + | | + | response.read() | putrequest() + v v + Idle Req-started-unread-response + ______/| + / | + response.read() | | ( putheader() )* endheaders() + v v + Request-started Req-sent-unread-response + | + | response.read() + v + Request-sent + +This diagram presents the following rules: + -- a second request may not be started until {response-headers-read} + -- a response [object] cannot be retrieved until {request-sent} + -- there is no differentiation between an unread response body and a + partially read response body + +Note: this enforcement is applied by the HTTPConnection class. The + HTTPResponse class does not enforce this state machine, which + implies sophisticated clients may accelerate the request/response + pipeline. Caution should be taken, though: accelerating the states + beyond the above pattern may imply knowledge of the server's + connection-close behavior for certain requests. For example, it + is impossible to tell whether the server will close the connection + UNTIL the response headers have been read; this means that further + requests cannot be placed into the pipeline until it is known that + the server will NOT be closing the connection. + +Logical State __state __response +------------- ------- ---------- +Idle _CS_IDLE None +Request-started _CS_REQ_STARTED None +Request-sent _CS_REQ_SENT None +Unread-response _CS_IDLE +Req-started-unread-response _CS_REQ_STARTED +Req-sent-unread-response _CS_REQ_SENT +""" + +from __future__ import (absolute_import, division, + print_function, unicode_literals) +from future.builtins import bytes, int, str, super +from future.utils import PY2 + +from future.backports.email import parser as email_parser +from future.backports.email import message as email_message +from future.backports.misc import create_connection as socket_create_connection +import io +import os +import socket +from future.backports.urllib.parse import urlsplit +import warnings +from array import array + +if PY2: + from collections import Iterable +else: + from collections.abc import Iterable + +__all__ = ["HTTPResponse", "HTTPConnection", + "HTTPException", "NotConnected", "UnknownProtocol", + "UnknownTransferEncoding", "UnimplementedFileMode", + "IncompleteRead", "InvalidURL", "ImproperConnectionState", + "CannotSendRequest", "CannotSendHeader", "ResponseNotReady", + "BadStatusLine", "error", "responses"] + +HTTP_PORT = 80 +HTTPS_PORT = 443 + +_UNKNOWN = 'UNKNOWN' + +# connection states +_CS_IDLE = 'Idle' +_CS_REQ_STARTED = 'Request-started' +_CS_REQ_SENT = 'Request-sent' + +# status codes +# informational +CONTINUE = 100 +SWITCHING_PROTOCOLS = 101 +PROCESSING = 102 + +# successful +OK = 200 +CREATED = 201 +ACCEPTED = 202 +NON_AUTHORITATIVE_INFORMATION = 203 +NO_CONTENT = 204 +RESET_CONTENT = 205 +PARTIAL_CONTENT = 206 +MULTI_STATUS = 207 +IM_USED = 226 + +# redirection +MULTIPLE_CHOICES = 300 +MOVED_PERMANENTLY = 301 +FOUND = 302 +SEE_OTHER = 303 +NOT_MODIFIED = 304 +USE_PROXY = 305 +TEMPORARY_REDIRECT = 307 + +# client error +BAD_REQUEST = 400 +UNAUTHORIZED = 401 +PAYMENT_REQUIRED = 402 +FORBIDDEN = 403 +NOT_FOUND = 404 +METHOD_NOT_ALLOWED = 405 +NOT_ACCEPTABLE = 406 +PROXY_AUTHENTICATION_REQUIRED = 407 +REQUEST_TIMEOUT = 408 +CONFLICT = 409 +GONE = 410 +LENGTH_REQUIRED = 411 +PRECONDITION_FAILED = 412 +REQUEST_ENTITY_TOO_LARGE = 413 +REQUEST_URI_TOO_LONG = 414 +UNSUPPORTED_MEDIA_TYPE = 415 +REQUESTED_RANGE_NOT_SATISFIABLE = 416 +EXPECTATION_FAILED = 417 +UNPROCESSABLE_ENTITY = 422 +LOCKED = 423 +FAILED_DEPENDENCY = 424 +UPGRADE_REQUIRED = 426 +PRECONDITION_REQUIRED = 428 +TOO_MANY_REQUESTS = 429 +REQUEST_HEADER_FIELDS_TOO_LARGE = 431 + +# server error +INTERNAL_SERVER_ERROR = 500 +NOT_IMPLEMENTED = 501 +BAD_GATEWAY = 502 +SERVICE_UNAVAILABLE = 503 +GATEWAY_TIMEOUT = 504 +HTTP_VERSION_NOT_SUPPORTED = 505 +INSUFFICIENT_STORAGE = 507 +NOT_EXTENDED = 510 +NETWORK_AUTHENTICATION_REQUIRED = 511 + +# Mapping status codes to official W3C names +responses = { + 100: 'Continue', + 101: 'Switching Protocols', + + 200: 'OK', + 201: 'Created', + 202: 'Accepted', + 203: 'Non-Authoritative Information', + 204: 'No Content', + 205: 'Reset Content', + 206: 'Partial Content', + + 300: 'Multiple Choices', + 301: 'Moved Permanently', + 302: 'Found', + 303: 'See Other', + 304: 'Not Modified', + 305: 'Use Proxy', + 306: '(Unused)', + 307: 'Temporary Redirect', + + 400: 'Bad Request', + 401: 'Unauthorized', + 402: 'Payment Required', + 403: 'Forbidden', + 404: 'Not Found', + 405: 'Method Not Allowed', + 406: 'Not Acceptable', + 407: 'Proxy Authentication Required', + 408: 'Request Timeout', + 409: 'Conflict', + 410: 'Gone', + 411: 'Length Required', + 412: 'Precondition Failed', + 413: 'Request Entity Too Large', + 414: 'Request-URI Too Long', + 415: 'Unsupported Media Type', + 416: 'Requested Range Not Satisfiable', + 417: 'Expectation Failed', + 428: 'Precondition Required', + 429: 'Too Many Requests', + 431: 'Request Header Fields Too Large', + + 500: 'Internal Server Error', + 501: 'Not Implemented', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + 505: 'HTTP Version Not Supported', + 511: 'Network Authentication Required', +} + +# maximal amount of data to read at one time in _safe_read +MAXAMOUNT = 1048576 + +# maximal line length when calling readline(). +_MAXLINE = 65536 +_MAXHEADERS = 100 + + +class HTTPMessage(email_message.Message): + # XXX The only usage of this method is in + # http.server.CGIHTTPRequestHandler. Maybe move the code there so + # that it doesn't need to be part of the public API. The API has + # never been defined so this could cause backwards compatibility + # issues. + + def getallmatchingheaders(self, name): + """Find all header lines matching a given header name. + + Look through the list of headers and find all lines matching a given + header name (and their continuation lines). A list of the lines is + returned, without interpretation. If the header does not occur, an + empty list is returned. If the header occurs multiple times, all + occurrences are returned. Case is not important in the header name. + + """ + name = name.lower() + ':' + n = len(name) + lst = [] + hit = 0 + for line in self.keys(): + if line[:n].lower() == name: + hit = 1 + elif not line[:1].isspace(): + hit = 0 + if hit: + lst.append(line) + return lst + +def parse_headers(fp, _class=HTTPMessage): + """Parses only RFC2822 headers from a file pointer. + + email Parser wants to see strings rather than bytes. + But a TextIOWrapper around self.rfile would buffer too many bytes + from the stream, bytes which we later need to read as bytes. + So we read the correct bytes here, as bytes, for email Parser + to parse. + + """ + headers = [] + while True: + line = fp.readline(_MAXLINE + 1) + if len(line) > _MAXLINE: + raise LineTooLong("header line") + headers.append(line) + if len(headers) > _MAXHEADERS: + raise HTTPException("got more than %d headers" % _MAXHEADERS) + if line in (b'\r\n', b'\n', b''): + break + hstring = bytes(b'').join(headers).decode('iso-8859-1') + return email_parser.Parser(_class=_class).parsestr(hstring) + + +_strict_sentinel = object() + +class HTTPResponse(io.RawIOBase): + + # See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details. + + # The bytes from the socket object are iso-8859-1 strings. + # See RFC 2616 sec 2.2 which notes an exception for MIME-encoded + # text following RFC 2047. The basic status line parsing only + # accepts iso-8859-1. + + def __init__(self, sock, debuglevel=0, strict=_strict_sentinel, method=None, url=None): + # If the response includes a content-length header, we need to + # make sure that the client doesn't read more than the + # specified number of bytes. If it does, it will block until + # the server times out and closes the connection. This will + # happen if a self.fp.read() is done (without a size) whether + # self.fp is buffered or not. So, no self.fp.read() by + # clients unless they know what they are doing. + self.fp = sock.makefile("rb") + self.debuglevel = debuglevel + if strict is not _strict_sentinel: + warnings.warn("the 'strict' argument isn't supported anymore; " + "http.client now always assumes HTTP/1.x compliant servers.", + DeprecationWarning, 2) + self._method = method + + # The HTTPResponse object is returned via urllib. The clients + # of http and urllib expect different attributes for the + # headers. headers is used here and supports urllib. msg is + # provided as a backwards compatibility layer for http + # clients. + + self.headers = self.msg = None + + # from the Status-Line of the response + self.version = _UNKNOWN # HTTP-Version + self.status = _UNKNOWN # Status-Code + self.reason = _UNKNOWN # Reason-Phrase + + self.chunked = _UNKNOWN # is "chunked" being used? + self.chunk_left = _UNKNOWN # bytes left to read in current chunk + self.length = _UNKNOWN # number of bytes left in response + self.will_close = _UNKNOWN # conn will close at end of response + + def _read_status(self): + line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") + if len(line) > _MAXLINE: + raise LineTooLong("status line") + if self.debuglevel > 0: + print("reply:", repr(line)) + if not line: + # Presumably, the server closed the connection before + # sending a valid response. + raise BadStatusLine(line) + try: + version, status, reason = line.split(None, 2) + except ValueError: + try: + version, status = line.split(None, 1) + reason = "" + except ValueError: + # empty version will cause next test to fail. + version = "" + if not version.startswith("HTTP/"): + self._close_conn() + raise BadStatusLine(line) + + # The status code is a three-digit number + try: + status = int(status) + if status < 100 or status > 999: + raise BadStatusLine(line) + except ValueError: + raise BadStatusLine(line) + return version, status, reason + + def begin(self): + if self.headers is not None: + # we've already started reading the response + return + + # read until we get a non-100 response + while True: + version, status, reason = self._read_status() + if status != CONTINUE: + break + # skip the header from the 100 response + while True: + skip = self.fp.readline(_MAXLINE + 1) + if len(skip) > _MAXLINE: + raise LineTooLong("header line") + skip = skip.strip() + if not skip: + break + if self.debuglevel > 0: + print("header:", skip) + + self.code = self.status = status + self.reason = reason.strip() + if version in ("HTTP/1.0", "HTTP/0.9"): + # Some servers might still return "0.9", treat it as 1.0 anyway + self.version = 10 + elif version.startswith("HTTP/1."): + self.version = 11 # use HTTP/1.1 code for HTTP/1.x where x>=1 + else: + raise UnknownProtocol(version) + + self.headers = self.msg = parse_headers(self.fp) + + if self.debuglevel > 0: + for hdr in self.headers: + print("header:", hdr, end=" ") + + # are we using the chunked-style of transfer encoding? + tr_enc = self.headers.get("transfer-encoding") + if tr_enc and tr_enc.lower() == "chunked": + self.chunked = True + self.chunk_left = None + else: + self.chunked = False + + # will the connection close at the end of the response? + self.will_close = self._check_close() + + # do we have a Content-Length? + # NOTE: RFC 2616, S4.4, #3 says we ignore this if tr_enc is "chunked" + self.length = None + length = self.headers.get("content-length") + + # are we using the chunked-style of transfer encoding? + tr_enc = self.headers.get("transfer-encoding") + if length and not self.chunked: + try: + self.length = int(length) + except ValueError: + self.length = None + else: + if self.length < 0: # ignore nonsensical negative lengths + self.length = None + else: + self.length = None + + # does the body have a fixed length? (of zero) + if (status == NO_CONTENT or status == NOT_MODIFIED or + 100 <= status < 200 or # 1xx codes + self._method == "HEAD"): + self.length = 0 + + # if the connection remains open, and we aren't using chunked, and + # a content-length was not provided, then assume that the connection + # WILL close. + if (not self.will_close and + not self.chunked and + self.length is None): + self.will_close = True + + def _check_close(self): + conn = self.headers.get("connection") + if self.version == 11: + # An HTTP/1.1 proxy is assumed to stay open unless + # explicitly closed. + conn = self.headers.get("connection") + if conn and "close" in conn.lower(): + return True + return False + + # Some HTTP/1.0 implementations have support for persistent + # connections, using rules different than HTTP/1.1. + + # For older HTTP, Keep-Alive indicates persistent connection. + if self.headers.get("keep-alive"): + return False + + # At least Akamai returns a "Connection: Keep-Alive" header, + # which was supposed to be sent by the client. + if conn and "keep-alive" in conn.lower(): + return False + + # Proxy-Connection is a netscape hack. + pconn = self.headers.get("proxy-connection") + if pconn and "keep-alive" in pconn.lower(): + return False + + # otherwise, assume it will close + return True + + def _close_conn(self): + fp = self.fp + self.fp = None + fp.close() + + def close(self): + super().close() # set "closed" flag + if self.fp: + self._close_conn() + + # These implementations are for the benefit of io.BufferedReader. + + # XXX This class should probably be revised to act more like + # the "raw stream" that BufferedReader expects. + + def flush(self): + super().flush() + if self.fp: + self.fp.flush() + + def readable(self): + return True + + # End of "raw stream" methods + + def isclosed(self): + """True if the connection is closed.""" + # NOTE: it is possible that we will not ever call self.close(). This + # case occurs when will_close is TRUE, length is None, and we + # read up to the last byte, but NOT past it. + # + # IMPLIES: if will_close is FALSE, then self.close() will ALWAYS be + # called, meaning self.isclosed() is meaningful. + return self.fp is None + + def read(self, amt=None): + if self.fp is None: + return bytes(b"") + + if self._method == "HEAD": + self._close_conn() + return bytes(b"") + + if amt is not None: + # Amount is given, so call base class version + # (which is implemented in terms of self.readinto) + return bytes(super(HTTPResponse, self).read(amt)) + else: + # Amount is not given (unbounded read) so we must check self.length + # and self.chunked + + if self.chunked: + return self._readall_chunked() + + if self.length is None: + s = self.fp.read() + else: + try: + s = self._safe_read(self.length) + except IncompleteRead: + self._close_conn() + raise + self.length = 0 + self._close_conn() # we read everything + return bytes(s) + + def readinto(self, b): + if self.fp is None: + return 0 + + if self._method == "HEAD": + self._close_conn() + return 0 + + if self.chunked: + return self._readinto_chunked(b) + + if self.length is not None: + if len(b) > self.length: + # clip the read to the "end of response" + b = memoryview(b)[0:self.length] + + # we do not use _safe_read() here because this may be a .will_close + # connection, and the user is reading more bytes than will be provided + # (for example, reading in 1k chunks) + + if PY2: + data = self.fp.read(len(b)) + n = len(data) + b[:n] = data + else: + n = self.fp.readinto(b) + + if not n and b: + # Ideally, we would raise IncompleteRead if the content-length + # wasn't satisfied, but it might break compatibility. + self._close_conn() + elif self.length is not None: + self.length -= n + if not self.length: + self._close_conn() + return n + + def _read_next_chunk_size(self): + # Read the next chunk size from the file + line = self.fp.readline(_MAXLINE + 1) + if len(line) > _MAXLINE: + raise LineTooLong("chunk size") + i = line.find(b";") + if i >= 0: + line = line[:i] # strip chunk-extensions + try: + return int(line, 16) + except ValueError: + # close the connection as protocol synchronisation is + # probably lost + self._close_conn() + raise + + def _read_and_discard_trailer(self): + # read and discard trailer up to the CRLF terminator + ### note: we shouldn't have any trailers! + while True: + line = self.fp.readline(_MAXLINE + 1) + if len(line) > _MAXLINE: + raise LineTooLong("trailer line") + if not line: + # a vanishingly small number of sites EOF without + # sending the trailer + break + if line in (b'\r\n', b'\n', b''): + break + + def _readall_chunked(self): + assert self.chunked != _UNKNOWN + chunk_left = self.chunk_left + value = [] + while True: + if chunk_left is None: + try: + chunk_left = self._read_next_chunk_size() + if chunk_left == 0: + break + except ValueError: + raise IncompleteRead(bytes(b'').join(value)) + value.append(self._safe_read(chunk_left)) + + # we read the whole chunk, get another + self._safe_read(2) # toss the CRLF at the end of the chunk + chunk_left = None + + self._read_and_discard_trailer() + + # we read everything; close the "file" + self._close_conn() + + return bytes(b'').join(value) + + def _readinto_chunked(self, b): + assert self.chunked != _UNKNOWN + chunk_left = self.chunk_left + + total_bytes = 0 + mvb = memoryview(b) + while True: + if chunk_left is None: + try: + chunk_left = self._read_next_chunk_size() + if chunk_left == 0: + break + except ValueError: + raise IncompleteRead(bytes(b[0:total_bytes])) + + if len(mvb) < chunk_left: + n = self._safe_readinto(mvb) + self.chunk_left = chunk_left - n + return total_bytes + n + elif len(mvb) == chunk_left: + n = self._safe_readinto(mvb) + self._safe_read(2) # toss the CRLF at the end of the chunk + self.chunk_left = None + return total_bytes + n + else: + temp_mvb = mvb[0:chunk_left] + n = self._safe_readinto(temp_mvb) + mvb = mvb[n:] + total_bytes += n + + # we read the whole chunk, get another + self._safe_read(2) # toss the CRLF at the end of the chunk + chunk_left = None + + self._read_and_discard_trailer() + + # we read everything; close the "file" + self._close_conn() + + return total_bytes + + def _safe_read(self, amt): + """Read the number of bytes requested, compensating for partial reads. + + Normally, we have a blocking socket, but a read() can be interrupted + by a signal (resulting in a partial read). + + Note that we cannot distinguish between EOF and an interrupt when zero + bytes have been read. IncompleteRead() will be raised in this + situation. + + This function should be used when bytes "should" be present for + reading. If the bytes are truly not available (due to EOF), then the + IncompleteRead exception can be used to detect the problem. + """ + s = [] + while amt > 0: + chunk = self.fp.read(min(amt, MAXAMOUNT)) + if not chunk: + raise IncompleteRead(bytes(b'').join(s), amt) + s.append(chunk) + amt -= len(chunk) + return bytes(b"").join(s) + + def _safe_readinto(self, b): + """Same as _safe_read, but for reading into a buffer.""" + total_bytes = 0 + mvb = memoryview(b) + while total_bytes < len(b): + if MAXAMOUNT < len(mvb): + temp_mvb = mvb[0:MAXAMOUNT] + if PY2: + data = self.fp.read(len(temp_mvb)) + n = len(data) + temp_mvb[:n] = data + else: + n = self.fp.readinto(temp_mvb) + else: + if PY2: + data = self.fp.read(len(mvb)) + n = len(data) + mvb[:n] = data + else: + n = self.fp.readinto(mvb) + if not n: + raise IncompleteRead(bytes(mvb[0:total_bytes]), len(b)) + mvb = mvb[n:] + total_bytes += n + return total_bytes + + def fileno(self): + return self.fp.fileno() + + def getheader(self, name, default=None): + if self.headers is None: + raise ResponseNotReady() + headers = self.headers.get_all(name) or default + if isinstance(headers, str) or not hasattr(headers, '__iter__'): + return headers + else: + return ', '.join(headers) + + def getheaders(self): + """Return list of (header, value) tuples.""" + if self.headers is None: + raise ResponseNotReady() + return list(self.headers.items()) + + # We override IOBase.__iter__ so that it doesn't check for closed-ness + + def __iter__(self): + return self + + # For compatibility with old-style urllib responses. + + def info(self): + return self.headers + + def geturl(self): + return self.url + + def getcode(self): + return self.status + +class HTTPConnection(object): + + _http_vsn = 11 + _http_vsn_str = 'HTTP/1.1' + + response_class = HTTPResponse + default_port = HTTP_PORT + auto_open = 1 + debuglevel = 0 + + def __init__(self, host, port=None, strict=_strict_sentinel, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, source_address=None): + if strict is not _strict_sentinel: + warnings.warn("the 'strict' argument isn't supported anymore; " + "http.client now always assumes HTTP/1.x compliant servers.", + DeprecationWarning, 2) + self.timeout = timeout + self.source_address = source_address + self.sock = None + self._buffer = [] + self.__response = None + self.__state = _CS_IDLE + self._method = None + self._tunnel_host = None + self._tunnel_port = None + self._tunnel_headers = {} + + self._set_hostport(host, port) + + def set_tunnel(self, host, port=None, headers=None): + """ Sets up the host and the port for the HTTP CONNECT Tunnelling. + + The headers argument should be a mapping of extra HTTP headers + to send with the CONNECT request. + """ + self._tunnel_host = host + self._tunnel_port = port + if headers: + self._tunnel_headers = headers + else: + self._tunnel_headers.clear() + + def _set_hostport(self, host, port): + if port is None: + i = host.rfind(':') + j = host.rfind(']') # ipv6 addresses have [...] + if i > j: + try: + port = int(host[i+1:]) + except ValueError: + if host[i+1:] == "": # http://foo.com:/ == http://foo.com/ + port = self.default_port + else: + raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) + host = host[:i] + else: + port = self.default_port + if host and host[0] == '[' and host[-1] == ']': + host = host[1:-1] + self.host = host + self.port = port + + def set_debuglevel(self, level): + self.debuglevel = level + + def _tunnel(self): + self._set_hostport(self._tunnel_host, self._tunnel_port) + connect_str = "CONNECT %s:%d HTTP/1.0\r\n" % (self.host, self.port) + connect_bytes = connect_str.encode("ascii") + self.send(connect_bytes) + for header, value in self._tunnel_headers.items(): + header_str = "%s: %s\r\n" % (header, value) + header_bytes = header_str.encode("latin-1") + self.send(header_bytes) + self.send(bytes(b'\r\n')) + + response = self.response_class(self.sock, method=self._method) + (version, code, message) = response._read_status() + + if code != 200: + self.close() + raise socket.error("Tunnel connection failed: %d %s" % (code, + message.strip())) + while True: + line = response.fp.readline(_MAXLINE + 1) + if len(line) > _MAXLINE: + raise LineTooLong("header line") + if not line: + # for sites which EOF without sending a trailer + break + if line in (b'\r\n', b'\n', b''): + break + + def connect(self): + """Connect to the host and port specified in __init__.""" + self.sock = socket_create_connection((self.host,self.port), + self.timeout, self.source_address) + if self._tunnel_host: + self._tunnel() + + def close(self): + """Close the connection to the HTTP server.""" + if self.sock: + self.sock.close() # close it manually... there may be other refs + self.sock = None + if self.__response: + self.__response.close() + self.__response = None + self.__state = _CS_IDLE + + def send(self, data): + """Send `data' to the server. + ``data`` can be a string object, a bytes object, an array object, a + file-like object that supports a .read() method, or an iterable object. + """ + + if self.sock is None: + if self.auto_open: + self.connect() + else: + raise NotConnected() + + if self.debuglevel > 0: + print("send:", repr(data)) + blocksize = 8192 + # Python 2.7 array objects have a read method which is incompatible + # with the 2-arg calling syntax below. + if hasattr(data, "read") and not isinstance(data, array): + if self.debuglevel > 0: + print("sendIng a read()able") + encode = False + try: + mode = data.mode + except AttributeError: + # io.BytesIO and other file-like objects don't have a `mode` + # attribute. + pass + else: + if "b" not in mode: + encode = True + if self.debuglevel > 0: + print("encoding file using iso-8859-1") + while 1: + datablock = data.read(blocksize) + if not datablock: + break + if encode: + datablock = datablock.encode("iso-8859-1") + self.sock.sendall(datablock) + return + try: + self.sock.sendall(data) + except TypeError: + if isinstance(data, Iterable): + for d in data: + self.sock.sendall(d) + else: + raise TypeError("data should be a bytes-like object " + "or an iterable, got %r" % type(data)) + + def _output(self, s): + """Add a line of output to the current request buffer. + + Assumes that the line does *not* end with \\r\\n. + """ + self._buffer.append(s) + + def _send_output(self, message_body=None): + """Send the currently buffered request and clear the buffer. + + Appends an extra \\r\\n to the buffer. + A message_body may be specified, to be appended to the request. + """ + self._buffer.extend((bytes(b""), bytes(b""))) + msg = bytes(b"\r\n").join(self._buffer) + del self._buffer[:] + # If msg and message_body are sent in a single send() call, + # it will avoid performance problems caused by the interaction + # between delayed ack and the Nagle algorithm. + if isinstance(message_body, bytes): + msg += message_body + message_body = None + self.send(msg) + if message_body is not None: + # message_body was not a string (i.e. it is a file), and + # we must run the risk of Nagle. + self.send(message_body) + + def putrequest(self, method, url, skip_host=0, skip_accept_encoding=0): + """Send a request to the server. + + `method' specifies an HTTP request method, e.g. 'GET'. + `url' specifies the object being requested, e.g. '/index.html'. + `skip_host' if True does not add automatically a 'Host:' header + `skip_accept_encoding' if True does not add automatically an + 'Accept-Encoding:' header + """ + + # if a prior response has been completed, then forget about it. + if self.__response and self.__response.isclosed(): + self.__response = None + + + # in certain cases, we cannot issue another request on this connection. + # this occurs when: + # 1) we are in the process of sending a request. (_CS_REQ_STARTED) + # 2) a response to a previous request has signalled that it is going + # to close the connection upon completion. + # 3) the headers for the previous response have not been read, thus + # we cannot determine whether point (2) is true. (_CS_REQ_SENT) + # + # if there is no prior response, then we can request at will. + # + # if point (2) is true, then we will have passed the socket to the + # response (effectively meaning, "there is no prior response"), and + # will open a new one when a new request is made. + # + # Note: if a prior response exists, then we *can* start a new request. + # We are not allowed to begin fetching the response to this new + # request, however, until that prior response is complete. + # + if self.__state == _CS_IDLE: + self.__state = _CS_REQ_STARTED + else: + raise CannotSendRequest(self.__state) + + # Save the method we use, we need it later in the response phase + self._method = method + if not url: + url = '/' + request = '%s %s %s' % (method, url, self._http_vsn_str) + + # Non-ASCII characters should have been eliminated earlier + self._output(request.encode('ascii')) + + if self._http_vsn == 11: + # Issue some standard headers for better HTTP/1.1 compliance + + if not skip_host: + # this header is issued *only* for HTTP/1.1 + # connections. more specifically, this means it is + # only issued when the client uses the new + # HTTPConnection() class. backwards-compat clients + # will be using HTTP/1.0 and those clients may be + # issuing this header themselves. we should NOT issue + # it twice; some web servers (such as Apache) barf + # when they see two Host: headers + + # If we need a non-standard port,include it in the + # header. If the request is going through a proxy, + # but the host of the actual URL, not the host of the + # proxy. + + netloc = '' + if url.startswith('http'): + nil, netloc, nil, nil, nil = urlsplit(url) + + if netloc: + try: + netloc_enc = netloc.encode("ascii") + except UnicodeEncodeError: + netloc_enc = netloc.encode("idna") + self.putheader('Host', netloc_enc) + else: + try: + host_enc = self.host.encode("ascii") + except UnicodeEncodeError: + host_enc = self.host.encode("idna") + + # As per RFC 273, IPv6 address should be wrapped with [] + # when used as Host header + + if self.host.find(':') >= 0: + host_enc = bytes(b'[' + host_enc + b']') + + if self.port == self.default_port: + self.putheader('Host', host_enc) + else: + host_enc = host_enc.decode("ascii") + self.putheader('Host', "%s:%s" % (host_enc, self.port)) + + # note: we are assuming that clients will not attempt to set these + # headers since *this* library must deal with the + # consequences. this also means that when the supporting + # libraries are updated to recognize other forms, then this + # code should be changed (removed or updated). + + # we only want a Content-Encoding of "identity" since we don't + # support encodings such as x-gzip or x-deflate. + if not skip_accept_encoding: + self.putheader('Accept-Encoding', 'identity') + + # we can accept "chunked" Transfer-Encodings, but no others + # NOTE: no TE header implies *only* "chunked" + #self.putheader('TE', 'chunked') + + # if TE is supplied in the header, then it must appear in a + # Connection header. + #self.putheader('Connection', 'TE') + + else: + # For HTTP/1.0, the server will assume "not chunked" + pass + + def putheader(self, header, *values): + """Send a request header line to the server. + + For example: h.putheader('Accept', 'text/html') + """ + if self.__state != _CS_REQ_STARTED: + raise CannotSendHeader() + + if hasattr(header, 'encode'): + header = header.encode('ascii') + values = list(values) + for i, one_value in enumerate(values): + if hasattr(one_value, 'encode'): + values[i] = one_value.encode('latin-1') + elif isinstance(one_value, int): + values[i] = str(one_value).encode('ascii') + value = bytes(b'\r\n\t').join(values) + header = header + bytes(b': ') + value + self._output(header) + + def endheaders(self, message_body=None): + """Indicate that the last header line has been sent to the server. + + This method sends the request to the server. The optional message_body + argument can be used to pass a message body associated with the + request. The message body will be sent in the same packet as the + message headers if it is a string, otherwise it is sent as a separate + packet. + """ + if self.__state == _CS_REQ_STARTED: + self.__state = _CS_REQ_SENT + else: + raise CannotSendHeader() + self._send_output(message_body) + + def request(self, method, url, body=None, headers={}): + """Send a complete request to the server.""" + self._send_request(method, url, body, headers) + + def _set_content_length(self, body): + # Set the content-length based on the body. + thelen = None + try: + thelen = str(len(body)) + except TypeError as te: + # If this is a file-like object, try to + # fstat its file descriptor + try: + thelen = str(os.fstat(body.fileno()).st_size) + except (AttributeError, OSError): + # Don't send a length if this failed + if self.debuglevel > 0: print("Cannot stat!!") + + if thelen is not None: + self.putheader('Content-Length', thelen) + + def _send_request(self, method, url, body, headers): + # Honor explicitly requested Host: and Accept-Encoding: headers. + header_names = dict.fromkeys([k.lower() for k in headers]) + skips = {} + if 'host' in header_names: + skips['skip_host'] = 1 + if 'accept-encoding' in header_names: + skips['skip_accept_encoding'] = 1 + + self.putrequest(method, url, **skips) + + if body is not None and ('content-length' not in header_names): + self._set_content_length(body) + for hdr, value in headers.items(): + self.putheader(hdr, value) + if isinstance(body, str): + # RFC 2616 Section 3.7.1 says that text default has a + # default charset of iso-8859-1. + body = body.encode('iso-8859-1') + self.endheaders(body) + + def getresponse(self): + """Get the response from the server. + + If the HTTPConnection is in the correct state, returns an + instance of HTTPResponse or of whatever object is returned by + class the response_class variable. + + If a request has not been sent or if a previous response has + not be handled, ResponseNotReady is raised. If the HTTP + response indicates that the connection should be closed, then + it will be closed before the response is returned. When the + connection is closed, the underlying socket is closed. + """ + + # if a prior response has been completed, then forget about it. + if self.__response and self.__response.isclosed(): + self.__response = None + + # if a prior response exists, then it must be completed (otherwise, we + # cannot read this response's header to determine the connection-close + # behavior) + # + # note: if a prior response existed, but was connection-close, then the + # socket and response were made independent of this HTTPConnection + # object since a new request requires that we open a whole new + # connection + # + # this means the prior response had one of two states: + # 1) will_close: this connection was reset and the prior socket and + # response operate independently + # 2) persistent: the response was retained and we await its + # isclosed() status to become true. + # + if self.__state != _CS_REQ_SENT or self.__response: + raise ResponseNotReady(self.__state) + + if self.debuglevel > 0: + response = self.response_class(self.sock, self.debuglevel, + method=self._method) + else: + response = self.response_class(self.sock, method=self._method) + + response.begin() + assert response.will_close != _UNKNOWN + self.__state = _CS_IDLE + + if response.will_close: + # this effectively passes the connection to the response + self.close() + else: + # remember this, so we can tell when it is complete + self.__response = response + + return response + +try: + import ssl + from ssl import SSLContext +except ImportError: + pass +else: + class HTTPSConnection(HTTPConnection): + "This class allows communication via SSL." + + default_port = HTTPS_PORT + + # XXX Should key_file and cert_file be deprecated in favour of context? + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=_strict_sentinel, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, **_3to2kwargs): + if 'check_hostname' in _3to2kwargs: check_hostname = _3to2kwargs['check_hostname']; del _3to2kwargs['check_hostname'] + else: check_hostname = None + if 'context' in _3to2kwargs: context = _3to2kwargs['context']; del _3to2kwargs['context'] + else: context = None + super(HTTPSConnection, self).__init__(host, port, strict, timeout, + source_address) + self.key_file = key_file + self.cert_file = cert_file + if context is None: + # Some reasonable defaults + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.options |= ssl.OP_NO_SSLv2 + will_verify = context.verify_mode != ssl.CERT_NONE + if check_hostname is None: + check_hostname = will_verify + elif check_hostname and not will_verify: + raise ValueError("check_hostname needs a SSL context with " + "either CERT_OPTIONAL or CERT_REQUIRED") + if key_file or cert_file: + context.load_cert_chain(cert_file, key_file) + self._context = context + self._check_hostname = check_hostname + + def connect(self): + "Connect to a host on a given (SSL) port." + + sock = socket_create_connection((self.host, self.port), + self.timeout, self.source_address) + + if self._tunnel_host: + self.sock = sock + self._tunnel() + + server_hostname = self.host if ssl.HAS_SNI else None + self.sock = self._context.wrap_socket(sock, + server_hostname=server_hostname) + try: + if self._check_hostname: + ssl.match_hostname(self.sock.getpeercert(), self.host) + except Exception: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + __all__.append("HTTPSConnection") + + + # ###################################### + # # We use the old HTTPSConnection class from Py2.7, because ssl.SSLContext + # # doesn't exist in the Py2.7 stdlib + # class HTTPSConnection(HTTPConnection): + # "This class allows communication via SSL." + + # default_port = HTTPS_PORT + + # def __init__(self, host, port=None, key_file=None, cert_file=None, + # strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + # source_address=None): + # HTTPConnection.__init__(self, host, port, strict, timeout, + # source_address) + # self.key_file = key_file + # self.cert_file = cert_file + + # def connect(self): + # "Connect to a host on a given (SSL) port." + + # sock = socket_create_connection((self.host, self.port), + # self.timeout, self.source_address) + # if self._tunnel_host: + # self.sock = sock + # self._tunnel() + # self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file) + + # __all__.append("HTTPSConnection") + # ###################################### + + +class HTTPException(Exception): + # Subclasses that define an __init__ must call Exception.__init__ + # or define self.args. Otherwise, str() will fail. + pass + +class NotConnected(HTTPException): + pass + +class InvalidURL(HTTPException): + pass + +class UnknownProtocol(HTTPException): + def __init__(self, version): + self.args = version, + self.version = version + +class UnknownTransferEncoding(HTTPException): + pass + +class UnimplementedFileMode(HTTPException): + pass + +class IncompleteRead(HTTPException): + def __init__(self, partial, expected=None): + self.args = partial, + self.partial = partial + self.expected = expected + def __repr__(self): + if self.expected is not None: + e = ', %i more expected' % self.expected + else: + e = '' + return 'IncompleteRead(%i bytes read%s)' % (len(self.partial), e) + def __str__(self): + return repr(self) + +class ImproperConnectionState(HTTPException): + pass + +class CannotSendRequest(ImproperConnectionState): + pass + +class CannotSendHeader(ImproperConnectionState): + pass + +class ResponseNotReady(ImproperConnectionState): + pass + +class BadStatusLine(HTTPException): + def __init__(self, line): + if not line: + line = repr(line) + self.args = line, + self.line = line + +class LineTooLong(HTTPException): + def __init__(self, line_type): + HTTPException.__init__(self, "got more than %d bytes when reading %s" + % (_MAXLINE, line_type)) + +# for backwards compatibility +error = HTTPException diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/cookiejar.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/cookiejar.py new file mode 100644 index 0000000..af3ef41 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/cookiejar.py @@ -0,0 +1,2110 @@ +r"""HTTP cookie handling for web clients. + +This is a backport of the Py3.3 ``http.cookiejar`` module for +python-future. + +This module has (now fairly distant) origins in Gisle Aas' Perl module +HTTP::Cookies, from the libwww-perl library. + +Docstrings, comments and debug strings in this code refer to the +attributes of the HTTP cookie system as cookie-attributes, to distinguish +them clearly from Python attributes. + +Class diagram (note that BSDDBCookieJar and the MSIE* classes are not +distributed with the Python standard library, but are available from +http://wwwsearch.sf.net/): + + CookieJar____ + / \ \ + FileCookieJar \ \ + / | \ \ \ + MozillaCookieJar | LWPCookieJar \ \ + | | \ + | ---MSIEBase | \ + | / | | \ + | / MSIEDBCookieJar BSDDBCookieJar + |/ + MSIECookieJar + +""" + +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future.builtins import filter, int, map, open, str +from future.utils import as_native_str, PY2 + +__all__ = ['Cookie', 'CookieJar', 'CookiePolicy', 'DefaultCookiePolicy', + 'FileCookieJar', 'LWPCookieJar', 'LoadError', 'MozillaCookieJar'] + +import copy +import datetime +import re +if PY2: + re.ASCII = 0 +import time +from future.backports.urllib.parse import urlparse, urlsplit, quote +from future.backports.http.client import HTTP_PORT +try: + import threading as _threading +except ImportError: + import dummy_threading as _threading +from calendar import timegm + +debug = False # set to True to enable debugging via the logging module +logger = None + +def _debug(*args): + if not debug: + return + global logger + if not logger: + import logging + logger = logging.getLogger("http.cookiejar") + return logger.debug(*args) + + +DEFAULT_HTTP_PORT = str(HTTP_PORT) +MISSING_FILENAME_TEXT = ("a filename was not supplied (nor was the CookieJar " + "instance initialised with one)") + +def _warn_unhandled_exception(): + # There are a few catch-all except: statements in this module, for + # catching input that's bad in unexpected ways. Warn if any + # exceptions are caught there. + import io, warnings, traceback + f = io.StringIO() + traceback.print_exc(None, f) + msg = f.getvalue() + warnings.warn("http.cookiejar bug!\n%s" % msg, stacklevel=2) + + +# Date/time conversion +# ----------------------------------------------------------------------------- + +EPOCH_YEAR = 1970 +def _timegm(tt): + year, month, mday, hour, min, sec = tt[:6] + if ((year >= EPOCH_YEAR) and (1 <= month <= 12) and (1 <= mday <= 31) and + (0 <= hour <= 24) and (0 <= min <= 59) and (0 <= sec <= 61)): + return timegm(tt) + else: + return None + +DAYS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] +MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +MONTHS_LOWER = [] +for month in MONTHS: MONTHS_LOWER.append(month.lower()) + +def time2isoz(t=None): + """Return a string representing time in seconds since epoch, t. + + If the function is called without an argument, it will use the current + time. + + The format of the returned string is like "YYYY-MM-DD hh:mm:ssZ", + representing Universal Time (UTC, aka GMT). An example of this format is: + + 1994-11-24 08:49:37Z + + """ + if t is None: + dt = datetime.datetime.utcnow() + else: + dt = datetime.datetime.utcfromtimestamp(t) + return "%04d-%02d-%02d %02d:%02d:%02dZ" % ( + dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second) + +def time2netscape(t=None): + """Return a string representing time in seconds since epoch, t. + + If the function is called without an argument, it will use the current + time. + + The format of the returned string is like this: + + Wed, DD-Mon-YYYY HH:MM:SS GMT + + """ + if t is None: + dt = datetime.datetime.utcnow() + else: + dt = datetime.datetime.utcfromtimestamp(t) + return "%s %02d-%s-%04d %02d:%02d:%02d GMT" % ( + DAYS[dt.weekday()], dt.day, MONTHS[dt.month-1], + dt.year, dt.hour, dt.minute, dt.second) + + +UTC_ZONES = {"GMT": None, "UTC": None, "UT": None, "Z": None} + +TIMEZONE_RE = re.compile(r"^([-+])?(\d\d?):?(\d\d)?$", re.ASCII) +def offset_from_tz_string(tz): + offset = None + if tz in UTC_ZONES: + offset = 0 + else: + m = TIMEZONE_RE.search(tz) + if m: + offset = 3600 * int(m.group(2)) + if m.group(3): + offset = offset + 60 * int(m.group(3)) + if m.group(1) == '-': + offset = -offset + return offset + +def _str2time(day, mon, yr, hr, min, sec, tz): + # translate month name to number + # month numbers start with 1 (January) + try: + mon = MONTHS_LOWER.index(mon.lower())+1 + except ValueError: + # maybe it's already a number + try: + imon = int(mon) + except ValueError: + return None + if 1 <= imon <= 12: + mon = imon + else: + return None + + # make sure clock elements are defined + if hr is None: hr = 0 + if min is None: min = 0 + if sec is None: sec = 0 + + yr = int(yr) + day = int(day) + hr = int(hr) + min = int(min) + sec = int(sec) + + if yr < 1000: + # find "obvious" year + cur_yr = time.localtime(time.time())[0] + m = cur_yr % 100 + tmp = yr + yr = yr + cur_yr - m + m = m - tmp + if abs(m) > 50: + if m > 0: yr = yr + 100 + else: yr = yr - 100 + + # convert UTC time tuple to seconds since epoch (not timezone-adjusted) + t = _timegm((yr, mon, day, hr, min, sec, tz)) + + if t is not None: + # adjust time using timezone string, to get absolute time since epoch + if tz is None: + tz = "UTC" + tz = tz.upper() + offset = offset_from_tz_string(tz) + if offset is None: + return None + t = t - offset + + return t + +STRICT_DATE_RE = re.compile( + r"^[SMTWF][a-z][a-z], (\d\d) ([JFMASOND][a-z][a-z]) " + "(\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$", re.ASCII) +WEEKDAY_RE = re.compile( + r"^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*", re.I | re.ASCII) +LOOSE_HTTP_DATE_RE = re.compile( + r"""^ + (\d\d?) # day + (?:\s+|[-\/]) + (\w+) # month + (?:\s+|[-\/]) + (\d+) # year + (?: + (?:\s+|:) # separator before clock + (\d\d?):(\d\d) # hour:min + (?::(\d\d))? # optional seconds + )? # optional clock + \s* + ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone + \s* + (?:\(\w+\))? # ASCII representation of timezone in parens. + \s*$""", re.X | re.ASCII) +def http2time(text): + """Returns time in seconds since epoch of time represented by a string. + + Return value is an integer. + + None is returned if the format of str is unrecognized, the time is outside + the representable range, or the timezone string is not recognized. If the + string contains no timezone, UTC is assumed. + + The timezone in the string may be numerical (like "-0800" or "+0100") or a + string timezone (like "UTC", "GMT", "BST" or "EST"). Currently, only the + timezone strings equivalent to UTC (zero offset) are known to the function. + + The function loosely parses the following formats: + + Wed, 09 Feb 1994 22:23:32 GMT -- HTTP format + Tuesday, 08-Feb-94 14:15:29 GMT -- old rfc850 HTTP format + Tuesday, 08-Feb-1994 14:15:29 GMT -- broken rfc850 HTTP format + 09 Feb 1994 22:23:32 GMT -- HTTP format (no weekday) + 08-Feb-94 14:15:29 GMT -- rfc850 format (no weekday) + 08-Feb-1994 14:15:29 GMT -- broken rfc850 format (no weekday) + + The parser ignores leading and trailing whitespace. The time may be + absent. + + If the year is given with only 2 digits, the function will select the + century that makes the year closest to the current date. + + """ + # fast exit for strictly conforming string + m = STRICT_DATE_RE.search(text) + if m: + g = m.groups() + mon = MONTHS_LOWER.index(g[1].lower()) + 1 + tt = (int(g[2]), mon, int(g[0]), + int(g[3]), int(g[4]), float(g[5])) + return _timegm(tt) + + # No, we need some messy parsing... + + # clean up + text = text.lstrip() + text = WEEKDAY_RE.sub("", text, 1) # Useless weekday + + # tz is time zone specifier string + day, mon, yr, hr, min, sec, tz = [None]*7 + + # loose regexp parse + m = LOOSE_HTTP_DATE_RE.search(text) + if m is not None: + day, mon, yr, hr, min, sec, tz = m.groups() + else: + return None # bad format + + return _str2time(day, mon, yr, hr, min, sec, tz) + +ISO_DATE_RE = re.compile( + """^ + (\d{4}) # year + [-\/]? + (\d\d?) # numerical month + [-\/]? + (\d\d?) # day + (?: + (?:\s+|[-:Tt]) # separator before clock + (\d\d?):?(\d\d) # hour:min + (?::?(\d\d(?:\.\d*)?))? # optional seconds (and fractional) + )? # optional clock + \s* + ([-+]?\d\d?:?(:?\d\d)? + |Z|z)? # timezone (Z is "zero meridian", i.e. GMT) + \s*$""", re.X | re. ASCII) +def iso2time(text): + """ + As for http2time, but parses the ISO 8601 formats: + + 1994-02-03 14:15:29 -0100 -- ISO 8601 format + 1994-02-03 14:15:29 -- zone is optional + 1994-02-03 -- only date + 1994-02-03T14:15:29 -- Use T as separator + 19940203T141529Z -- ISO 8601 compact format + 19940203 -- only date + + """ + # clean up + text = text.lstrip() + + # tz is time zone specifier string + day, mon, yr, hr, min, sec, tz = [None]*7 + + # loose regexp parse + m = ISO_DATE_RE.search(text) + if m is not None: + # XXX there's an extra bit of the timezone I'm ignoring here: is + # this the right thing to do? + yr, mon, day, hr, min, sec, tz, _ = m.groups() + else: + return None # bad format + + return _str2time(day, mon, yr, hr, min, sec, tz) + + +# Header parsing +# ----------------------------------------------------------------------------- + +def unmatched(match): + """Return unmatched part of re.Match object.""" + start, end = match.span(0) + return match.string[:start]+match.string[end:] + +HEADER_TOKEN_RE = re.compile(r"^\s*([^=\s;,]+)") +HEADER_QUOTED_VALUE_RE = re.compile(r"^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"") +HEADER_VALUE_RE = re.compile(r"^\s*=\s*([^\s;,]*)") +HEADER_ESCAPE_RE = re.compile(r"\\(.)") +def split_header_words(header_values): + r"""Parse header values into a list of lists containing key,value pairs. + + The function knows how to deal with ",", ";" and "=" as well as quoted + values after "=". A list of space separated tokens are parsed as if they + were separated by ";". + + If the header_values passed as argument contains multiple values, then they + are treated as if they were a single value separated by comma ",". + + This means that this function is useful for parsing header fields that + follow this syntax (BNF as from the HTTP/1.1 specification, but we relax + the requirement for tokens). + + headers = #header + header = (token | parameter) *( [";"] (token | parameter)) + + token = 1* + separators = "(" | ")" | "<" | ">" | "@" + | "," | ";" | ":" | "\" | <"> + | "/" | "[" | "]" | "?" | "=" + | "{" | "}" | SP | HT + + quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) + qdtext = > + quoted-pair = "\" CHAR + + parameter = attribute "=" value + attribute = token + value = token | quoted-string + + Each header is represented by a list of key/value pairs. The value for a + simple token (not part of a parameter) is None. Syntactically incorrect + headers will not necessarily be parsed as you would want. + + This is easier to describe with some examples: + + >>> split_header_words(['foo="bar"; port="80,81"; discard, bar=baz']) + [[('foo', 'bar'), ('port', '80,81'), ('discard', None)], [('bar', 'baz')]] + >>> split_header_words(['text/html; charset="iso-8859-1"']) + [[('text/html', None), ('charset', 'iso-8859-1')]] + >>> split_header_words([r'Basic realm="\"foo\bar\""']) + [[('Basic', None), ('realm', '"foobar"')]] + + """ + assert not isinstance(header_values, str) + result = [] + for text in header_values: + orig_text = text + pairs = [] + while text: + m = HEADER_TOKEN_RE.search(text) + if m: + text = unmatched(m) + name = m.group(1) + m = HEADER_QUOTED_VALUE_RE.search(text) + if m: # quoted value + text = unmatched(m) + value = m.group(1) + value = HEADER_ESCAPE_RE.sub(r"\1", value) + else: + m = HEADER_VALUE_RE.search(text) + if m: # unquoted value + text = unmatched(m) + value = m.group(1) + value = value.rstrip() + else: + # no value, a lone token + value = None + pairs.append((name, value)) + elif text.lstrip().startswith(","): + # concatenated headers, as per RFC 2616 section 4.2 + text = text.lstrip()[1:] + if pairs: result.append(pairs) + pairs = [] + else: + # skip junk + non_junk, nr_junk_chars = re.subn("^[=\s;]*", "", text) + assert nr_junk_chars > 0, ( + "split_header_words bug: '%s', '%s', %s" % + (orig_text, text, pairs)) + text = non_junk + if pairs: result.append(pairs) + return result + +HEADER_JOIN_ESCAPE_RE = re.compile(r"([\"\\])") +def join_header_words(lists): + """Do the inverse (almost) of the conversion done by split_header_words. + + Takes a list of lists of (key, value) pairs and produces a single header + value. Attribute values are quoted if needed. + + >>> join_header_words([[("text/plain", None), ("charset", "iso-8859/1")]]) + 'text/plain; charset="iso-8859/1"' + >>> join_header_words([[("text/plain", None)], [("charset", "iso-8859/1")]]) + 'text/plain, charset="iso-8859/1"' + + """ + headers = [] + for pairs in lists: + attr = [] + for k, v in pairs: + if v is not None: + if not re.search(r"^\w+$", v): + v = HEADER_JOIN_ESCAPE_RE.sub(r"\\\1", v) # escape " and \ + v = '"%s"' % v + k = "%s=%s" % (k, v) + attr.append(k) + if attr: headers.append("; ".join(attr)) + return ", ".join(headers) + +def strip_quotes(text): + if text.startswith('"'): + text = text[1:] + if text.endswith('"'): + text = text[:-1] + return text + +def parse_ns_headers(ns_headers): + """Ad-hoc parser for Netscape protocol cookie-attributes. + + The old Netscape cookie format for Set-Cookie can for instance contain + an unquoted "," in the expires field, so we have to use this ad-hoc + parser instead of split_header_words. + + XXX This may not make the best possible effort to parse all the crap + that Netscape Cookie headers contain. Ronald Tschalar's HTTPClient + parser is probably better, so could do worse than following that if + this ever gives any trouble. + + Currently, this is also used for parsing RFC 2109 cookies. + + """ + known_attrs = ("expires", "domain", "path", "secure", + # RFC 2109 attrs (may turn up in Netscape cookies, too) + "version", "port", "max-age") + + result = [] + for ns_header in ns_headers: + pairs = [] + version_set = False + for ii, param in enumerate(re.split(r";\s*", ns_header)): + param = param.rstrip() + if param == "": continue + if "=" not in param: + k, v = param, None + else: + k, v = re.split(r"\s*=\s*", param, 1) + k = k.lstrip() + if ii != 0: + lc = k.lower() + if lc in known_attrs: + k = lc + if k == "version": + # This is an RFC 2109 cookie. + v = strip_quotes(v) + version_set = True + if k == "expires": + # convert expires date to seconds since epoch + v = http2time(strip_quotes(v)) # None if invalid + pairs.append((k, v)) + + if pairs: + if not version_set: + pairs.append(("version", "0")) + result.append(pairs) + + return result + + +IPV4_RE = re.compile(r"\.\d+$", re.ASCII) +def is_HDN(text): + """Return True if text is a host domain name.""" + # XXX + # This may well be wrong. Which RFC is HDN defined in, if any (for + # the purposes of RFC 2965)? + # For the current implementation, what about IPv6? Remember to look + # at other uses of IPV4_RE also, if change this. + if IPV4_RE.search(text): + return False + if text == "": + return False + if text[0] == "." or text[-1] == ".": + return False + return True + +def domain_match(A, B): + """Return True if domain A domain-matches domain B, according to RFC 2965. + + A and B may be host domain names or IP addresses. + + RFC 2965, section 1: + + Host names can be specified either as an IP address or a HDN string. + Sometimes we compare one host name with another. (Such comparisons SHALL + be case-insensitive.) Host A's name domain-matches host B's if + + * their host name strings string-compare equal; or + + * A is a HDN string and has the form NB, where N is a non-empty + name string, B has the form .B', and B' is a HDN string. (So, + x.y.com domain-matches .Y.com but not Y.com.) + + Note that domain-match is not a commutative operation: a.b.c.com + domain-matches .c.com, but not the reverse. + + """ + # Note that, if A or B are IP addresses, the only relevant part of the + # definition of the domain-match algorithm is the direct string-compare. + A = A.lower() + B = B.lower() + if A == B: + return True + if not is_HDN(A): + return False + i = A.rfind(B) + if i == -1 or i == 0: + # A does not have form NB, or N is the empty string + return False + if not B.startswith("."): + return False + if not is_HDN(B[1:]): + return False + return True + +def liberal_is_HDN(text): + """Return True if text is a sort-of-like a host domain name. + + For accepting/blocking domains. + + """ + if IPV4_RE.search(text): + return False + return True + +def user_domain_match(A, B): + """For blocking/accepting domains. + + A and B may be host domain names or IP addresses. + + """ + A = A.lower() + B = B.lower() + if not (liberal_is_HDN(A) and liberal_is_HDN(B)): + if A == B: + # equal IP addresses + return True + return False + initial_dot = B.startswith(".") + if initial_dot and A.endswith(B): + return True + if not initial_dot and A == B: + return True + return False + +cut_port_re = re.compile(r":\d+$", re.ASCII) +def request_host(request): + """Return request-host, as defined by RFC 2965. + + Variation from RFC: returned value is lowercased, for convenient + comparison. + + """ + url = request.get_full_url() + host = urlparse(url)[1] + if host == "": + host = request.get_header("Host", "") + + # remove port, if present + host = cut_port_re.sub("", host, 1) + return host.lower() + +def eff_request_host(request): + """Return a tuple (request-host, effective request-host name). + + As defined by RFC 2965, except both are lowercased. + + """ + erhn = req_host = request_host(request) + if req_host.find(".") == -1 and not IPV4_RE.search(req_host): + erhn = req_host + ".local" + return req_host, erhn + +def request_path(request): + """Path component of request-URI, as defined by RFC 2965.""" + url = request.get_full_url() + parts = urlsplit(url) + path = escape_path(parts.path) + if not path.startswith("/"): + # fix bad RFC 2396 absoluteURI + path = "/" + path + return path + +def request_port(request): + host = request.host + i = host.find(':') + if i >= 0: + port = host[i+1:] + try: + int(port) + except ValueError: + _debug("nonnumeric port: '%s'", port) + return None + else: + port = DEFAULT_HTTP_PORT + return port + +# Characters in addition to A-Z, a-z, 0-9, '_', '.', and '-' that don't +# need to be escaped to form a valid HTTP URL (RFCs 2396 and 1738). +HTTP_PATH_SAFE = "%/;:@&=+$,!~*'()" +ESCAPED_CHAR_RE = re.compile(r"%([0-9a-fA-F][0-9a-fA-F])") +def uppercase_escaped_char(match): + return "%%%s" % match.group(1).upper() +def escape_path(path): + """Escape any invalid characters in HTTP URL, and uppercase all escapes.""" + # There's no knowing what character encoding was used to create URLs + # containing %-escapes, but since we have to pick one to escape invalid + # path characters, we pick UTF-8, as recommended in the HTML 4.0 + # specification: + # http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.2.1 + # And here, kind of: draft-fielding-uri-rfc2396bis-03 + # (And in draft IRI specification: draft-duerst-iri-05) + # (And here, for new URI schemes: RFC 2718) + path = quote(path, HTTP_PATH_SAFE) + path = ESCAPED_CHAR_RE.sub(uppercase_escaped_char, path) + return path + +def reach(h): + """Return reach of host h, as defined by RFC 2965, section 1. + + The reach R of a host name H is defined as follows: + + * If + + - H is the host domain name of a host; and, + + - H has the form A.B; and + + - A has no embedded (that is, interior) dots; and + + - B has at least one embedded dot, or B is the string "local". + then the reach of H is .B. + + * Otherwise, the reach of H is H. + + >>> reach("www.acme.com") + '.acme.com' + >>> reach("acme.com") + 'acme.com' + >>> reach("acme.local") + '.local' + + """ + i = h.find(".") + if i >= 0: + #a = h[:i] # this line is only here to show what a is + b = h[i+1:] + i = b.find(".") + if is_HDN(h) and (i >= 0 or b == "local"): + return "."+b + return h + +def is_third_party(request): + """ + + RFC 2965, section 3.3.6: + + An unverifiable transaction is to a third-party host if its request- + host U does not domain-match the reach R of the request-host O in the + origin transaction. + + """ + req_host = request_host(request) + if not domain_match(req_host, reach(request.get_origin_req_host())): + return True + else: + return False + + +class Cookie(object): + """HTTP Cookie. + + This class represents both Netscape and RFC 2965 cookies. + + This is deliberately a very simple class. It just holds attributes. It's + possible to construct Cookie instances that don't comply with the cookie + standards. CookieJar.make_cookies is the factory function for Cookie + objects -- it deals with cookie parsing, supplying defaults, and + normalising to the representation used in this class. CookiePolicy is + responsible for checking them to see whether they should be accepted from + and returned to the server. + + Note that the port may be present in the headers, but unspecified ("Port" + rather than"Port=80", for example); if this is the case, port is None. + + """ + + def __init__(self, version, name, value, + port, port_specified, + domain, domain_specified, domain_initial_dot, + path, path_specified, + secure, + expires, + discard, + comment, + comment_url, + rest, + rfc2109=False, + ): + + if version is not None: version = int(version) + if expires is not None: expires = int(expires) + if port is None and port_specified is True: + raise ValueError("if port is None, port_specified must be false") + + self.version = version + self.name = name + self.value = value + self.port = port + self.port_specified = port_specified + # normalise case, as per RFC 2965 section 3.3.3 + self.domain = domain.lower() + self.domain_specified = domain_specified + # Sigh. We need to know whether the domain given in the + # cookie-attribute had an initial dot, in order to follow RFC 2965 + # (as clarified in draft errata). Needed for the returned $Domain + # value. + self.domain_initial_dot = domain_initial_dot + self.path = path + self.path_specified = path_specified + self.secure = secure + self.expires = expires + self.discard = discard + self.comment = comment + self.comment_url = comment_url + self.rfc2109 = rfc2109 + + self._rest = copy.copy(rest) + + def has_nonstandard_attr(self, name): + return name in self._rest + def get_nonstandard_attr(self, name, default=None): + return self._rest.get(name, default) + def set_nonstandard_attr(self, name, value): + self._rest[name] = value + + def is_expired(self, now=None): + if now is None: now = time.time() + if (self.expires is not None) and (self.expires <= now): + return True + return False + + def __str__(self): + if self.port is None: p = "" + else: p = ":"+self.port + limit = self.domain + p + self.path + if self.value is not None: + namevalue = "%s=%s" % (self.name, self.value) + else: + namevalue = self.name + return "" % (namevalue, limit) + + @as_native_str() + def __repr__(self): + args = [] + for name in ("version", "name", "value", + "port", "port_specified", + "domain", "domain_specified", "domain_initial_dot", + "path", "path_specified", + "secure", "expires", "discard", "comment", "comment_url", + ): + attr = getattr(self, name) + ### Python-Future: + # Avoid u'...' prefixes for unicode strings: + if isinstance(attr, str): + attr = str(attr) + ### + args.append(str("%s=%s") % (name, repr(attr))) + args.append("rest=%s" % repr(self._rest)) + args.append("rfc2109=%s" % repr(self.rfc2109)) + return "Cookie(%s)" % ", ".join(args) + + +class CookiePolicy(object): + """Defines which cookies get accepted from and returned to server. + + May also modify cookies, though this is probably a bad idea. + + The subclass DefaultCookiePolicy defines the standard rules for Netscape + and RFC 2965 cookies -- override that if you want a customised policy. + + """ + def set_ok(self, cookie, request): + """Return true if (and only if) cookie should be accepted from server. + + Currently, pre-expired cookies never get this far -- the CookieJar + class deletes such cookies itself. + + """ + raise NotImplementedError() + + def return_ok(self, cookie, request): + """Return true if (and only if) cookie should be returned to server.""" + raise NotImplementedError() + + def domain_return_ok(self, domain, request): + """Return false if cookies should not be returned, given cookie domain. + """ + return True + + def path_return_ok(self, path, request): + """Return false if cookies should not be returned, given cookie path. + """ + return True + + +class DefaultCookiePolicy(CookiePolicy): + """Implements the standard rules for accepting and returning cookies.""" + + DomainStrictNoDots = 1 + DomainStrictNonDomain = 2 + DomainRFC2965Match = 4 + + DomainLiberal = 0 + DomainStrict = DomainStrictNoDots|DomainStrictNonDomain + + def __init__(self, + blocked_domains=None, allowed_domains=None, + netscape=True, rfc2965=False, + rfc2109_as_netscape=None, + hide_cookie2=False, + strict_domain=False, + strict_rfc2965_unverifiable=True, + strict_ns_unverifiable=False, + strict_ns_domain=DomainLiberal, + strict_ns_set_initial_dollar=False, + strict_ns_set_path=False, + ): + """Constructor arguments should be passed as keyword arguments only.""" + self.netscape = netscape + self.rfc2965 = rfc2965 + self.rfc2109_as_netscape = rfc2109_as_netscape + self.hide_cookie2 = hide_cookie2 + self.strict_domain = strict_domain + self.strict_rfc2965_unverifiable = strict_rfc2965_unverifiable + self.strict_ns_unverifiable = strict_ns_unverifiable + self.strict_ns_domain = strict_ns_domain + self.strict_ns_set_initial_dollar = strict_ns_set_initial_dollar + self.strict_ns_set_path = strict_ns_set_path + + if blocked_domains is not None: + self._blocked_domains = tuple(blocked_domains) + else: + self._blocked_domains = () + + if allowed_domains is not None: + allowed_domains = tuple(allowed_domains) + self._allowed_domains = allowed_domains + + def blocked_domains(self): + """Return the sequence of blocked domains (as a tuple).""" + return self._blocked_domains + def set_blocked_domains(self, blocked_domains): + """Set the sequence of blocked domains.""" + self._blocked_domains = tuple(blocked_domains) + + def is_blocked(self, domain): + for blocked_domain in self._blocked_domains: + if user_domain_match(domain, blocked_domain): + return True + return False + + def allowed_domains(self): + """Return None, or the sequence of allowed domains (as a tuple).""" + return self._allowed_domains + def set_allowed_domains(self, allowed_domains): + """Set the sequence of allowed domains, or None.""" + if allowed_domains is not None: + allowed_domains = tuple(allowed_domains) + self._allowed_domains = allowed_domains + + def is_not_allowed(self, domain): + if self._allowed_domains is None: + return False + for allowed_domain in self._allowed_domains: + if user_domain_match(domain, allowed_domain): + return False + return True + + def set_ok(self, cookie, request): + """ + If you override .set_ok(), be sure to call this method. If it returns + false, so should your subclass (assuming your subclass wants to be more + strict about which cookies to accept). + + """ + _debug(" - checking cookie %s=%s", cookie.name, cookie.value) + + assert cookie.name is not None + + for n in "version", "verifiability", "name", "path", "domain", "port": + fn_name = "set_ok_"+n + fn = getattr(self, fn_name) + if not fn(cookie, request): + return False + + return True + + def set_ok_version(self, cookie, request): + if cookie.version is None: + # Version is always set to 0 by parse_ns_headers if it's a Netscape + # cookie, so this must be an invalid RFC 2965 cookie. + _debug(" Set-Cookie2 without version attribute (%s=%s)", + cookie.name, cookie.value) + return False + if cookie.version > 0 and not self.rfc2965: + _debug(" RFC 2965 cookies are switched off") + return False + elif cookie.version == 0 and not self.netscape: + _debug(" Netscape cookies are switched off") + return False + return True + + def set_ok_verifiability(self, cookie, request): + if request.unverifiable and is_third_party(request): + if cookie.version > 0 and self.strict_rfc2965_unverifiable: + _debug(" third-party RFC 2965 cookie during " + "unverifiable transaction") + return False + elif cookie.version == 0 and self.strict_ns_unverifiable: + _debug(" third-party Netscape cookie during " + "unverifiable transaction") + return False + return True + + def set_ok_name(self, cookie, request): + # Try and stop servers setting V0 cookies designed to hack other + # servers that know both V0 and V1 protocols. + if (cookie.version == 0 and self.strict_ns_set_initial_dollar and + cookie.name.startswith("$")): + _debug(" illegal name (starts with '$'): '%s'", cookie.name) + return False + return True + + def set_ok_path(self, cookie, request): + if cookie.path_specified: + req_path = request_path(request) + if ((cookie.version > 0 or + (cookie.version == 0 and self.strict_ns_set_path)) and + not req_path.startswith(cookie.path)): + _debug(" path attribute %s is not a prefix of request " + "path %s", cookie.path, req_path) + return False + return True + + def set_ok_domain(self, cookie, request): + if self.is_blocked(cookie.domain): + _debug(" domain %s is in user block-list", cookie.domain) + return False + if self.is_not_allowed(cookie.domain): + _debug(" domain %s is not in user allow-list", cookie.domain) + return False + if cookie.domain_specified: + req_host, erhn = eff_request_host(request) + domain = cookie.domain + if self.strict_domain and (domain.count(".") >= 2): + # XXX This should probably be compared with the Konqueror + # (kcookiejar.cpp) and Mozilla implementations, but it's a + # losing battle. + i = domain.rfind(".") + j = domain.rfind(".", 0, i) + if j == 0: # domain like .foo.bar + tld = domain[i+1:] + sld = domain[j+1:i] + if sld.lower() in ("co", "ac", "com", "edu", "org", "net", + "gov", "mil", "int", "aero", "biz", "cat", "coop", + "info", "jobs", "mobi", "museum", "name", "pro", + "travel", "eu") and len(tld) == 2: + # domain like .co.uk + _debug(" country-code second level domain %s", domain) + return False + if domain.startswith("."): + undotted_domain = domain[1:] + else: + undotted_domain = domain + embedded_dots = (undotted_domain.find(".") >= 0) + if not embedded_dots and domain != ".local": + _debug(" non-local domain %s contains no embedded dot", + domain) + return False + if cookie.version == 0: + if (not erhn.endswith(domain) and + (not erhn.startswith(".") and + not ("."+erhn).endswith(domain))): + _debug(" effective request-host %s (even with added " + "initial dot) does not end with %s", + erhn, domain) + return False + if (cookie.version > 0 or + (self.strict_ns_domain & self.DomainRFC2965Match)): + if not domain_match(erhn, domain): + _debug(" effective request-host %s does not domain-match " + "%s", erhn, domain) + return False + if (cookie.version > 0 or + (self.strict_ns_domain & self.DomainStrictNoDots)): + host_prefix = req_host[:-len(domain)] + if (host_prefix.find(".") >= 0 and + not IPV4_RE.search(req_host)): + _debug(" host prefix %s for domain %s contains a dot", + host_prefix, domain) + return False + return True + + def set_ok_port(self, cookie, request): + if cookie.port_specified: + req_port = request_port(request) + if req_port is None: + req_port = "80" + else: + req_port = str(req_port) + for p in cookie.port.split(","): + try: + int(p) + except ValueError: + _debug(" bad port %s (not numeric)", p) + return False + if p == req_port: + break + else: + _debug(" request port (%s) not found in %s", + req_port, cookie.port) + return False + return True + + def return_ok(self, cookie, request): + """ + If you override .return_ok(), be sure to call this method. If it + returns false, so should your subclass (assuming your subclass wants to + be more strict about which cookies to return). + + """ + # Path has already been checked by .path_return_ok(), and domain + # blocking done by .domain_return_ok(). + _debug(" - checking cookie %s=%s", cookie.name, cookie.value) + + for n in "version", "verifiability", "secure", "expires", "port", "domain": + fn_name = "return_ok_"+n + fn = getattr(self, fn_name) + if not fn(cookie, request): + return False + return True + + def return_ok_version(self, cookie, request): + if cookie.version > 0 and not self.rfc2965: + _debug(" RFC 2965 cookies are switched off") + return False + elif cookie.version == 0 and not self.netscape: + _debug(" Netscape cookies are switched off") + return False + return True + + def return_ok_verifiability(self, cookie, request): + if request.unverifiable and is_third_party(request): + if cookie.version > 0 and self.strict_rfc2965_unverifiable: + _debug(" third-party RFC 2965 cookie during unverifiable " + "transaction") + return False + elif cookie.version == 0 and self.strict_ns_unverifiable: + _debug(" third-party Netscape cookie during unverifiable " + "transaction") + return False + return True + + def return_ok_secure(self, cookie, request): + if cookie.secure and request.type != "https": + _debug(" secure cookie with non-secure request") + return False + return True + + def return_ok_expires(self, cookie, request): + if cookie.is_expired(self._now): + _debug(" cookie expired") + return False + return True + + def return_ok_port(self, cookie, request): + if cookie.port: + req_port = request_port(request) + if req_port is None: + req_port = "80" + for p in cookie.port.split(","): + if p == req_port: + break + else: + _debug(" request port %s does not match cookie port %s", + req_port, cookie.port) + return False + return True + + def return_ok_domain(self, cookie, request): + req_host, erhn = eff_request_host(request) + domain = cookie.domain + + # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't + if (cookie.version == 0 and + (self.strict_ns_domain & self.DomainStrictNonDomain) and + not cookie.domain_specified and domain != erhn): + _debug(" cookie with unspecified domain does not string-compare " + "equal to request domain") + return False + + if cookie.version > 0 and not domain_match(erhn, domain): + _debug(" effective request-host name %s does not domain-match " + "RFC 2965 cookie domain %s", erhn, domain) + return False + if cookie.version == 0 and not ("."+erhn).endswith(domain): + _debug(" request-host %s does not match Netscape cookie domain " + "%s", req_host, domain) + return False + return True + + def domain_return_ok(self, domain, request): + # Liberal check of. This is here as an optimization to avoid + # having to load lots of MSIE cookie files unless necessary. + req_host, erhn = eff_request_host(request) + if not req_host.startswith("."): + req_host = "."+req_host + if not erhn.startswith("."): + erhn = "."+erhn + if not (req_host.endswith(domain) or erhn.endswith(domain)): + #_debug(" request domain %s does not match cookie domain %s", + # req_host, domain) + return False + + if self.is_blocked(domain): + _debug(" domain %s is in user block-list", domain) + return False + if self.is_not_allowed(domain): + _debug(" domain %s is not in user allow-list", domain) + return False + + return True + + def path_return_ok(self, path, request): + _debug("- checking cookie path=%s", path) + req_path = request_path(request) + if not req_path.startswith(path): + _debug(" %s does not path-match %s", req_path, path) + return False + return True + + +def vals_sorted_by_key(adict): + keys = sorted(adict.keys()) + return map(adict.get, keys) + +def deepvalues(mapping): + """Iterates over nested mapping, depth-first, in sorted order by key.""" + values = vals_sorted_by_key(mapping) + for obj in values: + mapping = False + try: + obj.items + except AttributeError: + pass + else: + mapping = True + for subobj in deepvalues(obj): + yield subobj + if not mapping: + yield obj + + +# Used as second parameter to dict.get() method, to distinguish absent +# dict key from one with a None value. +class Absent(object): pass + +class CookieJar(object): + """Collection of HTTP cookies. + + You may not need to know about this class: try + urllib.request.build_opener(HTTPCookieProcessor).open(url). + """ + + non_word_re = re.compile(r"\W") + quote_re = re.compile(r"([\"\\])") + strict_domain_re = re.compile(r"\.?[^.]*") + domain_re = re.compile(r"[^.]*") + dots_re = re.compile(r"^\.+") + + magic_re = re.compile(r"^\#LWP-Cookies-(\d+\.\d+)", re.ASCII) + + def __init__(self, policy=None): + if policy is None: + policy = DefaultCookiePolicy() + self._policy = policy + + self._cookies_lock = _threading.RLock() + self._cookies = {} + + def set_policy(self, policy): + self._policy = policy + + def _cookies_for_domain(self, domain, request): + cookies = [] + if not self._policy.domain_return_ok(domain, request): + return [] + _debug("Checking %s for cookies to return", domain) + cookies_by_path = self._cookies[domain] + for path in cookies_by_path.keys(): + if not self._policy.path_return_ok(path, request): + continue + cookies_by_name = cookies_by_path[path] + for cookie in cookies_by_name.values(): + if not self._policy.return_ok(cookie, request): + _debug(" not returning cookie") + continue + _debug(" it's a match") + cookies.append(cookie) + return cookies + + def _cookies_for_request(self, request): + """Return a list of cookies to be returned to server.""" + cookies = [] + for domain in self._cookies.keys(): + cookies.extend(self._cookies_for_domain(domain, request)) + return cookies + + def _cookie_attrs(self, cookies): + """Return a list of cookie-attributes to be returned to server. + + like ['foo="bar"; $Path="/"', ...] + + The $Version attribute is also added when appropriate (currently only + once per request). + + """ + # add cookies in order of most specific (ie. longest) path first + cookies.sort(key=lambda a: len(a.path), reverse=True) + + version_set = False + + attrs = [] + for cookie in cookies: + # set version of Cookie header + # XXX + # What should it be if multiple matching Set-Cookie headers have + # different versions themselves? + # Answer: there is no answer; was supposed to be settled by + # RFC 2965 errata, but that may never appear... + version = cookie.version + if not version_set: + version_set = True + if version > 0: + attrs.append("$Version=%s" % version) + + # quote cookie value if necessary + # (not for Netscape protocol, which already has any quotes + # intact, due to the poorly-specified Netscape Cookie: syntax) + if ((cookie.value is not None) and + self.non_word_re.search(cookie.value) and version > 0): + value = self.quote_re.sub(r"\\\1", cookie.value) + else: + value = cookie.value + + # add cookie-attributes to be returned in Cookie header + if cookie.value is None: + attrs.append(cookie.name) + else: + attrs.append("%s=%s" % (cookie.name, value)) + if version > 0: + if cookie.path_specified: + attrs.append('$Path="%s"' % cookie.path) + if cookie.domain.startswith("."): + domain = cookie.domain + if (not cookie.domain_initial_dot and + domain.startswith(".")): + domain = domain[1:] + attrs.append('$Domain="%s"' % domain) + if cookie.port is not None: + p = "$Port" + if cookie.port_specified: + p = p + ('="%s"' % cookie.port) + attrs.append(p) + + return attrs + + def add_cookie_header(self, request): + """Add correct Cookie: header to request (urllib.request.Request object). + + The Cookie2 header is also added unless policy.hide_cookie2 is true. + + """ + _debug("add_cookie_header") + self._cookies_lock.acquire() + try: + + self._policy._now = self._now = int(time.time()) + + cookies = self._cookies_for_request(request) + + attrs = self._cookie_attrs(cookies) + if attrs: + if not request.has_header("Cookie"): + request.add_unredirected_header( + "Cookie", "; ".join(attrs)) + + # if necessary, advertise that we know RFC 2965 + if (self._policy.rfc2965 and not self._policy.hide_cookie2 and + not request.has_header("Cookie2")): + for cookie in cookies: + if cookie.version != 1: + request.add_unredirected_header("Cookie2", '$Version="1"') + break + + finally: + self._cookies_lock.release() + + self.clear_expired_cookies() + + def _normalized_cookie_tuples(self, attrs_set): + """Return list of tuples containing normalised cookie information. + + attrs_set is the list of lists of key,value pairs extracted from + the Set-Cookie or Set-Cookie2 headers. + + Tuples are name, value, standard, rest, where name and value are the + cookie name and value, standard is a dictionary containing the standard + cookie-attributes (discard, secure, version, expires or max-age, + domain, path and port) and rest is a dictionary containing the rest of + the cookie-attributes. + + """ + cookie_tuples = [] + + boolean_attrs = "discard", "secure" + value_attrs = ("version", + "expires", "max-age", + "domain", "path", "port", + "comment", "commenturl") + + for cookie_attrs in attrs_set: + name, value = cookie_attrs[0] + + # Build dictionary of standard cookie-attributes (standard) and + # dictionary of other cookie-attributes (rest). + + # Note: expiry time is normalised to seconds since epoch. V0 + # cookies should have the Expires cookie-attribute, and V1 cookies + # should have Max-Age, but since V1 includes RFC 2109 cookies (and + # since V0 cookies may be a mish-mash of Netscape and RFC 2109), we + # accept either (but prefer Max-Age). + max_age_set = False + + bad_cookie = False + + standard = {} + rest = {} + for k, v in cookie_attrs[1:]: + lc = k.lower() + # don't lose case distinction for unknown fields + if lc in value_attrs or lc in boolean_attrs: + k = lc + if k in boolean_attrs and v is None: + # boolean cookie-attribute is present, but has no value + # (like "discard", rather than "port=80") + v = True + if k in standard: + # only first value is significant + continue + if k == "domain": + if v is None: + _debug(" missing value for domain attribute") + bad_cookie = True + break + # RFC 2965 section 3.3.3 + v = v.lower() + if k == "expires": + if max_age_set: + # Prefer max-age to expires (like Mozilla) + continue + if v is None: + _debug(" missing or invalid value for expires " + "attribute: treating as session cookie") + continue + if k == "max-age": + max_age_set = True + try: + v = int(v) + except ValueError: + _debug(" missing or invalid (non-numeric) value for " + "max-age attribute") + bad_cookie = True + break + # convert RFC 2965 Max-Age to seconds since epoch + # XXX Strictly you're supposed to follow RFC 2616 + # age-calculation rules. Remember that zero Max-Age is a + # is a request to discard (old and new) cookie, though. + k = "expires" + v = self._now + v + if (k in value_attrs) or (k in boolean_attrs): + if (v is None and + k not in ("port", "comment", "commenturl")): + _debug(" missing value for %s attribute" % k) + bad_cookie = True + break + standard[k] = v + else: + rest[k] = v + + if bad_cookie: + continue + + cookie_tuples.append((name, value, standard, rest)) + + return cookie_tuples + + def _cookie_from_cookie_tuple(self, tup, request): + # standard is dict of standard cookie-attributes, rest is dict of the + # rest of them + name, value, standard, rest = tup + + domain = standard.get("domain", Absent) + path = standard.get("path", Absent) + port = standard.get("port", Absent) + expires = standard.get("expires", Absent) + + # set the easy defaults + version = standard.get("version", None) + if version is not None: + try: + version = int(version) + except ValueError: + return None # invalid version, ignore cookie + secure = standard.get("secure", False) + # (discard is also set if expires is Absent) + discard = standard.get("discard", False) + comment = standard.get("comment", None) + comment_url = standard.get("commenturl", None) + + # set default path + if path is not Absent and path != "": + path_specified = True + path = escape_path(path) + else: + path_specified = False + path = request_path(request) + i = path.rfind("/") + if i != -1: + if version == 0: + # Netscape spec parts company from reality here + path = path[:i] + else: + path = path[:i+1] + if len(path) == 0: path = "/" + + # set default domain + domain_specified = domain is not Absent + # but first we have to remember whether it starts with a dot + domain_initial_dot = False + if domain_specified: + domain_initial_dot = bool(domain.startswith(".")) + if domain is Absent: + req_host, erhn = eff_request_host(request) + domain = erhn + elif not domain.startswith("."): + domain = "."+domain + + # set default port + port_specified = False + if port is not Absent: + if port is None: + # Port attr present, but has no value: default to request port. + # Cookie should then only be sent back on that port. + port = request_port(request) + else: + port_specified = True + port = re.sub(r"\s+", "", port) + else: + # No port attr present. Cookie can be sent back on any port. + port = None + + # set default expires and discard + if expires is Absent: + expires = None + discard = True + elif expires <= self._now: + # Expiry date in past is request to delete cookie. This can't be + # in DefaultCookiePolicy, because can't delete cookies there. + try: + self.clear(domain, path, name) + except KeyError: + pass + _debug("Expiring cookie, domain='%s', path='%s', name='%s'", + domain, path, name) + return None + + return Cookie(version, + name, value, + port, port_specified, + domain, domain_specified, domain_initial_dot, + path, path_specified, + secure, + expires, + discard, + comment, + comment_url, + rest) + + def _cookies_from_attrs_set(self, attrs_set, request): + cookie_tuples = self._normalized_cookie_tuples(attrs_set) + + cookies = [] + for tup in cookie_tuples: + cookie = self._cookie_from_cookie_tuple(tup, request) + if cookie: cookies.append(cookie) + return cookies + + def _process_rfc2109_cookies(self, cookies): + rfc2109_as_ns = getattr(self._policy, 'rfc2109_as_netscape', None) + if rfc2109_as_ns is None: + rfc2109_as_ns = not self._policy.rfc2965 + for cookie in cookies: + if cookie.version == 1: + cookie.rfc2109 = True + if rfc2109_as_ns: + # treat 2109 cookies as Netscape cookies rather than + # as RFC2965 cookies + cookie.version = 0 + + def make_cookies(self, response, request): + """Return sequence of Cookie objects extracted from response object.""" + # get cookie-attributes for RFC 2965 and Netscape protocols + headers = response.info() + rfc2965_hdrs = headers.get_all("Set-Cookie2", []) + ns_hdrs = headers.get_all("Set-Cookie", []) + + rfc2965 = self._policy.rfc2965 + netscape = self._policy.netscape + + if ((not rfc2965_hdrs and not ns_hdrs) or + (not ns_hdrs and not rfc2965) or + (not rfc2965_hdrs and not netscape) or + (not netscape and not rfc2965)): + return [] # no relevant cookie headers: quick exit + + try: + cookies = self._cookies_from_attrs_set( + split_header_words(rfc2965_hdrs), request) + except Exception: + _warn_unhandled_exception() + cookies = [] + + if ns_hdrs and netscape: + try: + # RFC 2109 and Netscape cookies + ns_cookies = self._cookies_from_attrs_set( + parse_ns_headers(ns_hdrs), request) + except Exception: + _warn_unhandled_exception() + ns_cookies = [] + self._process_rfc2109_cookies(ns_cookies) + + # Look for Netscape cookies (from Set-Cookie headers) that match + # corresponding RFC 2965 cookies (from Set-Cookie2 headers). + # For each match, keep the RFC 2965 cookie and ignore the Netscape + # cookie (RFC 2965 section 9.1). Actually, RFC 2109 cookies are + # bundled in with the Netscape cookies for this purpose, which is + # reasonable behaviour. + if rfc2965: + lookup = {} + for cookie in cookies: + lookup[(cookie.domain, cookie.path, cookie.name)] = None + + def no_matching_rfc2965(ns_cookie, lookup=lookup): + key = ns_cookie.domain, ns_cookie.path, ns_cookie.name + return key not in lookup + ns_cookies = filter(no_matching_rfc2965, ns_cookies) + + if ns_cookies: + cookies.extend(ns_cookies) + + return cookies + + def set_cookie_if_ok(self, cookie, request): + """Set a cookie if policy says it's OK to do so.""" + self._cookies_lock.acquire() + try: + self._policy._now = self._now = int(time.time()) + + if self._policy.set_ok(cookie, request): + self.set_cookie(cookie) + + + finally: + self._cookies_lock.release() + + def set_cookie(self, cookie): + """Set a cookie, without checking whether or not it should be set.""" + c = self._cookies + self._cookies_lock.acquire() + try: + if cookie.domain not in c: c[cookie.domain] = {} + c2 = c[cookie.domain] + if cookie.path not in c2: c2[cookie.path] = {} + c3 = c2[cookie.path] + c3[cookie.name] = cookie + finally: + self._cookies_lock.release() + + def extract_cookies(self, response, request): + """Extract cookies from response, where allowable given the request.""" + _debug("extract_cookies: %s", response.info()) + self._cookies_lock.acquire() + try: + self._policy._now = self._now = int(time.time()) + + for cookie in self.make_cookies(response, request): + if self._policy.set_ok(cookie, request): + _debug(" setting cookie: %s", cookie) + self.set_cookie(cookie) + finally: + self._cookies_lock.release() + + def clear(self, domain=None, path=None, name=None): + """Clear some cookies. + + Invoking this method without arguments will clear all cookies. If + given a single argument, only cookies belonging to that domain will be + removed. If given two arguments, cookies belonging to the specified + path within that domain are removed. If given three arguments, then + the cookie with the specified name, path and domain is removed. + + Raises KeyError if no matching cookie exists. + + """ + if name is not None: + if (domain is None) or (path is None): + raise ValueError( + "domain and path must be given to remove a cookie by name") + del self._cookies[domain][path][name] + elif path is not None: + if domain is None: + raise ValueError( + "domain must be given to remove cookies by path") + del self._cookies[domain][path] + elif domain is not None: + del self._cookies[domain] + else: + self._cookies = {} + + def clear_session_cookies(self): + """Discard all session cookies. + + Note that the .save() method won't save session cookies anyway, unless + you ask otherwise by passing a true ignore_discard argument. + + """ + self._cookies_lock.acquire() + try: + for cookie in self: + if cookie.discard: + self.clear(cookie.domain, cookie.path, cookie.name) + finally: + self._cookies_lock.release() + + def clear_expired_cookies(self): + """Discard all expired cookies. + + You probably don't need to call this method: expired cookies are never + sent back to the server (provided you're using DefaultCookiePolicy), + this method is called by CookieJar itself every so often, and the + .save() method won't save expired cookies anyway (unless you ask + otherwise by passing a true ignore_expires argument). + + """ + self._cookies_lock.acquire() + try: + now = time.time() + for cookie in self: + if cookie.is_expired(now): + self.clear(cookie.domain, cookie.path, cookie.name) + finally: + self._cookies_lock.release() + + def __iter__(self): + return deepvalues(self._cookies) + + def __len__(self): + """Return number of contained cookies.""" + i = 0 + for cookie in self: i = i + 1 + return i + + @as_native_str() + def __repr__(self): + r = [] + for cookie in self: r.append(repr(cookie)) + return "<%s[%s]>" % (self.__class__, ", ".join(r)) + + def __str__(self): + r = [] + for cookie in self: r.append(str(cookie)) + return "<%s[%s]>" % (self.__class__, ", ".join(r)) + + +# derives from IOError for backwards-compatibility with Python 2.4.0 +class LoadError(IOError): pass + +class FileCookieJar(CookieJar): + """CookieJar that can be loaded from and saved to a file.""" + + def __init__(self, filename=None, delayload=False, policy=None): + """ + Cookies are NOT loaded from the named file until either the .load() or + .revert() method is called. + + """ + CookieJar.__init__(self, policy) + if filename is not None: + try: + filename+"" + except: + raise ValueError("filename must be string-like") + self.filename = filename + self.delayload = bool(delayload) + + def save(self, filename=None, ignore_discard=False, ignore_expires=False): + """Save cookies to a file.""" + raise NotImplementedError() + + def load(self, filename=None, ignore_discard=False, ignore_expires=False): + """Load cookies from a file.""" + if filename is None: + if self.filename is not None: filename = self.filename + else: raise ValueError(MISSING_FILENAME_TEXT) + + f = open(filename) + try: + self._really_load(f, filename, ignore_discard, ignore_expires) + finally: + f.close() + + def revert(self, filename=None, + ignore_discard=False, ignore_expires=False): + """Clear all cookies and reload cookies from a saved file. + + Raises LoadError (or IOError) if reversion is not successful; the + object's state will not be altered if this happens. + + """ + if filename is None: + if self.filename is not None: filename = self.filename + else: raise ValueError(MISSING_FILENAME_TEXT) + + self._cookies_lock.acquire() + try: + + old_state = copy.deepcopy(self._cookies) + self._cookies = {} + try: + self.load(filename, ignore_discard, ignore_expires) + except (LoadError, IOError): + self._cookies = old_state + raise + + finally: + self._cookies_lock.release() + + +def lwp_cookie_str(cookie): + """Return string representation of Cookie in an the LWP cookie file format. + + Actually, the format is extended a bit -- see module docstring. + + """ + h = [(cookie.name, cookie.value), + ("path", cookie.path), + ("domain", cookie.domain)] + if cookie.port is not None: h.append(("port", cookie.port)) + if cookie.path_specified: h.append(("path_spec", None)) + if cookie.port_specified: h.append(("port_spec", None)) + if cookie.domain_initial_dot: h.append(("domain_dot", None)) + if cookie.secure: h.append(("secure", None)) + if cookie.expires: h.append(("expires", + time2isoz(float(cookie.expires)))) + if cookie.discard: h.append(("discard", None)) + if cookie.comment: h.append(("comment", cookie.comment)) + if cookie.comment_url: h.append(("commenturl", cookie.comment_url)) + + keys = sorted(cookie._rest.keys()) + for k in keys: + h.append((k, str(cookie._rest[k]))) + + h.append(("version", str(cookie.version))) + + return join_header_words([h]) + +class LWPCookieJar(FileCookieJar): + """ + The LWPCookieJar saves a sequence of "Set-Cookie3" lines. + "Set-Cookie3" is the format used by the libwww-perl libary, not known + to be compatible with any browser, but which is easy to read and + doesn't lose information about RFC 2965 cookies. + + Additional methods + + as_lwp_str(ignore_discard=True, ignore_expired=True) + + """ + + def as_lwp_str(self, ignore_discard=True, ignore_expires=True): + """Return cookies as a string of "\\n"-separated "Set-Cookie3" headers. + + ignore_discard and ignore_expires: see docstring for FileCookieJar.save + + """ + now = time.time() + r = [] + for cookie in self: + if not ignore_discard and cookie.discard: + continue + if not ignore_expires and cookie.is_expired(now): + continue + r.append("Set-Cookie3: %s" % lwp_cookie_str(cookie)) + return "\n".join(r+[""]) + + def save(self, filename=None, ignore_discard=False, ignore_expires=False): + if filename is None: + if self.filename is not None: filename = self.filename + else: raise ValueError(MISSING_FILENAME_TEXT) + + f = open(filename, "w") + try: + # There really isn't an LWP Cookies 2.0 format, but this indicates + # that there is extra information in here (domain_dot and + # port_spec) while still being compatible with libwww-perl, I hope. + f.write("#LWP-Cookies-2.0\n") + f.write(self.as_lwp_str(ignore_discard, ignore_expires)) + finally: + f.close() + + def _really_load(self, f, filename, ignore_discard, ignore_expires): + magic = f.readline() + if not self.magic_re.search(magic): + msg = ("%r does not look like a Set-Cookie3 (LWP) format " + "file" % filename) + raise LoadError(msg) + + now = time.time() + + header = "Set-Cookie3:" + boolean_attrs = ("port_spec", "path_spec", "domain_dot", + "secure", "discard") + value_attrs = ("version", + "port", "path", "domain", + "expires", + "comment", "commenturl") + + try: + while 1: + line = f.readline() + if line == "": break + if not line.startswith(header): + continue + line = line[len(header):].strip() + + for data in split_header_words([line]): + name, value = data[0] + standard = {} + rest = {} + for k in boolean_attrs: + standard[k] = False + for k, v in data[1:]: + if k is not None: + lc = k.lower() + else: + lc = None + # don't lose case distinction for unknown fields + if (lc in value_attrs) or (lc in boolean_attrs): + k = lc + if k in boolean_attrs: + if v is None: v = True + standard[k] = v + elif k in value_attrs: + standard[k] = v + else: + rest[k] = v + + h = standard.get + expires = h("expires") + discard = h("discard") + if expires is not None: + expires = iso2time(expires) + if expires is None: + discard = True + domain = h("domain") + domain_specified = domain.startswith(".") + c = Cookie(h("version"), name, value, + h("port"), h("port_spec"), + domain, domain_specified, h("domain_dot"), + h("path"), h("path_spec"), + h("secure"), + expires, + discard, + h("comment"), + h("commenturl"), + rest) + if not ignore_discard and c.discard: + continue + if not ignore_expires and c.is_expired(now): + continue + self.set_cookie(c) + + except IOError: + raise + except Exception: + _warn_unhandled_exception() + raise LoadError("invalid Set-Cookie3 format file %r: %r" % + (filename, line)) + + +class MozillaCookieJar(FileCookieJar): + """ + + WARNING: you may want to backup your browser's cookies file if you use + this class to save cookies. I *think* it works, but there have been + bugs in the past! + + This class differs from CookieJar only in the format it uses to save and + load cookies to and from a file. This class uses the Mozilla/Netscape + `cookies.txt' format. lynx uses this file format, too. + + Don't expect cookies saved while the browser is running to be noticed by + the browser (in fact, Mozilla on unix will overwrite your saved cookies if + you change them on disk while it's running; on Windows, you probably can't + save at all while the browser is running). + + Note that the Mozilla/Netscape format will downgrade RFC2965 cookies to + Netscape cookies on saving. + + In particular, the cookie version and port number information is lost, + together with information about whether or not Path, Port and Discard were + specified by the Set-Cookie2 (or Set-Cookie) header, and whether or not the + domain as set in the HTTP header started with a dot (yes, I'm aware some + domains in Netscape files start with a dot and some don't -- trust me, you + really don't want to know any more about this). + + Note that though Mozilla and Netscape use the same format, they use + slightly different headers. The class saves cookies using the Netscape + header by default (Mozilla can cope with that). + + """ + magic_re = re.compile("#( Netscape)? HTTP Cookie File") + header = """\ +# Netscape HTTP Cookie File +# http://www.netscape.com/newsref/std/cookie_spec.html +# This is a generated file! Do not edit. + +""" + + def _really_load(self, f, filename, ignore_discard, ignore_expires): + now = time.time() + + magic = f.readline() + if not self.magic_re.search(magic): + f.close() + raise LoadError( + "%r does not look like a Netscape format cookies file" % + filename) + + try: + while 1: + line = f.readline() + if line == "": break + + # last field may be absent, so keep any trailing tab + if line.endswith("\n"): line = line[:-1] + + # skip comments and blank lines XXX what is $ for? + if (line.strip().startswith(("#", "$")) or + line.strip() == ""): + continue + + domain, domain_specified, path, secure, expires, name, value = \ + line.split("\t") + secure = (secure == "TRUE") + domain_specified = (domain_specified == "TRUE") + if name == "": + # cookies.txt regards 'Set-Cookie: foo' as a cookie + # with no name, whereas http.cookiejar regards it as a + # cookie with no value. + name = value + value = None + + initial_dot = domain.startswith(".") + assert domain_specified == initial_dot + + discard = False + if expires == "": + expires = None + discard = True + + # assume path_specified is false + c = Cookie(0, name, value, + None, False, + domain, domain_specified, initial_dot, + path, False, + secure, + expires, + discard, + None, + None, + {}) + if not ignore_discard and c.discard: + continue + if not ignore_expires and c.is_expired(now): + continue + self.set_cookie(c) + + except IOError: + raise + except Exception: + _warn_unhandled_exception() + raise LoadError("invalid Netscape format cookies file %r: %r" % + (filename, line)) + + def save(self, filename=None, ignore_discard=False, ignore_expires=False): + if filename is None: + if self.filename is not None: filename = self.filename + else: raise ValueError(MISSING_FILENAME_TEXT) + + f = open(filename, "w") + try: + f.write(self.header) + now = time.time() + for cookie in self: + if not ignore_discard and cookie.discard: + continue + if not ignore_expires and cookie.is_expired(now): + continue + if cookie.secure: secure = "TRUE" + else: secure = "FALSE" + if cookie.domain.startswith("."): initial_dot = "TRUE" + else: initial_dot = "FALSE" + if cookie.expires is not None: + expires = str(cookie.expires) + else: + expires = "" + if cookie.value is None: + # cookies.txt regards 'Set-Cookie: foo' as a cookie + # with no name, whereas http.cookiejar regards it as a + # cookie with no value. + name = "" + value = cookie.name + else: + name = cookie.name + value = cookie.value + f.write( + "\t".join([cookie.domain, initial_dot, cookie.path, + secure, expires, name, value])+ + "\n") + finally: + f.close() diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/cookies.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/cookies.py new file mode 100644 index 0000000..8bb61e2 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/cookies.py @@ -0,0 +1,598 @@ +#### +# Copyright 2000 by Timothy O'Malley +# +# All Rights Reserved +# +# Permission to use, copy, modify, and distribute this software +# and its documentation for any purpose and without fee is hereby +# granted, provided that the above copyright notice appear in all +# copies and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of +# Timothy O'Malley not be used in advertising or publicity +# pertaining to distribution of the software without specific, written +# prior permission. +# +# Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS, IN NO EVENT SHALL Timothy O'Malley 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. +# +#### +# +# Id: Cookie.py,v 2.29 2000/08/23 05:28:49 timo Exp +# by Timothy O'Malley +# +# Cookie.py is a Python module for the handling of HTTP +# cookies as a Python dictionary. See RFC 2109 for more +# information on cookies. +# +# The original idea to treat Cookies as a dictionary came from +# Dave Mitchell (davem@magnet.com) in 1995, when he released the +# first version of nscookie.py. +# +#### + +r""" +http.cookies module ported to python-future from Py3.3 + +Here's a sample session to show how to use this module. +At the moment, this is the only documentation. + +The Basics +---------- + +Importing is easy... + + >>> from http import cookies + +Most of the time you start by creating a cookie. + + >>> C = cookies.SimpleCookie() + +Once you've created your Cookie, you can add values just as if it were +a dictionary. + + >>> C = cookies.SimpleCookie() + >>> C["fig"] = "newton" + >>> C["sugar"] = "wafer" + >>> C.output() + 'Set-Cookie: fig=newton\r\nSet-Cookie: sugar=wafer' + +Notice that the printable representation of a Cookie is the +appropriate format for a Set-Cookie: header. This is the +default behavior. You can change the header and printed +attributes by using the .output() function + + >>> C = cookies.SimpleCookie() + >>> C["rocky"] = "road" + >>> C["rocky"]["path"] = "/cookie" + >>> print(C.output(header="Cookie:")) + Cookie: rocky=road; Path=/cookie + >>> print(C.output(attrs=[], header="Cookie:")) + Cookie: rocky=road + +The load() method of a Cookie extracts cookies from a string. In a +CGI script, you would use this method to extract the cookies from the +HTTP_COOKIE environment variable. + + >>> C = cookies.SimpleCookie() + >>> C.load("chips=ahoy; vienna=finger") + >>> C.output() + 'Set-Cookie: chips=ahoy\r\nSet-Cookie: vienna=finger' + +The load() method is darn-tootin smart about identifying cookies +within a string. Escaped quotation marks, nested semicolons, and other +such trickeries do not confuse it. + + >>> C = cookies.SimpleCookie() + >>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";') + >>> print(C) + Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;" + +Each element of the Cookie also supports all of the RFC 2109 +Cookie attributes. Here's an example which sets the Path +attribute. + + >>> C = cookies.SimpleCookie() + >>> C["oreo"] = "doublestuff" + >>> C["oreo"]["path"] = "/" + >>> print(C) + Set-Cookie: oreo=doublestuff; Path=/ + +Each dictionary element has a 'value' attribute, which gives you +back the value associated with the key. + + >>> C = cookies.SimpleCookie() + >>> C["twix"] = "none for you" + >>> C["twix"].value + 'none for you' + +The SimpleCookie expects that all values should be standard strings. +Just to be sure, SimpleCookie invokes the str() builtin to convert +the value to a string, when the values are set dictionary-style. + + >>> C = cookies.SimpleCookie() + >>> C["number"] = 7 + >>> C["string"] = "seven" + >>> C["number"].value + '7' + >>> C["string"].value + 'seven' + >>> C.output() + 'Set-Cookie: number=7\r\nSet-Cookie: string=seven' + +Finis. +""" +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future.builtins import chr, dict, int, str +from future.utils import PY2, as_native_str + +# +# Import our required modules +# +import re +if PY2: + re.ASCII = 0 # for py2 compatibility +import string + +__all__ = ["CookieError", "BaseCookie", "SimpleCookie"] + +_nulljoin = ''.join +_semispacejoin = '; '.join +_spacejoin = ' '.join + +# +# Define an exception visible to External modules +# +class CookieError(Exception): + pass + + +# These quoting routines conform to the RFC2109 specification, which in +# turn references the character definitions from RFC2068. They provide +# a two-way quoting algorithm. Any non-text character is translated +# into a 4 character sequence: a forward-slash followed by the +# three-digit octal equivalent of the character. Any '\' or '"' is +# quoted with a preceeding '\' slash. +# +# These are taken from RFC2068 and RFC2109. +# _LegalChars is the list of chars which don't require "'s +# _Translator hash-table for fast quoting +# +_LegalChars = string.ascii_letters + string.digits + "!#$%&'*+-.^_`|~:" +_Translator = { + '\000' : '\\000', '\001' : '\\001', '\002' : '\\002', + '\003' : '\\003', '\004' : '\\004', '\005' : '\\005', + '\006' : '\\006', '\007' : '\\007', '\010' : '\\010', + '\011' : '\\011', '\012' : '\\012', '\013' : '\\013', + '\014' : '\\014', '\015' : '\\015', '\016' : '\\016', + '\017' : '\\017', '\020' : '\\020', '\021' : '\\021', + '\022' : '\\022', '\023' : '\\023', '\024' : '\\024', + '\025' : '\\025', '\026' : '\\026', '\027' : '\\027', + '\030' : '\\030', '\031' : '\\031', '\032' : '\\032', + '\033' : '\\033', '\034' : '\\034', '\035' : '\\035', + '\036' : '\\036', '\037' : '\\037', + + # Because of the way browsers really handle cookies (as opposed + # to what the RFC says) we also encode , and ; + + ',' : '\\054', ';' : '\\073', + + '"' : '\\"', '\\' : '\\\\', + + '\177' : '\\177', '\200' : '\\200', '\201' : '\\201', + '\202' : '\\202', '\203' : '\\203', '\204' : '\\204', + '\205' : '\\205', '\206' : '\\206', '\207' : '\\207', + '\210' : '\\210', '\211' : '\\211', '\212' : '\\212', + '\213' : '\\213', '\214' : '\\214', '\215' : '\\215', + '\216' : '\\216', '\217' : '\\217', '\220' : '\\220', + '\221' : '\\221', '\222' : '\\222', '\223' : '\\223', + '\224' : '\\224', '\225' : '\\225', '\226' : '\\226', + '\227' : '\\227', '\230' : '\\230', '\231' : '\\231', + '\232' : '\\232', '\233' : '\\233', '\234' : '\\234', + '\235' : '\\235', '\236' : '\\236', '\237' : '\\237', + '\240' : '\\240', '\241' : '\\241', '\242' : '\\242', + '\243' : '\\243', '\244' : '\\244', '\245' : '\\245', + '\246' : '\\246', '\247' : '\\247', '\250' : '\\250', + '\251' : '\\251', '\252' : '\\252', '\253' : '\\253', + '\254' : '\\254', '\255' : '\\255', '\256' : '\\256', + '\257' : '\\257', '\260' : '\\260', '\261' : '\\261', + '\262' : '\\262', '\263' : '\\263', '\264' : '\\264', + '\265' : '\\265', '\266' : '\\266', '\267' : '\\267', + '\270' : '\\270', '\271' : '\\271', '\272' : '\\272', + '\273' : '\\273', '\274' : '\\274', '\275' : '\\275', + '\276' : '\\276', '\277' : '\\277', '\300' : '\\300', + '\301' : '\\301', '\302' : '\\302', '\303' : '\\303', + '\304' : '\\304', '\305' : '\\305', '\306' : '\\306', + '\307' : '\\307', '\310' : '\\310', '\311' : '\\311', + '\312' : '\\312', '\313' : '\\313', '\314' : '\\314', + '\315' : '\\315', '\316' : '\\316', '\317' : '\\317', + '\320' : '\\320', '\321' : '\\321', '\322' : '\\322', + '\323' : '\\323', '\324' : '\\324', '\325' : '\\325', + '\326' : '\\326', '\327' : '\\327', '\330' : '\\330', + '\331' : '\\331', '\332' : '\\332', '\333' : '\\333', + '\334' : '\\334', '\335' : '\\335', '\336' : '\\336', + '\337' : '\\337', '\340' : '\\340', '\341' : '\\341', + '\342' : '\\342', '\343' : '\\343', '\344' : '\\344', + '\345' : '\\345', '\346' : '\\346', '\347' : '\\347', + '\350' : '\\350', '\351' : '\\351', '\352' : '\\352', + '\353' : '\\353', '\354' : '\\354', '\355' : '\\355', + '\356' : '\\356', '\357' : '\\357', '\360' : '\\360', + '\361' : '\\361', '\362' : '\\362', '\363' : '\\363', + '\364' : '\\364', '\365' : '\\365', '\366' : '\\366', + '\367' : '\\367', '\370' : '\\370', '\371' : '\\371', + '\372' : '\\372', '\373' : '\\373', '\374' : '\\374', + '\375' : '\\375', '\376' : '\\376', '\377' : '\\377' + } + +def _quote(str, LegalChars=_LegalChars): + r"""Quote a string for use in a cookie header. + + If the string does not need to be double-quoted, then just return the + string. Otherwise, surround the string in doublequotes and quote + (with a \) special characters. + """ + if all(c in LegalChars for c in str): + return str + else: + return '"' + _nulljoin(_Translator.get(s, s) for s in str) + '"' + + +_OctalPatt = re.compile(r"\\[0-3][0-7][0-7]") +_QuotePatt = re.compile(r"[\\].") + +def _unquote(mystr): + # If there aren't any doublequotes, + # then there can't be any special characters. See RFC 2109. + if len(mystr) < 2: + return mystr + if mystr[0] != '"' or mystr[-1] != '"': + return mystr + + # We have to assume that we must decode this string. + # Down to work. + + # Remove the "s + mystr = mystr[1:-1] + + # Check for special sequences. Examples: + # \012 --> \n + # \" --> " + # + i = 0 + n = len(mystr) + res = [] + while 0 <= i < n: + o_match = _OctalPatt.search(mystr, i) + q_match = _QuotePatt.search(mystr, i) + if not o_match and not q_match: # Neither matched + res.append(mystr[i:]) + break + # else: + j = k = -1 + if o_match: + j = o_match.start(0) + if q_match: + k = q_match.start(0) + if q_match and (not o_match or k < j): # QuotePatt matched + res.append(mystr[i:k]) + res.append(mystr[k+1]) + i = k + 2 + else: # OctalPatt matched + res.append(mystr[i:j]) + res.append(chr(int(mystr[j+1:j+4], 8))) + i = j + 4 + return _nulljoin(res) + +# The _getdate() routine is used to set the expiration time in the cookie's HTTP +# header. By default, _getdate() returns the current time in the appropriate +# "expires" format for a Set-Cookie header. The one optional argument is an +# offset from now, in seconds. For example, an offset of -3600 means "one hour +# ago". The offset may be a floating point number. +# + +_weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + +_monthname = [None, + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + +def _getdate(future=0, weekdayname=_weekdayname, monthname=_monthname): + from time import gmtime, time + now = time() + year, month, day, hh, mm, ss, wd, y, z = gmtime(now + future) + return "%s, %02d %3s %4d %02d:%02d:%02d GMT" % \ + (weekdayname[wd], day, monthname[month], year, hh, mm, ss) + + +class Morsel(dict): + """A class to hold ONE (key, value) pair. + + In a cookie, each such pair may have several attributes, so this class is + used to keep the attributes associated with the appropriate key,value pair. + This class also includes a coded_value attribute, which is used to hold + the network representation of the value. This is most useful when Python + objects are pickled for network transit. + """ + # RFC 2109 lists these attributes as reserved: + # path comment domain + # max-age secure version + # + # For historical reasons, these attributes are also reserved: + # expires + # + # This is an extension from Microsoft: + # httponly + # + # This dictionary provides a mapping from the lowercase + # variant on the left to the appropriate traditional + # formatting on the right. + _reserved = { + "expires" : "expires", + "path" : "Path", + "comment" : "Comment", + "domain" : "Domain", + "max-age" : "Max-Age", + "secure" : "secure", + "httponly" : "httponly", + "version" : "Version", + } + + _flags = set(['secure', 'httponly']) + + def __init__(self): + # Set defaults + self.key = self.value = self.coded_value = None + + # Set default attributes + for key in self._reserved: + dict.__setitem__(self, key, "") + + def __setitem__(self, K, V): + K = K.lower() + if not K in self._reserved: + raise CookieError("Invalid Attribute %s" % K) + dict.__setitem__(self, K, V) + + def isReservedKey(self, K): + return K.lower() in self._reserved + + def set(self, key, val, coded_val, LegalChars=_LegalChars): + # First we verify that the key isn't a reserved word + # Second we make sure it only contains legal characters + if key.lower() in self._reserved: + raise CookieError("Attempt to set a reserved key: %s" % key) + if any(c not in LegalChars for c in key): + raise CookieError("Illegal key value: %s" % key) + + # It's a good key, so save it. + self.key = key + self.value = val + self.coded_value = coded_val + + def output(self, attrs=None, header="Set-Cookie:"): + return "%s %s" % (header, self.OutputString(attrs)) + + __str__ = output + + @as_native_str() + def __repr__(self): + if PY2 and isinstance(self.value, unicode): + val = str(self.value) # make it a newstr to remove the u prefix + else: + val = self.value + return '<%s: %s=%s>' % (self.__class__.__name__, + str(self.key), repr(val)) + + def js_output(self, attrs=None): + # Print javascript + return """ + + """ % (self.OutputString(attrs).replace('"', r'\"')) + + def OutputString(self, attrs=None): + # Build up our result + # + result = [] + append = result.append + + # First, the key=value pair + append("%s=%s" % (self.key, self.coded_value)) + + # Now add any defined attributes + if attrs is None: + attrs = self._reserved + items = sorted(self.items()) + for key, value in items: + if value == "": + continue + if key not in attrs: + continue + if key == "expires" and isinstance(value, int): + append("%s=%s" % (self._reserved[key], _getdate(value))) + elif key == "max-age" and isinstance(value, int): + append("%s=%d" % (self._reserved[key], value)) + elif key == "secure": + append(str(self._reserved[key])) + elif key == "httponly": + append(str(self._reserved[key])) + else: + append("%s=%s" % (self._reserved[key], value)) + + # Return the result + return _semispacejoin(result) + + +# +# Pattern for finding cookie +# +# This used to be strict parsing based on the RFC2109 and RFC2068 +# specifications. I have since discovered that MSIE 3.0x doesn't +# follow the character rules outlined in those specs. As a +# result, the parsing rules here are less strict. +# + +_LegalCharsPatt = r"[\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=]" +_CookiePattern = re.compile(r""" + (?x) # This is a verbose pattern + (?P # Start of group 'key' + """ + _LegalCharsPatt + r"""+? # Any word of at least one letter + ) # End of group 'key' + ( # Optional group: there may not be a value. + \s*=\s* # Equal Sign + (?P # Start of group 'val' + "(?:[^\\"]|\\.)*" # Any doublequoted string + | # or + \w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT # Special case for "expires" attr + | # or + """ + _LegalCharsPatt + r"""* # Any word or empty string + ) # End of group 'val' + )? # End of optional value group + \s* # Any number of spaces. + (\s+|;|$) # Ending either at space, semicolon, or EOS. + """, re.ASCII) # May be removed if safe. + + +# At long last, here is the cookie class. Using this class is almost just like +# using a dictionary. See this module's docstring for example usage. +# +class BaseCookie(dict): + """A container class for a set of Morsels.""" + + def value_decode(self, val): + """real_value, coded_value = value_decode(STRING) + Called prior to setting a cookie's value from the network + representation. The VALUE is the value read from HTTP + header. + Override this function to modify the behavior of cookies. + """ + return val, val + + def value_encode(self, val): + """real_value, coded_value = value_encode(VALUE) + Called prior to setting a cookie's value from the dictionary + representation. The VALUE is the value being assigned. + Override this function to modify the behavior of cookies. + """ + strval = str(val) + return strval, strval + + def __init__(self, input=None): + if input: + self.load(input) + + def __set(self, key, real_value, coded_value): + """Private method for setting a cookie's value""" + M = self.get(key, Morsel()) + M.set(key, real_value, coded_value) + dict.__setitem__(self, key, M) + + def __setitem__(self, key, value): + """Dictionary style assignment.""" + rval, cval = self.value_encode(value) + self.__set(key, rval, cval) + + def output(self, attrs=None, header="Set-Cookie:", sep="\015\012"): + """Return a string suitable for HTTP.""" + result = [] + items = sorted(self.items()) + for key, value in items: + result.append(value.output(attrs, header)) + return sep.join(result) + + __str__ = output + + @as_native_str() + def __repr__(self): + l = [] + items = sorted(self.items()) + for key, value in items: + if PY2 and isinstance(value.value, unicode): + val = str(value.value) # make it a newstr to remove the u prefix + else: + val = value.value + l.append('%s=%s' % (str(key), repr(val))) + return '<%s: %s>' % (self.__class__.__name__, _spacejoin(l)) + + def js_output(self, attrs=None): + """Return a string suitable for JavaScript.""" + result = [] + items = sorted(self.items()) + for key, value in items: + result.append(value.js_output(attrs)) + return _nulljoin(result) + + def load(self, rawdata): + """Load cookies from a string (presumably HTTP_COOKIE) or + from a dictionary. Loading cookies from a dictionary 'd' + is equivalent to calling: + map(Cookie.__setitem__, d.keys(), d.values()) + """ + if isinstance(rawdata, str): + self.__parse_string(rawdata) + else: + # self.update() wouldn't call our custom __setitem__ + for key, value in rawdata.items(): + self[key] = value + return + + def __parse_string(self, mystr, patt=_CookiePattern): + i = 0 # Our starting point + n = len(mystr) # Length of string + M = None # current morsel + + while 0 <= i < n: + # Start looking for a cookie + match = patt.search(mystr, i) + if not match: + # No more cookies + break + + key, value = match.group("key"), match.group("val") + + i = match.end(0) + + # Parse the key, value in case it's metainfo + if key[0] == "$": + # We ignore attributes which pertain to the cookie + # mechanism as a whole. See RFC 2109. + # (Does anyone care?) + if M: + M[key[1:]] = value + elif key.lower() in Morsel._reserved: + if M: + if value is None: + if key.lower() in Morsel._flags: + M[key] = True + else: + M[key] = _unquote(value) + elif value is not None: + rval, cval = self.value_decode(value) + self.__set(key, rval, cval) + M = self[key] + + +class SimpleCookie(BaseCookie): + """ + SimpleCookie supports strings as cookie values. When setting + the value using the dictionary assignment notation, SimpleCookie + calls the builtin str() to convert the value to a string. Values + received from HTTP are kept as strings. + """ + def value_decode(self, val): + return _unquote(val), val + + def value_encode(self, val): + strval = str(val) + return strval, _quote(strval) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/server.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/server.py new file mode 100644 index 0000000..b1c11e0 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/http/server.py @@ -0,0 +1,1226 @@ +"""HTTP server classes. + +From Python 3.3 + +Note: BaseHTTPRequestHandler doesn't implement any HTTP request; see +SimpleHTTPRequestHandler for simple implementations of GET, HEAD and POST, +and CGIHTTPRequestHandler for CGI scripts. + +It does, however, optionally implement HTTP/1.1 persistent connections, +as of version 0.3. + +Notes on CGIHTTPRequestHandler +------------------------------ + +This class implements GET and POST requests to cgi-bin scripts. + +If the os.fork() function is not present (e.g. on Windows), +subprocess.Popen() is used as a fallback, with slightly altered semantics. + +In all cases, the implementation is intentionally naive -- all +requests are executed synchronously. + +SECURITY WARNING: DON'T USE THIS CODE UNLESS YOU ARE INSIDE A FIREWALL +-- it may execute arbitrary Python code or external programs. + +Note that status code 200 is sent prior to execution of a CGI script, so +scripts cannot send other status codes such as 302 (redirect). + +XXX To do: + +- log requests even later (to capture byte count) +- log user-agent header and other interesting goodies +- send error log to separate file +""" + +from __future__ import (absolute_import, division, + print_function, unicode_literals) +from future import utils +from future.builtins import * + + +# See also: +# +# HTTP Working Group T. Berners-Lee +# INTERNET-DRAFT R. T. Fielding +# H. Frystyk Nielsen +# Expires September 8, 1995 March 8, 1995 +# +# URL: http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-v10-spec-00.txt +# +# and +# +# Network Working Group R. Fielding +# Request for Comments: 2616 et al +# Obsoletes: 2068 June 1999 +# Category: Standards Track +# +# URL: http://www.faqs.org/rfcs/rfc2616.html + +# Log files +# --------- +# +# Here's a quote from the NCSA httpd docs about log file format. +# +# | The logfile format is as follows. Each line consists of: +# | +# | host rfc931 authuser [DD/Mon/YYYY:hh:mm:ss] "request" ddd bbbb +# | +# | host: Either the DNS name or the IP number of the remote client +# | rfc931: Any information returned by identd for this person, +# | - otherwise. +# | authuser: If user sent a userid for authentication, the user name, +# | - otherwise. +# | DD: Day +# | Mon: Month (calendar name) +# | YYYY: Year +# | hh: hour (24-hour format, the machine's timezone) +# | mm: minutes +# | ss: seconds +# | request: The first line of the HTTP request as sent by the client. +# | ddd: the status code returned by the server, - if not available. +# | bbbb: the total number of bytes sent, +# | *not including the HTTP/1.0 header*, - if not available +# | +# | You can determine the name of the file accessed through request. +# +# (Actually, the latter is only true if you know the server configuration +# at the time the request was made!) + +__version__ = "0.6" + +__all__ = ["HTTPServer", "BaseHTTPRequestHandler"] + +from future.backports import html +from future.backports.http import client as http_client +from future.backports.urllib import parse as urllib_parse +from future.backports import socketserver + +import io +import mimetypes +import os +import posixpath +import select +import shutil +import socket # For gethostbyaddr() +import sys +import time +import copy +import argparse + + +# Default error message template +DEFAULT_ERROR_MESSAGE = """\ + + + + + Error response + + +

Error response

+

Error code: %(code)d

+

Message: %(message)s.

+

Error code explanation: %(code)s - %(explain)s.

+ + +""" + +DEFAULT_ERROR_CONTENT_TYPE = "text/html;charset=utf-8" + +def _quote_html(html): + return html.replace("&", "&").replace("<", "<").replace(">", ">") + +class HTTPServer(socketserver.TCPServer): + + allow_reuse_address = 1 # Seems to make sense in testing environment + + def server_bind(self): + """Override server_bind to store the server name.""" + socketserver.TCPServer.server_bind(self) + host, port = self.socket.getsockname()[:2] + self.server_name = socket.getfqdn(host) + self.server_port = port + + +class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): + + """HTTP request handler base class. + + The following explanation of HTTP serves to guide you through the + code as well as to expose any misunderstandings I may have about + HTTP (so you don't need to read the code to figure out I'm wrong + :-). + + HTTP (HyperText Transfer Protocol) is an extensible protocol on + top of a reliable stream transport (e.g. TCP/IP). The protocol + recognizes three parts to a request: + + 1. One line identifying the request type and path + 2. An optional set of RFC-822-style headers + 3. An optional data part + + The headers and data are separated by a blank line. + + The first line of the request has the form + + + + where is a (case-sensitive) keyword such as GET or POST, + is a string containing path information for the request, + and should be the string "HTTP/1.0" or "HTTP/1.1". + is encoded using the URL encoding scheme (using %xx to signify + the ASCII character with hex code xx). + + The specification specifies that lines are separated by CRLF but + for compatibility with the widest range of clients recommends + servers also handle LF. Similarly, whitespace in the request line + is treated sensibly (allowing multiple spaces between components + and allowing trailing whitespace). + + Similarly, for output, lines ought to be separated by CRLF pairs + but most clients grok LF characters just fine. + + If the first line of the request has the form + + + + (i.e. is left out) then this is assumed to be an HTTP + 0.9 request; this form has no optional headers and data part and + the reply consists of just the data. + + The reply form of the HTTP 1.x protocol again has three parts: + + 1. One line giving the response code + 2. An optional set of RFC-822-style headers + 3. The data + + Again, the headers and data are separated by a blank line. + + The response code line has the form + + + + where is the protocol version ("HTTP/1.0" or "HTTP/1.1"), + is a 3-digit response code indicating success or + failure of the request, and is an optional + human-readable string explaining what the response code means. + + This server parses the request and the headers, and then calls a + function specific to the request type (). Specifically, + a request SPAM will be handled by a method do_SPAM(). If no + such method exists the server sends an error response to the + client. If it exists, it is called with no arguments: + + do_SPAM() + + Note that the request name is case sensitive (i.e. SPAM and spam + are different requests). + + The various request details are stored in instance variables: + + - client_address is the client IP address in the form (host, + port); + + - command, path and version are the broken-down request line; + + - headers is an instance of email.message.Message (or a derived + class) containing the header information; + + - rfile is a file object open for reading positioned at the + start of the optional input data part; + + - wfile is a file object open for writing. + + IT IS IMPORTANT TO ADHERE TO THE PROTOCOL FOR WRITING! + + The first thing to be written must be the response line. Then + follow 0 or more header lines, then a blank line, and then the + actual data (if any). The meaning of the header lines depends on + the command executed by the server; in most cases, when data is + returned, there should be at least one header line of the form + + Content-type: / + + where and should be registered MIME types, + e.g. "text/html" or "text/plain". + + """ + + # The Python system version, truncated to its first component. + sys_version = "Python/" + sys.version.split()[0] + + # The server software version. You may want to override this. + # The format is multiple whitespace-separated strings, + # where each string is of the form name[/version]. + server_version = "BaseHTTP/" + __version__ + + error_message_format = DEFAULT_ERROR_MESSAGE + error_content_type = DEFAULT_ERROR_CONTENT_TYPE + + # The default request version. This only affects responses up until + # the point where the request line is parsed, so it mainly decides what + # the client gets back when sending a malformed request line. + # Most web servers default to HTTP 0.9, i.e. don't send a status line. + default_request_version = "HTTP/0.9" + + def parse_request(self): + """Parse a request (internal). + + The request should be stored in self.raw_requestline; the results + are in self.command, self.path, self.request_version and + self.headers. + + Return True for success, False for failure; on failure, an + error is sent back. + + """ + self.command = None # set in case of error on the first line + self.request_version = version = self.default_request_version + self.close_connection = 1 + requestline = str(self.raw_requestline, 'iso-8859-1') + requestline = requestline.rstrip('\r\n') + self.requestline = requestline + words = requestline.split() + if len(words) == 3: + command, path, version = words + if version[:5] != 'HTTP/': + self.send_error(400, "Bad request version (%r)" % version) + return False + try: + base_version_number = version.split('/', 1)[1] + version_number = base_version_number.split(".") + # RFC 2145 section 3.1 says there can be only one "." and + # - major and minor numbers MUST be treated as + # separate integers; + # - HTTP/2.4 is a lower version than HTTP/2.13, which in + # turn is lower than HTTP/12.3; + # - Leading zeros MUST be ignored by recipients. + if len(version_number) != 2: + raise ValueError + version_number = int(version_number[0]), int(version_number[1]) + except (ValueError, IndexError): + self.send_error(400, "Bad request version (%r)" % version) + return False + if version_number >= (1, 1) and self.protocol_version >= "HTTP/1.1": + self.close_connection = 0 + if version_number >= (2, 0): + self.send_error(505, + "Invalid HTTP Version (%s)" % base_version_number) + return False + elif len(words) == 2: + command, path = words + self.close_connection = 1 + if command != 'GET': + self.send_error(400, + "Bad HTTP/0.9 request type (%r)" % command) + return False + elif not words: + return False + else: + self.send_error(400, "Bad request syntax (%r)" % requestline) + return False + self.command, self.path, self.request_version = command, path, version + + # Examine the headers and look for a Connection directive. + try: + self.headers = http_client.parse_headers(self.rfile, + _class=self.MessageClass) + except http_client.LineTooLong: + self.send_error(400, "Line too long") + return False + + conntype = self.headers.get('Connection', "") + if conntype.lower() == 'close': + self.close_connection = 1 + elif (conntype.lower() == 'keep-alive' and + self.protocol_version >= "HTTP/1.1"): + self.close_connection = 0 + # Examine the headers and look for an Expect directive + expect = self.headers.get('Expect', "") + if (expect.lower() == "100-continue" and + self.protocol_version >= "HTTP/1.1" and + self.request_version >= "HTTP/1.1"): + if not self.handle_expect_100(): + return False + return True + + def handle_expect_100(self): + """Decide what to do with an "Expect: 100-continue" header. + + If the client is expecting a 100 Continue response, we must + respond with either a 100 Continue or a final response before + waiting for the request body. The default is to always respond + with a 100 Continue. You can behave differently (for example, + reject unauthorized requests) by overriding this method. + + This method should either return True (possibly after sending + a 100 Continue response) or send an error response and return + False. + + """ + self.send_response_only(100) + self.flush_headers() + return True + + def handle_one_request(self): + """Handle a single HTTP request. + + You normally don't need to override this method; see the class + __doc__ string for information on how to handle specific HTTP + commands such as GET and POST. + + """ + try: + self.raw_requestline = self.rfile.readline(65537) + if len(self.raw_requestline) > 65536: + self.requestline = '' + self.request_version = '' + self.command = '' + self.send_error(414) + return + if not self.raw_requestline: + self.close_connection = 1 + return + if not self.parse_request(): + # An error code has been sent, just exit + return + mname = 'do_' + self.command + if not hasattr(self, mname): + self.send_error(501, "Unsupported method (%r)" % self.command) + return + method = getattr(self, mname) + method() + self.wfile.flush() #actually send the response if not already done. + except socket.timeout as e: + #a read or a write timed out. Discard this connection + self.log_error("Request timed out: %r", e) + self.close_connection = 1 + return + + def handle(self): + """Handle multiple requests if necessary.""" + self.close_connection = 1 + + self.handle_one_request() + while not self.close_connection: + self.handle_one_request() + + def send_error(self, code, message=None): + """Send and log an error reply. + + Arguments are the error code, and a detailed message. + The detailed message defaults to the short entry matching the + response code. + + This sends an error response (so it must be called before any + output has been generated), logs the error, and finally sends + a piece of HTML explaining the error to the user. + + """ + + try: + shortmsg, longmsg = self.responses[code] + except KeyError: + shortmsg, longmsg = '???', '???' + if message is None: + message = shortmsg + explain = longmsg + self.log_error("code %d, message %s", code, message) + # using _quote_html to prevent Cross Site Scripting attacks (see bug #1100201) + content = (self.error_message_format % + {'code': code, 'message': _quote_html(message), 'explain': explain}) + self.send_response(code, message) + self.send_header("Content-Type", self.error_content_type) + self.send_header('Connection', 'close') + self.end_headers() + if self.command != 'HEAD' and code >= 200 and code not in (204, 304): + self.wfile.write(content.encode('UTF-8', 'replace')) + + def send_response(self, code, message=None): + """Add the response header to the headers buffer and log the + response code. + + Also send two standard headers with the server software + version and the current date. + + """ + self.log_request(code) + self.send_response_only(code, message) + self.send_header('Server', self.version_string()) + self.send_header('Date', self.date_time_string()) + + def send_response_only(self, code, message=None): + """Send the response header only.""" + if message is None: + if code in self.responses: + message = self.responses[code][0] + else: + message = '' + if self.request_version != 'HTTP/0.9': + if not hasattr(self, '_headers_buffer'): + self._headers_buffer = [] + self._headers_buffer.append(("%s %d %s\r\n" % + (self.protocol_version, code, message)).encode( + 'latin-1', 'strict')) + + def send_header(self, keyword, value): + """Send a MIME header to the headers buffer.""" + if self.request_version != 'HTTP/0.9': + if not hasattr(self, '_headers_buffer'): + self._headers_buffer = [] + self._headers_buffer.append( + ("%s: %s\r\n" % (keyword, value)).encode('latin-1', 'strict')) + + if keyword.lower() == 'connection': + if value.lower() == 'close': + self.close_connection = 1 + elif value.lower() == 'keep-alive': + self.close_connection = 0 + + def end_headers(self): + """Send the blank line ending the MIME headers.""" + if self.request_version != 'HTTP/0.9': + self._headers_buffer.append(b"\r\n") + self.flush_headers() + + def flush_headers(self): + if hasattr(self, '_headers_buffer'): + self.wfile.write(b"".join(self._headers_buffer)) + self._headers_buffer = [] + + def log_request(self, code='-', size='-'): + """Log an accepted request. + + This is called by send_response(). + + """ + + self.log_message('"%s" %s %s', + self.requestline, str(code), str(size)) + + def log_error(self, format, *args): + """Log an error. + + This is called when a request cannot be fulfilled. By + default it passes the message on to log_message(). + + Arguments are the same as for log_message(). + + XXX This should go to the separate error log. + + """ + + self.log_message(format, *args) + + def log_message(self, format, *args): + """Log an arbitrary message. + + This is used by all other logging functions. Override + it if you have specific logging wishes. + + The first argument, FORMAT, is a format string for the + message to be logged. If the format string contains + any % escapes requiring parameters, they should be + specified as subsequent arguments (it's just like + printf!). + + The client ip and current date/time are prefixed to + every message. + + """ + + sys.stderr.write("%s - - [%s] %s\n" % + (self.address_string(), + self.log_date_time_string(), + format%args)) + + def version_string(self): + """Return the server software version string.""" + return self.server_version + ' ' + self.sys_version + + def date_time_string(self, timestamp=None): + """Return the current date and time formatted for a message header.""" + if timestamp is None: + timestamp = time.time() + year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp) + s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( + self.weekdayname[wd], + day, self.monthname[month], year, + hh, mm, ss) + return s + + def log_date_time_string(self): + """Return the current time formatted for logging.""" + now = time.time() + year, month, day, hh, mm, ss, x, y, z = time.localtime(now) + s = "%02d/%3s/%04d %02d:%02d:%02d" % ( + day, self.monthname[month], year, hh, mm, ss) + return s + + weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + + monthname = [None, + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + + def address_string(self): + """Return the client address.""" + + return self.client_address[0] + + # Essentially static class variables + + # The version of the HTTP protocol we support. + # Set this to HTTP/1.1 to enable automatic keepalive + protocol_version = "HTTP/1.0" + + # MessageClass used to parse headers + MessageClass = http_client.HTTPMessage + + # Table mapping response codes to messages; entries have the + # form {code: (shortmessage, longmessage)}. + # See RFC 2616 and 6585. + responses = { + 100: ('Continue', 'Request received, please continue'), + 101: ('Switching Protocols', + 'Switching to new protocol; obey Upgrade header'), + + 200: ('OK', 'Request fulfilled, document follows'), + 201: ('Created', 'Document created, URL follows'), + 202: ('Accepted', + 'Request accepted, processing continues off-line'), + 203: ('Non-Authoritative Information', 'Request fulfilled from cache'), + 204: ('No Content', 'Request fulfilled, nothing follows'), + 205: ('Reset Content', 'Clear input form for further input.'), + 206: ('Partial Content', 'Partial content follows.'), + + 300: ('Multiple Choices', + 'Object has several resources -- see URI list'), + 301: ('Moved Permanently', 'Object moved permanently -- see URI list'), + 302: ('Found', 'Object moved temporarily -- see URI list'), + 303: ('See Other', 'Object moved -- see Method and URL list'), + 304: ('Not Modified', + 'Document has not changed since given time'), + 305: ('Use Proxy', + 'You must use proxy specified in Location to access this ' + 'resource.'), + 307: ('Temporary Redirect', + 'Object moved temporarily -- see URI list'), + + 400: ('Bad Request', + 'Bad request syntax or unsupported method'), + 401: ('Unauthorized', + 'No permission -- see authorization schemes'), + 402: ('Payment Required', + 'No payment -- see charging schemes'), + 403: ('Forbidden', + 'Request forbidden -- authorization will not help'), + 404: ('Not Found', 'Nothing matches the given URI'), + 405: ('Method Not Allowed', + 'Specified method is invalid for this resource.'), + 406: ('Not Acceptable', 'URI not available in preferred format.'), + 407: ('Proxy Authentication Required', 'You must authenticate with ' + 'this proxy before proceeding.'), + 408: ('Request Timeout', 'Request timed out; try again later.'), + 409: ('Conflict', 'Request conflict.'), + 410: ('Gone', + 'URI no longer exists and has been permanently removed.'), + 411: ('Length Required', 'Client must specify Content-Length.'), + 412: ('Precondition Failed', 'Precondition in headers is false.'), + 413: ('Request Entity Too Large', 'Entity is too large.'), + 414: ('Request-URI Too Long', 'URI is too long.'), + 415: ('Unsupported Media Type', 'Entity body in unsupported format.'), + 416: ('Requested Range Not Satisfiable', + 'Cannot satisfy request range.'), + 417: ('Expectation Failed', + 'Expect condition could not be satisfied.'), + 428: ('Precondition Required', + 'The origin server requires the request to be conditional.'), + 429: ('Too Many Requests', 'The user has sent too many requests ' + 'in a given amount of time ("rate limiting").'), + 431: ('Request Header Fields Too Large', 'The server is unwilling to ' + 'process the request because its header fields are too large.'), + + 500: ('Internal Server Error', 'Server got itself in trouble'), + 501: ('Not Implemented', + 'Server does not support this operation'), + 502: ('Bad Gateway', 'Invalid responses from another server/proxy.'), + 503: ('Service Unavailable', + 'The server cannot process the request due to a high load'), + 504: ('Gateway Timeout', + 'The gateway server did not receive a timely response'), + 505: ('HTTP Version Not Supported', 'Cannot fulfill request.'), + 511: ('Network Authentication Required', + 'The client needs to authenticate to gain network access.'), + } + + +class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): + + """Simple HTTP request handler with GET and HEAD commands. + + This serves files from the current directory and any of its + subdirectories. The MIME type for files is determined by + calling the .guess_type() method. + + The GET and HEAD requests are identical except that the HEAD + request omits the actual contents of the file. + + """ + + server_version = "SimpleHTTP/" + __version__ + + def do_GET(self): + """Serve a GET request.""" + f = self.send_head() + if f: + self.copyfile(f, self.wfile) + f.close() + + def do_HEAD(self): + """Serve a HEAD request.""" + f = self.send_head() + if f: + f.close() + + def send_head(self): + """Common code for GET and HEAD commands. + + This sends the response code and MIME headers. + + Return value is either a file object (which has to be copied + to the outputfile by the caller unless the command was HEAD, + and must be closed by the caller under all circumstances), or + None, in which case the caller has nothing further to do. + + """ + path = self.translate_path(self.path) + f = None + if os.path.isdir(path): + if not self.path.endswith('/'): + # redirect browser - doing basically what apache does + self.send_response(301) + self.send_header("Location", self.path + "/") + self.end_headers() + return None + for index in "index.html", "index.htm": + index = os.path.join(path, index) + if os.path.exists(index): + path = index + break + else: + return self.list_directory(path) + ctype = self.guess_type(path) + try: + f = open(path, 'rb') + except IOError: + self.send_error(404, "File not found") + return None + self.send_response(200) + self.send_header("Content-type", ctype) + fs = os.fstat(f.fileno()) + self.send_header("Content-Length", str(fs[6])) + self.send_header("Last-Modified", self.date_time_string(fs.st_mtime)) + self.end_headers() + return f + + def list_directory(self, path): + """Helper to produce a directory listing (absent index.html). + + Return value is either a file object, or None (indicating an + error). In either case, the headers are sent, making the + interface the same as for send_head(). + + """ + try: + list = os.listdir(path) + except os.error: + self.send_error(404, "No permission to list directory") + return None + list.sort(key=lambda a: a.lower()) + r = [] + displaypath = html.escape(urllib_parse.unquote(self.path)) + enc = sys.getfilesystemencoding() + title = 'Directory listing for %s' % displaypath + r.append('') + r.append('\n') + r.append('' % enc) + r.append('%s\n' % title) + r.append('\n

%s

' % title) + r.append('
\n
\n
\n\n\n') + encoded = '\n'.join(r).encode(enc) + f = io.BytesIO() + f.write(encoded) + f.seek(0) + self.send_response(200) + self.send_header("Content-type", "text/html; charset=%s" % enc) + self.send_header("Content-Length", str(len(encoded))) + self.end_headers() + return f + + def translate_path(self, path): + """Translate a /-separated PATH to the local filename syntax. + + Components that mean special things to the local file system + (e.g. drive or directory names) are ignored. (XXX They should + probably be diagnosed.) + + """ + # abandon query parameters + path = path.split('?',1)[0] + path = path.split('#',1)[0] + path = posixpath.normpath(urllib_parse.unquote(path)) + words = path.split('/') + words = filter(None, words) + path = os.getcwd() + for word in words: + drive, word = os.path.splitdrive(word) + head, word = os.path.split(word) + if word in (os.curdir, os.pardir): continue + path = os.path.join(path, word) + return path + + def copyfile(self, source, outputfile): + """Copy all data between two file objects. + + The SOURCE argument is a file object open for reading + (or anything with a read() method) and the DESTINATION + argument is a file object open for writing (or + anything with a write() method). + + The only reason for overriding this would be to change + the block size or perhaps to replace newlines by CRLF + -- note however that this the default server uses this + to copy binary data as well. + + """ + shutil.copyfileobj(source, outputfile) + + def guess_type(self, path): + """Guess the type of a file. + + Argument is a PATH (a filename). + + Return value is a string of the form type/subtype, + usable for a MIME Content-type header. + + The default implementation looks the file's extension + up in the table self.extensions_map, using application/octet-stream + as a default; however it would be permissible (if + slow) to look inside the data to make a better guess. + + """ + + base, ext = posixpath.splitext(path) + if ext in self.extensions_map: + return self.extensions_map[ext] + ext = ext.lower() + if ext in self.extensions_map: + return self.extensions_map[ext] + else: + return self.extensions_map[''] + + if not mimetypes.inited: + mimetypes.init() # try to read system mime.types + extensions_map = mimetypes.types_map.copy() + extensions_map.update({ + '': 'application/octet-stream', # Default + '.py': 'text/plain', + '.c': 'text/plain', + '.h': 'text/plain', + }) + + +# Utilities for CGIHTTPRequestHandler + +def _url_collapse_path(path): + """ + Given a URL path, remove extra '/'s and '.' path elements and collapse + any '..' references and returns a colllapsed path. + + Implements something akin to RFC-2396 5.2 step 6 to parse relative paths. + The utility of this function is limited to is_cgi method and helps + preventing some security attacks. + + Returns: A tuple of (head, tail) where tail is everything after the final / + and head is everything before it. Head will always start with a '/' and, + if it contains anything else, never have a trailing '/'. + + Raises: IndexError if too many '..' occur within the path. + + """ + # Similar to os.path.split(os.path.normpath(path)) but specific to URL + # path semantics rather than local operating system semantics. + path_parts = path.split('/') + head_parts = [] + for part in path_parts[:-1]: + if part == '..': + head_parts.pop() # IndexError if more '..' than prior parts + elif part and part != '.': + head_parts.append( part ) + if path_parts: + tail_part = path_parts.pop() + if tail_part: + if tail_part == '..': + head_parts.pop() + tail_part = '' + elif tail_part == '.': + tail_part = '' + else: + tail_part = '' + + splitpath = ('/' + '/'.join(head_parts), tail_part) + collapsed_path = "/".join(splitpath) + + return collapsed_path + + + +nobody = None + +def nobody_uid(): + """Internal routine to get nobody's uid""" + global nobody + if nobody: + return nobody + try: + import pwd + except ImportError: + return -1 + try: + nobody = pwd.getpwnam('nobody')[2] + except KeyError: + nobody = 1 + max(x[2] for x in pwd.getpwall()) + return nobody + + +def executable(path): + """Test for executable file.""" + return os.access(path, os.X_OK) + + +class CGIHTTPRequestHandler(SimpleHTTPRequestHandler): + + """Complete HTTP server with GET, HEAD and POST commands. + + GET and HEAD also support running CGI scripts. + + The POST command is *only* implemented for CGI scripts. + + """ + + # Determine platform specifics + have_fork = hasattr(os, 'fork') + + # Make rfile unbuffered -- we need to read one line and then pass + # the rest to a subprocess, so we can't use buffered input. + rbufsize = 0 + + def do_POST(self): + """Serve a POST request. + + This is only implemented for CGI scripts. + + """ + + if self.is_cgi(): + self.run_cgi() + else: + self.send_error(501, "Can only POST to CGI scripts") + + def send_head(self): + """Version of send_head that support CGI scripts""" + if self.is_cgi(): + return self.run_cgi() + else: + return SimpleHTTPRequestHandler.send_head(self) + + def is_cgi(self): + """Test whether self.path corresponds to a CGI script. + + Returns True and updates the cgi_info attribute to the tuple + (dir, rest) if self.path requires running a CGI script. + Returns False otherwise. + + If any exception is raised, the caller should assume that + self.path was rejected as invalid and act accordingly. + + The default implementation tests whether the normalized url + path begins with one of the strings in self.cgi_directories + (and the next character is a '/' or the end of the string). + + """ + collapsed_path = _url_collapse_path(self.path) + dir_sep = collapsed_path.find('/', 1) + head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] + if head in self.cgi_directories: + self.cgi_info = head, tail + return True + return False + + + cgi_directories = ['/cgi-bin', '/htbin'] + + def is_executable(self, path): + """Test whether argument path is an executable file.""" + return executable(path) + + def is_python(self, path): + """Test whether argument path is a Python script.""" + head, tail = os.path.splitext(path) + return tail.lower() in (".py", ".pyw") + + def run_cgi(self): + """Execute a CGI script.""" + path = self.path + dir, rest = self.cgi_info + + i = path.find('/', len(dir) + 1) + while i >= 0: + nextdir = path[:i] + nextrest = path[i+1:] + + scriptdir = self.translate_path(nextdir) + if os.path.isdir(scriptdir): + dir, rest = nextdir, nextrest + i = path.find('/', len(dir) + 1) + else: + break + + # find an explicit query string, if present. + i = rest.rfind('?') + if i >= 0: + rest, query = rest[:i], rest[i+1:] + else: + query = '' + + # dissect the part after the directory name into a script name & + # a possible additional path, to be stored in PATH_INFO. + i = rest.find('/') + if i >= 0: + script, rest = rest[:i], rest[i:] + else: + script, rest = rest, '' + + scriptname = dir + '/' + script + scriptfile = self.translate_path(scriptname) + if not os.path.exists(scriptfile): + self.send_error(404, "No such CGI script (%r)" % scriptname) + return + if not os.path.isfile(scriptfile): + self.send_error(403, "CGI script is not a plain file (%r)" % + scriptname) + return + ispy = self.is_python(scriptname) + if self.have_fork or not ispy: + if not self.is_executable(scriptfile): + self.send_error(403, "CGI script is not executable (%r)" % + scriptname) + return + + # Reference: http://hoohoo.ncsa.uiuc.edu/cgi/env.html + # XXX Much of the following could be prepared ahead of time! + env = copy.deepcopy(os.environ) + env['SERVER_SOFTWARE'] = self.version_string() + env['SERVER_NAME'] = self.server.server_name + env['GATEWAY_INTERFACE'] = 'CGI/1.1' + env['SERVER_PROTOCOL'] = self.protocol_version + env['SERVER_PORT'] = str(self.server.server_port) + env['REQUEST_METHOD'] = self.command + uqrest = urllib_parse.unquote(rest) + env['PATH_INFO'] = uqrest + env['PATH_TRANSLATED'] = self.translate_path(uqrest) + env['SCRIPT_NAME'] = scriptname + if query: + env['QUERY_STRING'] = query + env['REMOTE_ADDR'] = self.client_address[0] + authorization = self.headers.get("authorization") + if authorization: + authorization = authorization.split() + if len(authorization) == 2: + import base64, binascii + env['AUTH_TYPE'] = authorization[0] + if authorization[0].lower() == "basic": + try: + authorization = authorization[1].encode('ascii') + if utils.PY3: + # In Py3.3, was: + authorization = base64.decodebytes(authorization).\ + decode('ascii') + else: + # Backport to Py2.7: + authorization = base64.decodestring(authorization).\ + decode('ascii') + except (binascii.Error, UnicodeError): + pass + else: + authorization = authorization.split(':') + if len(authorization) == 2: + env['REMOTE_USER'] = authorization[0] + # XXX REMOTE_IDENT + if self.headers.get('content-type') is None: + env['CONTENT_TYPE'] = self.headers.get_content_type() + else: + env['CONTENT_TYPE'] = self.headers['content-type'] + length = self.headers.get('content-length') + if length: + env['CONTENT_LENGTH'] = length + referer = self.headers.get('referer') + if referer: + env['HTTP_REFERER'] = referer + accept = [] + for line in self.headers.getallmatchingheaders('accept'): + if line[:1] in "\t\n\r ": + accept.append(line.strip()) + else: + accept = accept + line[7:].split(',') + env['HTTP_ACCEPT'] = ','.join(accept) + ua = self.headers.get('user-agent') + if ua: + env['HTTP_USER_AGENT'] = ua + co = filter(None, self.headers.get_all('cookie', [])) + cookie_str = ', '.join(co) + if cookie_str: + env['HTTP_COOKIE'] = cookie_str + # XXX Other HTTP_* headers + # Since we're setting the env in the parent, provide empty + # values to override previously set values + for k in ('QUERY_STRING', 'REMOTE_HOST', 'CONTENT_LENGTH', + 'HTTP_USER_AGENT', 'HTTP_COOKIE', 'HTTP_REFERER'): + env.setdefault(k, "") + + self.send_response(200, "Script output follows") + self.flush_headers() + + decoded_query = query.replace('+', ' ') + + if self.have_fork: + # Unix -- fork as we should + args = [script] + if '=' not in decoded_query: + args.append(decoded_query) + nobody = nobody_uid() + self.wfile.flush() # Always flush before forking + pid = os.fork() + if pid != 0: + # Parent + pid, sts = os.waitpid(pid, 0) + # throw away additional data [see bug #427345] + while select.select([self.rfile], [], [], 0)[0]: + if not self.rfile.read(1): + break + if sts: + self.log_error("CGI script exit status %#x", sts) + return + # Child + try: + try: + os.setuid(nobody) + except os.error: + pass + os.dup2(self.rfile.fileno(), 0) + os.dup2(self.wfile.fileno(), 1) + os.execve(scriptfile, args, env) + except: + self.server.handle_error(self.request, self.client_address) + os._exit(127) + + else: + # Non-Unix -- use subprocess + import subprocess + cmdline = [scriptfile] + if self.is_python(scriptfile): + interp = sys.executable + if interp.lower().endswith("w.exe"): + # On Windows, use python.exe, not pythonw.exe + interp = interp[:-5] + interp[-4:] + cmdline = [interp, '-u'] + cmdline + if '=' not in query: + cmdline.append(query) + self.log_message("command: %s", subprocess.list2cmdline(cmdline)) + try: + nbytes = int(length) + except (TypeError, ValueError): + nbytes = 0 + p = subprocess.Popen(cmdline, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env = env + ) + if self.command.lower() == "post" and nbytes > 0: + data = self.rfile.read(nbytes) + else: + data = None + # throw away additional data [see bug #427345] + while select.select([self.rfile._sock], [], [], 0)[0]: + if not self.rfile._sock.recv(1): + break + stdout, stderr = p.communicate(data) + self.wfile.write(stdout) + if stderr: + self.log_error('%s', stderr) + p.stderr.close() + p.stdout.close() + status = p.returncode + if status: + self.log_error("CGI script exit status %#x", status) + else: + self.log_message("CGI script exited OK") + + +def test(HandlerClass = BaseHTTPRequestHandler, + ServerClass = HTTPServer, protocol="HTTP/1.0", port=8000): + """Test the HTTP request handler class. + + This runs an HTTP server on port 8000 (or the first command line + argument). + + """ + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print("Serving HTTP on", sa[0], "port", sa[1], "...") + try: + httpd.serve_forever() + except KeyboardInterrupt: + print("\nKeyboard interrupt received, exiting.") + httpd.server_close() + sys.exit(0) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--cgi', action='store_true', + help='Run as CGI Server') + parser.add_argument('port', action='store', + default=8000, type=int, + nargs='?', + help='Specify alternate port [default: 8000]') + args = parser.parse_args() + if args.cgi: + test(HandlerClass=CGIHTTPRequestHandler, port=args.port) + else: + test(HandlerClass=SimpleHTTPRequestHandler, port=args.port) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/misc.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/misc.py new file mode 100644 index 0000000..098a066 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/misc.py @@ -0,0 +1,944 @@ +""" +Miscellaneous function (re)definitions from the Py3.4+ standard library +for Python 2.6/2.7. + +- math.ceil (for Python 2.7) +- collections.OrderedDict (for Python 2.6) +- collections.Counter (for Python 2.6) +- collections.ChainMap (for all versions prior to Python 3.3) +- itertools.count (for Python 2.6, with step parameter) +- subprocess.check_output (for Python 2.6) +- reprlib.recursive_repr (for Python 2.6+) +- functools.cmp_to_key (for Python 2.6) +""" + +from __future__ import absolute_import + +import subprocess +from math import ceil as oldceil + +from operator import itemgetter as _itemgetter, eq as _eq +import sys +import heapq as _heapq +from _weakref import proxy as _proxy +from itertools import repeat as _repeat, chain as _chain, starmap as _starmap +from socket import getaddrinfo, SOCK_STREAM, error, socket + +from future.utils import iteritems, itervalues, PY2, PY26, PY3 + +if PY2: + from collections import Mapping, MutableMapping +else: + from collections.abc import Mapping, MutableMapping + + +def ceil(x): + """ + Return the ceiling of x as an int. + This is the smallest integral value >= x. + """ + return int(oldceil(x)) + + +######################################################################## +### reprlib.recursive_repr decorator from Py3.4 +######################################################################## + +from itertools import islice + +if PY3: + try: + from _thread import get_ident + except ImportError: + from _dummy_thread import get_ident +else: + try: + from thread import get_ident + except ImportError: + from dummy_thread import get_ident + + +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 + + +################################################################################ +### OrderedDict +################################################################################ + +class _Link(object): + __slots__ = 'prev', 'next', 'key', '__weakref__' + +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 regular dictionaries. + + # The internal self.__map dict 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). + # The sentinel is in self.__hardroot with a weakref proxy in self.__root. + # The prev links are weakref proxies (to prevent circular references). + # Individual links are kept alive by the hard reference in self.__map. + # Those hard references disappear when a key is deleted from an OrderedDict. + + def __init__(*args, **kwds): + '''Initialize an ordered dictionary. The signature is the same as + regular dictionaries, but keyword arguments are not recommended because + their insertion order is arbitrary. + + ''' + if not args: + raise TypeError("descriptor '__init__' of 'OrderedDict' object " + "needs an argument") + self = args[0] + args = args[1:] + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__hardroot = _Link() + self.__root = root = _proxy(self.__hardroot) + root.prev = root.next = root + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, + dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link at the end of the linked list, + # and the inherited dictionary is updated with the new key/value pair. + if key not in self: + self.__map[key] = link = Link() + root = self.__root + last = root.prev + link.prev, link.next, link.key = last, root, key + last.next = link + root.prev = proxy(link) + 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 gets + # removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link = self.__map.pop(key) + link_prev = link.prev + link_next = link.next + link_prev.next = link_next + link_next.prev = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + # Traverse the linked list in order. + root = self.__root + curr = root.next + while curr is not root: + yield curr.key + curr = curr.next + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + # Traverse the linked list in reverse order. + root = self.__root + curr = root.prev + while curr is not root: + yield curr.key + curr = curr.prev + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + root = self.__root + root.prev = root.next = root + self.__map.clear() + 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.prev + link_prev = link.prev + link_prev.next = root + root.prev = link_prev + else: + link = root.next + link_next = link.next + root.next = link_next + link_next.prev = root + key = link.key + del self.__map[key] + value = dict.pop(self, key) + return key, value + + def move_to_end(self, key, last=True): + '''Move an existing element to the end (or beginning if last==False). + + Raises KeyError if the element does not exist. + When last=True, acts like a fast version of self[key]=self.pop(key). + + ''' + link = self.__map[key] + link_prev = link.prev + link_next = link.next + link_prev.next = link_next + link_next.prev = link_prev + root = self.__root + if last: + last = root.prev + link.prev = last + link.next = root + last.next = root.prev = link + else: + first = root.next + link.prev = root + link.next = first + root.next = first.prev = link + + def __sizeof__(self): + sizeof = sys.getsizeof + n = len(self) + 1 # number of links including root + size = sizeof(self.__dict__) # instance dictionary + size += sizeof(self.__map) * 2 # internal dict and inherited dict + size += sizeof(self.__hardroot) * n # link objects + size += sizeof(self.__root) * n # proxy objects + return size + + update = __update = MutableMapping.update + keys = MutableMapping.keys + values = MutableMapping.values + items = MutableMapping.items + __ne__ = MutableMapping.__ne__ + + __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 + + @recursive_repr() + def __repr__(self): + 'od.__repr__() <==> repr(od)' + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, list(self.items())) + + def __reduce__(self): + 'Return state information for pickling' + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + return self.__class__, (), inst_dict or None, None, iter(self.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. + If not specified, the value defaults to None. + + ''' + self = cls() + for key in iterable: + self[key] = value + return self + + 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 dict.__eq__(self, other) and all(map(_eq, self, other)) + return dict.__eq__(self, other) + + +# {{{ http://code.activestate.com/recipes/576611/ (r11) + +try: + from operator import itemgetter + from heapq import nlargest +except ImportError: + pass + +######################################################################## +### Counter +######################################################################## + +def _count_elements(mapping, iterable): + 'Tally elements from the iterable.' + mapping_get = mapping.get + for elem in iterable: + mapping[elem] = mapping_get(elem, 0) + 1 + +class Counter(dict): + '''Dict subclass for counting hashable items. Sometimes called a bag + or multiset. Elements are stored as dictionary keys and their counts + are stored as dictionary values. + + >>> c = Counter('abcdeabcdabcaba') # count elements from a string + + >>> c.most_common(3) # three most common elements + [('a', 5), ('b', 4), ('c', 3)] + >>> sorted(c) # list all unique elements + ['a', 'b', 'c', 'd', 'e'] + >>> ''.join(sorted(c.elements())) # list elements with repetitions + 'aaaaabbbbcccdde' + >>> sum(c.values()) # total of all counts + 15 + + >>> c['a'] # count of letter 'a' + 5 + >>> for elem in 'shazam': # update counts from an iterable + ... c[elem] += 1 # by adding 1 to each element's count + >>> c['a'] # now there are seven 'a' + 7 + >>> del c['b'] # remove all 'b' + >>> c['b'] # now there are zero 'b' + 0 + + >>> d = Counter('simsalabim') # make another counter + >>> c.update(d) # add in the second counter + >>> c['a'] # now there are nine 'a' + 9 + + >>> c.clear() # empty the counter + >>> c + Counter() + + Note: If a count is set to zero or reduced to zero, it will remain + in the counter until the entry is deleted or the counter is cleared: + + >>> c = Counter('aaabbc') + >>> c['b'] -= 2 # reduce the count of 'b' by two + >>> c.most_common() # 'b' is still in, but its count is zero + [('a', 3), ('c', 1), ('b', 0)] + + ''' + # References: + # http://en.wikipedia.org/wiki/Multiset + # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html + # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm + # http://code.activestate.com/recipes/259174/ + # Knuth, TAOCP Vol. II section 4.6.3 + + def __init__(*args, **kwds): + '''Create a new, empty Counter object. And if given, count elements + from an input iterable. Or, initialize the count from another mapping + of elements to their counts. + + >>> c = Counter() # a new, empty counter + >>> c = Counter('gallahad') # a new counter from an iterable + >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping + >>> c = Counter(a=4, b=2) # a new counter from keyword args + + ''' + if not args: + raise TypeError("descriptor '__init__' of 'Counter' object " + "needs an argument") + self = args[0] + args = args[1:] + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + super(Counter, self).__init__() + self.update(*args, **kwds) + + def __missing__(self, key): + 'The count of elements not in the Counter is zero.' + # Needed so that self[missing_item] does not raise KeyError + return 0 + + def most_common(self, n=None): + '''List the n most common elements and their counts from the most + common to the least. If n is None, then list all element counts. + + >>> Counter('abcdeabcdabcaba').most_common(3) + [('a', 5), ('b', 4), ('c', 3)] + + ''' + # Emulate Bag.sortedByCount from Smalltalk + if n is None: + return sorted(self.items(), key=_itemgetter(1), reverse=True) + return _heapq.nlargest(n, self.items(), key=_itemgetter(1)) + + def elements(self): + '''Iterator over elements repeating each as many times as its count. + + >>> c = Counter('ABCABC') + >>> sorted(c.elements()) + ['A', 'A', 'B', 'B', 'C', 'C'] + + # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1 + >>> prime_factors = Counter({2: 2, 3: 3, 17: 1}) + >>> product = 1 + >>> for factor in prime_factors.elements(): # loop over factors + ... product *= factor # and multiply them + >>> product + 1836 + + Note, if an element's count has been set to zero or is a negative + number, elements() will ignore it. + + ''' + # Emulate Bag.do from Smalltalk and Multiset.begin from C++. + return _chain.from_iterable(_starmap(_repeat, self.items())) + + # Override dict methods where necessary + + @classmethod + def fromkeys(cls, iterable, v=None): + # There is no equivalent method for counters because setting v=1 + # means that no element can have a count greater than one. + raise NotImplementedError( + 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') + + def update(*args, **kwds): + '''Like dict.update() but add counts instead of replacing them. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.update('witch') # add elements from another iterable + >>> d = Counter('watch') + >>> c.update(d) # add elements from another counter + >>> c['h'] # four 'h' in which, witch, and watch + 4 + + ''' + # The regular dict.update() operation makes no sense here because the + # replace behavior results in the some of original untouched counts + # being mixed-in with all of the other counts for a mismash that + # doesn't have a straight-forward interpretation in most counting + # contexts. Instead, we implement straight-addition. Both the inputs + # and outputs are allowed to contain zero and negative counts. + + if not args: + raise TypeError("descriptor 'update' of 'Counter' object " + "needs an argument") + self = args[0] + args = args[1:] + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + iterable = args[0] if args else None + if iterable is not None: + if isinstance(iterable, Mapping): + if self: + self_get = self.get + for elem, count in iterable.items(): + self[elem] = count + self_get(elem, 0) + else: + super(Counter, self).update(iterable) # fast path when counter is empty + else: + _count_elements(self, iterable) + if kwds: + self.update(kwds) + + def subtract(*args, **kwds): + '''Like dict.update() but subtracts counts instead of replacing them. + Counts can be reduced below zero. Both the inputs and outputs are + allowed to contain zero and negative counts. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.subtract('witch') # subtract elements from another iterable + >>> c.subtract(Counter('watch')) # subtract elements from another counter + >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch + 0 + >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch + -1 + + ''' + if not args: + raise TypeError("descriptor 'subtract' of 'Counter' object " + "needs an argument") + self = args[0] + args = args[1:] + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + iterable = args[0] if args else None + if iterable is not None: + self_get = self.get + if isinstance(iterable, Mapping): + for elem, count in iterable.items(): + self[elem] = self_get(elem, 0) - count + else: + for elem in iterable: + self[elem] = self_get(elem, 0) - 1 + if kwds: + self.subtract(kwds) + + def copy(self): + 'Return a shallow copy.' + return self.__class__(self) + + def __reduce__(self): + return self.__class__, (dict(self),) + + def __delitem__(self, elem): + 'Like dict.__delitem__() but does not raise KeyError for missing values.' + if elem in self: + super(Counter, self).__delitem__(elem) + + def __repr__(self): + if not self: + return '%s()' % self.__class__.__name__ + try: + items = ', '.join(map('%r: %r'.__mod__, self.most_common())) + return '%s({%s})' % (self.__class__.__name__, items) + except TypeError: + # handle case where values are not orderable + return '{0}({1!r})'.format(self.__class__.__name__, dict(self)) + + # Multiset-style mathematical operations discussed in: + # Knuth TAOCP Volume II section 4.6.3 exercise 19 + # and at http://en.wikipedia.org/wiki/Multiset + # + # Outputs guaranteed to only include positive counts. + # + # To strip negative and zero counts, add-in an empty counter: + # c += Counter() + + def __add__(self, other): + '''Add counts from two counters. + + >>> Counter('abbb') + Counter('bcc') + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + newcount = count + other[elem] + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count > 0: + result[elem] = count + return result + + def __sub__(self, other): + ''' Subtract count, but keep only results with positive counts. + + >>> Counter('abbbc') - Counter('bccd') + Counter({'b': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + newcount = count - other[elem] + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count < 0: + result[elem] = 0 - count + return result + + def __or__(self, other): + '''Union is the maximum of value in either of the input counters. + + >>> Counter('abbb') | Counter('bcc') + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + other_count = other[elem] + newcount = other_count if count < other_count else count + if newcount > 0: + result[elem] = newcount + for elem, count in other.items(): + if elem not in self and count > 0: + result[elem] = count + return result + + def __and__(self, other): + ''' Intersection is the minimum of corresponding counts. + + >>> Counter('abbb') & Counter('bcc') + Counter({'b': 1}) + + ''' + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem, count in self.items(): + other_count = other[elem] + newcount = count if count < other_count else other_count + if newcount > 0: + result[elem] = newcount + return result + + def __pos__(self): + 'Adds an empty counter, effectively stripping negative and zero counts' + return self + Counter() + + def __neg__(self): + '''Subtracts from an empty counter. Strips positive and zero counts, + and flips the sign on negative counts. + + ''' + return Counter() - self + + def _keep_positive(self): + '''Internal method to strip elements with a negative or zero count''' + nonpositive = [elem for elem, count in self.items() if not count > 0] + for elem in nonpositive: + del self[elem] + return self + + def __iadd__(self, other): + '''Inplace add from another counter, keeping only positive counts. + + >>> c = Counter('abbb') + >>> c += Counter('bcc') + >>> c + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] += count + return self._keep_positive() + + def __isub__(self, other): + '''Inplace subtract counter, but keep only results with positive counts. + + >>> c = Counter('abbbc') + >>> c -= Counter('bccd') + >>> c + Counter({'b': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] -= count + return self._keep_positive() + + def __ior__(self, other): + '''Inplace union is the maximum of value from either counter. + + >>> c = Counter('abbb') + >>> c |= Counter('bcc') + >>> c + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + for elem, other_count in other.items(): + count = self[elem] + if other_count > count: + self[elem] = other_count + return self._keep_positive() + + def __iand__(self, other): + '''Inplace intersection is the minimum of corresponding counts. + + >>> c = Counter('abbb') + >>> c &= Counter('bcc') + >>> c + Counter({'b': 1}) + + ''' + for elem, count in self.items(): + other_count = other[elem] + if other_count < count: + self[elem] = other_count + return self._keep_positive() + + +def check_output(*popenargs, **kwargs): + """ + For Python 2.6 compatibility: see + http://stackoverflow.com/questions/4814970/ + """ + + if 'stdout' in kwargs: + raise ValueError('stdout argument not allowed, it will be overridden.') + process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) + output, unused_err = process.communicate() + retcode = process.poll() + if retcode: + cmd = kwargs.get("args") + if cmd is None: + cmd = popenargs[0] + raise subprocess.CalledProcessError(retcode, cmd) + return output + + +def count(start=0, step=1): + """ + ``itertools.count`` in Py 2.6 doesn't accept a step + parameter. This is an enhanced version of ``itertools.count`` + for Py2.6 equivalent to ``itertools.count`` in Python 2.7+. + """ + while True: + yield start + start += step + + +######################################################################## +### ChainMap (helper for configparser and string.Template) +### From the Py3.4 source code. See also: +### https://github.com/kkxue/Py2ChainMap/blob/master/py2chainmap.py +######################################################################## + +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) + + # Py2 compatibility: + __nonzero__ = __bool__ + + @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, m=None): # like Django's Context.push() + ''' + New ChainMap with a new map followed by all previous maps. If no + map is provided, an empty dict is used. + ''' + if m is None: + m = {} + return self.__class__(m, *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: {0!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: {0!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + + +# Re-use the same sentinel as in the Python stdlib socket module: +from socket import _GLOBAL_DEFAULT_TIMEOUT +# Was: _GLOBAL_DEFAULT_TIMEOUT = object() + + +def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, + source_address=None): + """Backport of 3-argument create_connection() for Py2.6. + + 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 getaddrinfo(host, port, 0, SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = 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 as _: + err = _ + if sock is not None: + sock.close() + + if err is not None: + raise err + else: + raise error("getaddrinfo returns an empty list") + +# Backport from Py2.7 for Py2.6: +def cmp_to_key(mycmp): + """Convert a cmp= function into a key= function""" + class K(object): + __slots__ = ['obj'] + def __init__(self, obj, *args): + self.obj = obj + def __lt__(self, other): + return mycmp(self.obj, other.obj) < 0 + def __gt__(self, other): + return mycmp(self.obj, other.obj) > 0 + def __eq__(self, other): + return mycmp(self.obj, other.obj) == 0 + def __le__(self, other): + return mycmp(self.obj, other.obj) <= 0 + def __ge__(self, other): + return mycmp(self.obj, other.obj) >= 0 + def __ne__(self, other): + return mycmp(self.obj, other.obj) != 0 + def __hash__(self): + raise TypeError('hash not implemented') + return K + +# Back up our definitions above in case they're useful +_OrderedDict = OrderedDict +_Counter = Counter +_check_output = check_output +_count = count +_ceil = ceil +__count_elements = _count_elements +_recursive_repr = recursive_repr +_ChainMap = ChainMap +_create_connection = create_connection +_cmp_to_key = cmp_to_key + +# Overwrite the definitions above with the usual ones +# from the standard library: +if sys.version_info >= (2, 7): + from collections import OrderedDict, Counter + from itertools import count + from functools import cmp_to_key + try: + from subprocess import check_output + except ImportError: + # Not available. This happens with Google App Engine: see issue #231 + pass + from socket import create_connection + +if sys.version_info >= (3, 0): + from math import ceil + from collections import _count_elements + +if sys.version_info >= (3, 3): + from reprlib import recursive_repr + from collections import ChainMap diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/socket.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/socket.py new file mode 100644 index 0000000..930e1da --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/socket.py @@ -0,0 +1,454 @@ +# Wrapper module for _socket, providing some additional facilities +# implemented in Python. + +"""\ +This module provides socket operations and some related functions. +On Unix, it supports IP (Internet Protocol) and Unix domain sockets. +On other systems, it only supports IP. Functions specific for a +socket are available as methods of the socket object. + +Functions: + +socket() -- create a new socket object +socketpair() -- create a pair of new socket objects [*] +fromfd() -- create a socket object from an open file descriptor [*] +fromshare() -- create a socket object from data received from socket.share() [*] +gethostname() -- return the current hostname +gethostbyname() -- map a hostname to its IP number +gethostbyaddr() -- map an IP number or hostname to DNS info +getservbyname() -- map a service name and a protocol name to a port number +getprotobyname() -- map a protocol name (e.g. 'tcp') to a number +ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order +htons(), htonl() -- convert 16, 32 bit int from host to network byte order +inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format +inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89) +socket.getdefaulttimeout() -- get the default timeout value +socket.setdefaulttimeout() -- set the default timeout value +create_connection() -- connects to an address, with an optional timeout and + optional source address. + + [*] not available on all platforms! + +Special objects: + +SocketType -- type object for socket objects +error -- exception raised for I/O errors +has_ipv6 -- boolean value indicating if IPv6 is supported + +Integer constants: + +AF_INET, AF_UNIX -- socket domains (first argument to socket() call) +SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument) + +Many other constants may be defined; these may be used in calls to +the setsockopt() and getsockopt() methods. +""" + +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future.builtins import super + +import _socket +from _socket import * + +import os, sys, io + +try: + import errno +except ImportError: + errno = None +EBADF = getattr(errno, 'EBADF', 9) +EAGAIN = getattr(errno, 'EAGAIN', 11) +EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11) + +__all__ = ["getfqdn", "create_connection"] +__all__.extend(os._get_exports_list(_socket)) + + +_realsocket = socket + +# WSA error codes +if sys.platform.lower().startswith("win"): + errorTab = {} + errorTab[10004] = "The operation was interrupted." + errorTab[10009] = "A bad file handle was passed." + errorTab[10013] = "Permission denied." + errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT + errorTab[10022] = "An invalid operation was attempted." + errorTab[10035] = "The socket operation would block" + errorTab[10036] = "A blocking operation is already in progress." + errorTab[10048] = "The network address is in use." + errorTab[10054] = "The connection has been reset." + errorTab[10058] = "The network has been shut down." + errorTab[10060] = "The operation timed out." + errorTab[10061] = "Connection refused." + errorTab[10063] = "The name is too long." + errorTab[10064] = "The host is down." + errorTab[10065] = "The host is unreachable." + __all__.append("errorTab") + + +class socket(_socket.socket): + + """A subclass of _socket.socket adding the makefile() method.""" + + __slots__ = ["__weakref__", "_io_refs", "_closed"] + + def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None): + if fileno is None: + _socket.socket.__init__(self, family, type, proto) + else: + _socket.socket.__init__(self, family, type, proto, fileno) + self._io_refs = 0 + self._closed = False + + def __enter__(self): + return self + + def __exit__(self, *args): + if not self._closed: + self.close() + + def __repr__(self): + """Wrap __repr__() to reveal the real class name.""" + s = _socket.socket.__repr__(self) + if s.startswith(" socket object + + Return a new socket object connected to the same system resource. + """ + fd = dup(self.fileno()) + sock = self.__class__(self.family, self.type, self.proto, fileno=fd) + sock.settimeout(self.gettimeout()) + return sock + + def accept(self): + """accept() -> (socket object, address info) + + Wait for an incoming connection. Return a new socket + representing the connection, and the address of the client. + For IP sockets, the address info is a pair (hostaddr, port). + """ + fd, addr = self._accept() + sock = socket(self.family, self.type, self.proto, fileno=fd) + # Issue #7995: if no default timeout is set and the listening + # socket had a (non-zero) timeout, force the new socket in blocking + # mode to override platform-specific socket flags inheritance. + if getdefaulttimeout() is None and self.gettimeout(): + sock.setblocking(True) + return sock, addr + + def makefile(self, mode="r", buffering=None, **_3to2kwargs): + """makefile(...) -> an I/O stream connected to the socket + + The arguments are as for io.open() after the filename, + except the only mode characters supported are 'r', 'w' and 'b'. + The semantics are similar too. (XXX refactor to share code?) + """ + if 'newline' in _3to2kwargs: newline = _3to2kwargs['newline']; del _3to2kwargs['newline'] + else: newline = None + if 'errors' in _3to2kwargs: errors = _3to2kwargs['errors']; del _3to2kwargs['errors'] + else: errors = None + if 'encoding' in _3to2kwargs: encoding = _3to2kwargs['encoding']; del _3to2kwargs['encoding'] + else: encoding = None + for c in mode: + if c not in ("r", "w", "b"): + raise ValueError("invalid mode %r (only r, w, b allowed)") + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._io_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text + + def _decref_socketios(self): + if self._io_refs > 0: + self._io_refs -= 1 + if self._closed: + self.close() + + def _real_close(self, _ss=_socket.socket): + # This function should not reference any globals. See issue #808164. + _ss.close(self) + + def close(self): + # This function should not reference any globals. See issue #808164. + self._closed = True + if self._io_refs <= 0: + self._real_close() + + def detach(self): + """detach() -> file descriptor + + Close the socket object without closing the underlying file descriptor. + The object cannot be used after this call, but the file descriptor + can be reused for other purposes. The file descriptor is returned. + """ + self._closed = True + return super().detach() + +def fromfd(fd, family, type, proto=0): + """ fromfd(fd, family, type[, proto]) -> socket object + + Create a socket object from a duplicate of the given file + descriptor. The remaining arguments are the same as for socket(). + """ + nfd = dup(fd) + return socket(family, type, proto, nfd) + +if hasattr(_socket.socket, "share"): + def fromshare(info): + """ fromshare(info) -> socket object + + Create a socket object from a the bytes object returned by + socket.share(pid). + """ + return socket(0, 0, 0, info) + +if hasattr(_socket, "socketpair"): + + def socketpair(family=None, type=SOCK_STREAM, proto=0): + """socketpair([family[, type[, proto]]]) -> (socket object, socket object) + + Create a pair of socket objects from the sockets returned by the platform + socketpair() function. + The arguments are the same as for socket() except the default family is + AF_UNIX if defined on the platform; otherwise, the default is AF_INET. + """ + if family is None: + try: + family = AF_UNIX + except NameError: + family = AF_INET + a, b = _socket.socketpair(family, type, proto) + a = socket(family, type, proto, a.detach()) + b = socket(family, type, proto, b.detach()) + return a, b + + +_blocking_errnos = set([EAGAIN, EWOULDBLOCK]) + +class SocketIO(io.RawIOBase): + + """Raw I/O implementation for stream sockets. + + This class supports the makefile() method on sockets. It provides + the raw I/O interface on top of a socket object. + """ + + # One might wonder why not let FileIO do the job instead. There are two + # main reasons why FileIO is not adapted: + # - it wouldn't work under Windows (where you can't used read() and + # write() on a socket handle) + # - it wouldn't work with socket timeouts (FileIO would ignore the + # timeout and consider the socket non-blocking) + + # XXX More docs + + def __init__(self, sock, mode): + if mode not in ("r", "w", "rw", "rb", "wb", "rwb"): + raise ValueError("invalid mode: %r" % mode) + io.RawIOBase.__init__(self) + self._sock = sock + if "b" not in mode: + mode += "b" + self._mode = mode + self._reading = "r" in mode + self._writing = "w" in mode + self._timeout_occurred = False + + def readinto(self, b): + """Read up to len(b) bytes into the writable buffer *b* and return + the number of bytes read. If the socket is non-blocking and no bytes + are available, None is returned. + + If *b* is non-empty, a 0 return value indicates that the connection + was shutdown at the other end. + """ + self._checkClosed() + self._checkReadable() + if self._timeout_occurred: + raise IOError("cannot read from timed out object") + while True: + try: + return self._sock.recv_into(b) + except timeout: + self._timeout_occurred = True + raise + # except InterruptedError: + # continue + except error as e: + if e.args[0] in _blocking_errnos: + return None + raise + + def write(self, b): + """Write the given bytes or bytearray object *b* to the socket + and return the number of bytes written. This can be less than + len(b) if not all data could be written. If the socket is + non-blocking and no bytes could be written None is returned. + """ + self._checkClosed() + self._checkWritable() + try: + return self._sock.send(b) + except error as e: + # XXX what about EINTR? + if e.args[0] in _blocking_errnos: + return None + raise + + def readable(self): + """True if the SocketIO is open for reading. + """ + if self.closed: + raise ValueError("I/O operation on closed socket.") + return self._reading + + def writable(self): + """True if the SocketIO is open for writing. + """ + if self.closed: + raise ValueError("I/O operation on closed socket.") + return self._writing + + def seekable(self): + """True if the SocketIO is open for seeking. + """ + if self.closed: + raise ValueError("I/O operation on closed socket.") + return super().seekable() + + def fileno(self): + """Return the file descriptor of the underlying socket. + """ + self._checkClosed() + return self._sock.fileno() + + @property + def name(self): + if not self.closed: + return self.fileno() + else: + return -1 + + @property + def mode(self): + return self._mode + + def close(self): + """Close the SocketIO object. This doesn't close the underlying + socket, except if all references to it have disappeared. + """ + if self.closed: + return + io.RawIOBase.close(self) + self._sock._decref_socketios() + self._sock = None + + +def getfqdn(name=''): + """Get fully qualified domain name from name. + + An empty argument is interpreted as meaning the local host. + + First the hostname returned by gethostbyaddr() is checked, then + possibly existing aliases. In case no FQDN is available, hostname + from gethostname() is returned. + """ + name = name.strip() + if not name or name == '0.0.0.0': + name = gethostname() + try: + hostname, aliases, ipaddrs = gethostbyaddr(name) + except error: + pass + else: + aliases.insert(0, hostname) + for name in aliases: + if '.' in name: + break + else: + name = hostname + return name + + +# Re-use the same sentinel as in the Python stdlib socket module: +from socket import _GLOBAL_DEFAULT_TIMEOUT +# Was: _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 getaddrinfo(host, port, 0, SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = 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 as _: + err = _ + if sock is not None: + sock.close() + + if err is not None: + raise err + else: + raise error("getaddrinfo returns an empty list") diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/socketserver.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/socketserver.py new file mode 100644 index 0000000..d1e24a6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/socketserver.py @@ -0,0 +1,747 @@ +"""Generic socket server classes. + +This module tries to capture the various aspects of defining a server: + +For socket-based servers: + +- address family: + - AF_INET{,6}: IP (Internet Protocol) sockets (default) + - AF_UNIX: Unix domain sockets + - others, e.g. AF_DECNET are conceivable (see +- socket type: + - SOCK_STREAM (reliable stream, e.g. TCP) + - SOCK_DGRAM (datagrams, e.g. UDP) + +For request-based servers (including socket-based): + +- client address verification before further looking at the request + (This is actually a hook for any processing that needs to look + at the request before anything else, e.g. logging) +- how to handle multiple requests: + - synchronous (one request is handled at a time) + - forking (each request is handled by a new process) + - threading (each request is handled by a new thread) + +The classes in this module favor the server type that is simplest to +write: a synchronous TCP/IP server. This is bad class design, but +save some typing. (There's also the issue that a deep class hierarchy +slows down method lookups.) + +There are five classes in an inheritance diagram, four of which represent +synchronous servers of four types: + + +------------+ + | BaseServer | + +------------+ + | + v + +-----------+ +------------------+ + | TCPServer |------->| UnixStreamServer | + +-----------+ +------------------+ + | + v + +-----------+ +--------------------+ + | UDPServer |------->| UnixDatagramServer | + +-----------+ +--------------------+ + +Note that UnixDatagramServer derives from UDPServer, not from +UnixStreamServer -- the only difference between an IP and a Unix +stream server is the address family, which is simply repeated in both +unix server classes. + +Forking and threading versions of each type of server can be created +using the ForkingMixIn and ThreadingMixIn mix-in classes. For +instance, a threading UDP server class is created as follows: + + class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass + +The Mix-in class must come first, since it overrides a method defined +in UDPServer! Setting the various member variables also changes +the behavior of the underlying server mechanism. + +To implement a service, you must derive a class from +BaseRequestHandler and redefine its handle() method. You can then run +various versions of the service by combining one of the server classes +with your request handler class. + +The request handler class must be different for datagram or stream +services. This can be hidden by using the request handler +subclasses StreamRequestHandler or DatagramRequestHandler. + +Of course, you still have to use your head! + +For instance, it makes no sense to use a forking server if the service +contains state in memory that can be modified by requests (since the +modifications in the child process would never reach the initial state +kept in the parent process and passed to each child). In this case, +you can use a threading server, but you will probably have to use +locks to avoid two requests that come in nearly simultaneous to apply +conflicting changes to the server state. + +On the other hand, if you are building e.g. an HTTP server, where all +data is stored externally (e.g. in the file system), a synchronous +class will essentially render the service "deaf" while one request is +being handled -- which may be for a very long time if a client is slow +to read all the data it has requested. Here a threading or forking +server is appropriate. + +In some cases, it may be appropriate to process part of a request +synchronously, but to finish processing in a forked child depending on +the request data. This can be implemented by using a synchronous +server and doing an explicit fork in the request handler class +handle() method. + +Another approach to handling multiple simultaneous requests in an +environment that supports neither threads nor fork (or where these are +too expensive or inappropriate for the service) is to maintain an +explicit table of partially finished requests and to use select() to +decide which request to work on next (or whether to handle a new +incoming request). This is particularly important for stream services +where each client can potentially be connected for a long time (if +threads or subprocesses cannot be used). + +Future work: +- Standard classes for Sun RPC (which uses either UDP or TCP) +- Standard mix-in classes to implement various authentication + and encryption schemes +- Standard framework for select-based multiplexing + +XXX Open problems: +- What to do with out-of-band data? + +BaseServer: +- split generic "request" functionality out into BaseServer class. + Copyright (C) 2000 Luke Kenneth Casson Leighton + + example: read entries from a SQL database (requires overriding + get_request() to return a table entry from the database). + entry is processed by a RequestHandlerClass. + +""" + +# Author of the BaseServer patch: Luke Kenneth Casson Leighton + +# XXX Warning! +# There is a test suite for this module, but it cannot be run by the +# standard regression test. +# To run it manually, run Lib/test/test_socketserver.py. + +from __future__ import (absolute_import, print_function) + +__version__ = "0.4" + + +import socket +import select +import sys +import os +import errno +try: + import threading +except ImportError: + import dummy_threading as threading + +__all__ = ["TCPServer","UDPServer","ForkingUDPServer","ForkingTCPServer", + "ThreadingUDPServer","ThreadingTCPServer","BaseRequestHandler", + "StreamRequestHandler","DatagramRequestHandler", + "ThreadingMixIn", "ForkingMixIn"] +if hasattr(socket, "AF_UNIX"): + __all__.extend(["UnixStreamServer","UnixDatagramServer", + "ThreadingUnixStreamServer", + "ThreadingUnixDatagramServer"]) + +def _eintr_retry(func, *args): + """restart a system call interrupted by EINTR""" + while True: + try: + return func(*args) + except OSError as e: + if e.errno != errno.EINTR: + raise + +class BaseServer(object): + + """Base class for server classes. + + Methods for the caller: + + - __init__(server_address, RequestHandlerClass) + - serve_forever(poll_interval=0.5) + - shutdown() + - handle_request() # if you do not use serve_forever() + - fileno() -> int # for select() + + Methods that may be overridden: + + - server_bind() + - server_activate() + - get_request() -> request, client_address + - handle_timeout() + - verify_request(request, client_address) + - server_close() + - process_request(request, client_address) + - shutdown_request(request) + - close_request(request) + - service_actions() + - handle_error() + + Methods for derived classes: + + - finish_request(request, client_address) + + Class variables that may be overridden by derived classes or + instances: + + - timeout + - address_family + - socket_type + - allow_reuse_address + + Instance variables: + + - RequestHandlerClass + - socket + + """ + + timeout = None + + def __init__(self, server_address, RequestHandlerClass): + """Constructor. May be extended, do not override.""" + self.server_address = server_address + self.RequestHandlerClass = RequestHandlerClass + self.__is_shut_down = threading.Event() + self.__shutdown_request = False + + def server_activate(self): + """Called by constructor to activate the server. + + May be overridden. + + """ + pass + + def serve_forever(self, poll_interval=0.5): + """Handle one request at a time until shutdown. + + Polls for shutdown every poll_interval seconds. Ignores + self.timeout. If you need to do periodic tasks, do them in + another thread. + """ + self.__is_shut_down.clear() + try: + while not self.__shutdown_request: + # XXX: Consider using another file descriptor or + # connecting to the socket to wake this up instead of + # polling. Polling reduces our responsiveness to a + # shutdown request and wastes cpu at all other times. + r, w, e = _eintr_retry(select.select, [self], [], [], + poll_interval) + if self in r: + self._handle_request_noblock() + + self.service_actions() + finally: + self.__shutdown_request = False + self.__is_shut_down.set() + + def shutdown(self): + """Stops the serve_forever loop. + + Blocks until the loop has finished. This must be called while + serve_forever() is running in another thread, or it will + deadlock. + """ + self.__shutdown_request = True + self.__is_shut_down.wait() + + def service_actions(self): + """Called by the serve_forever() loop. + + May be overridden by a subclass / Mixin to implement any code that + needs to be run during the loop. + """ + pass + + # The distinction between handling, getting, processing and + # finishing a request is fairly arbitrary. Remember: + # + # - handle_request() is the top-level call. It calls + # select, get_request(), verify_request() and process_request() + # - get_request() is different for stream or datagram sockets + # - process_request() is the place that may fork a new process + # or create a new thread to finish the request + # - finish_request() instantiates the request handler class; + # this constructor will handle the request all by itself + + def handle_request(self): + """Handle one request, possibly blocking. + + Respects self.timeout. + """ + # Support people who used socket.settimeout() to escape + # handle_request before self.timeout was available. + timeout = self.socket.gettimeout() + if timeout is None: + timeout = self.timeout + elif self.timeout is not None: + timeout = min(timeout, self.timeout) + fd_sets = _eintr_retry(select.select, [self], [], [], timeout) + if not fd_sets[0]: + self.handle_timeout() + return + self._handle_request_noblock() + + def _handle_request_noblock(self): + """Handle one request, without blocking. + + I assume that select.select has returned that the socket is + readable before this function was called, so there should be + no risk of blocking in get_request(). + """ + try: + request, client_address = self.get_request() + except socket.error: + return + if self.verify_request(request, client_address): + try: + self.process_request(request, client_address) + except: + self.handle_error(request, client_address) + self.shutdown_request(request) + + def handle_timeout(self): + """Called if no new request arrives within self.timeout. + + Overridden by ForkingMixIn. + """ + pass + + def verify_request(self, request, client_address): + """Verify the request. May be overridden. + + Return True if we should proceed with this request. + + """ + return True + + def process_request(self, request, client_address): + """Call finish_request. + + Overridden by ForkingMixIn and ThreadingMixIn. + + """ + self.finish_request(request, client_address) + self.shutdown_request(request) + + def server_close(self): + """Called to clean-up the server. + + May be overridden. + + """ + pass + + def finish_request(self, request, client_address): + """Finish one request by instantiating RequestHandlerClass.""" + self.RequestHandlerClass(request, client_address, self) + + def shutdown_request(self, request): + """Called to shutdown and close an individual request.""" + self.close_request(request) + + def close_request(self, request): + """Called to clean up an individual request.""" + pass + + def handle_error(self, request, client_address): + """Handle an error gracefully. May be overridden. + + The default is to print a traceback and continue. + + """ + print('-'*40) + print('Exception happened during processing of request from', end=' ') + print(client_address) + import traceback + traceback.print_exc() # XXX But this goes to stderr! + print('-'*40) + + +class TCPServer(BaseServer): + + """Base class for various socket-based server classes. + + Defaults to synchronous IP stream (i.e., TCP). + + Methods for the caller: + + - __init__(server_address, RequestHandlerClass, bind_and_activate=True) + - serve_forever(poll_interval=0.5) + - shutdown() + - handle_request() # if you don't use serve_forever() + - fileno() -> int # for select() + + Methods that may be overridden: + + - server_bind() + - server_activate() + - get_request() -> request, client_address + - handle_timeout() + - verify_request(request, client_address) + - process_request(request, client_address) + - shutdown_request(request) + - close_request(request) + - handle_error() + + Methods for derived classes: + + - finish_request(request, client_address) + + Class variables that may be overridden by derived classes or + instances: + + - timeout + - address_family + - socket_type + - request_queue_size (only for stream sockets) + - allow_reuse_address + + Instance variables: + + - server_address + - RequestHandlerClass + - socket + + """ + + address_family = socket.AF_INET + + socket_type = socket.SOCK_STREAM + + request_queue_size = 5 + + allow_reuse_address = False + + def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True): + """Constructor. May be extended, do not override.""" + BaseServer.__init__(self, server_address, RequestHandlerClass) + self.socket = socket.socket(self.address_family, + self.socket_type) + if bind_and_activate: + self.server_bind() + self.server_activate() + + def server_bind(self): + """Called by constructor to bind the socket. + + May be overridden. + + """ + if self.allow_reuse_address: + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.socket.bind(self.server_address) + self.server_address = self.socket.getsockname() + + def server_activate(self): + """Called by constructor to activate the server. + + May be overridden. + + """ + self.socket.listen(self.request_queue_size) + + def server_close(self): + """Called to clean-up the server. + + May be overridden. + + """ + self.socket.close() + + def fileno(self): + """Return socket file number. + + Interface required by select(). + + """ + return self.socket.fileno() + + def get_request(self): + """Get the request and client address from the socket. + + May be overridden. + + """ + return self.socket.accept() + + def shutdown_request(self, request): + """Called to shutdown and close an individual request.""" + try: + #explicitly shutdown. socket.close() merely releases + #the socket and waits for GC to perform the actual close. + request.shutdown(socket.SHUT_WR) + except socket.error: + pass #some platforms may raise ENOTCONN here + self.close_request(request) + + def close_request(self, request): + """Called to clean up an individual request.""" + request.close() + + +class UDPServer(TCPServer): + + """UDP server class.""" + + allow_reuse_address = False + + socket_type = socket.SOCK_DGRAM + + max_packet_size = 8192 + + def get_request(self): + data, client_addr = self.socket.recvfrom(self.max_packet_size) + return (data, self.socket), client_addr + + def server_activate(self): + # No need to call listen() for UDP. + pass + + def shutdown_request(self, request): + # No need to shutdown anything. + self.close_request(request) + + def close_request(self, request): + # No need to close anything. + pass + +class ForkingMixIn(object): + + """Mix-in class to handle each request in a new process.""" + + timeout = 300 + active_children = None + max_children = 40 + + def collect_children(self): + """Internal routine to wait for children that have exited.""" + if self.active_children is None: return + while len(self.active_children) >= self.max_children: + # XXX: This will wait for any child process, not just ones + # spawned by this library. This could confuse other + # libraries that expect to be able to wait for their own + # children. + try: + pid, status = os.waitpid(0, 0) + except os.error: + pid = None + if pid not in self.active_children: continue + self.active_children.remove(pid) + + # XXX: This loop runs more system calls than it ought + # to. There should be a way to put the active_children into a + # process group and then use os.waitpid(-pgid) to wait for any + # of that set, but I couldn't find a way to allocate pgids + # that couldn't collide. + for child in self.active_children: + try: + pid, status = os.waitpid(child, os.WNOHANG) + except os.error: + pid = None + if not pid: continue + try: + self.active_children.remove(pid) + except ValueError as e: + raise ValueError('%s. x=%d and list=%r' % (e.message, pid, + self.active_children)) + + def handle_timeout(self): + """Wait for zombies after self.timeout seconds of inactivity. + + May be extended, do not override. + """ + self.collect_children() + + def service_actions(self): + """Collect the zombie child processes regularly in the ForkingMixIn. + + service_actions is called in the BaseServer's serve_forver loop. + """ + self.collect_children() + + def process_request(self, request, client_address): + """Fork a new subprocess to process the request.""" + pid = os.fork() + if pid: + # Parent process + if self.active_children is None: + self.active_children = [] + self.active_children.append(pid) + self.close_request(request) + return + else: + # Child process. + # This must never return, hence os._exit()! + try: + self.finish_request(request, client_address) + self.shutdown_request(request) + os._exit(0) + except: + try: + self.handle_error(request, client_address) + self.shutdown_request(request) + finally: + os._exit(1) + + +class ThreadingMixIn(object): + """Mix-in class to handle each request in a new thread.""" + + # Decides how threads will act upon termination of the + # main process + daemon_threads = False + + def process_request_thread(self, request, client_address): + """Same as in BaseServer but as a thread. + + In addition, exception handling is done here. + + """ + try: + self.finish_request(request, client_address) + self.shutdown_request(request) + except: + self.handle_error(request, client_address) + self.shutdown_request(request) + + def process_request(self, request, client_address): + """Start a new thread to process the request.""" + t = threading.Thread(target = self.process_request_thread, + args = (request, client_address)) + t.daemon = self.daemon_threads + t.start() + + +class ForkingUDPServer(ForkingMixIn, UDPServer): pass +class ForkingTCPServer(ForkingMixIn, TCPServer): pass + +class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass +class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass + +if hasattr(socket, 'AF_UNIX'): + + class UnixStreamServer(TCPServer): + address_family = socket.AF_UNIX + + class UnixDatagramServer(UDPServer): + address_family = socket.AF_UNIX + + class ThreadingUnixStreamServer(ThreadingMixIn, UnixStreamServer): pass + + class ThreadingUnixDatagramServer(ThreadingMixIn, UnixDatagramServer): pass + +class BaseRequestHandler(object): + + """Base class for request handler classes. + + This class is instantiated for each request to be handled. The + constructor sets the instance variables request, client_address + and server, and then calls the handle() method. To implement a + specific service, all you need to do is to derive a class which + defines a handle() method. + + The handle() method can find the request as self.request, the + client address as self.client_address, and the server (in case it + needs access to per-server information) as self.server. Since a + separate instance is created for each request, the handle() method + can define arbitrary other instance variariables. + + """ + + def __init__(self, request, client_address, server): + self.request = request + self.client_address = client_address + self.server = server + self.setup() + try: + self.handle() + finally: + self.finish() + + def setup(self): + pass + + def handle(self): + pass + + def finish(self): + pass + + +# The following two classes make it possible to use the same service +# class for stream or datagram servers. +# Each class sets up these instance variables: +# - rfile: a file object from which receives the request is read +# - wfile: a file object to which the reply is written +# When the handle() method returns, wfile is flushed properly + + +class StreamRequestHandler(BaseRequestHandler): + + """Define self.rfile and self.wfile for stream sockets.""" + + # Default buffer sizes for rfile, wfile. + # We default rfile to buffered because otherwise it could be + # really slow for large data (a getc() call per byte); we make + # wfile unbuffered because (a) often after a write() we want to + # read and we need to flush the line; (b) big writes to unbuffered + # files are typically optimized by stdio even when big reads + # aren't. + rbufsize = -1 + wbufsize = 0 + + # A timeout to apply to the request socket, if not None. + timeout = None + + # Disable nagle algorithm for this socket, if True. + # Use only when wbufsize != 0, to avoid small packets. + disable_nagle_algorithm = False + + def setup(self): + self.connection = self.request + if self.timeout is not None: + self.connection.settimeout(self.timeout) + if self.disable_nagle_algorithm: + self.connection.setsockopt(socket.IPPROTO_TCP, + socket.TCP_NODELAY, True) + self.rfile = self.connection.makefile('rb', self.rbufsize) + self.wfile = self.connection.makefile('wb', self.wbufsize) + + def finish(self): + if not self.wfile.closed: + try: + self.wfile.flush() + except socket.error: + # An final socket error may have occurred here, such as + # the local error ECONNABORTED. + pass + self.wfile.close() + self.rfile.close() + + +class DatagramRequestHandler(BaseRequestHandler): + + # XXX Regrettably, I cannot get this working on Linux; + # s.recvfrom() doesn't return a meaningful client address. + + """Define self.rfile and self.wfile for datagram sockets.""" + + def setup(self): + from io import BytesIO + self.packet, self.socket = self.request + self.rfile = BytesIO(self.packet) + self.wfile = BytesIO() + + def finish(self): + self.socket.sendto(self.wfile.getvalue(), self.client_address) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__init__.py new file mode 100644 index 0000000..0bba5e6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__init__.py @@ -0,0 +1,9 @@ +""" +test package backported for python-future. + +Its primary purpose is to allow use of "import test.support" for running +the Python standard library unit tests using the new Python 3 stdlib +import location. + +Python 3 renamed test.test_support to test.support. +""" diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7c075ac895001bf754c1491174a2ff1dd09f114 GIT binary patch literal 421 zcmYk2ziPuU5XR*!bp?KhBU=XBLo$X^x^*dqZXGHVOO8csN!1^WAF1?>vi2?7r6P2okC}H*~So^tSEgB9;{OXcN5s?tnm_*hhTvBy%`~5ZCY5XAweLaD<5qt)-%vW zt(88~&`Efm;ot+;f;$1dI=BRmT3tpx@~|0FvzFs^V2dLHo9XgPZyFwy(Wq}hZox^- z2V7!SkP=&DB(1lyD*Cd?&UcIn(=hf$+zKt4)9+Iq23uQY%czq-Qj}vSWnb=gW9z5S iQ+@HJzMAIiM6MZAxB+98ozD4wFe3Ky;Xc`qLH+@~#fXUj literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/pystone.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/pystone.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e17b4282b9116d4b67dfbb41d1ddb34fba2f2cd8 GIT binary patch literal 6673 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 QQ-VyzG|s_RE+H%VBRsI5IsgCw literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/ssl_servers.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/__pycache__/ssl_servers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bc77bb3f9189914b49313be52347bbb8ddd4757 GIT binary patch literal 6963 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/badcert.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/badcert.pem new file mode 100644 index 0000000..c419146 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/badcert.pem @@ -0,0 +1,36 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXwIBAAKBgQC8ddrhm+LutBvjYcQlnH21PPIseJ1JVG2HMmN2CmZk2YukO+9L +opdJhTvbGfEj0DQs1IE8M+kTUyOmuKfVrFMKwtVeCJphrAnhoz7TYOuLBSqt7lVH +fhi/VwovESJlaBOp+WMnfhcduPEYHYx/6cnVapIkZnLt30zu2um+DzA9jQIDAQAB +AoGBAK0FZpaKj6WnJZN0RqhhK+ggtBWwBnc0U/ozgKz2j1s3fsShYeiGtW6CK5nU +D1dZ5wzhbGThI7LiOXDvRucc9n7vUgi0alqPQ/PFodPxAN/eEYkmXQ7W2k7zwsDA +IUK0KUhktQbLu8qF/m8qM86ba9y9/9YkXuQbZ3COl5ahTZrhAkEA301P08RKv3KM +oXnGU2UHTuJ1MAD2hOrPxjD4/wxA/39EWG9bZczbJyggB4RHu0I3NOSFjAm3HQm0 +ANOu5QK9owJBANgOeLfNNcF4pp+UikRFqxk5hULqRAWzVxVrWe85FlPm0VVmHbb/ +loif7mqjU8o1jTd/LM7RD9f2usZyE2psaw8CQQCNLhkpX3KO5kKJmS9N7JMZSc4j +oog58yeYO8BBqKKzpug0LXuQultYv2K4veaIO04iL9VLe5z9S/Q1jaCHBBuXAkEA +z8gjGoi1AOp6PBBLZNsncCvcV/0aC+1se4HxTNo2+duKSDnbq+ljqOM+E7odU+Nq +ewvIWOG//e8fssd0mq3HywJBAJ8l/c8GVmrpFTx8r/nZ2Pyyjt3dH1widooDXYSV +q6Gbf41Llo5sYAtmxdndTLASuHKecacTgZVhy0FryZpLKrU= +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +Just bad cert data +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXwIBAAKBgQC8ddrhm+LutBvjYcQlnH21PPIseJ1JVG2HMmN2CmZk2YukO+9L +opdJhTvbGfEj0DQs1IE8M+kTUyOmuKfVrFMKwtVeCJphrAnhoz7TYOuLBSqt7lVH +fhi/VwovESJlaBOp+WMnfhcduPEYHYx/6cnVapIkZnLt30zu2um+DzA9jQIDAQAB +AoGBAK0FZpaKj6WnJZN0RqhhK+ggtBWwBnc0U/ozgKz2j1s3fsShYeiGtW6CK5nU +D1dZ5wzhbGThI7LiOXDvRucc9n7vUgi0alqPQ/PFodPxAN/eEYkmXQ7W2k7zwsDA +IUK0KUhktQbLu8qF/m8qM86ba9y9/9YkXuQbZ3COl5ahTZrhAkEA301P08RKv3KM +oXnGU2UHTuJ1MAD2hOrPxjD4/wxA/39EWG9bZczbJyggB4RHu0I3NOSFjAm3HQm0 +ANOu5QK9owJBANgOeLfNNcF4pp+UikRFqxk5hULqRAWzVxVrWe85FlPm0VVmHbb/ +loif7mqjU8o1jTd/LM7RD9f2usZyE2psaw8CQQCNLhkpX3KO5kKJmS9N7JMZSc4j +oog58yeYO8BBqKKzpug0LXuQultYv2K4veaIO04iL9VLe5z9S/Q1jaCHBBuXAkEA +z8gjGoi1AOp6PBBLZNsncCvcV/0aC+1se4HxTNo2+duKSDnbq+ljqOM+E7odU+Nq +ewvIWOG//e8fssd0mq3HywJBAJ8l/c8GVmrpFTx8r/nZ2Pyyjt3dH1widooDXYSV +q6Gbf41Llo5sYAtmxdndTLASuHKecacTgZVhy0FryZpLKrU= +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +Just bad cert data +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/badkey.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/badkey.pem new file mode 100644 index 0000000..1c8a955 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/badkey.pem @@ -0,0 +1,40 @@ +-----BEGIN RSA PRIVATE KEY----- +Bad Key, though the cert should be OK +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICpzCCAhCgAwIBAgIJAP+qStv1cIGNMA0GCSqGSIb3DQEBBQUAMIGJMQswCQYD +VQQGEwJVUzERMA8GA1UECBMIRGVsYXdhcmUxEzARBgNVBAcTCldpbG1pbmd0b24x +IzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMQwwCgYDVQQLEwNT +U0wxHzAdBgNVBAMTFnNvbWVtYWNoaW5lLnB5dGhvbi5vcmcwHhcNMDcwODI3MTY1 +NDUwWhcNMTMwMjE2MTY1NDUwWjCBiTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCERl +bGF3YXJlMRMwEQYDVQQHEwpXaWxtaW5ndG9uMSMwIQYDVQQKExpQeXRob24gU29m +dHdhcmUgRm91bmRhdGlvbjEMMAoGA1UECxMDU1NMMR8wHQYDVQQDExZzb21lbWFj +aGluZS5weXRob24ub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8ddrh +m+LutBvjYcQlnH21PPIseJ1JVG2HMmN2CmZk2YukO+9LopdJhTvbGfEj0DQs1IE8 +M+kTUyOmuKfVrFMKwtVeCJphrAnhoz7TYOuLBSqt7lVHfhi/VwovESJlaBOp+WMn +fhcduPEYHYx/6cnVapIkZnLt30zu2um+DzA9jQIDAQABoxUwEzARBglghkgBhvhC +AQEEBAMCBkAwDQYJKoZIhvcNAQEFBQADgYEAF4Q5BVqmCOLv1n8je/Jw9K669VXb +08hyGzQhkemEBYQd6fzQ9A/1ZzHkJKb1P6yreOLSEh4KcxYPyrLRC1ll8nr5OlCx +CMhKkTnR6qBsdNV0XtdU2+N25hqW+Ma4ZeqsN/iiJVCGNOZGnvQuvCAGWF8+J/f/ +iHkC6gGdBJhogs4= +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Bad Key, though the cert should be OK +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICpzCCAhCgAwIBAgIJAP+qStv1cIGNMA0GCSqGSIb3DQEBBQUAMIGJMQswCQYD +VQQGEwJVUzERMA8GA1UECBMIRGVsYXdhcmUxEzARBgNVBAcTCldpbG1pbmd0b24x +IzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMQwwCgYDVQQLEwNT +U0wxHzAdBgNVBAMTFnNvbWVtYWNoaW5lLnB5dGhvbi5vcmcwHhcNMDcwODI3MTY1 +NDUwWhcNMTMwMjE2MTY1NDUwWjCBiTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCERl +bGF3YXJlMRMwEQYDVQQHEwpXaWxtaW5ndG9uMSMwIQYDVQQKExpQeXRob24gU29m +dHdhcmUgRm91bmRhdGlvbjEMMAoGA1UECxMDU1NMMR8wHQYDVQQDExZzb21lbWFj +aGluZS5weXRob24ub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8ddrh +m+LutBvjYcQlnH21PPIseJ1JVG2HMmN2CmZk2YukO+9LopdJhTvbGfEj0DQs1IE8 +M+kTUyOmuKfVrFMKwtVeCJphrAnhoz7TYOuLBSqt7lVHfhi/VwovESJlaBOp+WMn +fhcduPEYHYx/6cnVapIkZnLt30zu2um+DzA9jQIDAQABoxUwEzARBglghkgBhvhC +AQEEBAMCBkAwDQYJKoZIhvcNAQEFBQADgYEAF4Q5BVqmCOLv1n8je/Jw9K669VXb +08hyGzQhkemEBYQd6fzQ9A/1ZzHkJKb1P6yreOLSEh4KcxYPyrLRC1ll8nr5OlCx +CMhKkTnR6qBsdNV0XtdU2+N25hqW+Ma4ZeqsN/iiJVCGNOZGnvQuvCAGWF8+J/f/ +iHkC6gGdBJhogs4= +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/dh512.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/dh512.pem new file mode 100644 index 0000000..200d16c --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/dh512.pem @@ -0,0 +1,9 @@ +-----BEGIN DH PARAMETERS----- +MEYCQQD1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWak +XUGfnHy9iUsiGSa6q6Jew1XpKgVfAgEC +-----END DH PARAMETERS----- + +These are the 512 bit DH parameters from "Assigned Number for SKIP Protocols" +(http://www.skip-vpn.org/spec/numbers.html). +See there for how they were generated. +Note that g is not a generator, but this is not a problem since p is a safe prime. diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/https_svn_python_org_root.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/https_svn_python_org_root.pem new file mode 100644 index 0000000..e7dfc82 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/https_svn_python_org_root.pem @@ -0,0 +1,41 @@ +-----BEGIN CERTIFICATE----- +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert.passwd.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert.passwd.pem new file mode 100644 index 0000000..e905748 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert.passwd.pem @@ -0,0 +1,33 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,1A8D9D2A02EC698A + +kJYbfZ8L0sfe9Oty3gw0aloNnY5E8fegRfQLZlNoxTl6jNt0nIwI8kDJ36CZgR9c +u3FDJm/KqrfUoz8vW+qEnWhSG7QPX2wWGPHd4K94Yz/FgrRzZ0DoK7XxXq9gOtVA +AVGQhnz32p+6WhfGsCr9ArXEwRZrTk/FvzEPaU5fHcoSkrNVAGX8IpSVkSDwEDQr +Gv17+cfk99UV1OCza6yKHoFkTtrC+PZU71LomBabivS2Oc4B9hYuSR2hF01wTHP+ +YlWNagZOOVtNz4oKK9x9eNQpmfQXQvPPTfusexKIbKfZrMvJoxcm1gfcZ0H/wK6P +6wmXSG35qMOOztCZNtperjs1wzEBXznyK8QmLcAJBjkfarABJX9vBEzZV0OUKhy+ +noORFwHTllphbmydLhu6ehLUZMHPhzAS5UN7srtpSN81eerDMy0RMUAwA7/PofX1 +94Me85Q8jP0PC9ETdsJcPqLzAPETEYu0ELewKRcrdyWi+tlLFrpE5KT/s5ecbl9l +7B61U4Kfd1PIXc/siINhU3A3bYK+845YyUArUOnKf1kEox7p1RpD7yFqVT04lRTo +cibNKATBusXSuBrp2G6GNuhWEOSafWCKJQAzgCYIp6ZTV2khhMUGppc/2H3CF6cO +zX0KtlPVZC7hLkB6HT8SxYUwF1zqWY7+/XPPdc37MeEZ87Q3UuZwqORLY+Z0hpgt +L5JXBCoklZhCAaN2GqwFLXtGiRSRFGY7xXIhbDTlE65Wv1WGGgDLMKGE1gOz3yAo +2jjG1+yAHJUdE69XTFHSqSkvaloA1W03LdMXZ9VuQJ/ySXCie6ABAQ== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICVDCCAb2gAwIBAgIJANfHOBkZr8JOMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV +BAYTAlhZMRcwFQYDVQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9u +IFNvZnR3YXJlIEZvdW5kYXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDEw +MDgyMzAxNTZaFw0yMDEwMDUyMzAxNTZaMF8xCzAJBgNVBAYTAlhZMRcwFQYDVQQH +Ew5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9uIFNvZnR3YXJlIEZvdW5k +YXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEA21vT5isq7F68amYuuNpSFlKDPrMUCa4YWYqZRt2OZ+/3NKaZ2xAiSwr7 +6MrQF70t5nLbSPpqE5+5VrS58SY+g/sXLiFd6AplH1wJZwh78DofbFYXUggktFMt +pTyiX8jtP66bkcPkDADA089RI1TQR6Ca+n7HFa7c1fabVV6i3zkCAwEAAaMYMBYw +FAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBBQUAA4GBAHPctQBEQ4wd +BJ6+JcpIraopLn8BGhbjNWj40mmRqWB/NAWF6M5ne7KpGAu7tLeG4hb1zLaldK8G +lxy2GPSRF6LFS48dpEj2HbMv2nvv6xxalDMJ9+DicWgAKTQ6bcX2j3GUkCR0g/T1 +CRlNBAAlvhKzO7Clpf9l0YKBEfraJByX +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert.pem new file mode 100644 index 0000000..64318aa --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert.pem @@ -0,0 +1,31 @@ +-----BEGIN PRIVATE KEY----- +MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANtb0+YrKuxevGpm +LrjaUhZSgz6zFAmuGFmKmUbdjmfv9zSmmdsQIksK++jK0Be9LeZy20j6ahOfuVa0 +ufEmPoP7Fy4hXegKZR9cCWcIe/A6H2xWF1IIJLRTLaU8ol/I7T+um5HD5AwAwNPP +USNU0Eegmvp+xxWu3NX2m1Veot85AgMBAAECgYA3ZdZ673X0oexFlq7AAmrutkHt +CL7LvwrpOiaBjhyTxTeSNWzvtQBkIU8DOI0bIazA4UreAFffwtvEuPmonDb3F+Iq +SMAu42XcGyVZEl+gHlTPU9XRX7nTOXVt+MlRRRxL6t9GkGfUAXI3XxJDXW3c0vBK +UL9xqD8cORXOfE06rQJBAP8mEX1ERkR64Ptsoe4281vjTlNfIbs7NMPkUnrn9N/Y +BLhjNIfQ3HFZG8BTMLfX7kCS9D593DW5tV4Z9BP/c6cCQQDcFzCcVArNh2JSywOQ +ZfTfRbJg/Z5Lt9Fkngv1meeGNPgIMLN8Sg679pAOOWmzdMO3V706rNPzSVMME7E5 +oPIfAkEA8pDddarP5tCvTTgUpmTFbakm0KoTZm2+FzHcnA4jRh+XNTjTOv98Y6Ik +eO5d1ZnKXseWvkZncQgxfdnMqqpj5wJAcNq/RVne1DbYlwWchT2Si65MYmmJ8t+F +0mcsULqjOnEMwf5e+ptq5LzwbyrHZYq5FNk7ocufPv/ZQrcSSC+cFwJBAKvOJByS +x56qyGeZLOQlWS2JS3KJo59XuLFGqcbgN9Om9xFa41Yb4N9NvplFivsvZdw3m1Q/ +SPIXQuT8RMPDVNQ= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICVDCCAb2gAwIBAgIJANfHOBkZr8JOMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV +BAYTAlhZMRcwFQYDVQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9u +IFNvZnR3YXJlIEZvdW5kYXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDEw +MDgyMzAxNTZaFw0yMDEwMDUyMzAxNTZaMF8xCzAJBgNVBAYTAlhZMRcwFQYDVQQH +Ew5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9uIFNvZnR3YXJlIEZvdW5k +YXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEA21vT5isq7F68amYuuNpSFlKDPrMUCa4YWYqZRt2OZ+/3NKaZ2xAiSwr7 +6MrQF70t5nLbSPpqE5+5VrS58SY+g/sXLiFd6AplH1wJZwh78DofbFYXUggktFMt +pTyiX8jtP66bkcPkDADA089RI1TQR6Ca+n7HFa7c1fabVV6i3zkCAwEAAaMYMBYw +FAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBBQUAA4GBAHPctQBEQ4wd +BJ6+JcpIraopLn8BGhbjNWj40mmRqWB/NAWF6M5ne7KpGAu7tLeG4hb1zLaldK8G +lxy2GPSRF6LFS48dpEj2HbMv2nvv6xxalDMJ9+DicWgAKTQ6bcX2j3GUkCR0g/T1 +CRlNBAAlvhKzO7Clpf9l0YKBEfraJByX +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert2.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert2.pem new file mode 100644 index 0000000..e8a9e08 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/keycert2.pem @@ -0,0 +1,31 @@ +-----BEGIN PRIVATE KEY----- +MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJnsJZVrppL+W5I9 +zGQrrawWwE5QJpBK9nWw17mXrZ03R1cD9BamLGivVISbPlRlAVnZBEyh1ATpsB7d +CUQ+WHEvALquvx4+Yw5l+fXeiYRjrLRBYZuVy8yNtXzU3iWcGObcYRkUdiXdOyP7 +sLF2YZHRvQZpzgDBKkrraeQ81w21AgMBAAECgYBEm7n07FMHWlE+0kT0sXNsLYfy +YE+QKZnJw9WkaDN+zFEEPELkhZVt5BjsMraJr6v2fIEqF0gGGJPkbenffVq2B5dC +lWUOxvJHufMK4sM3Cp6s/gOp3LP+QkzVnvJSfAyZU6l+4PGX5pLdUsXYjPxgzjzL +S36tF7/2Uv1WePyLUQJBAMsPhYzUXOPRgmbhcJiqi9A9c3GO8kvSDYTCKt3VMnqz +HBn6MQ4VQasCD1F+7jWTI0FU/3vdw8non/Fj8hhYqZcCQQDCDRdvmZqDiZnpMqDq +L6ZSrLTVtMvZXZbgwForaAD9uHj51TME7+eYT7EG2YCgJTXJ4YvRJEnPNyskwdKt +vTSTAkEAtaaN/vyemEJ82BIGStwONNw0ILsSr5cZ9tBHzqiA/tipY+e36HRFiXhP +QcU9zXlxyWkDH8iz9DSAmE2jbfoqwwJANlMJ65E543cjIlitGcKLMnvtCCLcKpb7 +xSG0XJB6Lo11OKPJ66jp0gcFTSCY1Lx2CXVd+gfJrfwI1Pp562+bhwJBAJ9IfDPU +R8OpO9v1SGd8x33Owm7uXOpB9d63/T70AD1QOXjKUC4eXYbt0WWfWuny/RNPRuyh +w7DXSfUF+kPKolU= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICXTCCAcagAwIBAgIJAIO3upAG445fMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNV +BAYTAlhZMRcwFQYDVQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9u +IFNvZnR3YXJlIEZvdW5kYXRpb24xFTATBgNVBAMTDGZha2Vob3N0bmFtZTAeFw0x +MDEwMDkxNTAxMDBaFw0yMDEwMDYxNTAxMDBaMGIxCzAJBgNVBAYTAlhZMRcwFQYD +VQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9uIFNvZnR3YXJlIEZv +dW5kYXRpb24xFTATBgNVBAMTDGZha2Vob3N0bmFtZTCBnzANBgkqhkiG9w0BAQEF +AAOBjQAwgYkCgYEAmewllWumkv5bkj3MZCutrBbATlAmkEr2dbDXuZetnTdHVwP0 +FqYsaK9UhJs+VGUBWdkETKHUBOmwHt0JRD5YcS8Auq6/Hj5jDmX59d6JhGOstEFh +m5XLzI21fNTeJZwY5txhGRR2Jd07I/uwsXZhkdG9BmnOAMEqSutp5DzXDbUCAwEA +AaMbMBkwFwYDVR0RBBAwDoIMZmFrZWhvc3RuYW1lMA0GCSqGSIb3DQEBBQUAA4GB +AH+iMClLLGSaKWgwXsmdVo4FhTZZHo8Uprrtg3N9FxEeE50btpDVQysgRt5ias3K +m+bME9zbKwvbVWD5zZdjus4pDgzwF/iHyccL8JyYhxOvS/9zmvAtFXj/APIIbZFp +IT75d9f88ScIGEtknZQejnrdhB64tYki/EqluiuKBqKD +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nokia.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nokia.pem new file mode 100644 index 0000000..0d044df --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nokia.pem @@ -0,0 +1,31 @@ +# Certificate for projects.developer.nokia.com:443 (see issue 13034) +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIQLubqdkCgdc7lAF9NfHlUmjANBgkqhkiG9w0BAQUFADCB +vDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug +YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDE2MDQGA1UEAxMt +VmVyaVNpZ24gQ2xhc3MgMyBJbnRlcm5hdGlvbmFsIFNlcnZlciBDQSAtIEczMB4X +DTExMDkyMTAwMDAwMFoXDTEyMDkyMDIzNTk1OVowcTELMAkGA1UEBhMCRkkxDjAM +BgNVBAgTBUVzcG9vMQ4wDAYDVQQHFAVFc3BvbzEOMAwGA1UEChQFTm9raWExCzAJ +BgNVBAsUAkJJMSUwIwYDVQQDFBxwcm9qZWN0cy5kZXZlbG9wZXIubm9raWEuY29t +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCr92w1bpHYSYxUEx8N/8Iddda2 +lYi+aXNtQfV/l2Fw9Ykv3Ipw4nLeGTj18FFlAZgMdPRlgrzF/NNXGw/9l3/qKdow +CypkQf8lLaxb9Ze1E/KKmkRJa48QTOqvo6GqKuTI6HCeGlG1RxDb8YSKcQWLiytn +yj3Wp4MgRQO266xmMQIDAQABo4IB9jCCAfIwQQYDVR0RBDowOIIccHJvamVjdHMu +ZGV2ZWxvcGVyLm5va2lhLmNvbYIYcHJvamVjdHMuZm9ydW0ubm9raWEuY29tMAkG +A1UdEwQCMAAwCwYDVR0PBAQDAgWgMEEGA1UdHwQ6MDgwNqA0oDKGMGh0dHA6Ly9T +VlJJbnRsLUczLWNybC52ZXJpc2lnbi5jb20vU1ZSSW50bEczLmNybDBEBgNVHSAE +PTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZl +cmlzaWduLmNvbS9ycGEwKAYDVR0lBCEwHwYJYIZIAYb4QgQBBggrBgEFBQcDAQYI +KwYBBQUHAwIwcgYIKwYBBQUHAQEEZjBkMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz +cC52ZXJpc2lnbi5jb20wPAYIKwYBBQUHMAKGMGh0dHA6Ly9TVlJJbnRsLUczLWFp +YS52ZXJpc2lnbi5jb20vU1ZSSW50bEczLmNlcjBuBggrBgEFBQcBDARiMGChXqBc +MFowWDBWFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBRLa7kolgYMu9BSOJsprEsH +iyEFGDAmFiRodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvMS5naWYwDQYJ +KoZIhvcNAQEFBQADggEBACQuPyIJqXwUyFRWw9x5yDXgMW4zYFopQYOw/ItRY522 +O5BsySTh56BWS6mQB07XVfxmYUGAvRQDA5QHpmY8jIlNwSmN3s8RKo+fAtiNRlcL +x/mWSfuMs3D/S6ev3D6+dpEMZtjrhOdctsarMKp8n/hPbwhAbg5hVjpkW5n8vz2y +0KxvvkA1AxpLwpVv7OlK17ttzIHw8bp9HTlHBU5s8bKz4a565V/a5HI0CSEv/+0y +ko4/ghTnZc1CkmUngKKeFMSah/mT/xAh8XnE2l1AazFa8UKuYki1e+ArHaGZc4ix +UYOtiRphwfuYQhRZ7qX9q2MMkCMI65XNK/SaFrAbbG0= +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nullbytecert.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nullbytecert.pem new file mode 100644 index 0000000..447186c --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nullbytecert.pem @@ -0,0 +1,90 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 0 (0x0) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, ST=Oregon, L=Beaverton, O=Python Software Foundation, OU=Python Core Development, CN=null.python.org\x00example.org/emailAddress=python-dev@python.org + Validity + Not Before: Aug 7 13:11:52 2013 GMT + Not After : Aug 7 13:12:52 2013 GMT + Subject: C=US, ST=Oregon, L=Beaverton, O=Python Software Foundation, OU=Python Core Development, CN=null.python.org\x00example.org/emailAddress=python-dev@python.org + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:b5:ea:ed:c9:fb:46:7d:6f:3b:76:80:dd:3a:f3: + 03:94:0b:a7:a6:db:ec:1d:df:ff:23:74:08:9d:97: + 16:3f:a3:a4:7b:3e:1b:0e:96:59:25:03:a7:26:e2: + 88:a9:cf:79:cd:f7:04:56:b0:ab:79:32:6e:59:c1: + 32:30:54:eb:58:a8:cb:91:f0:42:a5:64:27:cb:d4: + 56:31:88:52:ad:cf:bd:7f:f0:06:64:1f:cc:27:b8: + a3:8b:8c:f3:d8:29:1f:25:0b:f5:46:06:1b:ca:02: + 45:ad:7b:76:0a:9c:bf:bb:b9:ae:0d:16:ab:60:75: + ae:06:3e:9c:7c:31:dc:92:2f:29:1a:e0:4b:0c:91: + 90:6c:e9:37:c5:90:d7:2a:d7:97:15:a3:80:8f:5d: + 7b:49:8f:54:30:d4:97:2c:1c:5b:37:b5:ab:69:30: + 68:43:d3:33:78:4b:02:60:f5:3c:44:80:a1:8f:e7: + f0:0f:d1:5e:87:9e:46:cf:62:fc:f9:bf:0c:65:12: + f1:93:c8:35:79:3f:c8:ec:ec:47:f5:ef:be:44:d5: + ae:82:1e:2d:9a:9f:98:5a:67:65:e1:74:70:7c:cb: + d3:c2:ce:0e:45:49:27:dc:e3:2d:d4:fb:48:0e:2f: + 9e:77:b8:14:46:c0:c4:36:ca:02:ae:6a:91:8c:da: + 2f:85 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:FALSE + X509v3 Subject Key Identifier: + 88:5A:55:C0:52:FF:61:CD:52:A3:35:0F:EA:5A:9C:24:38:22:F7:5C + X509v3 Key Usage: + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Subject Alternative Name: + ************************************************************* + WARNING: The values for DNS, email and URI are WRONG. OpenSSL + doesn't print the text after a NULL byte. + ************************************************************* + DNS:altnull.python.org, email:null@python.org, URI:http://null.python.org, IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1 + Signature Algorithm: sha1WithRSAEncryption + ac:4f:45:ef:7d:49:a8:21:70:8e:88:59:3e:d4:36:42:70:f5: + a3:bd:8b:d7:a8:d0:58:f6:31:4a:b1:a4:a6:dd:6f:d9:e8:44: + 3c:b6:0a:71:d6:7f:b1:08:61:9d:60:ce:75:cf:77:0c:d2:37: + 86:02:8d:5e:5d:f9:0f:71:b4:16:a8:c1:3d:23:1c:f1:11:b3: + 56:6e:ca:d0:8d:34:94:e6:87:2a:99:f2:ae:ae:cc:c2:e8:86: + de:08:a8:7f:c5:05:fa:6f:81:a7:82:e6:d0:53:9d:34:f4:ac: + 3e:40:fe:89:57:7a:29:a4:91:7e:0b:c6:51:31:e5:10:2f:a4: + 60:76:cd:95:51:1a:be:8b:a1:b0:fd:ad:52:bd:d7:1b:87:60: + d2:31:c7:17:c4:18:4f:2d:08:25:a3:a7:4f:b7:92:ca:e2:f5: + 25:f1:54:75:81:9d:b3:3d:61:a2:f7:da:ed:e1:c6:6f:2c:60: + 1f:d8:6f:c5:92:05:ab:c9:09:62:49:a9:14:ad:55:11:cc:d6: + 4a:19:94:99:97:37:1d:81:5f:8b:cf:a3:a8:96:44:51:08:3d: + 0b:05:65:12:eb:b6:70:80:88:48:72:4f:c6:c2:da:cf:cd:8e: + 5b:ba:97:2f:60:b4:96:56:49:5e:3a:43:76:63:04:be:2a:f6: + c1:ca:a9:94 +-----BEGIN CERTIFICATE----- +MIIE2DCCA8CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBxTELMAkGA1UEBhMCVVMx +DzANBgNVBAgMBk9yZWdvbjESMBAGA1UEBwwJQmVhdmVydG9uMSMwIQYDVQQKDBpQ +eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjEgMB4GA1UECwwXUHl0aG9uIENvcmUg +RGV2ZWxvcG1lbnQxJDAiBgNVBAMMG251bGwucHl0aG9uLm9yZwBleGFtcGxlLm9y +ZzEkMCIGCSqGSIb3DQEJARYVcHl0aG9uLWRldkBweXRob24ub3JnMB4XDTEzMDgw +NzEzMTE1MloXDTEzMDgwNzEzMTI1MlowgcUxCzAJBgNVBAYTAlVTMQ8wDQYDVQQI +DAZPcmVnb24xEjAQBgNVBAcMCUJlYXZlcnRvbjEjMCEGA1UECgwaUHl0aG9uIFNv +ZnR3YXJlIEZvdW5kYXRpb24xIDAeBgNVBAsMF1B5dGhvbiBDb3JlIERldmVsb3Bt +ZW50MSQwIgYDVQQDDBtudWxsLnB5dGhvbi5vcmcAZXhhbXBsZS5vcmcxJDAiBgkq +hkiG9w0BCQEWFXB5dGhvbi1kZXZAcHl0aG9uLm9yZzCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBALXq7cn7Rn1vO3aA3TrzA5QLp6bb7B3f/yN0CJ2XFj+j +pHs+Gw6WWSUDpybiiKnPec33BFawq3kyblnBMjBU61ioy5HwQqVkJ8vUVjGIUq3P +vX/wBmQfzCe4o4uM89gpHyUL9UYGG8oCRa17dgqcv7u5rg0Wq2B1rgY+nHwx3JIv +KRrgSwyRkGzpN8WQ1yrXlxWjgI9de0mPVDDUlywcWze1q2kwaEPTM3hLAmD1PESA +oY/n8A/RXoeeRs9i/Pm/DGUS8ZPINXk/yOzsR/XvvkTVroIeLZqfmFpnZeF0cHzL +08LODkVJJ9zjLdT7SA4vnne4FEbAxDbKAq5qkYzaL4UCAwEAAaOB0DCBzTAMBgNV +HRMBAf8EAjAAMB0GA1UdDgQWBBSIWlXAUv9hzVKjNQ/qWpwkOCL3XDALBgNVHQ8E +BAMCBeAwgZAGA1UdEQSBiDCBhYIeYWx0bnVsbC5weXRob24ub3JnAGV4YW1wbGUu +Y29tgSBudWxsQHB5dGhvbi5vcmcAdXNlckBleGFtcGxlLm9yZ4YpaHR0cDovL251 +bGwucHl0aG9uLm9yZwBodHRwOi8vZXhhbXBsZS5vcmeHBMAAAgGHECABDbgAAAAA +AAAAAAAAAAEwDQYJKoZIhvcNAQEFBQADggEBAKxPRe99SaghcI6IWT7UNkJw9aO9 +i9eo0Fj2MUqxpKbdb9noRDy2CnHWf7EIYZ1gznXPdwzSN4YCjV5d+Q9xtBaowT0j +HPERs1ZuytCNNJTmhyqZ8q6uzMLoht4IqH/FBfpvgaeC5tBTnTT0rD5A/olXeimk +kX4LxlEx5RAvpGB2zZVRGr6LobD9rVK91xuHYNIxxxfEGE8tCCWjp0+3ksri9SXx +VHWBnbM9YaL32u3hxm8sYB/Yb8WSBavJCWJJqRStVRHM1koZlJmXNx2BX4vPo6iW +RFEIPQsFZRLrtnCAiEhyT8bC2s/Njlu6ly9gtJZWSV46Q3ZjBL4q9sHKqZQ= +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nullcert.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/nullcert.pem new file mode 100644 index 0000000..e69de29 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/pystone.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/pystone.py new file mode 100644 index 0000000..7652027 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/pystone.py @@ -0,0 +1,272 @@ +#!/usr/bin/env python3 + +""" +"PYSTONE" Benchmark Program + +Version: Python/1.1 (corresponds to C/1.1 plus 2 Pystone fixes) + +Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013. + + Translated from ADA to C by Rick Richardson. + Every method to preserve ADA-likeness has been used, + at the expense of C-ness. + + Translated from C to Python by Guido van Rossum. + +Version History: + + Version 1.1 corrects two bugs in version 1.0: + + First, it leaked memory: in Proc1(), NextRecord ends + up having a pointer to itself. I have corrected this + by zapping NextRecord.PtrComp at the end of Proc1(). + + Second, Proc3() used the operator != to compare a + record to None. This is rather inefficient and not + true to the intention of the original benchmark (where + a pointer comparison to None is intended; the != + operator attempts to find a method __cmp__ to do value + comparison of the record). Version 1.1 runs 5-10 + percent faster than version 1.0, so benchmark figures + of different versions can't be compared directly. + +""" + +from __future__ import print_function + +from time import clock + +LOOPS = 50000 + +__version__ = "1.1" + +[Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6) + +class Record(object): + + def __init__(self, PtrComp = None, Discr = 0, EnumComp = 0, + IntComp = 0, StringComp = 0): + self.PtrComp = PtrComp + self.Discr = Discr + self.EnumComp = EnumComp + self.IntComp = IntComp + self.StringComp = StringComp + + def copy(self): + return Record(self.PtrComp, self.Discr, self.EnumComp, + self.IntComp, self.StringComp) + +TRUE = 1 +FALSE = 0 + +def main(loops=LOOPS): + benchtime, stones = pystones(loops) + print("Pystone(%s) time for %d passes = %g" % \ + (__version__, loops, benchtime)) + print("This machine benchmarks at %g pystones/second" % stones) + + +def pystones(loops=LOOPS): + return Proc0(loops) + +IntGlob = 0 +BoolGlob = FALSE +Char1Glob = '\0' +Char2Glob = '\0' +Array1Glob = [0]*51 +Array2Glob = [x[:] for x in [Array1Glob]*51] +PtrGlb = None +PtrGlbNext = None + +def Proc0(loops=LOOPS): + global IntGlob + global BoolGlob + global Char1Glob + global Char2Glob + global Array1Glob + global Array2Glob + global PtrGlb + global PtrGlbNext + + starttime = clock() + for i in range(loops): + pass + nulltime = clock() - starttime + + PtrGlbNext = Record() + PtrGlb = Record() + PtrGlb.PtrComp = PtrGlbNext + PtrGlb.Discr = Ident1 + PtrGlb.EnumComp = Ident3 + PtrGlb.IntComp = 40 + PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING" + String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING" + Array2Glob[8][7] = 10 + + starttime = clock() + + for i in range(loops): + Proc5() + Proc4() + IntLoc1 = 2 + IntLoc2 = 3 + String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING" + EnumLoc = Ident2 + BoolGlob = not Func2(String1Loc, String2Loc) + while IntLoc1 < IntLoc2: + IntLoc3 = 5 * IntLoc1 - IntLoc2 + IntLoc3 = Proc7(IntLoc1, IntLoc2) + IntLoc1 = IntLoc1 + 1 + Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3) + PtrGlb = Proc1(PtrGlb) + CharIndex = 'A' + while CharIndex <= Char2Glob: + if EnumLoc == Func1(CharIndex, 'C'): + EnumLoc = Proc6(Ident1) + CharIndex = chr(ord(CharIndex)+1) + IntLoc3 = IntLoc2 * IntLoc1 + IntLoc2 = IntLoc3 / IntLoc1 + IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1 + IntLoc1 = Proc2(IntLoc1) + + benchtime = clock() - starttime - nulltime + if benchtime == 0.0: + loopsPerBenchtime = 0.0 + else: + loopsPerBenchtime = (loops / benchtime) + return benchtime, loopsPerBenchtime + +def Proc1(PtrParIn): + PtrParIn.PtrComp = NextRecord = PtrGlb.copy() + PtrParIn.IntComp = 5 + NextRecord.IntComp = PtrParIn.IntComp + NextRecord.PtrComp = PtrParIn.PtrComp + NextRecord.PtrComp = Proc3(NextRecord.PtrComp) + if NextRecord.Discr == Ident1: + NextRecord.IntComp = 6 + NextRecord.EnumComp = Proc6(PtrParIn.EnumComp) + NextRecord.PtrComp = PtrGlb.PtrComp + NextRecord.IntComp = Proc7(NextRecord.IntComp, 10) + else: + PtrParIn = NextRecord.copy() + NextRecord.PtrComp = None + return PtrParIn + +def Proc2(IntParIO): + IntLoc = IntParIO + 10 + while 1: + if Char1Glob == 'A': + IntLoc = IntLoc - 1 + IntParIO = IntLoc - IntGlob + EnumLoc = Ident1 + if EnumLoc == Ident1: + break + return IntParIO + +def Proc3(PtrParOut): + global IntGlob + + if PtrGlb is not None: + PtrParOut = PtrGlb.PtrComp + else: + IntGlob = 100 + PtrGlb.IntComp = Proc7(10, IntGlob) + return PtrParOut + +def Proc4(): + global Char2Glob + + BoolLoc = Char1Glob == 'A' + BoolLoc = BoolLoc or BoolGlob + Char2Glob = 'B' + +def Proc5(): + global Char1Glob + global BoolGlob + + Char1Glob = 'A' + BoolGlob = FALSE + +def Proc6(EnumParIn): + EnumParOut = EnumParIn + if not Func3(EnumParIn): + EnumParOut = Ident4 + if EnumParIn == Ident1: + EnumParOut = Ident1 + elif EnumParIn == Ident2: + if IntGlob > 100: + EnumParOut = Ident1 + else: + EnumParOut = Ident4 + elif EnumParIn == Ident3: + EnumParOut = Ident2 + elif EnumParIn == Ident4: + pass + elif EnumParIn == Ident5: + EnumParOut = Ident3 + return EnumParOut + +def Proc7(IntParI1, IntParI2): + IntLoc = IntParI1 + 2 + IntParOut = IntParI2 + IntLoc + return IntParOut + +def Proc8(Array1Par, Array2Par, IntParI1, IntParI2): + global IntGlob + + IntLoc = IntParI1 + 5 + Array1Par[IntLoc] = IntParI2 + Array1Par[IntLoc+1] = Array1Par[IntLoc] + Array1Par[IntLoc+30] = IntLoc + for IntIndex in range(IntLoc, IntLoc+2): + Array2Par[IntLoc][IntIndex] = IntLoc + Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1 + Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc] + IntGlob = 5 + +def Func1(CharPar1, CharPar2): + CharLoc1 = CharPar1 + CharLoc2 = CharLoc1 + if CharLoc2 != CharPar2: + return Ident1 + else: + return Ident2 + +def Func2(StrParI1, StrParI2): + IntLoc = 1 + while IntLoc <= 1: + if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1: + CharLoc = 'A' + IntLoc = IntLoc + 1 + if CharLoc >= 'W' and CharLoc <= 'Z': + IntLoc = 7 + if CharLoc == 'X': + return TRUE + else: + if StrParI1 > StrParI2: + IntLoc = IntLoc + 7 + return TRUE + else: + return FALSE + +def Func3(EnumParIn): + EnumLoc = EnumParIn + if EnumLoc == Ident3: return TRUE + return FALSE + +if __name__ == '__main__': + import sys + def error(msg): + print(msg, end=' ', file=sys.stderr) + print("usage: %s [number_of_loops]" % sys.argv[0], file=sys.stderr) + sys.exit(100) + nargs = len(sys.argv) - 1 + if nargs > 1: + error("%d arguments are too many;" % nargs) + elif nargs == 1: + try: loops = int(sys.argv[1]) + except ValueError: + error("Invalid argument %r;" % sys.argv[1]) + else: + loops = LOOPS + main(loops) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/sha256.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/sha256.pem new file mode 100644 index 0000000..d3db4b8 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/sha256.pem @@ -0,0 +1,128 @@ +# Certificate chain for https://sha256.tbs-internet.com + 0 s:/C=FR/postalCode=14000/ST=Calvados/L=CAEN/street=22 rue de Bretagne/O=TBS INTERNET/OU=0002 440443810/OU=sha-256 production/CN=sha256.tbs-internet.com + i:/C=FR/ST=Calvados/L=Caen/O=TBS INTERNET/OU=Terms and Conditions: http://www.tbs-internet.com/CA/repository/OU=TBS INTERNET CA/CN=TBS X509 CA SGC +-----BEGIN CERTIFICATE----- +MIIGXDCCBUSgAwIBAgIRAKpVmHgg9nfCodAVwcP4siwwDQYJKoZIhvcNAQELBQAw +gcQxCzAJBgNVBAYTAkZSMREwDwYDVQQIEwhDYWx2YWRvczENMAsGA1UEBxMEQ2Fl +bjEVMBMGA1UEChMMVEJTIElOVEVSTkVUMUgwRgYDVQQLEz9UZXJtcyBhbmQgQ29u +ZGl0aW9uczogaHR0cDovL3d3dy50YnMtaW50ZXJuZXQuY29tL0NBL3JlcG9zaXRv +cnkxGDAWBgNVBAsTD1RCUyBJTlRFUk5FVCBDQTEYMBYGA1UEAxMPVEJTIFg1MDkg +Q0EgU0dDMB4XDTEyMDEwNDAwMDAwMFoXDTE0MDIxNzIzNTk1OVowgcsxCzAJBgNV +BAYTAkZSMQ4wDAYDVQQREwUxNDAwMDERMA8GA1UECBMIQ2FsdmFkb3MxDTALBgNV +BAcTBENBRU4xGzAZBgNVBAkTEjIyIHJ1ZSBkZSBCcmV0YWduZTEVMBMGA1UEChMM +VEJTIElOVEVSTkVUMRcwFQYDVQQLEw4wMDAyIDQ0MDQ0MzgxMDEbMBkGA1UECxMS +c2hhLTI1NiBwcm9kdWN0aW9uMSAwHgYDVQQDExdzaGEyNTYudGJzLWludGVybmV0 +LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQIX/zdJcyxty0m +PM1XQSoSSifueS3AVcgqMsaIKS/u+rYzsv4hQ/qA6vLn5m5/ewUcZDj7zdi6rBVf +PaVNXJ6YinLX0tkaW8TEjeVuZG5yksGZlhCt1CJ1Ho9XLiLaP4uJ7MCoNUntpJ+E +LfrOdgsIj91kPmwjDJeztVcQCvKzhjVJA/KxdInc0JvOATn7rpaSmQI5bvIjufgo +qVsTPwVFzuUYULXBk7KxRT7MiEqnd5HvviNh0285QC478zl3v0I0Fb5El4yD3p49 +IthcRnxzMKc0UhU5ogi0SbONyBfm/mzONVfSxpM+MlyvZmJqrbuuLoEDzJD+t8PU +xSuzgbcCAwEAAaOCAj4wggI6MB8GA1UdIwQYMBaAFAdEdoWTKLx/bXjSCuv6TEvf +2YIfMB0GA1UdDgQWBBT/qTGYdaj+f61c2IRFL/B1eEsM8DAOBgNVHQ8BAf8EBAMC +BaAwDAYDVR0TAQH/BAIwADA0BgNVHSUELTArBggrBgEFBQcDAQYIKwYBBQUHAwIG +CisGAQQBgjcKAwMGCWCGSAGG+EIEATBLBgNVHSAERDBCMEAGCisGAQQB5TcCBAEw +MjAwBggrBgEFBQcCARYkaHR0cHM6Ly93d3cudGJzLWludGVybmV0LmNvbS9DQS9D +UFM0MG0GA1UdHwRmMGQwMqAwoC6GLGh0dHA6Ly9jcmwudGJzLWludGVybmV0LmNv +bS9UQlNYNTA5Q0FTR0MuY3JsMC6gLKAqhihodHRwOi8vY3JsLnRicy14NTA5LmNv +bS9UQlNYNTA5Q0FTR0MuY3JsMIGmBggrBgEFBQcBAQSBmTCBljA4BggrBgEFBQcw +AoYsaHR0cDovL2NydC50YnMtaW50ZXJuZXQuY29tL1RCU1g1MDlDQVNHQy5jcnQw +NAYIKwYBBQUHMAKGKGh0dHA6Ly9jcnQudGJzLXg1MDkuY29tL1RCU1g1MDlDQVNH +Qy5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnRicy14NTA5LmNvbTA/BgNV +HREEODA2ghdzaGEyNTYudGJzLWludGVybmV0LmNvbYIbd3d3LnNoYTI1Ni50YnMt +aW50ZXJuZXQuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQA0pOuL8QvAa5yksTbGShzX +ABApagunUGoEydv4YJT1MXy9tTp7DrWaozZSlsqBxrYAXP1d9r2fuKbEniYHxaQ0 +UYaf1VSIlDo1yuC8wE7wxbHDIpQ/E5KAyxiaJ8obtDhFstWAPAH+UoGXq0kj2teN +21sFQ5dXgA95nldvVFsFhrRUNB6xXAcaj0VZFhttI0ZfQZmQwEI/P+N9Jr40OGun +aa+Dn0TMeUH4U20YntfLbu2nDcJcYfyurm+8/0Tr4HznLnedXu9pCPYj0TaddrgT +XO0oFiyy7qGaY6+qKh71yD64Y3ycCJ/HR9Wm39mjZYc9ezYwT4noP6r7Lk8YO7/q +-----END CERTIFICATE----- + 1 s:/C=FR/ST=Calvados/L=Caen/O=TBS INTERNET/OU=Terms and Conditions: http://www.tbs-internet.com/CA/repository/OU=TBS INTERNET CA/CN=TBS X509 CA SGC + i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQXpDZ0ETJMV02WTx3GTnhhTANBgkqhkiG9w0BAQUFADBv +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk +ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF +eHRlcm5hbCBDQSBSb290MB4XDTA1MTIwMTAwMDAwMFoXDTE5MDYyNDE5MDYzMFow +gcQxCzAJBgNVBAYTAkZSMREwDwYDVQQIEwhDYWx2YWRvczENMAsGA1UEBxMEQ2Fl +bjEVMBMGA1UEChMMVEJTIElOVEVSTkVUMUgwRgYDVQQLEz9UZXJtcyBhbmQgQ29u +ZGl0aW9uczogaHR0cDovL3d3dy50YnMtaW50ZXJuZXQuY29tL0NBL3JlcG9zaXRv +cnkxGDAWBgNVBAsTD1RCUyBJTlRFUk5FVCBDQTEYMBYGA1UEAxMPVEJTIFg1MDkg +Q0EgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsgOkO3f7wzN6 +rOjg45tR5vjBfzK7qmV9IBxb/QW9EEXxG+E7FNhZqQLtwGBKoSsHTnQqV75wWMk0 +9tinWvftBkSpj5sTi/8cbzJfUvTSVYh3Qxv6AVVjMMH/ruLjE6y+4PoaPs8WoYAQ +ts5R4Z1g8c/WnTepLst2x0/Wv7GmuoQi+gXvHU6YrBiu7XkeYhzc95QdviWSJRDk +owhb5K43qhcvjRmBfO/paGlCliDGZp8mHwrI21mwobWpVjTxZRwYO3bd4+TGcI4G +Ie5wmHwE8F7SK1tgSqbBacKjDa93j7txKkfz/Yd2n7TGqOXiHPsJpG655vrKtnXk +9vs1zoDeJQIDAQABo4IBljCCAZIwHQYDVR0OBBYEFAdEdoWTKLx/bXjSCuv6TEvf +2YIfMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCAGA1UdJQQZ +MBcGCisGAQQBgjcKAwMGCWCGSAGG+EIEATAYBgNVHSAEETAPMA0GCysGAQQBgOU3 +AgQBMHsGA1UdHwR0MHIwOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0Fk +ZFRydXN0RXh0ZXJuYWxDQVJvb3QuY3JsMDagNKAyhjBodHRwOi8vY3JsLmNvbW9k +by5uZXQvQWRkVHJ1c3RFeHRlcm5hbENBUm9vdC5jcmwwgYAGCCsGAQUFBwEBBHQw +cjA4BggrBgEFBQcwAoYsaHR0cDovL2NydC5jb21vZG9jYS5jb20vQWRkVHJ1c3RV +VE5TR0NDQS5jcnQwNgYIKwYBBQUHMAKGKmh0dHA6Ly9jcnQuY29tb2RvLm5ldC9B +ZGRUcnVzdFVUTlNHQ0NBLmNydDARBglghkgBhvhCAQEEBAMCAgQwDQYJKoZIhvcN +AQEFBQADggEBAK2zEzs+jcIrVK9oDkdDZNvhuBYTdCfpxfFs+OAujW0bIfJAy232 +euVsnJm6u/+OrqKudD2tad2BbejLLXhMZViaCmK7D9nrXHx4te5EP8rL19SUVqLY +1pTnv5dhNgEgvA7n5lIzDSYs7yRLsr7HJsYPr6SeYSuZizyX1SNz7ooJ32/F3X98 +RB0Mlc/E0OyOrkQ9/y5IrnpnaSora8CnUrV5XNOg+kyCz9edCyx4D5wXYcwZPVWz +8aDqquESrezPyjtfi4WRO4s/VD3HLZvOxzMrWAVYCDG9FxaOhF0QGuuG1F7F3GKV +v6prNyCl016kRl2j1UT+a7gLd8fA25A4C9E= +-----END CERTIFICATE----- + 2 s:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root + i:/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN - DATACorp SGC +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQUSYKkxzif5zDpV954HKugjANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw0wNTA2MDcwODA5MTBaFw0xOTA2MjQxOTA2MzBaMG8xCzAJBgNVBAYT +AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0 +ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC39xoz5vIABC05 +4E5b7R+8bA/Ntfojts7emxEzl6QpTH2Tn71KvJPtAxrjj8/lbVBa1pcplFqAsEl6 +2y6V/bjKvzc4LR4+kUGtcFbH8E8/6DKedMrIkFTpxl8PeJ2aQDwOrGGqXhSPnoeh +alDc15pOrwWzpnGUnHGzUGAKxxOdOAeGAqjpqGkmGJCrTLBPI6s6T4TY386f4Wlv +u9dC12tE5Met7m1BX3JacQg3s3llpFmglDf3AC8NwpJy2tA4ctsUqEXEXSp9t7TW +xO6szRNEt8kr3UMAJfphuWlqWCMRt6czj1Z1WfXNKddGtworZbbTQm8Vsrh7++/p +XVPVNFonAgMBAAGjgdgwgdUwHwYDVR0jBBgwFoAUUzLRs89/+uDxoF2FTpLSnkUd +tE8wHQYDVR0OBBYEFK29mHo0tCb3+sQmVO8DveAky1QaMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MBEGCWCGSAGG+EIBAQQEAwIBAjAgBgNVHSUEGTAX +BgorBgEEAYI3CgMDBglghkgBhvhCBAEwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDov +L2NybC51c2VydHJ1c3QuY29tL1VUTi1EQVRBQ29ycFNHQy5jcmwwDQYJKoZIhvcN +AQEFBQADggEBAMbuUxdoFLJRIh6QWA2U/b3xcOWGLcM2MY9USEbnLQg3vGwKYOEO +rVE04BKT6b64q7gmtOmWPSiPrmQH/uAB7MXjkesYoPF1ftsK5p+R26+udd8jkWjd +FwBaS/9kbHDrARrQkNnHptZt9hPk/7XJ0h4qy7ElQyZ42TCbTg0evmnv3+r+LbPM ++bDdtRTKkdSytaX7ARmjR3mfnYyVhzT4HziS2jamEfpr62vp3EV4FTkG101B5CHI +3C+H0be/SGB1pWLLJN47YaApIKa+xWycxOkKaSLvkTr6Jq/RW0GnOuL4OAdCq8Fb ++M5tug8EPzI0rNwEKNdwMBQmBsTkm5jVz3g= +-----END CERTIFICATE----- + 3 s:/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN - DATACorp SGC + i:/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN - DATACorp SGC +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_cert.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_cert.pem new file mode 100644 index 0000000..47a7d7e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_cert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICVDCCAb2gAwIBAgIJANfHOBkZr8JOMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV +BAYTAlhZMRcwFQYDVQQHEw5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9u +IFNvZnR3YXJlIEZvdW5kYXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDEw +MDgyMzAxNTZaFw0yMDEwMDUyMzAxNTZaMF8xCzAJBgNVBAYTAlhZMRcwFQYDVQQH +Ew5DYXN0bGUgQW50aHJheDEjMCEGA1UEChMaUHl0aG9uIFNvZnR3YXJlIEZvdW5k +YXRpb24xEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEA21vT5isq7F68amYuuNpSFlKDPrMUCa4YWYqZRt2OZ+/3NKaZ2xAiSwr7 +6MrQF70t5nLbSPpqE5+5VrS58SY+g/sXLiFd6AplH1wJZwh78DofbFYXUggktFMt +pTyiX8jtP66bkcPkDADA089RI1TQR6Ca+n7HFa7c1fabVV6i3zkCAwEAAaMYMBYw +FAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBBQUAA4GBAHPctQBEQ4wd +BJ6+JcpIraopLn8BGhbjNWj40mmRqWB/NAWF6M5ne7KpGAu7tLeG4hb1zLaldK8G +lxy2GPSRF6LFS48dpEj2HbMv2nvv6xxalDMJ9+DicWgAKTQ6bcX2j3GUkCR0g/T1 +CRlNBAAlvhKzO7Clpf9l0YKBEfraJByX +-----END CERTIFICATE----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_key.passwd.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_key.passwd.pem new file mode 100644 index 0000000..2524672 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_key.passwd.pem @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,1A8D9D2A02EC698A + +kJYbfZ8L0sfe9Oty3gw0aloNnY5E8fegRfQLZlNoxTl6jNt0nIwI8kDJ36CZgR9c +u3FDJm/KqrfUoz8vW+qEnWhSG7QPX2wWGPHd4K94Yz/FgrRzZ0DoK7XxXq9gOtVA +AVGQhnz32p+6WhfGsCr9ArXEwRZrTk/FvzEPaU5fHcoSkrNVAGX8IpSVkSDwEDQr +Gv17+cfk99UV1OCza6yKHoFkTtrC+PZU71LomBabivS2Oc4B9hYuSR2hF01wTHP+ +YlWNagZOOVtNz4oKK9x9eNQpmfQXQvPPTfusexKIbKfZrMvJoxcm1gfcZ0H/wK6P +6wmXSG35qMOOztCZNtperjs1wzEBXznyK8QmLcAJBjkfarABJX9vBEzZV0OUKhy+ +noORFwHTllphbmydLhu6ehLUZMHPhzAS5UN7srtpSN81eerDMy0RMUAwA7/PofX1 +94Me85Q8jP0PC9ETdsJcPqLzAPETEYu0ELewKRcrdyWi+tlLFrpE5KT/s5ecbl9l +7B61U4Kfd1PIXc/siINhU3A3bYK+845YyUArUOnKf1kEox7p1RpD7yFqVT04lRTo +cibNKATBusXSuBrp2G6GNuhWEOSafWCKJQAzgCYIp6ZTV2khhMUGppc/2H3CF6cO +zX0KtlPVZC7hLkB6HT8SxYUwF1zqWY7+/XPPdc37MeEZ87Q3UuZwqORLY+Z0hpgt +L5JXBCoklZhCAaN2GqwFLXtGiRSRFGY7xXIhbDTlE65Wv1WGGgDLMKGE1gOz3yAo +2jjG1+yAHJUdE69XTFHSqSkvaloA1W03LdMXZ9VuQJ/ySXCie6ABAQ== +-----END RSA PRIVATE KEY----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_key.pem b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_key.pem new file mode 100644 index 0000000..3fd3bbd --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_key.pem @@ -0,0 +1,16 @@ +-----BEGIN PRIVATE KEY----- +MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANtb0+YrKuxevGpm +LrjaUhZSgz6zFAmuGFmKmUbdjmfv9zSmmdsQIksK++jK0Be9LeZy20j6ahOfuVa0 +ufEmPoP7Fy4hXegKZR9cCWcIe/A6H2xWF1IIJLRTLaU8ol/I7T+um5HD5AwAwNPP +USNU0Eegmvp+xxWu3NX2m1Veot85AgMBAAECgYA3ZdZ673X0oexFlq7AAmrutkHt +CL7LvwrpOiaBjhyTxTeSNWzvtQBkIU8DOI0bIazA4UreAFffwtvEuPmonDb3F+Iq +SMAu42XcGyVZEl+gHlTPU9XRX7nTOXVt+MlRRRxL6t9GkGfUAXI3XxJDXW3c0vBK +UL9xqD8cORXOfE06rQJBAP8mEX1ERkR64Ptsoe4281vjTlNfIbs7NMPkUnrn9N/Y +BLhjNIfQ3HFZG8BTMLfX7kCS9D593DW5tV4Z9BP/c6cCQQDcFzCcVArNh2JSywOQ +ZfTfRbJg/Z5Lt9Fkngv1meeGNPgIMLN8Sg679pAOOWmzdMO3V706rNPzSVMME7E5 +oPIfAkEA8pDddarP5tCvTTgUpmTFbakm0KoTZm2+FzHcnA4jRh+XNTjTOv98Y6Ik +eO5d1ZnKXseWvkZncQgxfdnMqqpj5wJAcNq/RVne1DbYlwWchT2Si65MYmmJ8t+F +0mcsULqjOnEMwf5e+ptq5LzwbyrHZYq5FNk7ocufPv/ZQrcSSC+cFwJBAKvOJByS +x56qyGeZLOQlWS2JS3KJo59XuLFGqcbgN9Om9xFa41Yb4N9NvplFivsvZdw3m1Q/ +SPIXQuT8RMPDVNQ= +-----END PRIVATE KEY----- diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_servers.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_servers.py new file mode 100644 index 0000000..87a3fb8 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/ssl_servers.py @@ -0,0 +1,207 @@ +from __future__ import absolute_import, division, print_function, unicode_literals +from future.builtins import filter, str +from future import utils +import os +import sys +import ssl +import pprint +import socket +from future.backports.urllib import parse as urllib_parse +from future.backports.http.server import (HTTPServer as _HTTPServer, + SimpleHTTPRequestHandler, BaseHTTPRequestHandler) +from future.backports.test import support +threading = support.import_module("threading") + +here = os.path.dirname(__file__) + +HOST = support.HOST +CERTFILE = os.path.join(here, 'keycert.pem') + +# This one's based on HTTPServer, which is based on SocketServer + +class HTTPSServer(_HTTPServer): + + def __init__(self, server_address, handler_class, context): + _HTTPServer.__init__(self, server_address, handler_class) + self.context = context + + def __str__(self): + return ('<%s %s:%s>' % + (self.__class__.__name__, + self.server_name, + self.server_port)) + + def get_request(self): + # override this to wrap socket with SSL + try: + sock, addr = self.socket.accept() + sslconn = self.context.wrap_socket(sock, server_side=True) + except socket.error as e: + # socket errors are silenced by the caller, print them here + if support.verbose: + sys.stderr.write("Got an error:\n%s\n" % e) + raise + return sslconn, addr + +class RootedHTTPRequestHandler(SimpleHTTPRequestHandler): + # need to override translate_path to get a known root, + # instead of using os.curdir, since the test could be + # run from anywhere + + server_version = "TestHTTPS/1.0" + root = here + # Avoid hanging when a request gets interrupted by the client + timeout = 5 + + def translate_path(self, path): + """Translate a /-separated PATH to the local filename syntax. + + Components that mean special things to the local file system + (e.g. drive or directory names) are ignored. (XXX They should + probably be diagnosed.) + + """ + # abandon query parameters + path = urllib.parse.urlparse(path)[2] + path = os.path.normpath(urllib.parse.unquote(path)) + words = path.split('/') + words = filter(None, words) + path = self.root + for word in words: + drive, word = os.path.splitdrive(word) + head, word = os.path.split(word) + path = os.path.join(path, word) + return path + + def log_message(self, format, *args): + # we override this to suppress logging unless "verbose" + if support.verbose: + sys.stdout.write(" server (%s:%d %s):\n [%s] %s\n" % + (self.server.server_address, + self.server.server_port, + self.request.cipher(), + self.log_date_time_string(), + format%args)) + + +class StatsRequestHandler(BaseHTTPRequestHandler): + """Example HTTP request handler which returns SSL statistics on GET + requests. + """ + + server_version = "StatsHTTPS/1.0" + + def do_GET(self, send_body=True): + """Serve a GET request.""" + sock = self.rfile.raw._sock + context = sock.context + stats = { + 'session_cache': context.session_stats(), + 'cipher': sock.cipher(), + 'compression': sock.compression(), + } + body = pprint.pformat(stats) + body = body.encode('utf-8') + self.send_response(200) + self.send_header("Content-type", "text/plain; charset=utf-8") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + if send_body: + self.wfile.write(body) + + def do_HEAD(self): + """Serve a HEAD request.""" + self.do_GET(send_body=False) + + def log_request(self, format, *args): + if support.verbose: + BaseHTTPRequestHandler.log_request(self, format, *args) + + +class HTTPSServerThread(threading.Thread): + + def __init__(self, context, host=HOST, handler_class=None): + self.flag = None + self.server = HTTPSServer((host, 0), + handler_class or RootedHTTPRequestHandler, + context) + self.port = self.server.server_port + threading.Thread.__init__(self) + self.daemon = True + + def __str__(self): + return "<%s %s>" % (self.__class__.__name__, self.server) + + def start(self, flag=None): + self.flag = flag + threading.Thread.start(self) + + def run(self): + if self.flag: + self.flag.set() + try: + self.server.serve_forever(0.05) + finally: + self.server.server_close() + + def stop(self): + self.server.shutdown() + + +def make_https_server(case, certfile=CERTFILE, host=HOST, handler_class=None): + # we assume the certfile contains both private key and certificate + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.load_cert_chain(certfile) + server = HTTPSServerThread(context, host, handler_class) + flag = threading.Event() + server.start(flag) + flag.wait() + def cleanup(): + if support.verbose: + sys.stdout.write('stopping HTTPS server\n') + server.stop() + if support.verbose: + sys.stdout.write('joining HTTPS thread\n') + server.join() + case.addCleanup(cleanup) + return server + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser( + description='Run a test HTTPS server. ' + 'By default, the current directory is served.') + parser.add_argument('-p', '--port', type=int, default=4433, + help='port to listen on (default: %(default)s)') + parser.add_argument('-q', '--quiet', dest='verbose', default=True, + action='store_false', help='be less verbose') + parser.add_argument('-s', '--stats', dest='use_stats_handler', default=False, + action='store_true', help='always return stats page') + parser.add_argument('--curve-name', dest='curve_name', type=str, + action='store', + help='curve name for EC-based Diffie-Hellman') + parser.add_argument('--dh', dest='dh_file', type=str, action='store', + help='PEM file containing DH parameters') + args = parser.parse_args() + + support.verbose = args.verbose + if args.use_stats_handler: + handler_class = StatsRequestHandler + else: + handler_class = RootedHTTPRequestHandler + if utils.PY2: + handler_class.root = os.getcwdu() + else: + handler_class.root = os.getcwd() + context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) + context.load_cert_chain(CERTFILE) + if args.curve_name: + context.set_ecdh_curve(args.curve_name) + if args.dh_file: + context.load_dh_params(args.dh_file) + + server = HTTPSServer(("", args.port), handler_class, context) + if args.verbose: + print("Listening on https://localhost:{0.port}".format(args)) + server.serve_forever(0.1) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/support.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/support.py new file mode 100644 index 0000000..1999e20 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/test/support.py @@ -0,0 +1,2048 @@ +# -*- coding: utf-8 -*- +"""Supporting definitions for the Python regression tests. + +Backported for python-future from Python 3.3 test/support.py. +""" + +from __future__ import (absolute_import, division, + print_function, unicode_literals) +from future import utils +from future.builtins import str, range, open, int, map, list + +import contextlib +import errno +import functools +import gc +import socket +import sys +import os +import platform +import shutil +import warnings +import unittest +# For Python 2.6 compatibility: +if not hasattr(unittest, 'skip'): + import unittest2 as unittest + +import importlib +# import collections.abc # not present on Py2.7 +import re +import subprocess +import imp +import time +try: + import sysconfig +except ImportError: + # sysconfig is not available on Python 2.6. Try using distutils.sysconfig instead: + from distutils import sysconfig +import fnmatch +import logging.handlers +import struct +import tempfile + +try: + if utils.PY3: + import _thread, threading + else: + import thread as _thread, threading +except ImportError: + _thread = None + threading = None +try: + import multiprocessing.process +except ImportError: + multiprocessing = None + +try: + import zlib +except ImportError: + zlib = None + +try: + import gzip +except ImportError: + gzip = None + +try: + import bz2 +except ImportError: + bz2 = None + +try: + import lzma +except ImportError: + lzma = None + +__all__ = [ + "Error", "TestFailed", "ResourceDenied", "import_module", "verbose", + "use_resources", "max_memuse", "record_original_stdout", + "get_original_stdout", "unload", "unlink", "rmtree", "forget", + "is_resource_enabled", "requires", "requires_freebsd_version", + "requires_linux_version", "requires_mac_ver", "find_unused_port", + "bind_port", "IPV6_ENABLED", "is_jython", "TESTFN", "HOST", "SAVEDCWD", + "temp_cwd", "findfile", "create_empty_file", "sortdict", + "check_syntax_error", "open_urlresource", "check_warnings", "CleanImport", + "EnvironmentVarGuard", "TransientResource", "captured_stdout", + "captured_stdin", "captured_stderr", "time_out", "socket_peer_reset", + "ioerror_peer_reset", "run_with_locale", 'temp_umask', + "transient_internet", "set_memlimit", "bigmemtest", "bigaddrspacetest", + "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", + "threading_cleanup", "reap_children", "cpython_only", "check_impl_detail", + "get_attribute", "swap_item", "swap_attr", "requires_IEEE_754", + "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink", + "skip_unless_xattr", "import_fresh_module", "requires_zlib", + "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz", + "requires_gzip", "requires_bz2", "requires_lzma", "suppress_crash_popup", + ] + +class Error(Exception): + """Base class for regression test exceptions.""" + +class TestFailed(Error): + """Test failed.""" + +class ResourceDenied(unittest.SkipTest): + """Test skipped because it requested a disallowed resource. + + This is raised when a test calls requires() for a resource that + has not be enabled. It is used to distinguish between expected + and unexpected skips. + """ + +@contextlib.contextmanager +def _ignore_deprecated_imports(ignore=True): + """Context manager to suppress package and module deprecation + warnings when importing them. + + If ignore is False, this context manager has no effect.""" + if ignore: + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", ".+ (module|package)", + DeprecationWarning) + yield + else: + yield + + +def import_module(name, deprecated=False): + """Import and return the module to be tested, raising SkipTest if + it is not available. + + If deprecated is True, any module or package deprecation messages + will be suppressed.""" + with _ignore_deprecated_imports(deprecated): + try: + return importlib.import_module(name) + except ImportError as msg: + raise unittest.SkipTest(str(msg)) + + +def _save_and_remove_module(name, orig_modules): + """Helper function to save and remove a module from sys.modules + + Raise ImportError if the module can't be imported. + """ + # try to import the module and raise an error if it can't be imported + if name not in sys.modules: + __import__(name) + del sys.modules[name] + for modname in list(sys.modules): + if modname == name or modname.startswith(name + '.'): + orig_modules[modname] = sys.modules[modname] + del sys.modules[modname] + +def _save_and_block_module(name, orig_modules): + """Helper function to save and block a module in sys.modules + + Return True if the module was in sys.modules, False otherwise. + """ + saved = True + try: + orig_modules[name] = sys.modules[name] + except KeyError: + saved = False + sys.modules[name] = None + return saved + + +def anticipate_failure(condition): + """Decorator to mark a test that is known to be broken in some cases + + Any use of this decorator should have a comment identifying the + associated tracker issue. + """ + if condition: + return unittest.expectedFailure + return lambda f: f + + +def import_fresh_module(name, fresh=(), blocked=(), deprecated=False): + """Import and return a module, deliberately bypassing sys.modules. + This function imports and returns a fresh copy of the named Python module + by removing the named module from sys.modules before doing the import. + Note that unlike reload, the original module is not affected by + this operation. + + *fresh* is an iterable of additional module names that are also removed + from the sys.modules cache before doing the import. + + *blocked* is an iterable of module names that are replaced with None + in the module cache during the import to ensure that attempts to import + them raise ImportError. + + The named module and any modules named in the *fresh* and *blocked* + parameters are saved before starting the import and then reinserted into + sys.modules when the fresh import is complete. + + Module and package deprecation messages are suppressed during this import + if *deprecated* is True. + + This function will raise ImportError if the named module cannot be + imported. + + If deprecated is True, any module or package deprecation messages + will be suppressed. + """ + # NOTE: test_heapq, test_json and test_warnings include extra sanity checks + # to make sure that this utility function is working as expected + with _ignore_deprecated_imports(deprecated): + # Keep track of modules saved for later restoration as well + # as those which just need a blocking entry removed + orig_modules = {} + names_to_remove = [] + _save_and_remove_module(name, orig_modules) + try: + for fresh_name in fresh: + _save_and_remove_module(fresh_name, orig_modules) + for blocked_name in blocked: + if not _save_and_block_module(blocked_name, orig_modules): + names_to_remove.append(blocked_name) + fresh_module = importlib.import_module(name) + except ImportError: + fresh_module = None + finally: + for orig_name, module in orig_modules.items(): + sys.modules[orig_name] = module + for name_to_remove in names_to_remove: + del sys.modules[name_to_remove] + return fresh_module + + +def get_attribute(obj, name): + """Get an attribute, raising SkipTest if AttributeError is raised.""" + try: + attribute = getattr(obj, name) + except AttributeError: + raise unittest.SkipTest("object %r has no attribute %r" % (obj, name)) + else: + return attribute + +verbose = 1 # Flag set to 0 by regrtest.py +use_resources = None # Flag set to [] by regrtest.py +max_memuse = 0 # Disable bigmem tests (they will still be run with + # small sizes, to make sure they work.) +real_max_memuse = 0 +failfast = False +match_tests = None + +# _original_stdout is meant to hold stdout at the time regrtest began. +# This may be "the real" stdout, or IDLE's emulation of stdout, or whatever. +# The point is to have some flavor of stdout the user can actually see. +_original_stdout = None +def record_original_stdout(stdout): + global _original_stdout + _original_stdout = stdout + +def get_original_stdout(): + return _original_stdout or sys.stdout + +def unload(name): + try: + del sys.modules[name] + except KeyError: + pass + +if sys.platform.startswith("win"): + def _waitfor(func, pathname, waitall=False): + # Perform the operation + func(pathname) + # Now setup the wait loop + if waitall: + dirname = pathname + else: + dirname, name = os.path.split(pathname) + dirname = dirname or '.' + # Check for `pathname` to be removed from the filesystem. + # The exponential backoff of the timeout amounts to a total + # of ~1 second after which the deletion is probably an error + # anyway. + # Testing on a i7@4.3GHz shows that usually only 1 iteration is + # required when contention occurs. + timeout = 0.001 + while timeout < 1.0: + # Note we are only testing for the existence of the file(s) in + # the contents of the directory regardless of any security or + # access rights. If we have made it this far, we have sufficient + # permissions to do that much using Python's equivalent of the + # Windows API FindFirstFile. + # Other Windows APIs can fail or give incorrect results when + # dealing with files that are pending deletion. + L = os.listdir(dirname) + if not (L if waitall else name in L): + return + # Increase the timeout and try again + time.sleep(timeout) + timeout *= 2 + warnings.warn('tests may fail, delete still pending for ' + pathname, + RuntimeWarning, stacklevel=4) + + def _unlink(filename): + _waitfor(os.unlink, filename) + + def _rmdir(dirname): + _waitfor(os.rmdir, dirname) + + def _rmtree(path): + def _rmtree_inner(path): + for name in os.listdir(path): + fullname = os.path.join(path, name) + if os.path.isdir(fullname): + _waitfor(_rmtree_inner, fullname, waitall=True) + os.rmdir(fullname) + else: + os.unlink(fullname) + _waitfor(_rmtree_inner, path, waitall=True) + _waitfor(os.rmdir, path) +else: + _unlink = os.unlink + _rmdir = os.rmdir + _rmtree = shutil.rmtree + +def unlink(filename): + try: + _unlink(filename) + except OSError as error: + # The filename need not exist. + if error.errno not in (errno.ENOENT, errno.ENOTDIR): + raise + +def rmdir(dirname): + try: + _rmdir(dirname) + except OSError as error: + # The directory need not exist. + if error.errno != errno.ENOENT: + raise + +def rmtree(path): + try: + _rmtree(path) + except OSError as error: + if error.errno != errno.ENOENT: + raise + +def make_legacy_pyc(source): + """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location. + + The choice of .pyc or .pyo extension is done based on the __debug__ flag + value. + + :param source: The file system path to the source file. The source file + does not need to exist, however the PEP 3147 pyc file must exist. + :return: The file system path to the legacy pyc file. + """ + pyc_file = imp.cache_from_source(source) + up_one = os.path.dirname(os.path.abspath(source)) + legacy_pyc = os.path.join(up_one, source + ('c' if __debug__ else 'o')) + os.rename(pyc_file, legacy_pyc) + return legacy_pyc + +def forget(modname): + """'Forget' a module was ever imported. + + This removes the module from sys.modules and deletes any PEP 3147 or + legacy .pyc and .pyo files. + """ + unload(modname) + for dirname in sys.path: + source = os.path.join(dirname, modname + '.py') + # It doesn't matter if they exist or not, unlink all possible + # combinations of PEP 3147 and legacy pyc and pyo files. + unlink(source + 'c') + unlink(source + 'o') + unlink(imp.cache_from_source(source, debug_override=True)) + unlink(imp.cache_from_source(source, debug_override=False)) + +# On some platforms, should not run gui test even if it is allowed +# in `use_resources'. +if sys.platform.startswith('win'): + import ctypes + import ctypes.wintypes + def _is_gui_available(): + UOI_FLAGS = 1 + WSF_VISIBLE = 0x0001 + class USEROBJECTFLAGS(ctypes.Structure): + _fields_ = [("fInherit", ctypes.wintypes.BOOL), + ("fReserved", ctypes.wintypes.BOOL), + ("dwFlags", ctypes.wintypes.DWORD)] + dll = ctypes.windll.user32 + h = dll.GetProcessWindowStation() + if not h: + raise ctypes.WinError() + uof = USEROBJECTFLAGS() + needed = ctypes.wintypes.DWORD() + res = dll.GetUserObjectInformationW(h, + UOI_FLAGS, + ctypes.byref(uof), + ctypes.sizeof(uof), + ctypes.byref(needed)) + if not res: + raise ctypes.WinError() + return bool(uof.dwFlags & WSF_VISIBLE) +else: + def _is_gui_available(): + return True + +def is_resource_enabled(resource): + """Test whether a resource is enabled. Known resources are set by + regrtest.py.""" + return use_resources is not None and resource in use_resources + +def requires(resource, msg=None): + """Raise ResourceDenied if the specified resource is not available. + + If the caller's module is __main__ then automatically return True. The + possibility of False being returned occurs when regrtest.py is + executing. + """ + if resource == 'gui' and not _is_gui_available(): + raise unittest.SkipTest("Cannot use the 'gui' resource") + # see if the caller's module is __main__ - if so, treat as if + # the resource was set + if sys._getframe(1).f_globals.get("__name__") == "__main__": + return + if not is_resource_enabled(resource): + if msg is None: + msg = "Use of the %r resource not enabled" % resource + raise ResourceDenied(msg) + +def _requires_unix_version(sysname, min_version): + """Decorator raising SkipTest if the OS is `sysname` and the version is less + than `min_version`. + + For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if + the FreeBSD version is less than 7.2. + """ + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kw): + if platform.system() == sysname: + version_txt = platform.release().split('-', 1)[0] + try: + version = tuple(map(int, version_txt.split('.'))) + except ValueError: + pass + else: + if version < min_version: + min_version_txt = '.'.join(map(str, min_version)) + raise unittest.SkipTest( + "%s version %s or higher required, not %s" + % (sysname, min_version_txt, version_txt)) + return func(*args, **kw) + wrapper.min_version = min_version + return wrapper + return decorator + +def requires_freebsd_version(*min_version): + """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version is + less than `min_version`. + + For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD + version is less than 7.2. + """ + return _requires_unix_version('FreeBSD', min_version) + +def requires_linux_version(*min_version): + """Decorator raising SkipTest if the OS is Linux and the Linux version is + less than `min_version`. + + For example, @requires_linux_version(2, 6, 32) raises SkipTest if the Linux + version is less than 2.6.32. + """ + return _requires_unix_version('Linux', min_version) + +def requires_mac_ver(*min_version): + """Decorator raising SkipTest if the OS is Mac OS X and the OS X + version if less than min_version. + + For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version + is lesser than 10.5. + """ + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kw): + if sys.platform == 'darwin': + version_txt = platform.mac_ver()[0] + try: + version = tuple(map(int, version_txt.split('.'))) + except ValueError: + pass + else: + if version < min_version: + min_version_txt = '.'.join(map(str, min_version)) + raise unittest.SkipTest( + "Mac OS X %s or higher required, not %s" + % (min_version_txt, version_txt)) + return func(*args, **kw) + wrapper.min_version = min_version + return wrapper + return decorator + +# Don't use "localhost", since resolving it uses the DNS under recent +# Windows versions (see issue #18792). +HOST = "127.0.0.1" +HOSTv6 = "::1" + + +def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): + """Returns an unused port that should be suitable for binding. This is + achieved by creating a temporary socket with the same family and type as + the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to + the specified host address (defaults to 0.0.0.0) with the port set to 0, + eliciting an unused ephemeral port from the OS. The temporary socket is + then closed and deleted, and the ephemeral port is returned. + + Either this method or bind_port() should be used for any tests where a + server socket needs to be bound to a particular port for the duration of + the test. Which one to use depends on whether the calling code is creating + a python socket, or if an unused port needs to be provided in a constructor + or passed to an external program (i.e. the -accept argument to openssl's + s_server mode). Always prefer bind_port() over find_unused_port() where + possible. Hard coded ports should *NEVER* be used. As soon as a server + socket is bound to a hard coded port, the ability to run multiple instances + of the test simultaneously on the same host is compromised, which makes the + test a ticking time bomb in a buildbot environment. On Unix buildbots, this + may simply manifest as a failed test, which can be recovered from without + intervention in most cases, but on Windows, the entire python process can + completely and utterly wedge, requiring someone to log in to the buildbot + and manually kill the affected process. + + (This is easy to reproduce on Windows, unfortunately, and can be traced to + the SO_REUSEADDR socket option having different semantics on Windows versus + Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind, + listen and then accept connections on identical host/ports. An EADDRINUSE + socket.error will be raised at some point (depending on the platform and + the order bind and listen were called on each socket). + + However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE + will ever be raised when attempting to bind two identical host/ports. When + accept() is called on each socket, the second caller's process will steal + the port from the first caller, leaving them both in an awkwardly wedged + state where they'll no longer respond to any signals or graceful kills, and + must be forcibly killed via OpenProcess()/TerminateProcess(). + + The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option + instead of SO_REUSEADDR, which effectively affords the same semantics as + SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open + Source world compared to Windows ones, this is a common mistake. A quick + look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when + openssl.exe is called with the 's_server' option, for example. See + http://bugs.python.org/issue2550 for more info. The following site also + has a very thorough description about the implications of both REUSEADDR + and EXCLUSIVEADDRUSE on Windows: + http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx) + + XXX: although this approach is a vast improvement on previous attempts to + elicit unused ports, it rests heavily on the assumption that the ephemeral + port returned to us by the OS won't immediately be dished back out to some + other process when we close and delete our temporary socket but before our + calling code has a chance to bind the returned port. We can deal with this + issue if/when we come across it. + """ + + tempsock = socket.socket(family, socktype) + port = bind_port(tempsock) + tempsock.close() + del tempsock + return port + +def bind_port(sock, host=HOST): + """Bind the socket to a free port and return the port number. Relies on + ephemeral ports in order to ensure we are using an unbound port. This is + important as many tests may be running simultaneously, especially in a + buildbot environment. This method raises an exception if the sock.family + is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR + or SO_REUSEPORT set on it. Tests should *never* set these socket options + for TCP/IP sockets. The only case for setting these options is testing + multicasting via multiple UDP sockets. + + Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e. + on Windows), it will be set on the socket. This will prevent anyone else + from bind()'ing to our host/port for the duration of the test. + """ + + if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM: + if hasattr(socket, 'SO_REUSEADDR'): + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1: + raise TestFailed("tests should never set the SO_REUSEADDR " \ + "socket option on TCP/IP sockets!") + if hasattr(socket, 'SO_REUSEPORT'): + try: + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1: + raise TestFailed("tests should never set the SO_REUSEPORT " \ + "socket option on TCP/IP sockets!") + except socket.error: + # Python's socket module was compiled using modern headers + # thus defining SO_REUSEPORT but this process is running + # under an older kernel that does not support SO_REUSEPORT. + pass + if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + + sock.bind((host, 0)) + port = sock.getsockname()[1] + return port + +def _is_ipv6_enabled(): + """Check whether IPv6 is enabled on this host.""" + if socket.has_ipv6: + sock = None + try: + sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + sock.bind(('::1', 0)) + return True + except (socket.error, socket.gaierror): + pass + finally: + if sock: + sock.close() + return False + +IPV6_ENABLED = _is_ipv6_enabled() + + +# A constant likely larger than the underlying OS pipe buffer size, to +# make writes blocking. +# Windows limit seems to be around 512 B, and many Unix kernels have a +# 64 KiB pipe buffer size or 16 * PAGE_SIZE: take a few megs to be sure. +# (see issue #17835 for a discussion of this number). +PIPE_MAX_SIZE = 4 * 1024 * 1024 + 1 + +# A constant likely larger than the underlying OS socket buffer size, to make +# writes blocking. +# The socket buffer sizes can usually be tuned system-wide (e.g. through sysctl +# on Linux), or on a per-socket basis (SO_SNDBUF/SO_RCVBUF). See issue #18643 +# for a discussion of this number). +SOCK_MAX_SIZE = 16 * 1024 * 1024 + 1 + +# # decorator for skipping tests on non-IEEE 754 platforms +# requires_IEEE_754 = unittest.skipUnless( +# float.__getformat__("double").startswith("IEEE"), +# "test requires IEEE 754 doubles") + +requires_zlib = unittest.skipUnless(zlib, 'requires zlib') + +requires_bz2 = unittest.skipUnless(bz2, 'requires bz2') + +requires_lzma = unittest.skipUnless(lzma, 'requires lzma') + +is_jython = sys.platform.startswith('java') + +# Filename used for testing +if os.name == 'java': + # Jython disallows @ in module names + TESTFN = '$test' +else: + TESTFN = '@test' + +# Disambiguate TESTFN for parallel testing, while letting it remain a valid +# module name. +TESTFN = "{0}_{1}_tmp".format(TESTFN, os.getpid()) + +# # FS_NONASCII: non-ASCII character encodable by os.fsencode(), +# # or None if there is no such character. +# FS_NONASCII = None +# for character in ( +# # First try printable and common characters to have a readable filename. +# # For each character, the encoding list are just example of encodings able +# # to encode the character (the list is not exhaustive). +# +# # U+00E6 (Latin Small Letter Ae): cp1252, iso-8859-1 +# '\u00E6', +# # U+0130 (Latin Capital Letter I With Dot Above): cp1254, iso8859_3 +# '\u0130', +# # U+0141 (Latin Capital Letter L With Stroke): cp1250, cp1257 +# '\u0141', +# # U+03C6 (Greek Small Letter Phi): cp1253 +# '\u03C6', +# # U+041A (Cyrillic Capital Letter Ka): cp1251 +# '\u041A', +# # U+05D0 (Hebrew Letter Alef): Encodable to cp424 +# '\u05D0', +# # U+060C (Arabic Comma): cp864, cp1006, iso8859_6, mac_arabic +# '\u060C', +# # U+062A (Arabic Letter Teh): cp720 +# '\u062A', +# # U+0E01 (Thai Character Ko Kai): cp874 +# '\u0E01', +# +# # Then try more "special" characters. "special" because they may be +# # interpreted or displayed differently depending on the exact locale +# # encoding and the font. +# +# # U+00A0 (No-Break Space) +# '\u00A0', +# # U+20AC (Euro Sign) +# '\u20AC', +# ): +# try: +# os.fsdecode(os.fsencode(character)) +# except UnicodeError: +# pass +# else: +# FS_NONASCII = character +# break +# +# # TESTFN_UNICODE is a non-ascii filename +# TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f" +# if sys.platform == 'darwin': +# # In Mac OS X's VFS API file names are, by definition, canonically +# # decomposed Unicode, encoded using UTF-8. See QA1173: +# # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html +# import unicodedata +# TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE) +# TESTFN_ENCODING = sys.getfilesystemencoding() +# +# # TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be +# # encoded by the filesystem encoding (in strict mode). It can be None if we +# # cannot generate such filename. +# TESTFN_UNENCODABLE = None +# if os.name in ('nt', 'ce'): +# # skip win32s (0) or Windows 9x/ME (1) +# if sys.getwindowsversion().platform >= 2: +# # Different kinds of characters from various languages to minimize the +# # probability that the whole name is encodable to MBCS (issue #9819) +# TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80" +# try: +# TESTFN_UNENCODABLE.encode(TESTFN_ENCODING) +# except UnicodeEncodeError: +# pass +# else: +# print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). ' +# 'Unicode filename tests may not be effective' +# % (TESTFN_UNENCODABLE, TESTFN_ENCODING)) +# TESTFN_UNENCODABLE = None +# # Mac OS X denies unencodable filenames (invalid utf-8) +# elif sys.platform != 'darwin': +# try: +# # ascii and utf-8 cannot encode the byte 0xff +# b'\xff'.decode(TESTFN_ENCODING) +# except UnicodeDecodeError: +# # 0xff will be encoded using the surrogate character u+DCFF +# TESTFN_UNENCODABLE = TESTFN \ +# + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape') +# else: +# # File system encoding (eg. ISO-8859-* encodings) can encode +# # the byte 0xff. Skip some unicode filename tests. +# pass +# +# # TESTFN_UNDECODABLE is a filename (bytes type) that should *not* be able to be +# # decoded from the filesystem encoding (in strict mode). It can be None if we +# # cannot generate such filename (ex: the latin1 encoding can decode any byte +# # sequence). On UNIX, TESTFN_UNDECODABLE can be decoded by os.fsdecode() thanks +# # to the surrogateescape error handler (PEP 383), but not from the filesystem +# # encoding in strict mode. +# TESTFN_UNDECODABLE = None +# for name in ( +# # b'\xff' is not decodable by os.fsdecode() with code page 932. Windows +# # accepts it to create a file or a directory, or don't accept to enter to +# # such directory (when the bytes name is used). So test b'\xe7' first: it is +# # not decodable from cp932. +# b'\xe7w\xf0', +# # undecodable from ASCII, UTF-8 +# b'\xff', +# # undecodable from iso8859-3, iso8859-6, iso8859-7, cp424, iso8859-8, cp856 +# # and cp857 +# b'\xae\xd5' +# # undecodable from UTF-8 (UNIX and Mac OS X) +# b'\xed\xb2\x80', b'\xed\xb4\x80', +# # undecodable from shift_jis, cp869, cp874, cp932, cp1250, cp1251, cp1252, +# # cp1253, cp1254, cp1255, cp1257, cp1258 +# b'\x81\x98', +# ): +# try: +# name.decode(TESTFN_ENCODING) +# except UnicodeDecodeError: +# TESTFN_UNDECODABLE = os.fsencode(TESTFN) + name +# break +# +# if FS_NONASCII: +# TESTFN_NONASCII = TESTFN + '-' + FS_NONASCII +# else: +# TESTFN_NONASCII = None + +# Save the initial cwd +SAVEDCWD = os.getcwd() + +@contextlib.contextmanager +def temp_cwd(name='tempcwd', quiet=False, path=None): + """ + Context manager that temporarily changes the CWD. + + An existing path may be provided as *path*, in which case this + function makes no changes to the file system. + + Otherwise, the new CWD is created in the current directory and it's + named *name*. If *quiet* is False (default) and it's not possible to + create or change the CWD, an error is raised. If it's True, only a + warning is raised and the original CWD is used. + """ + saved_dir = os.getcwd() + is_temporary = False + if path is None: + path = name + try: + os.mkdir(name) + is_temporary = True + except OSError: + if not quiet: + raise + warnings.warn('tests may fail, unable to create temp CWD ' + name, + RuntimeWarning, stacklevel=3) + try: + os.chdir(path) + except OSError: + if not quiet: + raise + warnings.warn('tests may fail, unable to change the CWD to ' + path, + RuntimeWarning, stacklevel=3) + try: + yield os.getcwd() + finally: + os.chdir(saved_dir) + if is_temporary: + rmtree(name) + + +if hasattr(os, "umask"): + @contextlib.contextmanager + def temp_umask(umask): + """Context manager that temporarily sets the process umask.""" + oldmask = os.umask(umask) + try: + yield + finally: + os.umask(oldmask) + + +def findfile(file, here=__file__, subdir=None): + """Try to find a file on sys.path and the working directory. If it is not + found the argument passed to the function is returned (this does not + necessarily signal failure; could still be the legitimate path).""" + if os.path.isabs(file): + return file + if subdir is not None: + file = os.path.join(subdir, file) + path = sys.path + path = [os.path.dirname(here)] + path + for dn in path: + fn = os.path.join(dn, file) + if os.path.exists(fn): return fn + return file + +def create_empty_file(filename): + """Create an empty file. If the file already exists, truncate it.""" + fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC) + os.close(fd) + +def sortdict(dict): + "Like repr(dict), but in sorted order." + items = sorted(dict.items()) + reprpairs = ["%r: %r" % pair for pair in items] + withcommas = ", ".join(reprpairs) + return "{%s}" % withcommas + +def make_bad_fd(): + """ + Create an invalid file descriptor by opening and closing a file and return + its fd. + """ + file = open(TESTFN, "wb") + try: + return file.fileno() + finally: + file.close() + unlink(TESTFN) + +def check_syntax_error(testcase, statement): + testcase.assertRaises(SyntaxError, compile, statement, + '', 'exec') + +def open_urlresource(url, *args, **kw): + from future.backports.urllib import (request as urllib_request, + parse as urllib_parse) + + check = kw.pop('check', None) + + filename = urllib_parse.urlparse(url)[2].split('/')[-1] # '/': it's URL! + + fn = os.path.join(os.path.dirname(__file__), "data", filename) + + def check_valid_file(fn): + f = open(fn, *args, **kw) + if check is None: + return f + elif check(f): + f.seek(0) + return f + f.close() + + if os.path.exists(fn): + f = check_valid_file(fn) + if f is not None: + return f + unlink(fn) + + # Verify the requirement before downloading the file + requires('urlfetch') + + print('\tfetching %s ...' % url, file=get_original_stdout()) + f = urllib_request.urlopen(url, timeout=15) + try: + with open(fn, "wb") as out: + s = f.read() + while s: + out.write(s) + s = f.read() + finally: + f.close() + + f = check_valid_file(fn) + if f is not None: + return f + raise TestFailed('invalid resource %r' % fn) + + +class WarningsRecorder(object): + """Convenience wrapper for the warnings list returned on + entry to the warnings.catch_warnings() context manager. + """ + def __init__(self, warnings_list): + self._warnings = warnings_list + self._last = 0 + + def __getattr__(self, attr): + if len(self._warnings) > self._last: + return getattr(self._warnings[-1], attr) + elif attr in warnings.WarningMessage._WARNING_DETAILS: + return None + raise AttributeError("%r has no attribute %r" % (self, attr)) + + @property + def warnings(self): + return self._warnings[self._last:] + + def reset(self): + self._last = len(self._warnings) + + +def _filterwarnings(filters, quiet=False): + """Catch the warnings, then check if all the expected + warnings have been raised and re-raise unexpected warnings. + If 'quiet' is True, only re-raise the unexpected warnings. + """ + # Clear the warning registry of the calling module + # in order to re-raise the warnings. + frame = sys._getframe(2) + registry = frame.f_globals.get('__warningregistry__') + if registry: + if utils.PY3: + registry.clear() + else: + # Py2-compatible: + for i in range(len(registry)): + registry.pop() + with warnings.catch_warnings(record=True) as w: + # Set filter "always" to record all warnings. Because + # test_warnings swap the module, we need to look up in + # the sys.modules dictionary. + sys.modules['warnings'].simplefilter("always") + yield WarningsRecorder(w) + # Filter the recorded warnings + reraise = list(w) + missing = [] + for msg, cat in filters: + seen = False + for w in reraise[:]: + warning = w.message + # Filter out the matching messages + if (re.match(msg, str(warning), re.I) and + issubclass(warning.__class__, cat)): + seen = True + reraise.remove(w) + if not seen and not quiet: + # This filter caught nothing + missing.append((msg, cat.__name__)) + if reraise: + raise AssertionError("unhandled warning %s" % reraise[0]) + if missing: + raise AssertionError("filter (%r, %s) did not catch any warning" % + missing[0]) + + +@contextlib.contextmanager +def check_warnings(*filters, **kwargs): + """Context manager to silence warnings. + + Accept 2-tuples as positional arguments: + ("message regexp", WarningCategory) + + Optional argument: + - if 'quiet' is True, it does not fail if a filter catches nothing + (default True without argument, + default False if some filters are defined) + + Without argument, it defaults to: + check_warnings(("", Warning), quiet=True) + """ + quiet = kwargs.get('quiet') + if not filters: + filters = (("", Warning),) + # Preserve backward compatibility + if quiet is None: + quiet = True + return _filterwarnings(filters, quiet) + + +class CleanImport(object): + """Context manager to force import to return a new module reference. + + This is useful for testing module-level behaviours, such as + the emission of a DeprecationWarning on import. + + Use like this: + + with CleanImport("foo"): + importlib.import_module("foo") # new reference + """ + + def __init__(self, *module_names): + self.original_modules = sys.modules.copy() + for module_name in module_names: + if module_name in sys.modules: + module = sys.modules[module_name] + # It is possible that module_name is just an alias for + # another module (e.g. stub for modules renamed in 3.x). + # In that case, we also need delete the real module to clear + # the import cache. + if module.__name__ != module_name: + del sys.modules[module.__name__] + del sys.modules[module_name] + + def __enter__(self): + return self + + def __exit__(self, *ignore_exc): + sys.modules.update(self.original_modules) + +### Added for python-future: +if utils.PY3: + import collections.abc + mybase = collections.abc.MutableMapping +else: + import UserDict + mybase = UserDict.DictMixin +### + +class EnvironmentVarGuard(mybase): + + """Class to help protect the environment variable properly. Can be used as + a context manager.""" + + def __init__(self): + self._environ = os.environ + self._changed = {} + + def __getitem__(self, envvar): + return self._environ[envvar] + + def __setitem__(self, envvar, value): + # Remember the initial value on the first access + if envvar not in self._changed: + self._changed[envvar] = self._environ.get(envvar) + self._environ[envvar] = value + + def __delitem__(self, envvar): + # Remember the initial value on the first access + if envvar not in self._changed: + self._changed[envvar] = self._environ.get(envvar) + if envvar in self._environ: + del self._environ[envvar] + + def keys(self): + return self._environ.keys() + + def __iter__(self): + return iter(self._environ) + + def __len__(self): + return len(self._environ) + + def set(self, envvar, value): + self[envvar] = value + + def unset(self, envvar): + del self[envvar] + + def __enter__(self): + return self + + def __exit__(self, *ignore_exc): + for (k, v) in self._changed.items(): + if v is None: + if k in self._environ: + del self._environ[k] + else: + self._environ[k] = v + os.environ = self._environ + + +class DirsOnSysPath(object): + """Context manager to temporarily add directories to sys.path. + + This makes a copy of sys.path, appends any directories given + as positional arguments, then reverts sys.path to the copied + settings when the context ends. + + Note that *all* sys.path modifications in the body of the + context manager, including replacement of the object, + will be reverted at the end of the block. + """ + + def __init__(self, *paths): + self.original_value = sys.path[:] + self.original_object = sys.path + sys.path.extend(paths) + + def __enter__(self): + return self + + def __exit__(self, *ignore_exc): + sys.path = self.original_object + sys.path[:] = self.original_value + + +class TransientResource(object): + + """Raise ResourceDenied if an exception is raised while the context manager + is in effect that matches the specified exception and attributes.""" + + def __init__(self, exc, **kwargs): + self.exc = exc + self.attrs = kwargs + + def __enter__(self): + return self + + def __exit__(self, type_=None, value=None, traceback=None): + """If type_ is a subclass of self.exc and value has attributes matching + self.attrs, raise ResourceDenied. Otherwise let the exception + propagate (if any).""" + if type_ is not None and issubclass(self.exc, type_): + for attr, attr_value in self.attrs.items(): + if not hasattr(value, attr): + break + if getattr(value, attr) != attr_value: + break + else: + raise ResourceDenied("an optional resource is not available") + +# Context managers that raise ResourceDenied when various issues +# with the Internet connection manifest themselves as exceptions. +# XXX deprecate these and use transient_internet() instead +time_out = TransientResource(IOError, errno=errno.ETIMEDOUT) +socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET) +ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET) + + +@contextlib.contextmanager +def transient_internet(resource_name, timeout=30.0, errnos=()): + """Return a context manager that raises ResourceDenied when various issues + with the Internet connection manifest themselves as exceptions.""" + default_errnos = [ + ('ECONNREFUSED', 111), + ('ECONNRESET', 104), + ('EHOSTUNREACH', 113), + ('ENETUNREACH', 101), + ('ETIMEDOUT', 110), + ] + default_gai_errnos = [ + ('EAI_AGAIN', -3), + ('EAI_FAIL', -4), + ('EAI_NONAME', -2), + ('EAI_NODATA', -5), + # Encountered when trying to resolve IPv6-only hostnames + ('WSANO_DATA', 11004), + ] + + denied = ResourceDenied("Resource %r is not available" % resource_name) + captured_errnos = errnos + gai_errnos = [] + if not captured_errnos: + captured_errnos = [getattr(errno, name, num) + for (name, num) in default_errnos] + gai_errnos = [getattr(socket, name, num) + for (name, num) in default_gai_errnos] + + def filter_error(err): + n = getattr(err, 'errno', None) + if (isinstance(err, socket.timeout) or + (isinstance(err, socket.gaierror) and n in gai_errnos) or + n in captured_errnos): + if not verbose: + sys.stderr.write(denied.args[0] + "\n") + # Was: raise denied from err + # For Python-Future: + exc = denied + exc.__cause__ = err + raise exc + + old_timeout = socket.getdefaulttimeout() + try: + if timeout is not None: + socket.setdefaulttimeout(timeout) + yield + except IOError as err: + # urllib can wrap original socket errors multiple times (!), we must + # unwrap to get at the original error. + while True: + a = err.args + if len(a) >= 1 and isinstance(a[0], IOError): + err = a[0] + # The error can also be wrapped as args[1]: + # except socket.error as msg: + # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2]) + elif len(a) >= 2 and isinstance(a[1], IOError): + err = a[1] + else: + break + filter_error(err) + raise + # XXX should we catch generic exceptions and look for their + # __cause__ or __context__? + finally: + socket.setdefaulttimeout(old_timeout) + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO.""" + import io + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, io.StringIO()) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as s: + print("hello") + self.assertEqual(s.getvalue(), "hello") + """ + return captured_output("stdout") + +def captured_stderr(): + return captured_output("stderr") + +def captured_stdin(): + return captured_output("stdin") + + +def gc_collect(): + """Force as many objects as possible to be collected. + + In non-CPython implementations of Python, this is needed because timely + deallocation is not guaranteed by the garbage collector. (Even in CPython + this can be the case in case of reference cycles.) This means that __del__ + methods may be called later than expected and weakrefs may remain alive for + longer than expected. This function tries its best to force all garbage + objects to disappear. + """ + gc.collect() + if is_jython: + time.sleep(0.1) + gc.collect() + gc.collect() + +@contextlib.contextmanager +def disable_gc(): + have_gc = gc.isenabled() + gc.disable() + try: + yield + finally: + if have_gc: + gc.enable() + + +def python_is_optimized(): + """Find if Python was built with optimizations.""" + # We don't have sysconfig on Py2.6: + import sysconfig + cflags = sysconfig.get_config_var('PY_CFLAGS') or '' + final_opt = "" + for opt in cflags.split(): + if opt.startswith('-O'): + final_opt = opt + return final_opt != '' and final_opt != '-O0' + + +_header = 'nP' +_align = '0n' +if hasattr(sys, "gettotalrefcount"): + _header = '2P' + _header + _align = '0P' +_vheader = _header + 'n' + +def calcobjsize(fmt): + return struct.calcsize(_header + fmt + _align) + +def calcvobjsize(fmt): + return struct.calcsize(_vheader + fmt + _align) + + +_TPFLAGS_HAVE_GC = 1<<14 +_TPFLAGS_HEAPTYPE = 1<<9 + +def check_sizeof(test, o, size): + result = sys.getsizeof(o) + # add GC header size + if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\ + ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))): + size += _testcapi.SIZEOF_PYGC_HEAD + msg = 'wrong size for %s: got %d, expected %d' \ + % (type(o), result, size) + test.assertEqual(result, size, msg) + +#======================================================================= +# Decorator for running a function in a different locale, correctly resetting +# it afterwards. + +def run_with_locale(catstr, *locales): + def decorator(func): + def inner(*args, **kwds): + try: + import locale + category = getattr(locale, catstr) + orig_locale = locale.setlocale(category) + except AttributeError: + # if the test author gives us an invalid category string + raise + except: + # cannot retrieve original locale, so do nothing + locale = orig_locale = None + else: + for loc in locales: + try: + locale.setlocale(category, loc) + break + except: + pass + + # now run the function, resetting the locale on exceptions + try: + return func(*args, **kwds) + finally: + if locale and orig_locale: + locale.setlocale(category, orig_locale) + inner.__name__ = func.__name__ + inner.__doc__ = func.__doc__ + return inner + return decorator + +#======================================================================= +# Decorator for running a function in a specific timezone, correctly +# resetting it afterwards. + +def run_with_tz(tz): + def decorator(func): + def inner(*args, **kwds): + try: + tzset = time.tzset + except AttributeError: + raise unittest.SkipTest("tzset required") + if 'TZ' in os.environ: + orig_tz = os.environ['TZ'] + else: + orig_tz = None + os.environ['TZ'] = tz + tzset() + + # now run the function, resetting the tz on exceptions + try: + return func(*args, **kwds) + finally: + if orig_tz is None: + del os.environ['TZ'] + else: + os.environ['TZ'] = orig_tz + time.tzset() + + inner.__name__ = func.__name__ + inner.__doc__ = func.__doc__ + return inner + return decorator + +#======================================================================= +# Big-memory-test support. Separate from 'resources' because memory use +# should be configurable. + +# Some handy shorthands. Note that these are used for byte-limits as well +# as size-limits, in the various bigmem tests +_1M = 1024*1024 +_1G = 1024 * _1M +_2G = 2 * _1G +_4G = 4 * _1G + +MAX_Py_ssize_t = sys.maxsize + +def set_memlimit(limit): + global max_memuse + global real_max_memuse + sizes = { + 'k': 1024, + 'm': _1M, + 'g': _1G, + 't': 1024*_1G, + } + m = re.match(r'(\d+(\.\d+)?) (K|M|G|T)b?$', limit, + re.IGNORECASE | re.VERBOSE) + if m is None: + raise ValueError('Invalid memory limit %r' % (limit,)) + memlimit = int(float(m.group(1)) * sizes[m.group(3).lower()]) + real_max_memuse = memlimit + if memlimit > MAX_Py_ssize_t: + memlimit = MAX_Py_ssize_t + if memlimit < _2G - 1: + raise ValueError('Memory limit %r too low to be useful' % (limit,)) + max_memuse = memlimit + +class _MemoryWatchdog(object): + """An object which periodically watches the process' memory consumption + and prints it out. + """ + + def __init__(self): + self.procfile = '/proc/{pid}/statm'.format(pid=os.getpid()) + self.started = False + + def start(self): + try: + f = open(self.procfile, 'r') + except OSError as e: + warnings.warn('/proc not available for stats: {0}'.format(e), + RuntimeWarning) + sys.stderr.flush() + return + + watchdog_script = findfile("memory_watchdog.py") + self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script], + stdin=f, stderr=subprocess.DEVNULL) + f.close() + self.started = True + + def stop(self): + if self.started: + self.mem_watchdog.terminate() + self.mem_watchdog.wait() + + +def bigmemtest(size, memuse, dry_run=True): + """Decorator for bigmem tests. + + 'minsize' is the minimum useful size for the test (in arbitrary, + test-interpreted units.) 'memuse' is the number of 'bytes per size' for + the test, or a good estimate of it. + + if 'dry_run' is False, it means the test doesn't support dummy runs + when -M is not specified. + """ + def decorator(f): + def wrapper(self): + size = wrapper.size + memuse = wrapper.memuse + if not real_max_memuse: + maxsize = 5147 + else: + maxsize = size + + if ((real_max_memuse or not dry_run) + and real_max_memuse < maxsize * memuse): + raise unittest.SkipTest( + "not enough memory: %.1fG minimum needed" + % (size * memuse / (1024 ** 3))) + + if real_max_memuse and verbose: + print() + print(" ... expected peak memory use: {peak:.1f}G" + .format(peak=size * memuse / (1024 ** 3))) + watchdog = _MemoryWatchdog() + watchdog.start() + else: + watchdog = None + + try: + return f(self, maxsize) + finally: + if watchdog: + watchdog.stop() + + wrapper.size = size + wrapper.memuse = memuse + return wrapper + return decorator + +def bigaddrspacetest(f): + """Decorator for tests that fill the address space.""" + def wrapper(self): + if max_memuse < MAX_Py_ssize_t: + if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31: + raise unittest.SkipTest( + "not enough memory: try a 32-bit build instead") + else: + raise unittest.SkipTest( + "not enough memory: %.1fG minimum needed" + % (MAX_Py_ssize_t / (1024 ** 3))) + else: + return f(self) + return wrapper + +#======================================================================= +# unittest integration. + +class BasicTestRunner(object): + def run(self, test): + result = unittest.TestResult() + test(result) + return result + +def _id(obj): + return obj + +def requires_resource(resource): + if resource == 'gui' and not _is_gui_available(): + return unittest.skip("resource 'gui' is not available") + if is_resource_enabled(resource): + return _id + else: + return unittest.skip("resource {0!r} is not enabled".format(resource)) + +def cpython_only(test): + """ + Decorator for tests only applicable on CPython. + """ + return impl_detail(cpython=True)(test) + +def impl_detail(msg=None, **guards): + if check_impl_detail(**guards): + return _id + if msg is None: + guardnames, default = _parse_guards(guards) + if default: + msg = "implementation detail not available on {0}" + else: + msg = "implementation detail specific to {0}" + guardnames = sorted(guardnames.keys()) + msg = msg.format(' or '.join(guardnames)) + return unittest.skip(msg) + +def _parse_guards(guards): + # Returns a tuple ({platform_name: run_me}, default_value) + if not guards: + return ({'cpython': True}, False) + is_true = list(guards.values())[0] + assert list(guards.values()) == [is_true] * len(guards) # all True or all False + return (guards, not is_true) + +# Use the following check to guard CPython's implementation-specific tests -- +# or to run them only on the implementation(s) guarded by the arguments. +def check_impl_detail(**guards): + """This function returns True or False depending on the host platform. + Examples: + if check_impl_detail(): # only on CPython (default) + if check_impl_detail(jython=True): # only on Jython + if check_impl_detail(cpython=False): # everywhere except on CPython + """ + guards, default = _parse_guards(guards) + return guards.get(platform.python_implementation().lower(), default) + + +def no_tracing(func): + """Decorator to temporarily turn off tracing for the duration of a test.""" + if not hasattr(sys, 'gettrace'): + return func + else: + @functools.wraps(func) + def wrapper(*args, **kwargs): + original_trace = sys.gettrace() + try: + sys.settrace(None) + return func(*args, **kwargs) + finally: + sys.settrace(original_trace) + return wrapper + + +def refcount_test(test): + """Decorator for tests which involve reference counting. + + To start, the decorator does not run the test if is not run by CPython. + After that, any trace function is unset during the test to prevent + unexpected refcounts caused by the trace function. + + """ + return no_tracing(cpython_only(test)) + + +def _filter_suite(suite, pred): + """Recursively filter test cases in a suite based on a predicate.""" + newtests = [] + for test in suite._tests: + if isinstance(test, unittest.TestSuite): + _filter_suite(test, pred) + newtests.append(test) + else: + if pred(test): + newtests.append(test) + suite._tests = newtests + +def _run_suite(suite): + """Run tests from a unittest.TestSuite-derived class.""" + if verbose: + runner = unittest.TextTestRunner(sys.stdout, verbosity=2, + failfast=failfast) + else: + runner = BasicTestRunner() + + result = runner.run(suite) + if not result.wasSuccessful(): + if len(result.errors) == 1 and not result.failures: + err = result.errors[0][1] + elif len(result.failures) == 1 and not result.errors: + err = result.failures[0][1] + else: + err = "multiple errors occurred" + if not verbose: err += "; run in verbose mode for details" + raise TestFailed(err) + + +def run_unittest(*classes): + """Run tests from unittest.TestCase-derived classes.""" + valid_types = (unittest.TestSuite, unittest.TestCase) + suite = unittest.TestSuite() + for cls in classes: + if isinstance(cls, str): + if cls in sys.modules: + suite.addTest(unittest.findTestCases(sys.modules[cls])) + else: + raise ValueError("str arguments must be keys in sys.modules") + elif isinstance(cls, valid_types): + suite.addTest(cls) + else: + suite.addTest(unittest.makeSuite(cls)) + def case_pred(test): + if match_tests is None: + return True + for name in test.id().split("."): + if fnmatch.fnmatchcase(name, match_tests): + return True + return False + _filter_suite(suite, case_pred) + _run_suite(suite) + +# We don't have sysconfig on Py2.6: +# #======================================================================= +# # Check for the presence of docstrings. +# +# HAVE_DOCSTRINGS = (check_impl_detail(cpython=False) or +# sys.platform == 'win32' or +# sysconfig.get_config_var('WITH_DOC_STRINGS')) +# +# requires_docstrings = unittest.skipUnless(HAVE_DOCSTRINGS, +# "test requires docstrings") +# +# +# #======================================================================= +# doctest driver. + +def run_doctest(module, verbosity=None, optionflags=0): + """Run doctest on the given module. Return (#failures, #tests). + + If optional argument verbosity is not specified (or is None), pass + support's belief about verbosity on to doctest. Else doctest's + usual behavior is used (it searches sys.argv for -v). + """ + + import doctest + + if verbosity is None: + verbosity = verbose + else: + verbosity = None + + f, t = doctest.testmod(module, verbose=verbosity, optionflags=optionflags) + if f: + raise TestFailed("%d of %d doctests failed" % (f, t)) + if verbose: + print('doctest (%s) ... %d tests with zero failures' % + (module.__name__, t)) + return f, t + + +#======================================================================= +# Support for saving and restoring the imported modules. + +def modules_setup(): + return sys.modules.copy(), + +def modules_cleanup(oldmodules): + # Encoders/decoders are registered permanently within the internal + # codec cache. If we destroy the corresponding modules their + # globals will be set to None which will trip up the cached functions. + encodings = [(k, v) for k, v in sys.modules.items() + if k.startswith('encodings.')] + # Was: + # sys.modules.clear() + # Py2-compatible: + for i in range(len(sys.modules)): + sys.modules.pop() + + sys.modules.update(encodings) + # XXX: This kind of problem can affect more than just encodings. In particular + # extension modules (such as _ssl) don't cope with reloading properly. + # Really, test modules should be cleaning out the test specific modules they + # know they added (ala test_runpy) rather than relying on this function (as + # test_importhooks and test_pkg do currently). + # Implicitly imported *real* modules should be left alone (see issue 10556). + sys.modules.update(oldmodules) + +#======================================================================= +# Backported versions of threading_setup() and threading_cleanup() which don't refer +# to threading._dangling (not available on Py2.7). + +# Threading support to prevent reporting refleaks when running regrtest.py -R + +# NOTE: we use thread._count() rather than threading.enumerate() (or the +# moral equivalent thereof) because a threading.Thread object is still alive +# until its __bootstrap() method has returned, even after it has been +# unregistered from the threading module. +# thread._count(), on the other hand, only gets decremented *after* the +# __bootstrap() method has returned, which gives us reliable reference counts +# at the end of a test run. + +def threading_setup(): + if _thread: + return _thread._count(), + else: + return 1, + +def threading_cleanup(nb_threads): + if not _thread: + return + + _MAX_COUNT = 10 + for count in range(_MAX_COUNT): + n = _thread._count() + if n == nb_threads: + break + time.sleep(0.1) + # XXX print a warning in case of failure? + +def reap_threads(func): + """Use this function when threads are being used. This will + ensure that the threads are cleaned up even when the test fails. + If threading is unavailable this function does nothing. + """ + if not _thread: + return func + + @functools.wraps(func) + def decorator(*args): + key = threading_setup() + try: + return func(*args) + finally: + threading_cleanup(*key) + return decorator + +def reap_children(): + """Use this function at the end of test_main() whenever sub-processes + are started. This will help ensure that no extra children (zombies) + stick around to hog resources and create problems when looking + for refleaks. + """ + + # Reap all our dead child processes so we don't leave zombies around. + # These hog resources and might be causing some of the buildbots to die. + if hasattr(os, 'waitpid'): + any_process = -1 + while True: + try: + # This will raise an exception on Windows. That's ok. + pid, status = os.waitpid(any_process, os.WNOHANG) + if pid == 0: + break + except: + break + +@contextlib.contextmanager +def swap_attr(obj, attr, new_val): + """Temporary swap out an attribute with a new object. + + Usage: + with swap_attr(obj, "attr", 5): + ... + + This will set obj.attr to 5 for the duration of the with: block, + restoring the old value at the end of the block. If `attr` doesn't + exist on `obj`, it will be created and then deleted at the end of the + block. + """ + if hasattr(obj, attr): + real_val = getattr(obj, attr) + setattr(obj, attr, new_val) + try: + yield + finally: + setattr(obj, attr, real_val) + else: + setattr(obj, attr, new_val) + try: + yield + finally: + delattr(obj, attr) + +@contextlib.contextmanager +def swap_item(obj, item, new_val): + """Temporary swap out an item with a new object. + + Usage: + with swap_item(obj, "item", 5): + ... + + This will set obj["item"] to 5 for the duration of the with: block, + restoring the old value at the end of the block. If `item` doesn't + exist on `obj`, it will be created and then deleted at the end of the + block. + """ + if item in obj: + real_val = obj[item] + obj[item] = new_val + try: + yield + finally: + obj[item] = real_val + else: + obj[item] = new_val + try: + yield + finally: + del obj[item] + +def strip_python_stderr(stderr): + """Strip the stderr of a Python process from potential debug output + emitted by the interpreter. + + This will typically be run on the result of the communicate() method + of a subprocess.Popen object. + """ + stderr = re.sub(br"\[\d+ refs\]\r?\n?", b"", stderr).strip() + return stderr + +def args_from_interpreter_flags(): + """Return a list of command-line arguments reproducing the current + settings in sys.flags and sys.warnoptions.""" + return subprocess._args_from_interpreter_flags() + +#============================================================ +# Support for assertions about logging. +#============================================================ + +class TestHandler(logging.handlers.BufferingHandler): + def __init__(self, matcher): + # BufferingHandler takes a "capacity" argument + # so as to know when to flush. As we're overriding + # shouldFlush anyway, we can set a capacity of zero. + # You can call flush() manually to clear out the + # buffer. + logging.handlers.BufferingHandler.__init__(self, 0) + self.matcher = matcher + + def shouldFlush(self): + return False + + def emit(self, record): + self.format(record) + self.buffer.append(record.__dict__) + + def matches(self, **kwargs): + """ + Look for a saved dict whose keys/values match the supplied arguments. + """ + result = False + for d in self.buffer: + if self.matcher.matches(d, **kwargs): + result = True + break + return result + +class Matcher(object): + + _partial_matches = ('msg', 'message') + + def matches(self, d, **kwargs): + """ + Try to match a single dict with the supplied arguments. + + Keys whose values are strings and which are in self._partial_matches + will be checked for partial (i.e. substring) matches. You can extend + this scheme to (for example) do regular expression matching, etc. + """ + result = True + for k in kwargs: + v = kwargs[k] + dv = d.get(k) + if not self.match_value(k, dv, v): + result = False + break + return result + + def match_value(self, k, dv, v): + """ + Try to match a single stored value (dv) with a supplied value (v). + """ + if type(v) != type(dv): + result = False + elif type(dv) is not str or k not in self._partial_matches: + result = (v == dv) + else: + result = dv.find(v) >= 0 + return result + + +_can_symlink = None +def can_symlink(): + global _can_symlink + if _can_symlink is not None: + return _can_symlink + symlink_path = TESTFN + "can_symlink" + try: + os.symlink(TESTFN, symlink_path) + can = True + except (OSError, NotImplementedError, AttributeError): + can = False + else: + os.remove(symlink_path) + _can_symlink = can + return can + +def skip_unless_symlink(test): + """Skip decorator for tests that require functional symlink""" + ok = can_symlink() + msg = "Requires functional symlink implementation" + return test if ok else unittest.skip(msg)(test) + +_can_xattr = None +def can_xattr(): + global _can_xattr + if _can_xattr is not None: + return _can_xattr + if not hasattr(os, "setxattr"): + can = False + else: + tmp_fp, tmp_name = tempfile.mkstemp() + try: + with open(TESTFN, "wb") as fp: + try: + # TESTFN & tempfile may use different file systems with + # different capabilities + os.setxattr(tmp_fp, b"user.test", b"") + os.setxattr(fp.fileno(), b"user.test", b"") + # Kernels < 2.6.39 don't respect setxattr flags. + kernel_version = platform.release() + m = re.match("2.6.(\d{1,2})", kernel_version) + can = m is None or int(m.group(1)) >= 39 + except OSError: + can = False + finally: + unlink(TESTFN) + unlink(tmp_name) + _can_xattr = can + return can + +def skip_unless_xattr(test): + """Skip decorator for tests that require functional extended attributes""" + ok = can_xattr() + msg = "no non-broken extended attribute support" + return test if ok else unittest.skip(msg)(test) + + +if sys.platform.startswith('win'): + @contextlib.contextmanager + def suppress_crash_popup(): + """Disable Windows Error Reporting dialogs using SetErrorMode.""" + # see http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx + # GetErrorMode is not available on Windows XP and Windows Server 2003, + # but SetErrorMode returns the previous value, so we can use that + import ctypes + k32 = ctypes.windll.kernel32 + SEM_NOGPFAULTERRORBOX = 0x02 + old_error_mode = k32.SetErrorMode(SEM_NOGPFAULTERRORBOX) + k32.SetErrorMode(old_error_mode | SEM_NOGPFAULTERRORBOX) + try: + yield + finally: + k32.SetErrorMode(old_error_mode) +else: + # this is a no-op for other platforms + @contextlib.contextmanager + def suppress_crash_popup(): + yield + + +def patch(test_instance, object_to_patch, attr_name, new_value): + """Override 'object_to_patch'.'attr_name' with 'new_value'. + + Also, add a cleanup procedure to 'test_instance' to restore + 'object_to_patch' value for 'attr_name'. + The 'attr_name' should be a valid attribute for 'object_to_patch'. + + """ + # check that 'attr_name' is a real attribute for 'object_to_patch' + # will raise AttributeError if it does not exist + getattr(object_to_patch, attr_name) + + # keep a copy of the old value + attr_is_local = False + try: + old_value = object_to_patch.__dict__[attr_name] + except (AttributeError, KeyError): + old_value = getattr(object_to_patch, attr_name, None) + else: + attr_is_local = True + + # restore the value when the test is done + def cleanup(): + if attr_is_local: + setattr(object_to_patch, attr_name, old_value) + else: + delattr(object_to_patch, attr_name) + + test_instance.addCleanup(cleanup) + + # actually override the attribute + setattr(object_to_patch, attr_name, new_value) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/total_ordering.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/total_ordering.py new file mode 100644 index 0000000..760f06d --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/total_ordering.py @@ -0,0 +1,38 @@ +""" +For Python < 2.7.2. total_ordering in versions prior to 2.7.2 is buggy. +See http://bugs.python.org/issue10042 for details. For these versions use +code borrowed from Python 2.7.3. + +From django.utils. +""" + +import sys +if sys.version_info >= (2, 7, 2): + from functools import total_ordering +else: + def total_ordering(cls): + """Class decorator that fills in missing ordering methods""" + convert = { + '__lt__': [('__gt__', lambda self, other: not (self < other or self == other)), + ('__le__', lambda self, other: self < other or self == other), + ('__ge__', lambda self, other: not self < other)], + '__le__': [('__ge__', lambda self, other: not self <= other or self == other), + ('__lt__', lambda self, other: self <= other and not self == other), + ('__gt__', lambda self, other: not self <= other)], + '__gt__': [('__lt__', lambda self, other: not (self > other or self == other)), + ('__ge__', lambda self, other: self > other or self == other), + ('__le__', lambda self, other: not self > other)], + '__ge__': [('__le__', lambda self, other: (not self >= other) or self == other), + ('__gt__', lambda self, other: self >= other and not self == other), + ('__lt__', lambda self, other: not self >= other)] + } + roots = set(dir(cls)) & set(convert) + if not roots: + raise ValueError('must define at least one ordering operation: < > <= >=') + root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__ + for opname, opfunc in convert[root]: + if opname not in roots: + opfunc.__name__ = opname + opfunc.__doc__ = getattr(int, opname).__doc__ + setattr(cls, opname, opfunc) + return cls diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7dc12e028faa718cfc2d057657bdf46a00d73147 GIT binary patch literal 151 zcmXr!<>lgC{X32U2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUoQG3xdr+KnFYF~ zc?F5d*{LbInjK%)HE! Z_;|g7%3B;Zx%nxjIjMFa(~E(a0RV;bCZ+%Y literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/error.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/error.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..402f38849fb75fa1fc067721a8abbef22fd8074b GIT binary patch literal 2588 zcma)8%Wm676y-}4Ma!|0x=9~NJDau;V9SdJT?9euHVB#kgrbb=7^l>A6FRvQZc42y^FspXXlc%kAxO`?tS;{w1`m->oaHgZUx4 zRv^NPEMW^Lvu94^%-qPGd68$+o||=Me&n0Emvv`B)Wf_Ze9=8|qwqUR1fuf}J96vN zjrv&kgpai^`?7bsed$HFuosFh_PVlWmGOo4MOz~7p z!Nv_rudLhAgBiU~PMbIEwVU}HJuZ_+}sV#4TAah~t7@w_6=)mp02j7@NhXIa?lpjV6p zWa2Vjlsq}(ClVSzKR*7^NG3)+|Ci#`lp7g5(*@(~4bM`+=n+#=mqo5+nC80Tc_NMO zjiT_5k#o*T^Mudg67#53MO7q4#w57{5|wOthHG{j{z&7iKBDdGm^qS$c*Y*m5$@ zxN4Ocg?|8R*3hkY_*fU&ypnM`D+^WCfk@w^8aSv2^E@Tx;w-JCf`f*3Js?*It^_v6 zimL_og0*RNu*N{$YyDpDJ|*Sz>bNLgO(DTVBO&qY=3;V)u0H{hR%9ay9KhNU?mIhj zg-5WCJYfT@UDd^_0;{PgB9lBU?0J3kE;`1 z`$}>ROM^+8$(+w5ooJa&)D}3YKFF_@x`pAdZw{(ic~GY1{yZmiNwI%El``9Z`0#w9 z7q8C_Ci7~pq^D(=U8ZB zY}prsE8@)|IjKVmlT+fj4&!)MhMoIcL_Q$0@wjm|g<>CF)4l~@t$rN<>`p7;W`t2FjHSe+K^QEt zC(asYw@rC_w!+vW;B4q@l)4#f1{dVIHO>qZ!vk6vpk0GGLER`pz9*13*=ifR|3d^N z>esCZ=VGuiv`Oy&CxM)LvxM49^GRXUT4l?vjR-nA8ury4JXh}#*#)5-6Geht*=cG( z+*Zht3qg-4q$YJfq(_uLb%1XNLSHSK;`1>bY$9xCCd`ENA-bmW6xf~}IKg(%>3a#* zZ6jR|(KRWw$t~d^XI$aJv!3eV=vpClv0*GFpjC+f5@qz#u^a4f%BRU|qkr8spQgMT zx(!&nGpRK`y^4Xw75!U;zQDdI2bSHpFCN_VacCiW1SPM#wsG1`ZXsiy6K}FSK>Zr1 z`_nSq@sFM`^|x(G>`5zi&0y@M@{S$fl)o6`v@!kcOb0Y)xVj>5A@YC j^~X5$ip_1z>fmuxKA%v`On!RyuHAR~ZrB~{?0)(WI3#AO literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/parse.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/parse.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e3d0e880ad1479410294ae126980c2a13450993 GIT binary patch literal 28758 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/request.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/request.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cda98b2f08cf9071e4eeee99a055a7778921e299 GIT binary patch literal 70280 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ᙦHvQALkQD=bOmxSB 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 IFgU#OD;;bUL;wH) literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/robotparser.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/__pycache__/robotparser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80fe79cb8f5ec100b4cccc3ff6c52939dd6a57bf GIT binary patch literal 6053 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/error.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/error.py new file mode 100644 index 0000000..a473e44 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/error.py @@ -0,0 +1,75 @@ +"""Exception classes raised by urllib. + +The base exception class is URLError, which inherits from IOError. It +doesn't define any behavior of its own, but is the base class for all +exceptions defined in this package. + +HTTPError is an exception class that is also a valid HTTP response +instance. It behaves this way because HTTP protocol errors are valid +responses, with a status code, headers, and a body. In some contexts, +an application may want to handle an exception like a regular +response. +""" +from __future__ import absolute_import, division, unicode_literals +from future import standard_library + +from future.backports.urllib import response as urllib_response + + +__all__ = ['URLError', 'HTTPError', 'ContentTooShortError'] + + +# do these error classes make sense? +# make sure all of the IOError stuff is overridden. we just want to be +# subtypes. + +class URLError(IOError): + # URLError is a sub-type of IOError, but it doesn't share any of + # the implementation. need to override __init__ and __str__. + # It sets self.args for compatibility with other EnvironmentError + # subclasses, but args doesn't have the typical format with errno in + # slot 0 and strerror in slot 1. This may be better than nothing. + def __init__(self, reason, filename=None): + self.args = reason, + self.reason = reason + if filename is not None: + self.filename = filename + + def __str__(self): + return '' % self.reason + +class HTTPError(URLError, urllib_response.addinfourl): + """Raised when HTTP error occurs, but also acts like non-error return""" + __super_init = urllib_response.addinfourl.__init__ + + def __init__(self, url, code, msg, hdrs, fp): + self.code = code + self.msg = msg + self.hdrs = hdrs + self.fp = fp + self.filename = url + # The addinfourl classes depend on fp being a valid file + # object. In some cases, the HTTPError may not have a valid + # file object. If this happens, the simplest workaround is to + # not initialize the base classes. + if fp is not None: + self.__super_init(fp, hdrs, url, code) + + def __str__(self): + return 'HTTP Error %s: %s' % (self.code, self.msg) + + # since URLError specifies a .reason attribute, HTTPError should also + # provide this attribute. See issue13211 for discussion. + @property + def reason(self): + return self.msg + + def info(self): + return self.hdrs + + +# exception raised when downloaded size does not match content-length +class ContentTooShortError(URLError): + def __init__(self, message, content): + URLError.__init__(self, message) + self.content = content diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/parse.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/parse.py new file mode 100644 index 0000000..04e52d4 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/parse.py @@ -0,0 +1,991 @@ +""" +Ported using Python-Future from the Python 3.3 standard library. + +Parse (absolute and relative) URLs. + +urlparse module is based upon the following RFC specifications. + +RFC 3986 (STD66): "Uniform Resource Identifiers" by T. Berners-Lee, R. Fielding +and L. Masinter, January 2005. + +RFC 2732 : "Format for Literal IPv6 Addresses in URL's by R.Hinden, B.Carpenter +and L.Masinter, December 1999. + +RFC 2396: "Uniform Resource Identifiers (URI)": Generic Syntax by T. +Berners-Lee, R. Fielding, and L. Masinter, August 1998. + +RFC 2368: "The mailto URL scheme", by P.Hoffman , L Masinter, J. Zawinski, July 1998. + +RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, UC Irvine, June +1995. + +RFC 1738: "Uniform Resource Locators (URL)" by T. Berners-Lee, L. Masinter, M. +McCahill, December 1994 + +RFC 3986 is considered the current standard and any future changes to +urlparse module should conform with it. The urlparse module is +currently not entirely compliant with this RFC due to defacto +scenarios for parsing, and for backward compatibility purposes, some +parsing quirks from older RFCs are retained. The testcases in +test_urlparse.py provides a good indicator of parsing behavior. +""" +from __future__ import absolute_import, division, unicode_literals +from future.builtins import bytes, chr, dict, int, range, str +from future.utils import raise_with_traceback + +import re +import sys +import collections + +__all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag", + "urlsplit", "urlunsplit", "urlencode", "parse_qs", + "parse_qsl", "quote", "quote_plus", "quote_from_bytes", + "unquote", "unquote_plus", "unquote_to_bytes"] + +# A classification of schemes ('' means apply by default) +uses_relative = ['ftp', 'http', 'gopher', 'nntp', 'imap', + 'wais', 'file', 'https', 'shttp', 'mms', + 'prospero', 'rtsp', 'rtspu', '', 'sftp', + 'svn', 'svn+ssh'] +uses_netloc = ['ftp', 'http', 'gopher', 'nntp', 'telnet', + 'imap', 'wais', 'file', 'mms', 'https', 'shttp', + 'snews', 'prospero', 'rtsp', 'rtspu', 'rsync', '', + 'svn', 'svn+ssh', 'sftp', 'nfs', 'git', 'git+ssh'] +uses_params = ['ftp', 'hdl', 'prospero', 'http', 'imap', + 'https', 'shttp', 'rtsp', 'rtspu', 'sip', 'sips', + 'mms', '', 'sftp', 'tel'] + +# These are not actually used anymore, but should stay for backwards +# compatibility. (They are undocumented, but have a public-looking name.) +non_hierarchical = ['gopher', 'hdl', 'mailto', 'news', + 'telnet', 'wais', 'imap', 'snews', 'sip', 'sips'] +uses_query = ['http', 'wais', 'imap', 'https', 'shttp', 'mms', + 'gopher', 'rtsp', 'rtspu', 'sip', 'sips', ''] +uses_fragment = ['ftp', 'hdl', 'http', 'gopher', 'news', + 'nntp', 'wais', 'https', 'shttp', 'snews', + 'file', 'prospero', ''] + +# Characters valid in scheme names +scheme_chars = ('abcdefghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + '0123456789' + '+-.') + +# XXX: Consider replacing with functools.lru_cache +MAX_CACHE_SIZE = 20 +_parse_cache = {} + +def clear_cache(): + """Clear the parse cache and the quoters cache.""" + _parse_cache.clear() + _safe_quoters.clear() + + +# Helpers for bytes handling +# For 3.2, we deliberately require applications that +# handle improperly quoted URLs to do their own +# decoding and encoding. If valid use cases are +# presented, we may relax this by using latin-1 +# decoding internally for 3.3 +_implicit_encoding = 'ascii' +_implicit_errors = 'strict' + +def _noop(obj): + return obj + +def _encode_result(obj, encoding=_implicit_encoding, + errors=_implicit_errors): + return obj.encode(encoding, errors) + +def _decode_args(args, encoding=_implicit_encoding, + errors=_implicit_errors): + return tuple(x.decode(encoding, errors) if x else '' for x in args) + +def _coerce_args(*args): + # Invokes decode if necessary to create str args + # and returns the coerced inputs along with + # an appropriate result coercion function + # - noop for str inputs + # - encoding function otherwise + str_input = isinstance(args[0], str) + for arg in args[1:]: + # We special-case the empty string to support the + # "scheme=''" default argument to some functions + if arg and isinstance(arg, str) != str_input: + raise TypeError("Cannot mix str and non-str arguments") + if str_input: + return args + (_noop,) + return _decode_args(args) + (_encode_result,) + +# Result objects are more helpful than simple tuples +class _ResultMixinStr(object): + """Standard approach to encoding parsed results from str to bytes""" + __slots__ = () + + def encode(self, encoding='ascii', errors='strict'): + return self._encoded_counterpart(*(x.encode(encoding, errors) for x in self)) + + +class _ResultMixinBytes(object): + """Standard approach to decoding parsed results from bytes to str""" + __slots__ = () + + def decode(self, encoding='ascii', errors='strict'): + return self._decoded_counterpart(*(x.decode(encoding, errors) for x in self)) + + +class _NetlocResultMixinBase(object): + """Shared methods for the parsed result objects containing a netloc element""" + __slots__ = () + + @property + def username(self): + return self._userinfo[0] + + @property + def password(self): + return self._userinfo[1] + + @property + def hostname(self): + hostname = self._hostinfo[0] + if not hostname: + hostname = None + elif hostname is not None: + hostname = hostname.lower() + return hostname + + @property + def port(self): + port = self._hostinfo[1] + if port is not None: + port = int(port, 10) + # Return None on an illegal port + if not ( 0 <= port <= 65535): + return None + return port + + +class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr): + __slots__ = () + + @property + def _userinfo(self): + netloc = self.netloc + userinfo, have_info, hostinfo = netloc.rpartition('@') + if have_info: + username, have_password, password = userinfo.partition(':') + if not have_password: + password = None + else: + username = password = None + return username, password + + @property + def _hostinfo(self): + netloc = self.netloc + _, _, hostinfo = netloc.rpartition('@') + _, have_open_br, bracketed = hostinfo.partition('[') + if have_open_br: + hostname, _, port = bracketed.partition(']') + _, have_port, port = port.partition(':') + else: + hostname, have_port, port = hostinfo.partition(':') + if not have_port: + port = None + return hostname, port + + +class _NetlocResultMixinBytes(_NetlocResultMixinBase, _ResultMixinBytes): + __slots__ = () + + @property + def _userinfo(self): + netloc = self.netloc + userinfo, have_info, hostinfo = netloc.rpartition(b'@') + if have_info: + username, have_password, password = userinfo.partition(b':') + if not have_password: + password = None + else: + username = password = None + return username, password + + @property + def _hostinfo(self): + netloc = self.netloc + _, _, hostinfo = netloc.rpartition(b'@') + _, have_open_br, bracketed = hostinfo.partition(b'[') + if have_open_br: + hostname, _, port = bracketed.partition(b']') + _, have_port, port = port.partition(b':') + else: + hostname, have_port, port = hostinfo.partition(b':') + if not have_port: + port = None + return hostname, port + + +from collections import namedtuple + +_DefragResultBase = namedtuple('DefragResult', 'url fragment') +_SplitResultBase = namedtuple('SplitResult', 'scheme netloc path query fragment') +_ParseResultBase = namedtuple('ParseResult', 'scheme netloc path params query fragment') + +# For backwards compatibility, alias _NetlocResultMixinStr +# ResultBase is no longer part of the documented API, but it is +# retained since deprecating it isn't worth the hassle +ResultBase = _NetlocResultMixinStr + +# Structured result objects for string data +class DefragResult(_DefragResultBase, _ResultMixinStr): + __slots__ = () + def geturl(self): + if self.fragment: + return self.url + '#' + self.fragment + else: + return self.url + +class SplitResult(_SplitResultBase, _NetlocResultMixinStr): + __slots__ = () + def geturl(self): + return urlunsplit(self) + +class ParseResult(_ParseResultBase, _NetlocResultMixinStr): + __slots__ = () + def geturl(self): + return urlunparse(self) + +# Structured result objects for bytes data +class DefragResultBytes(_DefragResultBase, _ResultMixinBytes): + __slots__ = () + def geturl(self): + if self.fragment: + return self.url + b'#' + self.fragment + else: + return self.url + +class SplitResultBytes(_SplitResultBase, _NetlocResultMixinBytes): + __slots__ = () + def geturl(self): + return urlunsplit(self) + +class ParseResultBytes(_ParseResultBase, _NetlocResultMixinBytes): + __slots__ = () + def geturl(self): + return urlunparse(self) + +# Set up the encode/decode result pairs +def _fix_result_transcoding(): + _result_pairs = ( + (DefragResult, DefragResultBytes), + (SplitResult, SplitResultBytes), + (ParseResult, ParseResultBytes), + ) + for _decoded, _encoded in _result_pairs: + _decoded._encoded_counterpart = _encoded + _encoded._decoded_counterpart = _decoded + +_fix_result_transcoding() +del _fix_result_transcoding + +def urlparse(url, scheme='', allow_fragments=True): + """Parse a URL into 6 components: + :///;?# + Return a 6-tuple: (scheme, netloc, path, params, query, fragment). + Note that we don't break the components up in smaller bits + (e.g. netloc is a single string) and we don't expand % escapes.""" + url, scheme, _coerce_result = _coerce_args(url, scheme) + splitresult = urlsplit(url, scheme, allow_fragments) + scheme, netloc, url, query, fragment = splitresult + if scheme in uses_params and ';' in url: + url, params = _splitparams(url) + else: + params = '' + result = ParseResult(scheme, netloc, url, params, query, fragment) + return _coerce_result(result) + +def _splitparams(url): + if '/' in url: + i = url.find(';', url.rfind('/')) + if i < 0: + return url, '' + else: + i = url.find(';') + return url[:i], url[i+1:] + +def _splitnetloc(url, start=0): + delim = len(url) # position of end of domain part of url, default is end + for c in '/?#': # look for delimiters; the order is NOT important + wdelim = url.find(c, start) # find first of this delim + if wdelim >= 0: # if found + delim = min(delim, wdelim) # use earliest delim position + return url[start:delim], url[delim:] # return (domain, rest) + +def urlsplit(url, scheme='', allow_fragments=True): + """Parse a URL into 5 components: + :///?# + Return a 5-tuple: (scheme, netloc, path, query, fragment). + Note that we don't break the components up in smaller bits + (e.g. netloc is a single string) and we don't expand % escapes.""" + url, scheme, _coerce_result = _coerce_args(url, scheme) + allow_fragments = bool(allow_fragments) + key = url, scheme, allow_fragments, type(url), type(scheme) + cached = _parse_cache.get(key, None) + if cached: + return _coerce_result(cached) + if len(_parse_cache) >= MAX_CACHE_SIZE: # avoid runaway growth + clear_cache() + netloc = query = fragment = '' + i = url.find(':') + if i > 0: + if url[:i] == 'http': # optimize the common case + scheme = url[:i].lower() + url = url[i+1:] + if url[:2] == '//': + netloc, url = _splitnetloc(url, 2) + if (('[' in netloc and ']' not in netloc) or + (']' in netloc and '[' not in netloc)): + raise ValueError("Invalid IPv6 URL") + if allow_fragments and '#' in url: + url, fragment = url.split('#', 1) + if '?' in url: + url, query = url.split('?', 1) + v = SplitResult(scheme, netloc, url, query, fragment) + _parse_cache[key] = v + return _coerce_result(v) + for c in url[:i]: + if c not in scheme_chars: + break + else: + # make sure "url" is not actually a port number (in which case + # "scheme" is really part of the path) + rest = url[i+1:] + if not rest or any(c not in '0123456789' for c in rest): + # not a port number + scheme, url = url[:i].lower(), rest + + if url[:2] == '//': + netloc, url = _splitnetloc(url, 2) + if (('[' in netloc and ']' not in netloc) or + (']' in netloc and '[' not in netloc)): + raise ValueError("Invalid IPv6 URL") + if allow_fragments and '#' in url: + url, fragment = url.split('#', 1) + if '?' in url: + url, query = url.split('?', 1) + v = SplitResult(scheme, netloc, url, query, fragment) + _parse_cache[key] = v + return _coerce_result(v) + +def urlunparse(components): + """Put a parsed URL back together again. This may result in a + slightly different, but equivalent URL, if the URL that was parsed + originally had redundant delimiters, e.g. a ? with an empty query + (the draft states that these are equivalent).""" + scheme, netloc, url, params, query, fragment, _coerce_result = ( + _coerce_args(*components)) + if params: + url = "%s;%s" % (url, params) + return _coerce_result(urlunsplit((scheme, netloc, url, query, fragment))) + +def urlunsplit(components): + """Combine the elements of a tuple as returned by urlsplit() into a + complete URL as a string. The data argument can be any five-item iterable. + This may result in a slightly different, but equivalent URL, if the URL that + was parsed originally had unnecessary delimiters (for example, a ? with an + empty query; the RFC states that these are equivalent).""" + scheme, netloc, url, query, fragment, _coerce_result = ( + _coerce_args(*components)) + if netloc or (scheme and scheme in uses_netloc and url[:2] != '//'): + if url and url[:1] != '/': url = '/' + url + url = '//' + (netloc or '') + url + if scheme: + url = scheme + ':' + url + if query: + url = url + '?' + query + if fragment: + url = url + '#' + fragment + return _coerce_result(url) + +def urljoin(base, url, allow_fragments=True): + """Join a base URL and a possibly relative URL to form an absolute + interpretation of the latter.""" + if not base: + return url + if not url: + return base + base, url, _coerce_result = _coerce_args(base, url) + bscheme, bnetloc, bpath, bparams, bquery, bfragment = \ + urlparse(base, '', allow_fragments) + scheme, netloc, path, params, query, fragment = \ + urlparse(url, bscheme, allow_fragments) + if scheme != bscheme or scheme not in uses_relative: + return _coerce_result(url) + if scheme in uses_netloc: + if netloc: + return _coerce_result(urlunparse((scheme, netloc, path, + params, query, fragment))) + netloc = bnetloc + if path[:1] == '/': + return _coerce_result(urlunparse((scheme, netloc, path, + params, query, fragment))) + if not path and not params: + path = bpath + params = bparams + if not query: + query = bquery + return _coerce_result(urlunparse((scheme, netloc, path, + params, query, fragment))) + segments = bpath.split('/')[:-1] + path.split('/') + # XXX The stuff below is bogus in various ways... + if segments[-1] == '.': + segments[-1] = '' + while '.' in segments: + segments.remove('.') + while 1: + i = 1 + n = len(segments) - 1 + while i < n: + if (segments[i] == '..' + and segments[i-1] not in ('', '..')): + del segments[i-1:i+1] + break + i = i+1 + else: + break + if segments == ['', '..']: + segments[-1] = '' + elif len(segments) >= 2 and segments[-1] == '..': + segments[-2:] = [''] + return _coerce_result(urlunparse((scheme, netloc, '/'.join(segments), + params, query, fragment))) + +def urldefrag(url): + """Removes any existing fragment from URL. + + Returns a tuple of the defragmented URL and the fragment. If + the URL contained no fragments, the second element is the + empty string. + """ + url, _coerce_result = _coerce_args(url) + if '#' in url: + s, n, p, a, q, frag = urlparse(url) + defrag = urlunparse((s, n, p, a, q, '')) + else: + frag = '' + defrag = url + return _coerce_result(DefragResult(defrag, frag)) + +_hexdig = '0123456789ABCDEFabcdef' +_hextobyte = dict(((a + b).encode(), bytes([int(a + b, 16)])) + for a in _hexdig for b in _hexdig) + +def unquote_to_bytes(string): + """unquote_to_bytes('abc%20def') -> b'abc def'.""" + # Note: strings are encoded as UTF-8. This is only an issue if it contains + # unescaped non-ASCII characters, which URIs should not. + if not string: + # Is it a string-like object? + string.split + return bytes(b'') + if isinstance(string, str): + string = string.encode('utf-8') + ### For Python-Future: + # It is already a byte-string object, but force it to be newbytes here on + # Py2: + string = bytes(string) + ### + bits = string.split(b'%') + if len(bits) == 1: + return string + res = [bits[0]] + append = res.append + for item in bits[1:]: + try: + append(_hextobyte[item[:2]]) + append(item[2:]) + except KeyError: + append(b'%') + append(item) + return bytes(b'').join(res) + +_asciire = re.compile('([\x00-\x7f]+)') + +def unquote(string, encoding='utf-8', errors='replace'): + """Replace %xx escapes by their single-character equivalent. The optional + encoding and errors parameters specify how to decode percent-encoded + sequences into Unicode characters, as accepted by the bytes.decode() + method. + By default, percent-encoded sequences are decoded with UTF-8, and invalid + sequences are replaced by a placeholder character. + + unquote('abc%20def') -> 'abc def'. + """ + if '%' not in string: + string.split + return string + if encoding is None: + encoding = 'utf-8' + if errors is None: + errors = 'replace' + bits = _asciire.split(string) + res = [bits[0]] + append = res.append + for i in range(1, len(bits), 2): + append(unquote_to_bytes(bits[i]).decode(encoding, errors)) + append(bits[i + 1]) + return ''.join(res) + +def parse_qs(qs, keep_blank_values=False, strict_parsing=False, + encoding='utf-8', errors='replace'): + """Parse a query given as a string argument. + + Arguments: + + qs: percent-encoded query string to be parsed + + keep_blank_values: flag indicating whether blank values in + percent-encoded queries should be treated as blank strings. + A true value indicates that blanks should be retained as + blank strings. The default false value indicates that + blank values are to be ignored and treated as if they were + not included. + + strict_parsing: flag indicating what to do with parsing errors. + If false (the default), errors are silently ignored. + If true, errors raise a ValueError exception. + + encoding and errors: specify how to decode percent-encoded sequences + into Unicode characters, as accepted by the bytes.decode() method. + """ + parsed_result = {} + pairs = parse_qsl(qs, keep_blank_values, strict_parsing, + encoding=encoding, errors=errors) + for name, value in pairs: + if name in parsed_result: + parsed_result[name].append(value) + else: + parsed_result[name] = [value] + return parsed_result + +def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, + encoding='utf-8', errors='replace'): + """Parse a query given as a string argument. + + Arguments: + + qs: percent-encoded query string to be parsed + + keep_blank_values: flag indicating whether blank values in + percent-encoded queries should be treated as blank strings. A + true value indicates that blanks should be retained as blank + strings. The default false value indicates that blank values + are to be ignored and treated as if they were not included. + + strict_parsing: flag indicating what to do with parsing errors. If + false (the default), errors are silently ignored. If true, + errors raise a ValueError exception. + + encoding and errors: specify how to decode percent-encoded sequences + into Unicode characters, as accepted by the bytes.decode() method. + + Returns a list, as G-d intended. + """ + qs, _coerce_result = _coerce_args(qs) + pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] + r = [] + for name_value in pairs: + if not name_value and not strict_parsing: + continue + nv = name_value.split('=', 1) + if len(nv) != 2: + if strict_parsing: + raise ValueError("bad query field: %r" % (name_value,)) + # Handle case of a control-name with no equal sign + if keep_blank_values: + nv.append('') + else: + continue + if len(nv[1]) or keep_blank_values: + name = nv[0].replace('+', ' ') + name = unquote(name, encoding=encoding, errors=errors) + name = _coerce_result(name) + value = nv[1].replace('+', ' ') + value = unquote(value, encoding=encoding, errors=errors) + value = _coerce_result(value) + r.append((name, value)) + return r + +def unquote_plus(string, encoding='utf-8', errors='replace'): + """Like unquote(), but also replace plus signs by spaces, as required for + unquoting HTML form values. + + unquote_plus('%7e/abc+def') -> '~/abc def' + """ + string = string.replace('+', ' ') + return unquote(string, encoding, errors) + +_ALWAYS_SAFE = frozenset(bytes(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + b'abcdefghijklmnopqrstuvwxyz' + b'0123456789' + b'_.-')) +_ALWAYS_SAFE_BYTES = bytes(_ALWAYS_SAFE) +_safe_quoters = {} + +class Quoter(collections.defaultdict): + """A mapping from bytes (in range(0,256)) to strings. + + String values are percent-encoded byte values, unless the key < 128, and + in the "safe" set (either the specified safe set, or default set). + """ + # Keeps a cache internally, using defaultdict, for efficiency (lookups + # of cached keys don't call Python code at all). + def __init__(self, safe): + """safe: bytes object.""" + self.safe = _ALWAYS_SAFE.union(bytes(safe)) + + def __repr__(self): + # Without this, will just display as a defaultdict + return "" % dict(self) + + def __missing__(self, b): + # Handle a cache miss. Store quoted string in cache and return. + res = chr(b) if b in self.safe else '%{0:02X}'.format(b) + self[b] = res + return res + +def quote(string, safe='/', encoding=None, errors=None): + """quote('abc def') -> 'abc%20def' + + Each part of a URL, e.g. the path info, the query, etc., has a + different set of reserved characters that must be quoted. + + RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists + the following reserved characters. + + reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | + "$" | "," + + Each of these characters is reserved in some component of a URL, + but not necessarily in all of them. + + By default, the quote function is intended for quoting the path + section of a URL. Thus, it will not encode '/'. This character + is reserved, but in typical usage the quote function is being + called on a path where the existing slash characters are used as + reserved characters. + + string and safe may be either str or bytes objects. encoding must + not be specified if string is a str. + + The optional encoding and errors parameters specify how to deal with + non-ASCII characters, as accepted by the str.encode method. + By default, encoding='utf-8' (characters are encoded with UTF-8), and + errors='strict' (unsupported characters raise a UnicodeEncodeError). + """ + if isinstance(string, str): + if not string: + return string + if encoding is None: + encoding = 'utf-8' + if errors is None: + errors = 'strict' + string = string.encode(encoding, errors) + else: + if encoding is not None: + raise TypeError("quote() doesn't support 'encoding' for bytes") + if errors is not None: + raise TypeError("quote() doesn't support 'errors' for bytes") + return quote_from_bytes(string, safe) + +def quote_plus(string, safe='', encoding=None, errors=None): + """Like quote(), but also replace ' ' with '+', as required for quoting + HTML form values. Plus signs in the original string are escaped unless + they are included in safe. It also does not have safe default to '/'. + """ + # Check if ' ' in string, where string may either be a str or bytes. If + # there are no spaces, the regular quote will produce the right answer. + if ((isinstance(string, str) and ' ' not in string) or + (isinstance(string, bytes) and b' ' not in string)): + return quote(string, safe, encoding, errors) + if isinstance(safe, str): + space = str(' ') + else: + space = bytes(b' ') + string = quote(string, safe + space, encoding, errors) + return string.replace(' ', '+') + +def quote_from_bytes(bs, safe='/'): + """Like quote(), but accepts a bytes object rather than a str, and does + not perform string-to-bytes encoding. It always returns an ASCII string. + quote_from_bytes(b'abc def\x3f') -> 'abc%20def%3f' + """ + if not isinstance(bs, (bytes, bytearray)): + raise TypeError("quote_from_bytes() expected bytes") + if not bs: + return str('') + ### For Python-Future: + bs = bytes(bs) + ### + if isinstance(safe, str): + # Normalize 'safe' by converting to bytes and removing non-ASCII chars + safe = str(safe).encode('ascii', 'ignore') + else: + ### For Python-Future: + safe = bytes(safe) + ### + safe = bytes([c for c in safe if c < 128]) + if not bs.rstrip(_ALWAYS_SAFE_BYTES + safe): + return bs.decode() + try: + quoter = _safe_quoters[safe] + except KeyError: + _safe_quoters[safe] = quoter = Quoter(safe).__getitem__ + return str('').join([quoter(char) for char in bs]) + +def urlencode(query, doseq=False, safe='', encoding=None, errors=None): + """Encode a sequence of two-element tuples or dictionary into a URL query string. + + If any values in the query arg are sequences and doseq is true, each + sequence element is converted to a separate parameter. + + If the query arg is a sequence of two-element tuples, the order of the + parameters in the output will match the order of parameters in the + input. + + The query arg may be either a string or a bytes type. When query arg is a + string, the safe, encoding and error parameters are sent the quote_plus for + encoding. + """ + + if hasattr(query, "items"): + query = query.items() + else: + # It's a bother at times that strings and string-like objects are + # sequences. + try: + # non-sequence items should not work with len() + # non-empty strings will fail this + if len(query) and not isinstance(query[0], tuple): + raise TypeError + # Zero-length sequences of all types will get here and succeed, + # but that's a minor nit. Since the original implementation + # allowed empty dicts that type of behavior probably should be + # preserved for consistency + except TypeError: + ty, va, tb = sys.exc_info() + raise_with_traceback(TypeError("not a valid non-string sequence " + "or mapping object"), tb) + + l = [] + if not doseq: + for k, v in query: + if isinstance(k, bytes): + k = quote_plus(k, safe) + else: + k = quote_plus(str(k), safe, encoding, errors) + + if isinstance(v, bytes): + v = quote_plus(v, safe) + else: + v = quote_plus(str(v), safe, encoding, errors) + l.append(k + '=' + v) + else: + for k, v in query: + if isinstance(k, bytes): + k = quote_plus(k, safe) + else: + k = quote_plus(str(k), safe, encoding, errors) + + if isinstance(v, bytes): + v = quote_plus(v, safe) + l.append(k + '=' + v) + elif isinstance(v, str): + v = quote_plus(v, safe, encoding, errors) + l.append(k + '=' + v) + else: + try: + # Is this a sufficient test for sequence-ness? + x = len(v) + except TypeError: + # not a sequence + v = quote_plus(str(v), safe, encoding, errors) + l.append(k + '=' + v) + else: + # loop over the sequence + for elt in v: + if isinstance(elt, bytes): + elt = quote_plus(elt, safe) + else: + elt = quote_plus(str(elt), safe, encoding, errors) + l.append(k + '=' + elt) + return str('&').join(l) + +# Utilities to parse URLs (most of these return None for missing parts): +# unwrap('') --> 'type://host/path' +# splittype('type:opaquestring') --> 'type', 'opaquestring' +# splithost('//host[:port]/path') --> 'host[:port]', '/path' +# splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]' +# splitpasswd('user:passwd') -> 'user', 'passwd' +# splitport('host:port') --> 'host', 'port' +# splitquery('/path?query') --> '/path', 'query' +# splittag('/path#tag') --> '/path', 'tag' +# splitattr('/path;attr1=value1;attr2=value2;...') -> +# '/path', ['attr1=value1', 'attr2=value2', ...] +# splitvalue('attr=value') --> 'attr', 'value' +# urllib.parse.unquote('abc%20def') -> 'abc def' +# quote('abc def') -> 'abc%20def') + +def to_bytes(url): + """to_bytes(u"URL") --> 'URL'.""" + # Most URL schemes require ASCII. If that changes, the conversion + # can be relaxed. + # XXX get rid of to_bytes() + if isinstance(url, str): + try: + url = url.encode("ASCII").decode() + except UnicodeError: + raise UnicodeError("URL " + repr(url) + + " contains non-ASCII characters") + return url + +def unwrap(url): + """unwrap('') --> 'type://host/path'.""" + url = str(url).strip() + if url[:1] == '<' and url[-1:] == '>': + url = url[1:-1].strip() + if url[:4] == 'URL:': url = url[4:].strip() + return url + +_typeprog = None +def splittype(url): + """splittype('type:opaquestring') --> 'type', 'opaquestring'.""" + global _typeprog + if _typeprog is None: + import re + _typeprog = re.compile('^([^/:]+):') + + match = _typeprog.match(url) + if match: + scheme = match.group(1) + return scheme.lower(), url[len(scheme) + 1:] + return None, url + +_hostprog = None +def splithost(url): + """splithost('//host[:port]/path') --> 'host[:port]', '/path'.""" + global _hostprog + if _hostprog is None: + import re + _hostprog = re.compile('^//([^/?]*)(.*)$') + + match = _hostprog.match(url) + if match: + host_port = match.group(1) + path = match.group(2) + if path and not path.startswith('/'): + path = '/' + path + return host_port, path + return None, url + +_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 + +_passwdprog = None +def splitpasswd(user): + """splitpasswd('user:passwd') -> 'user', 'passwd'.""" + global _passwdprog + if _passwdprog is None: + import re + _passwdprog = re.compile('^([^:]*):(.*)$',re.S) + + match = _passwdprog.match(user) + if match: return match.group(1, 2) + return user, None + +# splittag('/path#tag') --> '/path', 'tag' +_portprog = None +def splitport(host): + """splitport('host:port') --> 'host', 'port'.""" + global _portprog + if _portprog is None: + import re + _portprog = re.compile('^(.*):([0-9]+)$') + + match = _portprog.match(host) + if match: return match.group(1, 2) + return host, None + +_nportprog = None +def splitnport(host, defport=-1): + """Split host and port, returning numeric port. + Return given default port if no ':' found; defaults to -1. + Return numerical port if a valid number are found after ':'. + Return None if ':' but not a valid number.""" + global _nportprog + if _nportprog is None: + import re + _nportprog = re.compile('^(.*):(.*)$') + + match = _nportprog.match(host) + if match: + host, port = match.group(1, 2) + try: + if not port: raise ValueError("no digits") + nport = int(port) + except ValueError: + nport = None + return host, nport + return host, defport + +_queryprog = None +def splitquery(url): + """splitquery('/path?query') --> '/path', 'query'.""" + global _queryprog + if _queryprog is None: + import re + _queryprog = re.compile('^(.*)\?([^?]*)$') + + match = _queryprog.match(url) + if match: return match.group(1, 2) + return url, None + +_tagprog = None +def splittag(url): + """splittag('/path#tag') --> '/path', 'tag'.""" + global _tagprog + if _tagprog is None: + import re + _tagprog = re.compile('^(.*)#([^#]*)$') + + match = _tagprog.match(url) + if match: return match.group(1, 2) + return url, None + +def splitattr(url): + """splitattr('/path;attr1=value1;attr2=value2;...') -> + '/path', ['attr1=value1', 'attr2=value2', ...].""" + words = url.split(';') + return words[0], words[1:] + +_valueprog = None +def splitvalue(attr): + """splitvalue('attr=value') --> 'attr', 'value'.""" + global _valueprog + if _valueprog is None: + import re + _valueprog = re.compile('^([^=]*)=(.*)$') + + match = _valueprog.match(attr) + if match: return match.group(1, 2) + return attr, None diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/request.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/request.py new file mode 100644 index 0000000..baee540 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/request.py @@ -0,0 +1,2647 @@ +""" +Ported using Python-Future from the Python 3.3 standard library. + +An extensible library for opening URLs using a variety of protocols + +The simplest way to use this module is to call the urlopen function, +which accepts a string containing a URL or a Request object (described +below). It opens the URL and returns the results as file-like +object; the returned object has some extra methods described below. + +The OpenerDirector manages a collection of Handler objects that do +all the actual work. Each Handler implements a particular protocol or +option. The OpenerDirector is a composite object that invokes the +Handlers needed to open the requested URL. For example, the +HTTPHandler performs HTTP GET and POST requests and deals with +non-error returns. The HTTPRedirectHandler automatically deals with +HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler +deals with digest authentication. + +urlopen(url, data=None) -- Basic usage is the same as original +urllib. pass the url and optionally data to post to an HTTP URL, and +get a file-like object back. One difference is that you can also pass +a Request instance instead of URL. Raises a URLError (subclass of +IOError); for HTTP errors, raises an HTTPError, which can also be +treated as a valid response. + +build_opener -- Function that creates a new OpenerDirector instance. +Will install the default handlers. Accepts one or more Handlers as +arguments, either instances or Handler classes that it will +instantiate. If one of the argument is a subclass of the default +handler, the argument will be installed instead of the default. + +install_opener -- Installs a new opener as the default opener. + +objects of interest: + +OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages +the Handler classes, while dealing with requests and responses. + +Request -- An object that encapsulates the state of a request. The +state can be as simple as the URL. It can also include extra HTTP +headers, e.g. a User-Agent. + +BaseHandler -- + +internals: +BaseHandler and parent +_call_chain conventions + +Example usage: + +import urllib.request + +# set up authentication info +authinfo = urllib.request.HTTPBasicAuthHandler() +authinfo.add_password(realm='PDQ Application', + uri='https://mahler:8092/site-updates.py', + user='klem', + passwd='geheim$parole') + +proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"}) + +# build a new opener that adds authentication and caching FTP handlers +opener = urllib.request.build_opener(proxy_support, authinfo, + urllib.request.CacheFTPHandler) + +# install it +urllib.request.install_opener(opener) + +f = urllib.request.urlopen('http://www.python.org/') +""" + +# XXX issues: +# If an authentication error handler that tries to perform +# authentication for some reason but fails, how should the error be +# signalled? The client needs to know the HTTP error code. But if +# the handler knows that the problem was, e.g., that it didn't know +# that hash algo that requested in the challenge, it would be good to +# pass that information along to the client, too. +# ftp errors aren't handled cleanly +# check digest against correct (i.e. non-apache) implementation + +# Possible extensions: +# complex proxies XXX not sure what exactly was meant by this +# abstract factory for opener + +from __future__ import absolute_import, division, print_function, unicode_literals +from future.builtins import bytes, dict, filter, input, int, map, open, str +from future.utils import PY2, PY3, raise_with_traceback + +import base64 +import bisect +import hashlib +import array + +from future.backports import email +from future.backports.http import client as http_client +from .error import URLError, HTTPError, ContentTooShortError +from .parse import ( + urlparse, urlsplit, urljoin, unwrap, quote, unquote, + splittype, splithost, splitport, splituser, splitpasswd, + splitattr, splitquery, splitvalue, splittag, to_bytes, urlunparse) +from .response import addinfourl, addclosehook + +import io +import os +import posixpath +import re +import socket +import sys +import time +import tempfile +import contextlib +import warnings + +from future.utils import PY2 + +if PY2: + from collections import Iterable +else: + from collections.abc import Iterable + +# check for SSL +try: + import ssl + # Not available in the SSL module in Py2: + from ssl import SSLContext +except ImportError: + _have_ssl = False +else: + _have_ssl = True + +__all__ = [ + # Classes + 'Request', 'OpenerDirector', 'BaseHandler', 'HTTPDefaultErrorHandler', + 'HTTPRedirectHandler', 'HTTPCookieProcessor', 'ProxyHandler', + 'HTTPPasswordMgr', 'HTTPPasswordMgrWithDefaultRealm', + 'AbstractBasicAuthHandler', 'HTTPBasicAuthHandler', 'ProxyBasicAuthHandler', + 'AbstractDigestAuthHandler', 'HTTPDigestAuthHandler', 'ProxyDigestAuthHandler', + 'HTTPHandler', 'FileHandler', 'FTPHandler', 'CacheFTPHandler', + 'UnknownHandler', 'HTTPErrorProcessor', + # Functions + 'urlopen', 'install_opener', 'build_opener', + 'pathname2url', 'url2pathname', 'getproxies', + # Legacy interface + 'urlretrieve', 'urlcleanup', 'URLopener', 'FancyURLopener', +] + +# used in User-Agent header sent +__version__ = sys.version[:3] + +_opener = None +def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, **_3to2kwargs): + if 'cadefault' in _3to2kwargs: cadefault = _3to2kwargs['cadefault']; del _3to2kwargs['cadefault'] + else: cadefault = False + if 'capath' in _3to2kwargs: capath = _3to2kwargs['capath']; del _3to2kwargs['capath'] + else: capath = None + if 'cafile' in _3to2kwargs: cafile = _3to2kwargs['cafile']; del _3to2kwargs['cafile'] + else: cafile = None + global _opener + if cafile or capath or cadefault: + if not _have_ssl: + raise ValueError('SSL support not available') + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.options |= ssl.OP_NO_SSLv2 + context.verify_mode = ssl.CERT_REQUIRED + if cafile or capath: + context.load_verify_locations(cafile, capath) + else: + context.set_default_verify_paths() + https_handler = HTTPSHandler(context=context, check_hostname=True) + opener = build_opener(https_handler) + elif _opener is None: + _opener = opener = build_opener() + else: + opener = _opener + return opener.open(url, data, timeout) + +def install_opener(opener): + global _opener + _opener = opener + +_url_tempfiles = [] +def urlretrieve(url, filename=None, reporthook=None, data=None): + """ + Retrieve a URL into a temporary location on disk. + + Requires a URL argument. If a filename is passed, it is used as + the temporary file location. The reporthook argument should be + a callable that accepts a block number, a read size, and the + total file size of the URL target. The data argument should be + valid URL encoded data. + + If a filename is passed and the URL points to a local resource, + the result is a copy from local file to new file. + + Returns a tuple containing the path to the newly created + data file as well as the resulting HTTPMessage object. + """ + url_type, path = splittype(url) + + with contextlib.closing(urlopen(url, data)) as fp: + headers = fp.info() + + # Just return the local path and the "headers" for file:// + # URLs. No sense in performing a copy unless requested. + if url_type == "file" and not filename: + return os.path.normpath(path), headers + + # Handle temporary file setup. + if filename: + tfp = open(filename, 'wb') + else: + tfp = tempfile.NamedTemporaryFile(delete=False) + filename = tfp.name + _url_tempfiles.append(filename) + + with tfp: + result = filename, headers + bs = 1024*8 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + + if reporthook: + reporthook(blocknum, bs, size) + + while True: + block = fp.read(bs) + if not block: + break + read += len(block) + tfp.write(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, bs, size) + + if size >= 0 and read < size: + raise ContentTooShortError( + "retrieval incomplete: got only %i out of %i bytes" + % (read, size), result) + + return result + +def urlcleanup(): + for temp_file in _url_tempfiles: + try: + os.unlink(temp_file) + except EnvironmentError: + pass + + del _url_tempfiles[:] + global _opener + if _opener: + _opener = None + +if PY3: + _cut_port_re = re.compile(r":\d+$", re.ASCII) +else: + _cut_port_re = re.compile(r":\d+$") + +def request_host(request): + + """Return request-host, as defined by RFC 2965. + + Variation from RFC: returned value is lowercased, for convenient + comparison. + + """ + url = request.full_url + host = urlparse(url)[1] + if host == "": + host = request.get_header("Host", "") + + # remove port, if present + host = _cut_port_re.sub("", host, 1) + return host.lower() + +class Request(object): + + def __init__(self, url, data=None, headers={}, + origin_req_host=None, unverifiable=False, + method=None): + # unwrap('') --> 'type://host/path' + self.full_url = unwrap(url) + self.full_url, self.fragment = splittag(self.full_url) + self.data = data + self.headers = {} + self._tunnel_host = None + for key, value in headers.items(): + self.add_header(key, value) + self.unredirected_hdrs = {} + if origin_req_host is None: + origin_req_host = request_host(self) + self.origin_req_host = origin_req_host + self.unverifiable = unverifiable + self.method = method + self._parse() + + def _parse(self): + self.type, rest = splittype(self.full_url) + if self.type is None: + raise ValueError("unknown url type: %r" % self.full_url) + self.host, self.selector = splithost(rest) + if self.host: + self.host = unquote(self.host) + + def get_method(self): + """Return a string indicating the HTTP request method.""" + if self.method is not None: + return self.method + elif self.data is not None: + return "POST" + else: + return "GET" + + def get_full_url(self): + if self.fragment: + return '%s#%s' % (self.full_url, self.fragment) + else: + return self.full_url + + # Begin deprecated methods + + def add_data(self, data): + msg = "Request.add_data method is deprecated." + warnings.warn(msg, DeprecationWarning, stacklevel=1) + self.data = data + + def has_data(self): + msg = "Request.has_data method is deprecated." + warnings.warn(msg, DeprecationWarning, stacklevel=1) + return self.data is not None + + def get_data(self): + msg = "Request.get_data method is deprecated." + warnings.warn(msg, DeprecationWarning, stacklevel=1) + return self.data + + def get_type(self): + msg = "Request.get_type method is deprecated." + warnings.warn(msg, DeprecationWarning, stacklevel=1) + return self.type + + def get_host(self): + msg = "Request.get_host method is deprecated." + warnings.warn(msg, DeprecationWarning, stacklevel=1) + return self.host + + def get_selector(self): + msg = "Request.get_selector method is deprecated." + warnings.warn(msg, DeprecationWarning, stacklevel=1) + return self.selector + + def is_unverifiable(self): + msg = "Request.is_unverifiable method is deprecated." + warnings.warn(msg, DeprecationWarning, stacklevel=1) + return self.unverifiable + + def get_origin_req_host(self): + msg = "Request.get_origin_req_host method is deprecated." + warnings.warn(msg, DeprecationWarning, stacklevel=1) + return self.origin_req_host + + # End deprecated methods + + def set_proxy(self, host, type): + if self.type == 'https' and not self._tunnel_host: + self._tunnel_host = self.host + else: + self.type= type + self.selector = self.full_url + self.host = host + + def has_proxy(self): + return self.selector == self.full_url + + def add_header(self, key, val): + # useful for something like authentication + self.headers[key.capitalize()] = val + + def add_unredirected_header(self, key, val): + # will not be added to a redirected request + self.unredirected_hdrs[key.capitalize()] = val + + def has_header(self, header_name): + return (header_name in self.headers or + header_name in self.unredirected_hdrs) + + def get_header(self, header_name, default=None): + return self.headers.get( + header_name, + self.unredirected_hdrs.get(header_name, default)) + + def header_items(self): + hdrs = self.unredirected_hdrs.copy() + hdrs.update(self.headers) + return list(hdrs.items()) + +class OpenerDirector(object): + def __init__(self): + client_version = "Python-urllib/%s" % __version__ + self.addheaders = [('User-agent', client_version)] + # self.handlers is retained only for backward compatibility + self.handlers = [] + # manage the individual handlers + self.handle_open = {} + self.handle_error = {} + self.process_response = {} + self.process_request = {} + + def add_handler(self, handler): + if not hasattr(handler, "add_parent"): + raise TypeError("expected BaseHandler instance, got %r" % + type(handler)) + + added = False + for meth in dir(handler): + if meth in ["redirect_request", "do_open", "proxy_open"]: + # oops, coincidental match + continue + + i = meth.find("_") + protocol = meth[:i] + condition = meth[i+1:] + + if condition.startswith("error"): + j = condition.find("_") + i + 1 + kind = meth[j+1:] + try: + kind = int(kind) + except ValueError: + pass + lookup = self.handle_error.get(protocol, {}) + self.handle_error[protocol] = lookup + elif condition == "open": + kind = protocol + lookup = self.handle_open + elif condition == "response": + kind = protocol + lookup = self.process_response + elif condition == "request": + kind = protocol + lookup = self.process_request + else: + continue + + handlers = lookup.setdefault(kind, []) + if handlers: + bisect.insort(handlers, handler) + else: + handlers.append(handler) + added = True + + if added: + bisect.insort(self.handlers, handler) + handler.add_parent(self) + + def close(self): + # Only exists for backwards compatibility. + pass + + def _call_chain(self, chain, kind, meth_name, *args): + # Handlers raise an exception if no one else should try to handle + # the request, or return None if they can't but another handler + # could. Otherwise, they return the response. + handlers = chain.get(kind, ()) + for handler in handlers: + func = getattr(handler, meth_name) + result = func(*args) + if result is not None: + return result + + def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): + """ + Accept a URL or a Request object + + Python-Future: if the URL is passed as a byte-string, decode it first. + """ + if isinstance(fullurl, bytes): + fullurl = fullurl.decode() + if isinstance(fullurl, str): + req = Request(fullurl, data) + else: + req = fullurl + if data is not None: + req.data = data + + req.timeout = timeout + protocol = req.type + + # pre-process request + meth_name = protocol+"_request" + for processor in self.process_request.get(protocol, []): + meth = getattr(processor, meth_name) + req = meth(req) + + response = self._open(req, data) + + # post-process response + meth_name = protocol+"_response" + for processor in self.process_response.get(protocol, []): + meth = getattr(processor, meth_name) + response = meth(req, response) + + return response + + def _open(self, req, data=None): + result = self._call_chain(self.handle_open, 'default', + 'default_open', req) + if result: + return result + + protocol = req.type + result = self._call_chain(self.handle_open, protocol, protocol + + '_open', req) + if result: + return result + + return self._call_chain(self.handle_open, 'unknown', + 'unknown_open', req) + + def error(self, proto, *args): + if proto in ('http', 'https'): + # XXX http[s] protocols are special-cased + dict = self.handle_error['http'] # https is not different than http + proto = args[2] # YUCK! + meth_name = 'http_error_%s' % proto + http_err = 1 + orig_args = args + else: + dict = self.handle_error + meth_name = proto + '_error' + http_err = 0 + args = (dict, proto, meth_name) + args + result = self._call_chain(*args) + if result: + return result + + if http_err: + args = (dict, 'default', 'http_error_default') + orig_args + return self._call_chain(*args) + +# XXX probably also want an abstract factory that knows when it makes +# sense to skip a superclass in favor of a subclass and when it might +# make sense to include both + +def build_opener(*handlers): + """Create an opener object from a list of handlers. + + The opener will use several default handlers, including support + for HTTP, FTP and when applicable HTTPS. + + If any of the handlers passed as arguments are subclasses of the + default handlers, the default handlers will not be used. + """ + def isclass(obj): + return isinstance(obj, type) or hasattr(obj, "__bases__") + + opener = OpenerDirector() + default_classes = [ProxyHandler, UnknownHandler, HTTPHandler, + HTTPDefaultErrorHandler, HTTPRedirectHandler, + FTPHandler, FileHandler, HTTPErrorProcessor] + if hasattr(http_client, "HTTPSConnection"): + default_classes.append(HTTPSHandler) + skip = set() + for klass in default_classes: + for check in handlers: + if isclass(check): + if issubclass(check, klass): + skip.add(klass) + elif isinstance(check, klass): + skip.add(klass) + for klass in skip: + default_classes.remove(klass) + + for klass in default_classes: + opener.add_handler(klass()) + + for h in handlers: + if isclass(h): + h = h() + opener.add_handler(h) + return opener + +class BaseHandler(object): + handler_order = 500 + + def add_parent(self, parent): + self.parent = parent + + def close(self): + # Only exists for backwards compatibility + pass + + def __lt__(self, other): + if not hasattr(other, "handler_order"): + # Try to preserve the old behavior of having custom classes + # inserted after default ones (works only for custom user + # classes which are not aware of handler_order). + return True + return self.handler_order < other.handler_order + + +class HTTPErrorProcessor(BaseHandler): + """Process HTTP error responses.""" + handler_order = 1000 # after all other processing + + def http_response(self, request, response): + code, msg, hdrs = response.code, response.msg, response.info() + + # According to RFC 2616, "2xx" code indicates that the client's + # request was successfully received, understood, and accepted. + if not (200 <= code < 300): + response = self.parent.error( + 'http', request, response, code, msg, hdrs) + + return response + + https_response = http_response + +class HTTPDefaultErrorHandler(BaseHandler): + def http_error_default(self, req, fp, code, msg, hdrs): + raise HTTPError(req.full_url, code, msg, hdrs, fp) + +class HTTPRedirectHandler(BaseHandler): + # maximum number of redirections to any single URL + # this is needed because of the state that cookies introduce + max_repeats = 4 + # maximum total number of redirections (regardless of URL) before + # assuming we're in a loop + max_redirections = 10 + + def redirect_request(self, req, fp, code, msg, headers, newurl): + """Return a Request or None in response to a redirect. + + This is called by the http_error_30x methods when a + redirection response is received. If a redirection should + take place, return a new Request to allow http_error_30x to + perform the redirect. Otherwise, raise HTTPError if no-one + else should try to handle this url. Return None if you can't + but another Handler might. + """ + m = req.get_method() + if (not (code in (301, 302, 303, 307) and m in ("GET", "HEAD") + or code in (301, 302, 303) and m == "POST")): + raise HTTPError(req.full_url, code, msg, headers, fp) + + # Strictly (according to RFC 2616), 301 or 302 in response to + # a POST MUST NOT cause a redirection without confirmation + # from the user (of urllib.request, in this case). In practice, + # essentially all clients do redirect in this case, so we do + # the same. + # be conciliant with URIs containing a space + newurl = newurl.replace(' ', '%20') + CONTENT_HEADERS = ("content-length", "content-type") + newheaders = dict((k, v) for k, v in req.headers.items() + if k.lower() not in CONTENT_HEADERS) + return Request(newurl, + headers=newheaders, + origin_req_host=req.origin_req_host, + unverifiable=True) + + # Implementation note: To avoid the server sending us into an + # infinite loop, the request object needs to track what URLs we + # have already seen. Do this by adding a handler-specific + # attribute to the Request object. + 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. + if "location" in headers: + newurl = headers["location"] + elif "uri" in headers: + newurl = headers["uri"] + else: + return + + # fix a possible malformed URL + urlparts = urlparse(newurl) + + # For security reasons we don't allow redirection to anything other + # than http, https or ftp. + + if urlparts.scheme not in ('http', 'https', 'ftp', ''): + raise HTTPError( + newurl, code, + "%s - Redirection to url '%s' is not allowed" % (msg, newurl), + headers, fp) + + if not urlparts.path: + urlparts = list(urlparts) + urlparts[2] = "/" + newurl = urlunparse(urlparts) + + newurl = urljoin(req.full_url, newurl) + + # XXX Probably want to forget about the state of the current + # request, although that might interact poorly with other + # handlers that also use handler-specific request attributes + new = self.redirect_request(req, fp, code, msg, headers, newurl) + if new is None: + return + + # loop detection + # .redirect_dict has a key url if url was previously visited. + if hasattr(req, 'redirect_dict'): + visited = new.redirect_dict = req.redirect_dict + if (visited.get(newurl, 0) >= self.max_repeats or + len(visited) >= self.max_redirections): + raise HTTPError(req.full_url, code, + self.inf_msg + msg, headers, fp) + else: + visited = new.redirect_dict = req.redirect_dict = {} + visited[newurl] = visited.get(newurl, 0) + 1 + + # Don't close the fp until we are sure that we won't use it + # with HTTPError. + fp.read() + fp.close() + + return self.parent.open(new, timeout=req.timeout) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + + inf_msg = "The HTTP server returned a redirect error that would " \ + "lead to an infinite loop.\n" \ + "The last 30x error message was:\n" + + +def _parse_proxy(proxy): + """Return (scheme, user, password, host/port) given a URL or an authority. + + If a URL is supplied, it must have an authority (host:port) component. + According to RFC 3986, having an authority component means the URL must + have two slashes after the scheme: + + >>> _parse_proxy('file:/ftp.example.com/') + Traceback (most recent call last): + ValueError: proxy URL with no authority: 'file:/ftp.example.com/' + + The first three items of the returned tuple may be None. + + Examples of authority parsing: + + >>> _parse_proxy('proxy.example.com') + (None, None, None, 'proxy.example.com') + >>> _parse_proxy('proxy.example.com:3128') + (None, None, None, 'proxy.example.com:3128') + + The authority component may optionally include userinfo (assumed to be + username:password): + + >>> _parse_proxy('joe:password@proxy.example.com') + (None, 'joe', 'password', 'proxy.example.com') + >>> _parse_proxy('joe:password@proxy.example.com:3128') + (None, 'joe', 'password', 'proxy.example.com:3128') + + Same examples, but with URLs instead: + + >>> _parse_proxy('http://proxy.example.com/') + ('http', None, None, 'proxy.example.com') + >>> _parse_proxy('http://proxy.example.com:3128/') + ('http', None, None, 'proxy.example.com:3128') + >>> _parse_proxy('http://joe:password@proxy.example.com/') + ('http', 'joe', 'password', 'proxy.example.com') + >>> _parse_proxy('http://joe:password@proxy.example.com:3128') + ('http', 'joe', 'password', 'proxy.example.com:3128') + + Everything after the authority is ignored: + + >>> _parse_proxy('ftp://joe:password@proxy.example.com/rubbish:3128') + ('ftp', 'joe', 'password', 'proxy.example.com') + + Test for no trailing '/' case: + + >>> _parse_proxy('http://joe:password@proxy.example.com') + ('http', 'joe', 'password', 'proxy.example.com') + + """ + scheme, r_scheme = splittype(proxy) + if not r_scheme.startswith("/"): + # authority + scheme = None + authority = proxy + else: + # URL + if not r_scheme.startswith("//"): + raise ValueError("proxy URL with no authority: %r" % proxy) + # We have an authority, so for RFC 3986-compliant URLs (by ss 3. + # and 3.3.), path is empty or starts with '/' + end = r_scheme.find("/", 2) + if end == -1: + end = None + authority = r_scheme[2:end] + userinfo, hostport = splituser(authority) + if userinfo is not None: + user, password = splitpasswd(userinfo) + else: + user = password = None + return scheme, user, password, hostport + +class ProxyHandler(BaseHandler): + # Proxies must be in front + handler_order = 100 + + def __init__(self, proxies=None): + if proxies is None: + proxies = getproxies() + assert hasattr(proxies, 'keys'), "proxies must be a mapping" + self.proxies = proxies + for type, url in proxies.items(): + setattr(self, '%s_open' % type, + lambda r, proxy=url, type=type, meth=self.proxy_open: + meth(r, proxy, type)) + + def proxy_open(self, req, proxy, type): + orig_type = req.type + proxy_type, user, password, hostport = _parse_proxy(proxy) + if proxy_type is None: + proxy_type = orig_type + + if req.host and proxy_bypass(req.host): + return None + + if user and password: + user_pass = '%s:%s' % (unquote(user), + unquote(password)) + creds = base64.b64encode(user_pass.encode()).decode("ascii") + req.add_header('Proxy-authorization', 'Basic ' + creds) + hostport = unquote(hostport) + req.set_proxy(hostport, proxy_type) + if orig_type == proxy_type or orig_type == 'https': + # let other handlers take care of it + return None + else: + # need to start over, because the other handlers don't + # grok the proxy's URL type + # e.g. if we have a constructor arg proxies like so: + # {'http': 'ftp://proxy.example.com'}, we may end up turning + # a request for http://acme.example.com/a into one for + # ftp://proxy.example.com/a + return self.parent.open(req, timeout=req.timeout) + +class HTTPPasswordMgr(object): + + def __init__(self): + self.passwd = {} + + def add_password(self, realm, uri, user, passwd): + # uri could be a single URI or a sequence + if isinstance(uri, str): + uri = [uri] + if realm not in self.passwd: + self.passwd[realm] = {} + for default_port in True, False: + reduced_uri = tuple( + [self.reduce_uri(u, default_port) for u in uri]) + self.passwd[realm][reduced_uri] = (user, passwd) + + def find_user_password(self, realm, authuri): + domains = self.passwd.get(realm, {}) + for default_port in True, False: + reduced_authuri = self.reduce_uri(authuri, default_port) + for uris, authinfo in domains.items(): + for uri in uris: + if self.is_suburi(uri, reduced_authuri): + return authinfo + return None, None + + def reduce_uri(self, uri, default_port=True): + """Accept authority or URI and extract only the authority and path.""" + # note HTTP URLs do not have a userinfo component + parts = urlsplit(uri) + if parts[1]: + # URI + scheme = parts[0] + authority = parts[1] + path = parts[2] or '/' + else: + # host or host:port + scheme = None + authority = uri + path = '/' + host, port = splitport(authority) + if default_port and port is None and scheme is not None: + dport = {"http": 80, + "https": 443, + }.get(scheme) + if dport is not None: + authority = "%s:%d" % (host, dport) + return authority, path + + def is_suburi(self, base, test): + """Check if test is below base in a URI tree + + Both args must be URIs in reduced form. + """ + if base == test: + return True + if base[0] != test[0]: + return False + common = posixpath.commonprefix((base[1], test[1])) + if len(common) == len(base[1]): + return True + return False + + +class HTTPPasswordMgrWithDefaultRealm(HTTPPasswordMgr): + + def find_user_password(self, realm, authuri): + user, password = HTTPPasswordMgr.find_user_password(self, realm, + authuri) + if user is not None: + return user, password + return HTTPPasswordMgr.find_user_password(self, None, authuri) + + +class AbstractBasicAuthHandler(object): + + # XXX this allows for multiple auth-schemes, but will stupidly pick + # the last one with a realm specified. + + # allow for double- and single-quoted realm values + # (single quotes are a violation of the RFC, but appear in the wild) + rx = re.compile('(?:.*,)*[ \t]*([^ \t]+)[ \t]+' + 'realm=(["\']?)([^"\']*)\\2', re.I) + + # XXX could pre-emptively send auth info already accepted (RFC 2617, + # end of section 2, and section 1.2 immediately after "credentials" + # production). + + def __init__(self, password_mgr=None): + if password_mgr is None: + password_mgr = HTTPPasswordMgr() + self.passwd = password_mgr + self.add_password = self.passwd.add_password + self.retried = 0 + + def reset_retry_count(self): + self.retried = 0 + + def http_error_auth_reqed(self, authreq, host, req, headers): + # host may be an authority (without userinfo) or a URL with an + # authority + # XXX could be multiple headers + authreq = headers.get(authreq, None) + + if self.retried > 5: + # retry sending the username:password 5 times before failing. + raise HTTPError(req.get_full_url(), 401, "basic auth failed", + headers, None) + else: + self.retried += 1 + + if authreq: + scheme = authreq.split()[0] + if scheme.lower() != 'basic': + raise ValueError("AbstractBasicAuthHandler does not" + " support the following scheme: '%s'" % + scheme) + else: + mo = AbstractBasicAuthHandler.rx.search(authreq) + if mo: + scheme, quote, realm = mo.groups() + if quote not in ['"',"'"]: + warnings.warn("Basic Auth Realm was unquoted", + UserWarning, 2) + if scheme.lower() == 'basic': + response = self.retry_http_basic_auth(host, req, realm) + if response and response.code != 401: + self.retried = 0 + return response + + def retry_http_basic_auth(self, host, req, realm): + user, pw = self.passwd.find_user_password(realm, host) + if pw is not None: + raw = "%s:%s" % (user, pw) + auth = "Basic " + base64.b64encode(raw.encode()).decode("ascii") + if req.headers.get(self.auth_header, None) == auth: + return None + req.add_unredirected_header(self.auth_header, auth) + return self.parent.open(req, timeout=req.timeout) + else: + return None + + +class HTTPBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler): + + auth_header = 'Authorization' + + def http_error_401(self, req, fp, code, msg, headers): + url = req.full_url + response = self.http_error_auth_reqed('www-authenticate', + url, req, headers) + self.reset_retry_count() + return response + + +class ProxyBasicAuthHandler(AbstractBasicAuthHandler, BaseHandler): + + auth_header = 'Proxy-authorization' + + def http_error_407(self, req, fp, code, msg, headers): + # http_error_auth_reqed requires that there is no userinfo component in + # authority. Assume there isn't one, since urllib.request does not (and + # should not, RFC 3986 s. 3.2.1) support requests for URLs containing + # userinfo. + authority = req.host + response = self.http_error_auth_reqed('proxy-authenticate', + authority, req, headers) + self.reset_retry_count() + return response + + +# Return n random bytes. +_randombytes = os.urandom + + +class AbstractDigestAuthHandler(object): + # Digest authentication is specified in RFC 2617. + + # XXX The client does not inspect the Authentication-Info header + # in a successful response. + + # XXX It should be possible to test this implementation against + # a mock server that just generates a static set of challenges. + + # XXX qop="auth-int" supports is shaky + + def __init__(self, passwd=None): + if passwd is None: + passwd = HTTPPasswordMgr() + self.passwd = passwd + self.add_password = self.passwd.add_password + self.retried = 0 + self.nonce_count = 0 + self.last_nonce = None + + def reset_retry_count(self): + self.retried = 0 + + def http_error_auth_reqed(self, auth_header, host, req, headers): + authreq = headers.get(auth_header, None) + if self.retried > 5: + # Don't fail endlessly - if we failed once, we'll probably + # fail a second time. Hm. Unless the Password Manager is + # prompting for the information. Crap. This isn't great + # but it's better than the current 'repeat until recursion + # depth exceeded' approach + raise HTTPError(req.full_url, 401, "digest auth failed", + headers, None) + else: + self.retried += 1 + if authreq: + scheme = authreq.split()[0] + if scheme.lower() == 'digest': + return self.retry_http_digest_auth(req, authreq) + elif scheme.lower() != 'basic': + raise ValueError("AbstractDigestAuthHandler does not support" + " the following scheme: '%s'" % scheme) + + def retry_http_digest_auth(self, req, auth): + token, challenge = auth.split(' ', 1) + chal = parse_keqv_list(filter(None, parse_http_list(challenge))) + auth = self.get_authorization(req, chal) + if auth: + auth_val = 'Digest %s' % auth + if req.headers.get(self.auth_header, None) == auth_val: + return None + req.add_unredirected_header(self.auth_header, auth_val) + resp = self.parent.open(req, timeout=req.timeout) + return resp + + def get_cnonce(self, nonce): + # The cnonce-value is an opaque + # quoted string value provided by the client and used by both client + # and server to avoid chosen plaintext attacks, to provide mutual + # authentication, and to provide some message integrity protection. + # This isn't a fabulous effort, but it's probably Good Enough. + s = "%s:%s:%s:" % (self.nonce_count, nonce, time.ctime()) + b = s.encode("ascii") + _randombytes(8) + dig = hashlib.sha1(b).hexdigest() + return dig[:16] + + def get_authorization(self, req, chal): + try: + realm = chal['realm'] + nonce = chal['nonce'] + qop = chal.get('qop') + algorithm = chal.get('algorithm', 'MD5') + # mod_digest doesn't send an opaque, even though it isn't + # supposed to be optional + opaque = chal.get('opaque', None) + except KeyError: + return None + + H, KD = self.get_algorithm_impls(algorithm) + if H is None: + return None + + user, pw = self.passwd.find_user_password(realm, req.full_url) + if user is None: + return None + + # XXX not implemented yet + if req.data is not None: + entdig = self.get_entity_digest(req.data, chal) + else: + entdig = None + + A1 = "%s:%s:%s" % (user, realm, pw) + A2 = "%s:%s" % (req.get_method(), + # XXX selector: what about proxies and full urls + req.selector) + if qop == 'auth': + if nonce == self.last_nonce: + self.nonce_count += 1 + else: + self.nonce_count = 1 + self.last_nonce = nonce + ncvalue = '%08x' % self.nonce_count + cnonce = self.get_cnonce(nonce) + noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, H(A2)) + respdig = KD(H(A1), noncebit) + elif qop is None: + respdig = KD(H(A1), "%s:%s" % (nonce, H(A2))) + else: + # XXX handle auth-int. + raise URLError("qop '%s' is not supported." % qop) + + # XXX should the partial digests be encoded too? + + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (user, realm, nonce, req.selector, + respdig) + if opaque: + base += ', opaque="%s"' % opaque + if entdig: + base += ', digest="%s"' % entdig + base += ', algorithm="%s"' % algorithm + if qop: + base += ', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce) + return base + + def get_algorithm_impls(self, algorithm): + # lambdas assume digest modules are imported at the top level + if algorithm == 'MD5': + H = lambda x: hashlib.md5(x.encode("ascii")).hexdigest() + elif algorithm == 'SHA': + H = lambda x: hashlib.sha1(x.encode("ascii")).hexdigest() + # XXX MD5-sess + KD = lambda s, d: H("%s:%s" % (s, d)) + return H, KD + + def get_entity_digest(self, data, chal): + # XXX not implemented yet + return None + + +class HTTPDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler): + """An authentication protocol defined by RFC 2069 + + Digest authentication improves on basic authentication because it + does not transmit passwords in the clear. + """ + + auth_header = 'Authorization' + handler_order = 490 # before Basic auth + + def http_error_401(self, req, fp, code, msg, headers): + host = urlparse(req.full_url)[1] + retry = self.http_error_auth_reqed('www-authenticate', + host, req, headers) + self.reset_retry_count() + return retry + + +class ProxyDigestAuthHandler(BaseHandler, AbstractDigestAuthHandler): + + auth_header = 'Proxy-Authorization' + handler_order = 490 # before Basic auth + + def http_error_407(self, req, fp, code, msg, headers): + host = req.host + retry = self.http_error_auth_reqed('proxy-authenticate', + host, req, headers) + self.reset_retry_count() + return retry + +class AbstractHTTPHandler(BaseHandler): + + def __init__(self, debuglevel=0): + self._debuglevel = debuglevel + + def set_http_debuglevel(self, level): + self._debuglevel = level + + def do_request_(self, request): + host = request.host + if not host: + raise URLError('no host given') + + if request.data is not None: # POST + data = request.data + if isinstance(data, str): + msg = "POST data should be bytes or an iterable of bytes. " \ + "It cannot be of type str." + raise TypeError(msg) + if not request.has_header('Content-type'): + request.add_unredirected_header( + 'Content-type', + 'application/x-www-form-urlencoded') + if not request.has_header('Content-length'): + size = None + try: + ### For Python-Future: + if PY2 and isinstance(data, array.array): + # memoryviews of arrays aren't supported + # in Py2.7. (e.g. memoryview(array.array('I', + # [1, 2, 3, 4])) raises a TypeError.) + # So we calculate the size manually instead: + size = len(data) * data.itemsize + ### + else: + mv = memoryview(data) + size = len(mv) * mv.itemsize + except TypeError: + if isinstance(data, Iterable): + raise ValueError("Content-Length should be specified " + "for iterable data of type %r %r" % (type(data), + data)) + else: + request.add_unredirected_header( + 'Content-length', '%d' % size) + + sel_host = host + if request.has_proxy(): + scheme, sel = splittype(request.selector) + sel_host, sel_path = splithost(sel) + if not request.has_header('Host'): + request.add_unredirected_header('Host', sel_host) + for name, value in self.parent.addheaders: + name = name.capitalize() + if not request.has_header(name): + request.add_unredirected_header(name, value) + + return request + + def do_open(self, http_class, req, **http_conn_args): + """Return an HTTPResponse object for the request, using http_class. + + http_class must implement the HTTPConnection API from http.client. + """ + host = req.host + if not host: + raise URLError('no host given') + + # will parse host:port + h = http_class(host, timeout=req.timeout, **http_conn_args) + + headers = dict(req.unredirected_hdrs) + headers.update(dict((k, v) for k, v in req.headers.items() + if k not in headers)) + + # TODO(jhylton): Should this be redesigned to handle + # persistent connections? + + # We want to make an HTTP/1.1 request, but the addinfourl + # class isn't prepared to deal with a persistent connection. + # It will try to read all remaining data from the socket, + # which will block while the server waits for the next request. + # So make sure the connection gets closed after the (only) + # request. + headers["Connection"] = "close" + headers = dict((name.title(), val) for name, val in headers.items()) + + if req._tunnel_host: + tunnel_headers = {} + proxy_auth_hdr = "Proxy-Authorization" + if proxy_auth_hdr in headers: + tunnel_headers[proxy_auth_hdr] = headers[proxy_auth_hdr] + # Proxy-Authorization should not be sent to origin + # server. + del headers[proxy_auth_hdr] + h.set_tunnel(req._tunnel_host, headers=tunnel_headers) + + try: + h.request(req.get_method(), req.selector, req.data, headers) + except socket.error as err: # timeout error + h.close() + raise URLError(err) + else: + r = h.getresponse() + # If the server does not send us a 'Connection: close' header, + # HTTPConnection assumes the socket should be left open. Manually + # mark the socket to be closed when this response object goes away. + if h.sock: + h.sock.close() + h.sock = None + + + r.url = req.get_full_url() + # This line replaces the .msg attribute of the HTTPResponse + # with .headers, because urllib clients expect the response to + # have the reason in .msg. It would be good to mark this + # attribute is deprecated and get then to use info() or + # .headers. + r.msg = r.reason + return r + + +class HTTPHandler(AbstractHTTPHandler): + + def http_open(self, req): + return self.do_open(http_client.HTTPConnection, req) + + http_request = AbstractHTTPHandler.do_request_ + +if hasattr(http_client, 'HTTPSConnection'): + + class HTTPSHandler(AbstractHTTPHandler): + + def __init__(self, debuglevel=0, context=None, check_hostname=None): + AbstractHTTPHandler.__init__(self, debuglevel) + self._context = context + self._check_hostname = check_hostname + + def https_open(self, req): + return self.do_open(http_client.HTTPSConnection, req, + context=self._context, check_hostname=self._check_hostname) + + https_request = AbstractHTTPHandler.do_request_ + + __all__.append('HTTPSHandler') + +class HTTPCookieProcessor(BaseHandler): + def __init__(self, cookiejar=None): + import future.backports.http.cookiejar as http_cookiejar + if cookiejar is None: + cookiejar = http_cookiejar.CookieJar() + self.cookiejar = cookiejar + + def http_request(self, request): + self.cookiejar.add_cookie_header(request) + return request + + def http_response(self, request, response): + self.cookiejar.extract_cookies(response, request) + return response + + https_request = http_request + https_response = http_response + +class UnknownHandler(BaseHandler): + def unknown_open(self, req): + type = req.type + raise URLError('unknown url type: %s' % type) + +def parse_keqv_list(l): + """Parse list of key=value strings where keys are not duplicated.""" + parsed = {} + for elt in l: + k, v = elt.split('=', 1) + if v[0] == '"' and v[-1] == '"': + v = v[1:-1] + parsed[k] = v + return parsed + +def parse_http_list(s): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Neither commas nor quotes count if they are escaped. + Only double-quotes count, not single-quotes. + """ + res = [] + part = '' + + escape = quote = False + for cur in s: + if escape: + part += cur + escape = False + continue + if quote: + if cur == '\\': + escape = True + continue + elif cur == '"': + quote = False + part += cur + continue + + if cur == ',': + res.append(part) + part = '' + continue + + if cur == '"': + quote = True + + part += cur + + # append last part + if part: + res.append(part) + + return [part.strip() for part in res] + +class FileHandler(BaseHandler): + # Use local file or FTP depending on form of URL + def file_open(self, req): + url = req.selector + if url[:2] == '//' and url[2:3] != '/' and (req.host and + req.host != 'localhost'): + if not req.host is self.get_names(): + raise URLError("file:// scheme is supported only on localhost") + else: + return self.open_local_file(req) + + # names for the localhost + names = None + def get_names(self): + if FileHandler.names is None: + try: + FileHandler.names = tuple( + socket.gethostbyname_ex('localhost')[2] + + socket.gethostbyname_ex(socket.gethostname())[2]) + except socket.gaierror: + FileHandler.names = (socket.gethostbyname('localhost'),) + return FileHandler.names + + # not entirely sure what the rules are here + def open_local_file(self, req): + import future.backports.email.utils as email_utils + import mimetypes + host = req.host + filename = req.selector + localfile = url2pathname(filename) + try: + stats = os.stat(localfile) + size = stats.st_size + modified = email_utils.formatdate(stats.st_mtime, usegmt=True) + mtype = mimetypes.guess_type(filename)[0] + headers = email.message_from_string( + 'Content-type: %s\nContent-length: %d\nLast-modified: %s\n' % + (mtype or 'text/plain', size, modified)) + if host: + host, port = splitport(host) + if not host or \ + (not port and _safe_gethostbyname(host) in self.get_names()): + if host: + origurl = 'file://' + host + filename + else: + origurl = 'file://' + filename + return addinfourl(open(localfile, 'rb'), headers, origurl) + except OSError as exp: + # users shouldn't expect OSErrors coming from urlopen() + raise URLError(exp) + raise URLError('file not on local host') + +def _safe_gethostbyname(host): + try: + return socket.gethostbyname(host) + except socket.gaierror: + return None + +class FTPHandler(BaseHandler): + def ftp_open(self, req): + import ftplib + import mimetypes + host = req.host + if not host: + raise URLError('ftp error: no host given') + host, port = splitport(host) + if port is None: + port = ftplib.FTP_PORT + else: + port = int(port) + + # username/password handling + user, host = splituser(host) + if user: + user, passwd = splitpasswd(user) + else: + passwd = None + host = unquote(host) + user = user or '' + passwd = passwd or '' + + try: + host = socket.gethostbyname(host) + except socket.error as msg: + raise URLError(msg) + path, attrs = splitattr(req.selector) + dirs = path.split('/') + dirs = list(map(unquote, dirs)) + dirs, file = dirs[:-1], dirs[-1] + if dirs and not dirs[0]: + dirs = dirs[1:] + try: + fw = self.connect_ftp(user, passwd, host, port, dirs, req.timeout) + type = file and 'I' or 'D' + for attr in attrs: + attr, value = splitvalue(attr) + if attr.lower() == 'type' and \ + value in ('a', 'A', 'i', 'I', 'd', 'D'): + type = value.upper() + fp, retrlen = fw.retrfile(file, type) + headers = "" + mtype = mimetypes.guess_type(req.full_url)[0] + if mtype: + headers += "Content-type: %s\n" % mtype + if retrlen is not None and retrlen >= 0: + headers += "Content-length: %d\n" % retrlen + headers = email.message_from_string(headers) + return addinfourl(fp, headers, req.full_url) + except ftplib.all_errors as exp: + exc = URLError('ftp error: %r' % exp) + raise_with_traceback(exc) + + def connect_ftp(self, user, passwd, host, port, dirs, timeout): + return ftpwrapper(user, passwd, host, port, dirs, timeout, + persistent=False) + +class CacheFTPHandler(FTPHandler): + # XXX would be nice to have pluggable cache strategies + # XXX this stuff is definitely not thread safe + def __init__(self): + self.cache = {} + self.timeout = {} + self.soonest = 0 + self.delay = 60 + self.max_conns = 16 + + def setTimeout(self, t): + self.delay = t + + def setMaxConns(self, m): + self.max_conns = m + + def connect_ftp(self, user, passwd, host, port, dirs, timeout): + key = user, host, port, '/'.join(dirs), timeout + if key in self.cache: + self.timeout[key] = time.time() + self.delay + else: + self.cache[key] = ftpwrapper(user, passwd, host, port, + dirs, timeout) + self.timeout[key] = time.time() + self.delay + self.check_cache() + return self.cache[key] + + def check_cache(self): + # first check for old ones + t = time.time() + if self.soonest <= t: + for k, v in list(self.timeout.items()): + if v < t: + self.cache[k].close() + del self.cache[k] + del self.timeout[k] + self.soonest = min(list(self.timeout.values())) + + # then check the size + if len(self.cache) == self.max_conns: + for k, v in list(self.timeout.items()): + if v == self.soonest: + del self.cache[k] + del self.timeout[k] + break + self.soonest = min(list(self.timeout.values())) + + def clear_cache(self): + for conn in self.cache.values(): + conn.close() + self.cache.clear() + self.timeout.clear() + + +# Code move from the old urllib module + +MAXFTPCACHE = 10 # Trim the ftp cache beyond this size + +# Helper for non-unix systems +if os.name == 'nt': + from nturl2path import url2pathname, pathname2url +else: + def url2pathname(pathname): + """OS-specific conversion from a relative URL of the 'file' scheme + to a file system path; not recommended for general use.""" + return unquote(pathname) + + def pathname2url(pathname): + """OS-specific conversion from a file system path to a relative URL + of the 'file' scheme; not recommended for general use.""" + return quote(pathname) + +# This really consists of two pieces: +# (1) a class which handles opening of all sorts of URLs +# (plus assorted utilities etc.) +# (2) a set of functions for parsing URLs +# XXX Should these be separated out into different modules? + + +ftpcache = {} +class URLopener(object): + """Class to open URLs. + This is a class rather than just a subroutine because we may need + more than one set of global protocol-specific options. + Note -- this is a base class for those who don't want the + automatic handling of errors type 302 (relocated) and 401 + (authorization needed).""" + + __tempfiles = None + + version = "Python-urllib/%s" % __version__ + + # Constructor + def __init__(self, proxies=None, **x509): + msg = "%(class)s style of invoking requests is deprecated. " \ + "Use newer urlopen functions/methods" % {'class': self.__class__.__name__} + warnings.warn(msg, DeprecationWarning, stacklevel=3) + if proxies is None: + proxies = getproxies() + assert hasattr(proxies, 'keys'), "proxies must be a mapping" + self.proxies = proxies + self.key_file = x509.get('key_file') + self.cert_file = x509.get('cert_file') + self.addheaders = [('User-Agent', self.version)] + self.__tempfiles = [] + self.__unlink = os.unlink # See cleanup() + self.tempcache = None + # Undocumented feature: if you assign {} to tempcache, + # it is used to cache files retrieved with + # self.retrieve(). This is not enabled by default + # since it does not work for changing documents (and I + # haven't got the logic to check expiration headers + # yet). + self.ftpcache = ftpcache + # Undocumented feature: you can use a different + # ftp cache by assigning to the .ftpcache member; + # in case you want logically independent URL openers + # XXX This is not threadsafe. Bah. + + def __del__(self): + self.close() + + def close(self): + self.cleanup() + + def cleanup(self): + # This code sometimes runs when the rest of this module + # has already been deleted, so it can't use any globals + # or import anything. + if self.__tempfiles: + for file in self.__tempfiles: + try: + self.__unlink(file) + except OSError: + pass + del self.__tempfiles[:] + if self.tempcache: + self.tempcache.clear() + + def addheader(self, *args): + """Add a header to be used by the HTTP interface only + e.g. u.addheader('Accept', 'sound/basic')""" + self.addheaders.append(args) + + # External interface + def open(self, fullurl, data=None): + """Use URLopener().open(file) instead of open(file, 'r').""" + fullurl = unwrap(to_bytes(fullurl)) + fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]|") + if self.tempcache and fullurl in self.tempcache: + filename, headers = self.tempcache[fullurl] + fp = open(filename, 'rb') + return addinfourl(fp, headers, fullurl) + urltype, url = splittype(fullurl) + if not urltype: + urltype = 'file' + if urltype in self.proxies: + proxy = self.proxies[urltype] + urltype, proxyhost = splittype(proxy) + host, selector = splithost(proxyhost) + url = (host, fullurl) # Signal special case to open_*() + else: + proxy = None + name = 'open_' + urltype + self.type = urltype + name = name.replace('-', '_') + if not hasattr(self, name): + if proxy: + return self.open_unknown_proxy(proxy, fullurl, data) + else: + return self.open_unknown(fullurl, data) + try: + if data is None: + return getattr(self, name)(url) + else: + return getattr(self, name)(url, data) + except HTTPError: + raise + except socket.error as msg: + raise_with_traceback(IOError('socket error', msg)) + + def open_unknown(self, fullurl, data=None): + """Overridable interface to open unknown URL type.""" + type, url = splittype(fullurl) + raise IOError('url error', 'unknown url type', type) + + def open_unknown_proxy(self, proxy, fullurl, data=None): + """Overridable interface to open unknown URL type.""" + type, url = splittype(fullurl) + raise IOError('url error', 'invalid proxy for %s' % type, proxy) + + # External interface + def retrieve(self, url, filename=None, reporthook=None, data=None): + """retrieve(url) returns (filename, headers) for a local object + or (tempfilename, headers) for a remote object.""" + url = unwrap(to_bytes(url)) + if self.tempcache and url in self.tempcache: + return self.tempcache[url] + type, url1 = splittype(url) + if filename is None and (not type or type == 'file'): + try: + fp = self.open_local_file(url1) + hdrs = fp.info() + fp.close() + return url2pathname(splithost(url1)[1]), hdrs + except IOError as msg: + pass + fp = self.open(url, data) + try: + headers = fp.info() + if filename: + tfp = open(filename, 'wb') + else: + import tempfile + garbage, path = splittype(url) + garbage, path = splithost(path or "") + path, garbage = splitquery(path or "") + path, garbage = splitattr(path or "") + suffix = os.path.splitext(path)[1] + (fd, filename) = tempfile.mkstemp(suffix) + self.__tempfiles.append(filename) + tfp = os.fdopen(fd, 'wb') + try: + result = filename, headers + if self.tempcache is not None: + self.tempcache[url] = result + bs = 1024*8 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, bs, size) + while 1: + block = fp.read(bs) + if not block: + break + read += len(block) + tfp.write(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, bs, size) + finally: + tfp.close() + finally: + fp.close() + + # raise exception if actual size does not match content-length header + if size >= 0 and read < size: + raise ContentTooShortError( + "retrieval incomplete: got only %i out of %i bytes" + % (read, size), result) + + return result + + # Each method named open_ knows how to open that type of URL + + def _open_generic_http(self, connection_factory, url, data): + """Make an HTTP connection using connection_class. + + This is an internal method that should be called from + open_http() or open_https(). + + Arguments: + - connection_factory should take a host name and return an + HTTPConnection instance. + - url is the url to retrieval or a host, relative-path pair. + - data is payload for a POST request or None. + """ + + user_passwd = None + proxy_passwd= None + if isinstance(url, str): + host, selector = splithost(url) + if host: + user_passwd, host = splituser(host) + host = unquote(host) + realhost = host + else: + host, selector = url + # check whether the proxy contains authorization information + proxy_passwd, host = splituser(host) + # now we proceed with the url we want to obtain + urltype, rest = splittype(selector) + url = rest + user_passwd = None + if urltype.lower() != 'http': + realhost = None + else: + realhost, rest = splithost(rest) + if realhost: + user_passwd, realhost = splituser(realhost) + if user_passwd: + selector = "%s://%s%s" % (urltype, realhost, rest) + if proxy_bypass(realhost): + host = realhost + + if not host: raise IOError('http error', 'no host given') + + if proxy_passwd: + proxy_passwd = unquote(proxy_passwd) + proxy_auth = base64.b64encode(proxy_passwd.encode()).decode('ascii') + else: + proxy_auth = None + + if user_passwd: + user_passwd = unquote(user_passwd) + auth = base64.b64encode(user_passwd.encode()).decode('ascii') + else: + auth = None + http_conn = connection_factory(host) + headers = {} + if proxy_auth: + headers["Proxy-Authorization"] = "Basic %s" % proxy_auth + if auth: + headers["Authorization"] = "Basic %s" % auth + if realhost: + headers["Host"] = realhost + + # Add Connection:close as we don't support persistent connections yet. + # This helps in closing the socket and avoiding ResourceWarning + + headers["Connection"] = "close" + + for header, value in self.addheaders: + headers[header] = value + + if data is not None: + headers["Content-Type"] = "application/x-www-form-urlencoded" + http_conn.request("POST", selector, data, headers) + else: + http_conn.request("GET", selector, headers=headers) + + try: + response = http_conn.getresponse() + except http_client.BadStatusLine: + # something went wrong with the HTTP status line + raise URLError("http protocol error: bad status line") + + # According to RFC 2616, "2xx" code indicates that the client's + # request was successfully received, understood, and accepted. + if 200 <= response.status < 300: + return addinfourl(response, response.msg, "http:" + url, + response.status) + else: + return self.http_error( + url, response.fp, + response.status, response.reason, response.msg, data) + + def open_http(self, url, data=None): + """Use HTTP protocol.""" + return self._open_generic_http(http_client.HTTPConnection, url, data) + + def http_error(self, url, fp, errcode, errmsg, headers, data=None): + """Handle http errors. + + Derived class can override this, or provide specific handlers + named http_error_DDD where DDD is the 3-digit error code.""" + # First check if there's a specific handler for this error + name = 'http_error_%d' % errcode + if hasattr(self, name): + method = getattr(self, name) + if data is None: + result = method(url, fp, errcode, errmsg, headers) + else: + result = method(url, fp, errcode, errmsg, headers, data) + if result: return result + return self.http_error_default(url, fp, errcode, errmsg, headers) + + def http_error_default(self, url, fp, errcode, errmsg, headers): + """Default error handler: close the connection and raise IOError.""" + fp.close() + raise HTTPError(url, errcode, errmsg, headers, None) + + if _have_ssl: + def _https_connection(self, host): + return http_client.HTTPSConnection(host, + key_file=self.key_file, + cert_file=self.cert_file) + + def open_https(self, url, data=None): + """Use HTTPS protocol.""" + return self._open_generic_http(self._https_connection, url, data) + + def open_file(self, url): + """Use local file or FTP depending on form of URL.""" + if not isinstance(url, str): + raise URLError('file error: proxy support for file protocol currently not implemented') + if url[:2] == '//' and url[2:3] != '/' and url[2:12].lower() != 'localhost/': + raise ValueError("file:// scheme is supported only on localhost") + else: + return self.open_local_file(url) + + def open_local_file(self, url): + """Use local file.""" + import future.backports.email.utils as email_utils + import mimetypes + host, file = splithost(url) + localname = url2pathname(file) + try: + stats = os.stat(localname) + except OSError as e: + raise URLError(e.strerror, e.filename) + size = stats.st_size + modified = email_utils.formatdate(stats.st_mtime, usegmt=True) + mtype = mimetypes.guess_type(url)[0] + headers = email.message_from_string( + 'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' % + (mtype or 'text/plain', size, modified)) + if not host: + urlfile = file + if file[:1] == '/': + urlfile = 'file://' + file + return addinfourl(open(localname, 'rb'), headers, urlfile) + host, port = splitport(host) + if (not port + and socket.gethostbyname(host) in ((localhost(),) + thishost())): + urlfile = file + if file[:1] == '/': + urlfile = 'file://' + file + elif file[:2] == './': + raise ValueError("local file url may start with / or file:. Unknown url of type: %s" % url) + return addinfourl(open(localname, 'rb'), headers, urlfile) + raise URLError('local file error: not on local host') + + def open_ftp(self, url): + """Use FTP protocol.""" + if not isinstance(url, str): + raise URLError('ftp error: proxy support for ftp protocol currently not implemented') + import mimetypes + host, path = splithost(url) + if not host: raise URLError('ftp error: no host given') + host, port = splitport(host) + user, host = splituser(host) + if user: user, passwd = splitpasswd(user) + else: passwd = None + host = unquote(host) + user = unquote(user or '') + passwd = unquote(passwd or '') + host = socket.gethostbyname(host) + if not port: + import ftplib + port = ftplib.FTP_PORT + else: + port = int(port) + path, attrs = splitattr(path) + path = unquote(path) + dirs = path.split('/') + dirs, file = dirs[:-1], dirs[-1] + if dirs and not dirs[0]: dirs = dirs[1:] + if dirs and not dirs[0]: dirs[0] = '/' + key = user, host, port, '/'.join(dirs) + # XXX thread unsafe! + if len(self.ftpcache) > MAXFTPCACHE: + # Prune the cache, rather arbitrarily + for k in self.ftpcache.keys(): + if k != key: + v = self.ftpcache[k] + del self.ftpcache[k] + v.close() + try: + if key not in self.ftpcache: + self.ftpcache[key] = \ + ftpwrapper(user, passwd, host, port, dirs) + if not file: type = 'D' + else: type = 'I' + for attr in attrs: + attr, value = splitvalue(attr) + if attr.lower() == 'type' and \ + value in ('a', 'A', 'i', 'I', 'd', 'D'): + type = value.upper() + (fp, retrlen) = self.ftpcache[key].retrfile(file, type) + mtype = mimetypes.guess_type("ftp:" + url)[0] + headers = "" + if mtype: + headers += "Content-Type: %s\n" % mtype + if retrlen is not None and retrlen >= 0: + headers += "Content-Length: %d\n" % retrlen + headers = email.message_from_string(headers) + return addinfourl(fp, headers, "ftp:" + url) + except ftperrors() as exp: + raise_with_traceback(URLError('ftp error %r' % exp)) + + def open_data(self, url, data=None): + """Use "data" URL.""" + if not isinstance(url, str): + raise URLError('data error: proxy support for data protocol currently not implemented') + # ignore POSTed data + # + # syntax of data URLs: + # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data + # mediatype := [ type "/" subtype ] *( ";" parameter ) + # data := *urlchar + # parameter := attribute "=" value + try: + [type, data] = url.split(',', 1) + except ValueError: + raise IOError('data error', 'bad data URL') + if not type: + type = 'text/plain;charset=US-ASCII' + semi = type.rfind(';') + if semi >= 0 and '=' not in type[semi:]: + encoding = type[semi+1:] + type = type[:semi] + else: + encoding = '' + msg = [] + msg.append('Date: %s'%time.strftime('%a, %d %b %Y %H:%M:%S GMT', + time.gmtime(time.time()))) + msg.append('Content-type: %s' % type) + if encoding == 'base64': + # XXX is this encoding/decoding ok? + data = base64.decodebytes(data.encode('ascii')).decode('latin-1') + else: + data = unquote(data) + msg.append('Content-Length: %d' % len(data)) + msg.append('') + msg.append(data) + msg = '\n'.join(msg) + headers = email.message_from_string(msg) + f = io.StringIO(msg) + #f.fileno = None # needed for addinfourl + return addinfourl(f, headers, url) + + +class FancyURLopener(URLopener): + """Derived class with handlers for errors we can handle (perhaps).""" + + def __init__(self, *args, **kwargs): + URLopener.__init__(self, *args, **kwargs) + self.auth_cache = {} + self.tries = 0 + self.maxtries = 10 + + def http_error_default(self, url, fp, errcode, errmsg, headers): + """Default error handling -- don't raise an exception.""" + return addinfourl(fp, headers, "http:" + url, errcode) + + def http_error_302(self, url, fp, errcode, errmsg, headers, data=None): + """Error 302 -- relocated (temporarily).""" + self.tries += 1 + if self.maxtries and self.tries >= self.maxtries: + if hasattr(self, "http_error_500"): + meth = self.http_error_500 + else: + meth = self.http_error_default + self.tries = 0 + return meth(url, fp, 500, + "Internal Server Error: Redirect Recursion", headers) + result = self.redirect_internal(url, fp, errcode, errmsg, headers, + data) + self.tries = 0 + return result + + def redirect_internal(self, url, fp, errcode, errmsg, headers, data): + if 'location' in headers: + newurl = headers['location'] + elif 'uri' in headers: + newurl = headers['uri'] + else: + return + fp.close() + + # In case the server sent a relative URL, join with original: + newurl = urljoin(self.type + ":" + url, newurl) + + urlparts = urlparse(newurl) + + # For security reasons, we don't allow redirection to anything other + # than http, https and ftp. + + # We are using newer HTTPError with older redirect_internal method + # This older method will get deprecated in 3.3 + + if urlparts.scheme not in ('http', 'https', 'ftp', ''): + raise HTTPError(newurl, errcode, + errmsg + + " Redirection to url '%s' is not allowed." % newurl, + headers, fp) + + return self.open(newurl) + + def http_error_301(self, url, fp, errcode, errmsg, headers, data=None): + """Error 301 -- also relocated (permanently).""" + return self.http_error_302(url, fp, errcode, errmsg, headers, data) + + def http_error_303(self, url, fp, errcode, errmsg, headers, data=None): + """Error 303 -- also relocated (essentially identical to 302).""" + return self.http_error_302(url, fp, errcode, errmsg, headers, data) + + def http_error_307(self, url, fp, errcode, errmsg, headers, data=None): + """Error 307 -- relocated, but turn POST into error.""" + if data is None: + return self.http_error_302(url, fp, errcode, errmsg, headers, data) + else: + return self.http_error_default(url, fp, errcode, errmsg, headers) + + def http_error_401(self, url, fp, errcode, errmsg, headers, data=None, + retry=False): + """Error 401 -- authentication required. + This function supports Basic authentication only.""" + if 'www-authenticate' not in headers: + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + stuff = headers['www-authenticate'] + match = re.match('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"', stuff) + if not match: + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + scheme, realm = match.groups() + if scheme.lower() != 'basic': + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + if not retry: + URLopener.http_error_default(self, url, fp, errcode, errmsg, + headers) + name = 'retry_' + self.type + '_basic_auth' + if data is None: + return getattr(self,name)(url, realm) + else: + return getattr(self,name)(url, realm, data) + + def http_error_407(self, url, fp, errcode, errmsg, headers, data=None, + retry=False): + """Error 407 -- proxy authentication required. + This function supports Basic authentication only.""" + if 'proxy-authenticate' not in headers: + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + stuff = headers['proxy-authenticate'] + match = re.match('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"', stuff) + if not match: + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + scheme, realm = match.groups() + if scheme.lower() != 'basic': + URLopener.http_error_default(self, url, fp, + errcode, errmsg, headers) + if not retry: + URLopener.http_error_default(self, url, fp, errcode, errmsg, + headers) + name = 'retry_proxy_' + self.type + '_basic_auth' + if data is None: + return getattr(self,name)(url, realm) + else: + return getattr(self,name)(url, realm, data) + + def retry_proxy_http_basic_auth(self, url, realm, data=None): + host, selector = splithost(url) + newurl = 'http://' + host + selector + proxy = self.proxies['http'] + urltype, proxyhost = splittype(proxy) + proxyhost, proxyselector = splithost(proxyhost) + i = proxyhost.find('@') + 1 + proxyhost = proxyhost[i:] + user, passwd = self.get_user_passwd(proxyhost, realm, i) + if not (user or passwd): return None + proxyhost = "%s:%s@%s" % (quote(user, safe=''), + quote(passwd, safe=''), proxyhost) + self.proxies['http'] = 'http://' + proxyhost + proxyselector + if data is None: + return self.open(newurl) + else: + return self.open(newurl, data) + + def retry_proxy_https_basic_auth(self, url, realm, data=None): + host, selector = splithost(url) + newurl = 'https://' + host + selector + proxy = self.proxies['https'] + urltype, proxyhost = splittype(proxy) + proxyhost, proxyselector = splithost(proxyhost) + i = proxyhost.find('@') + 1 + proxyhost = proxyhost[i:] + user, passwd = self.get_user_passwd(proxyhost, realm, i) + if not (user or passwd): return None + proxyhost = "%s:%s@%s" % (quote(user, safe=''), + quote(passwd, safe=''), proxyhost) + self.proxies['https'] = 'https://' + proxyhost + proxyselector + if data is None: + return self.open(newurl) + else: + return self.open(newurl, data) + + def retry_http_basic_auth(self, url, realm, data=None): + host, selector = splithost(url) + i = host.find('@') + 1 + host = host[i:] + user, passwd = self.get_user_passwd(host, realm, i) + if not (user or passwd): return None + host = "%s:%s@%s" % (quote(user, safe=''), + quote(passwd, safe=''), host) + newurl = 'http://' + host + selector + if data is None: + return self.open(newurl) + else: + return self.open(newurl, data) + + def retry_https_basic_auth(self, url, realm, data=None): + host, selector = splithost(url) + i = host.find('@') + 1 + host = host[i:] + user, passwd = self.get_user_passwd(host, realm, i) + if not (user or passwd): return None + host = "%s:%s@%s" % (quote(user, safe=''), + quote(passwd, safe=''), host) + newurl = 'https://' + host + selector + if data is None: + return self.open(newurl) + else: + return self.open(newurl, data) + + def get_user_passwd(self, host, realm, clear_cache=0): + key = realm + '@' + host.lower() + if key in self.auth_cache: + if clear_cache: + del self.auth_cache[key] + else: + return self.auth_cache[key] + user, passwd = self.prompt_user_passwd(host, realm) + if user or passwd: self.auth_cache[key] = (user, passwd) + return user, passwd + + def prompt_user_passwd(self, host, realm): + """Override this in a GUI environment!""" + import getpass + try: + user = input("Enter username for %s at %s: " % (realm, host)) + passwd = getpass.getpass("Enter password for %s in %s at %s: " % + (user, realm, host)) + return user, passwd + except KeyboardInterrupt: + print() + return None, None + + +# Utility functions + +_localhost = None +def localhost(): + """Return the IP address of the magic hostname 'localhost'.""" + global _localhost + if _localhost is None: + _localhost = socket.gethostbyname('localhost') + return _localhost + +_thishost = None +def thishost(): + """Return the IP addresses of the current host.""" + global _thishost + if _thishost is None: + try: + _thishost = tuple(socket.gethostbyname_ex(socket.gethostname())[2]) + except socket.gaierror: + _thishost = tuple(socket.gethostbyname_ex('localhost')[2]) + return _thishost + +_ftperrors = None +def ftperrors(): + """Return the set of errors raised by the FTP class.""" + global _ftperrors + if _ftperrors is None: + import ftplib + _ftperrors = ftplib.all_errors + return _ftperrors + +_noheaders = None +def noheaders(): + """Return an empty email Message object.""" + global _noheaders + if _noheaders is None: + _noheaders = email.message_from_string("") + return _noheaders + + +# Utility classes + +class ftpwrapper(object): + """Class used by open_ftp() for cache of open FTP connections.""" + + def __init__(self, user, passwd, host, port, dirs, timeout=None, + persistent=True): + self.user = user + self.passwd = passwd + self.host = host + self.port = port + self.dirs = dirs + self.timeout = timeout + self.refcount = 0 + self.keepalive = persistent + self.init() + + def init(self): + import ftplib + self.busy = 0 + self.ftp = ftplib.FTP() + self.ftp.connect(self.host, self.port, self.timeout) + self.ftp.login(self.user, self.passwd) + _target = '/'.join(self.dirs) + self.ftp.cwd(_target) + + def retrfile(self, file, type): + import ftplib + self.endtransfer() + if type in ('d', 'D'): cmd = 'TYPE A'; isdir = 1 + else: cmd = 'TYPE ' + type; isdir = 0 + try: + self.ftp.voidcmd(cmd) + except ftplib.all_errors: + self.init() + self.ftp.voidcmd(cmd) + conn = None + if file and not isdir: + # Try to retrieve as a file + try: + cmd = 'RETR ' + file + conn, retrlen = self.ftp.ntransfercmd(cmd) + except ftplib.error_perm as reason: + if str(reason)[:3] != '550': + raise_with_traceback(URLError('ftp error: %r' % reason)) + if not conn: + # Set transfer mode to ASCII! + self.ftp.voidcmd('TYPE A') + # Try a directory listing. Verify that directory exists. + if file: + pwd = self.ftp.pwd() + try: + try: + self.ftp.cwd(file) + except ftplib.error_perm as reason: + ### Was: + # raise URLError('ftp error: %r' % reason) from reason + exc = URLError('ftp error: %r' % reason) + exc.__cause__ = reason + raise exc + finally: + self.ftp.cwd(pwd) + cmd = 'LIST ' + file + else: + cmd = 'LIST' + conn, retrlen = self.ftp.ntransfercmd(cmd) + self.busy = 1 + + ftpobj = addclosehook(conn.makefile('rb'), self.file_close) + self.refcount += 1 + conn.close() + # Pass back both a suitably decorated object and a retrieval length + return (ftpobj, retrlen) + + def endtransfer(self): + self.busy = 0 + + def close(self): + self.keepalive = False + if self.refcount <= 0: + self.real_close() + + def file_close(self): + self.endtransfer() + self.refcount -= 1 + if self.refcount <= 0 and not self.keepalive: + self.real_close() + + def real_close(self): + self.endtransfer() + try: + self.ftp.close() + except ftperrors(): + pass + +# Proxy handling +def getproxies_environment(): + """Return a dictionary of scheme -> proxy server URL mappings. + + Scan the environment for variables named _proxy; + this seems to be the standard convention. If you need a + different way, you can pass a proxies dictionary to the + [Fancy]URLopener constructor. + + """ + proxies = {} + for name, value in os.environ.items(): + name = name.lower() + if value and name[-6:] == '_proxy': + proxies[name[:-6]] = value + return proxies + +def proxy_bypass_environment(host): + """Test if proxies should not be used for a particular host. + + Checks the environment for a variable named no_proxy, which should + be a list of DNS suffixes separated by commas, or '*' for all hosts. + """ + no_proxy = os.environ.get('no_proxy', '') or os.environ.get('NO_PROXY', '') + # '*' is special case for always bypass + if no_proxy == '*': + return 1 + # strip port off host + hostonly, port = splitport(host) + # check if the host ends with any of the DNS suffixes + no_proxy_list = [proxy.strip() for proxy in no_proxy.split(',')] + for name in no_proxy_list: + if name and (hostonly.endswith(name) or host.endswith(name)): + return 1 + # otherwise, don't bypass + return 0 + + +# This code tests an OSX specific data structure but is testable on all +# platforms +def _proxy_bypass_macosx_sysconf(host, proxy_settings): + """ + Return True iff this host shouldn't be accessed using a proxy + + This function uses the MacOSX framework SystemConfiguration + to fetch the proxy information. + + proxy_settings come from _scproxy._get_proxy_settings or get mocked ie: + { 'exclude_simple': bool, + 'exceptions': ['foo.bar', '*.bar.com', '127.0.0.1', '10.1', '10.0/16'] + } + """ + from fnmatch import fnmatch + + hostonly, port = splitport(host) + + def ip2num(ipAddr): + parts = ipAddr.split('.') + parts = list(map(int, parts)) + if len(parts) != 4: + parts = (parts + [0, 0, 0, 0])[:4] + return (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3] + + # Check for simple host names: + if '.' not in host: + if proxy_settings['exclude_simple']: + return True + + hostIP = None + + for value in proxy_settings.get('exceptions', ()): + # Items in the list are strings like these: *.local, 169.254/16 + if not value: continue + + m = re.match(r"(\d+(?:\.\d+)*)(/\d+)?", value) + if m is not None: + if hostIP is None: + try: + hostIP = socket.gethostbyname(hostonly) + hostIP = ip2num(hostIP) + except socket.error: + continue + + base = ip2num(m.group(1)) + mask = m.group(2) + if mask is None: + mask = 8 * (m.group(1).count('.') + 1) + else: + mask = int(mask[1:]) + mask = 32 - mask + + if (hostIP >> mask) == (base >> mask): + return True + + elif fnmatch(host, value): + return True + + return False + + +if sys.platform == 'darwin': + from _scproxy import _get_proxy_settings, _get_proxies + + def proxy_bypass_macosx_sysconf(host): + proxy_settings = _get_proxy_settings() + return _proxy_bypass_macosx_sysconf(host, proxy_settings) + + def getproxies_macosx_sysconf(): + """Return a dictionary of scheme -> proxy server URL mappings. + + This function uses the MacOSX framework SystemConfiguration + to fetch the proxy information. + """ + return _get_proxies() + + + + def proxy_bypass(host): + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_macosx_sysconf(host) + + def getproxies(): + return getproxies_environment() or getproxies_macosx_sysconf() + + +elif os.name == 'nt': + def getproxies_registry(): + """Return a dictionary of scheme -> proxy server URL mappings. + + Win32 uses the registry to store proxies. + + """ + proxies = {} + try: + import winreg + except ImportError: + # Std module, so should be around - but you never know! + return proxies + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + if proxyEnable: + # Returned as Unicode but problems if not converted to ASCII + proxyServer = str(winreg.QueryValueEx(internetSettings, + 'ProxyServer')[0]) + if '=' in proxyServer: + # Per-protocol settings + for p in proxyServer.split(';'): + protocol, address = p.split('=', 1) + # See if address has a type:// prefix + if not re.match('^([^/:]+)://', address): + address = '%s://%s' % (protocol, address) + proxies[protocol] = address + else: + # Use one setting for all protocols + if proxyServer[:5] == 'http:': + proxies['http'] = proxyServer + else: + proxies['http'] = 'http://%s' % proxyServer + proxies['https'] = 'https://%s' % proxyServer + proxies['ftp'] = 'ftp://%s' % proxyServer + internetSettings.Close() + except (WindowsError, ValueError, TypeError): + # Either registry key not found etc, or the value in an + # unexpected format. + # proxies already set up to be empty so nothing to do + pass + return proxies + + def getproxies(): + """Return a dictionary of scheme -> proxy server URL mappings. + + Returns settings gathered from the environment, if specified, + or the registry. + + """ + return getproxies_environment() or getproxies_registry() + + def proxy_bypass_registry(host): + try: + import winreg + except ImportError: + # Std modules, so should be around - but you never know! + return 0 + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + proxyOverride = str(winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0]) + # ^^^^ Returned as Unicode but problems if not converted to ASCII + except WindowsError: + return 0 + if not proxyEnable or not proxyOverride: + return 0 + # try to make a host list from name and IP address. + rawHost, port = splitport(host) + host = [rawHost] + try: + addr = socket.gethostbyname(rawHost) + if addr != rawHost: + host.append(addr) + except socket.error: + pass + try: + fqdn = socket.getfqdn(rawHost) + if fqdn != rawHost: + host.append(fqdn) + except socket.error: + pass + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '': + if '.' not in rawHost: + return 1 + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + for val in host: + if re.match(test, val, re.I): + return 1 + return 0 + + def proxy_bypass(host): + """Return a dictionary of scheme -> proxy server URL mappings. + + Returns settings gathered from the environment, if specified, + or the registry. + + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + +else: + # By default use environment variables + getproxies = getproxies_environment + proxy_bypass = proxy_bypass_environment diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/response.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/response.py new file mode 100644 index 0000000..adbf6e5 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/response.py @@ -0,0 +1,103 @@ +"""Response classes used by urllib. + +The base class, addbase, defines a minimal file-like interface, +including read() and readline(). The typical response object is an +addinfourl instance, which defines an info() method that returns +headers and a geturl() method that returns the url. +""" +from __future__ import absolute_import, division, unicode_literals +from future.builtins import object + +class addbase(object): + """Base class for addinfo and addclosehook.""" + + # XXX Add a method to expose the timeout on the underlying socket? + + def __init__(self, fp): + # TODO(jhylton): Is there a better way to delegate using io? + self.fp = fp + self.read = self.fp.read + self.readline = self.fp.readline + # TODO(jhylton): Make sure an object with readlines() is also iterable + if hasattr(self.fp, "readlines"): + self.readlines = self.fp.readlines + if hasattr(self.fp, "fileno"): + self.fileno = self.fp.fileno + else: + self.fileno = lambda: None + + def __iter__(self): + # Assigning `__iter__` to the instance doesn't work as intended + # because the iter builtin does something like `cls.__iter__(obj)` + # and thus fails to find the _bound_ method `obj.__iter__`. + # Returning just `self.fp` works for built-in file objects but + # might not work for general file-like objects. + return iter(self.fp) + + def __repr__(self): + return '<%s at %r whose fp = %r>' % (self.__class__.__name__, + id(self), self.fp) + + def close(self): + if self.fp: + self.fp.close() + self.fp = None + self.read = None + self.readline = None + self.readlines = None + self.fileno = None + self.__iter__ = None + self.__next__ = None + + def __enter__(self): + if self.fp is None: + raise ValueError("I/O operation on closed file") + return self + + def __exit__(self, type, value, traceback): + self.close() + +class addclosehook(addbase): + """Class to add a close hook to an open file.""" + + def __init__(self, fp, closehook, *hookargs): + addbase.__init__(self, fp) + self.closehook = closehook + self.hookargs = hookargs + + def close(self): + if self.closehook: + self.closehook(*self.hookargs) + self.closehook = None + self.hookargs = None + addbase.close(self) + +class addinfo(addbase): + """class to add an info() method to an open file.""" + + def __init__(self, fp, headers): + addbase.__init__(self, fp) + self.headers = headers + + def info(self): + return self.headers + +class addinfourl(addbase): + """class to add info() and geturl() methods to an open file.""" + + def __init__(self, fp, headers, url, code=None): + addbase.__init__(self, fp) + self.headers = headers + self.url = url + self.code = code + + def info(self): + return self.headers + + def getcode(self): + return self.code + + def geturl(self): + return self.url + +del absolute_import, division, unicode_literals, object diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/robotparser.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/robotparser.py new file mode 100644 index 0000000..a0f3651 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/urllib/robotparser.py @@ -0,0 +1,211 @@ +from __future__ import absolute_import, division, unicode_literals +from future.builtins import str +""" robotparser.py + + Copyright (C) 2000 Bastian Kleineidam + + You can choose between two licenses when using this package: + 1) GNU GPLv2 + 2) PSF license for Python 2.2 + + The robots.txt Exclusion Protocol is implemented as specified in + http://info.webcrawler.com/mak/projects/robots/norobots-rfc.html +""" + +# Was: import urllib.parse, urllib.request +from future.backports import urllib +from future.backports.urllib import parse as _parse, request as _request +urllib.parse = _parse +urllib.request = _request + + +__all__ = ["RobotFileParser"] + +class RobotFileParser(object): + """ This class provides a set of methods to read, parse and answer + questions about a single robots.txt file. + + """ + + def __init__(self, url=''): + self.entries = [] + self.default_entry = None + self.disallow_all = False + self.allow_all = False + self.set_url(url) + self.last_checked = 0 + + def mtime(self): + """Returns the time the robots.txt file was last fetched. + + This is useful for long-running web spiders that need to + check for new robots.txt files periodically. + + """ + return self.last_checked + + def modified(self): + """Sets the time the robots.txt file was last fetched to the + current time. + + """ + import time + self.last_checked = time.time() + + def set_url(self, url): + """Sets the URL referring to a robots.txt file.""" + self.url = url + self.host, self.path = urllib.parse.urlparse(url)[1:3] + + def read(self): + """Reads the robots.txt URL and feeds it to the parser.""" + try: + f = urllib.request.urlopen(self.url) + except urllib.error.HTTPError as err: + if err.code in (401, 403): + self.disallow_all = True + elif err.code >= 400: + self.allow_all = True + else: + raw = f.read() + self.parse(raw.decode("utf-8").splitlines()) + + def _add_entry(self, entry): + if "*" in entry.useragents: + # the default entry is considered last + if self.default_entry is None: + # the first default entry wins + self.default_entry = entry + else: + self.entries.append(entry) + + def parse(self, lines): + """Parse the input lines from a robots.txt file. + + We allow that a user-agent: line is not preceded by + one or more blank lines. + """ + # states: + # 0: start state + # 1: saw user-agent line + # 2: saw an allow or disallow line + state = 0 + entry = Entry() + + for line in lines: + if not line: + if state == 1: + entry = Entry() + state = 0 + elif state == 2: + self._add_entry(entry) + entry = Entry() + state = 0 + # remove optional comment and strip line + i = line.find('#') + if i >= 0: + line = line[:i] + line = line.strip() + if not line: + continue + line = line.split(':', 1) + if len(line) == 2: + line[0] = line[0].strip().lower() + line[1] = urllib.parse.unquote(line[1].strip()) + if line[0] == "user-agent": + if state == 2: + self._add_entry(entry) + entry = Entry() + entry.useragents.append(line[1]) + state = 1 + elif line[0] == "disallow": + if state != 0: + entry.rulelines.append(RuleLine(line[1], False)) + state = 2 + elif line[0] == "allow": + if state != 0: + entry.rulelines.append(RuleLine(line[1], True)) + state = 2 + if state == 2: + self._add_entry(entry) + + + def can_fetch(self, useragent, url): + """using the parsed robots.txt decide if useragent can fetch url""" + if self.disallow_all: + return False + if self.allow_all: + return True + # search for given user agent matches + # the first match counts + parsed_url = urllib.parse.urlparse(urllib.parse.unquote(url)) + url = urllib.parse.urlunparse(('','',parsed_url.path, + parsed_url.params,parsed_url.query, parsed_url.fragment)) + url = urllib.parse.quote(url) + if not url: + url = "/" + for entry in self.entries: + if entry.applies_to(useragent): + return entry.allowance(url) + # try the default entry last + if self.default_entry: + return self.default_entry.allowance(url) + # agent not found ==> access granted + return True + + def __str__(self): + return ''.join([str(entry) + "\n" for entry in self.entries]) + + +class RuleLine(object): + """A rule line is a single "Allow:" (allowance==True) or "Disallow:" + (allowance==False) followed by a path.""" + def __init__(self, path, allowance): + if path == '' and not allowance: + # an empty value means allow all + allowance = True + self.path = urllib.parse.quote(path) + self.allowance = allowance + + def applies_to(self, filename): + return self.path == "*" or filename.startswith(self.path) + + def __str__(self): + return (self.allowance and "Allow" or "Disallow") + ": " + self.path + + +class Entry(object): + """An entry has one or more user-agents and zero or more rulelines""" + def __init__(self): + self.useragents = [] + self.rulelines = [] + + def __str__(self): + ret = [] + for agent in self.useragents: + ret.extend(["User-agent: ", agent, "\n"]) + for line in self.rulelines: + ret.extend([str(line), "\n"]) + return ''.join(ret) + + def applies_to(self, useragent): + """check if this entry applies to the specified agent""" + # split the name token and make it lower case + useragent = useragent.split("/")[0].lower() + for agent in self.useragents: + if agent == '*': + # we have the catch-all agent + return True + agent = agent.lower() + if agent in useragent: + return True + return False + + def allowance(self, filename): + """Preconditions: + - our agent applies to this entry + - filename is URL decoded""" + for line in self.rulelines: + if line.applies_to(filename): + return line.allowance + return True diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__init__.py new file mode 100644 index 0000000..196d378 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__init__.py @@ -0,0 +1 @@ +# This directory is a Python package. diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b69f275dc71011b2388481ef40e2e28d15e8a019 GIT binary patch literal 151 zcmXr!<>lgC{X0&Lfq~&M5W@i@kmUfx#VkM~g&~+hlhJP_LlH1DRe7#0&tOyC&EG literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__pycache__/client.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/__pycache__/client.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd30ff5a1be71a3cab7e0402345898e58192613f GIT binary patch literal 33904 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

+# The value can be given as a datetime object, as a string in the +# format "yyyymmddThh:mm:ss", as a 9-item time tuple (as returned by +# time.localtime()), or an integer value (as returned by time.time()). +# The wrapper uses time.localtime() to convert an integer to a time +# tuple. +# +# @param value The time, given as a datetime object, an ISO 8601 string, +# a time tuple, or an integer time value. + + +### For Python-Future: +def _iso8601_format(value): + return "%04d%02d%02dT%02d:%02d:%02d" % ( + value.year, value.month, value.day, + value.hour, value.minute, value.second) +### +# Issue #13305: different format codes across platforms +# _day0 = datetime(1, 1, 1) +# if _day0.strftime('%Y') == '0001': # Mac OS X +# def _iso8601_format(value): +# return value.strftime("%Y%m%dT%H:%M:%S") +# elif _day0.strftime('%4Y') == '0001': # Linux +# def _iso8601_format(value): +# return value.strftime("%4Y%m%dT%H:%M:%S") +# else: +# def _iso8601_format(value): +# return value.strftime("%Y%m%dT%H:%M:%S").zfill(17) +# del _day0 + + +def _strftime(value): + if isinstance(value, datetime): + return _iso8601_format(value) + + if not isinstance(value, (tuple, time.struct_time)): + if value == 0: + value = time.time() + value = time.localtime(value) + + return "%04d%02d%02dT%02d:%02d:%02d" % value[:6] + +class DateTime(object): + """DateTime wrapper for an ISO 8601 string or time tuple or + localtime integer value to generate 'dateTime.iso8601' XML-RPC + value. + """ + + def __init__(self, value=0): + if isinstance(value, str): + self.value = value + else: + self.value = _strftime(value) + + def make_comparable(self, other): + if isinstance(other, DateTime): + s = self.value + o = other.value + elif isinstance(other, datetime): + s = self.value + o = _iso8601_format(other) + elif isinstance(other, str): + s = self.value + o = other + elif hasattr(other, "timetuple"): + s = self.timetuple() + o = other.timetuple() + else: + otype = (hasattr(other, "__class__") + and other.__class__.__name__ + or type(other)) + raise TypeError("Can't compare %s and %s" % + (self.__class__.__name__, otype)) + return s, o + + def __lt__(self, other): + s, o = self.make_comparable(other) + return s < o + + def __le__(self, other): + s, o = self.make_comparable(other) + return s <= o + + def __gt__(self, other): + s, o = self.make_comparable(other) + return s > o + + def __ge__(self, other): + s, o = self.make_comparable(other) + return s >= o + + def __eq__(self, other): + s, o = self.make_comparable(other) + return s == o + + def __ne__(self, other): + s, o = self.make_comparable(other) + return s != o + + def timetuple(self): + return time.strptime(self.value, "%Y%m%dT%H:%M:%S") + + ## + # Get date/time value. + # + # @return Date/time value, as an ISO 8601 string. + + def __str__(self): + return self.value + + def __repr__(self): + return "" % (ensure_new_type(self.value), id(self)) + + def decode(self, data): + self.value = str(data).strip() + + def encode(self, out): + out.write("") + out.write(self.value) + out.write("\n") + +def _datetime(data): + # decode xml element contents into a DateTime structure. + value = DateTime() + value.decode(data) + return value + +def _datetime_type(data): + return datetime.strptime(data, "%Y%m%dT%H:%M:%S") + +## +# Wrapper for binary data. This can be used to transport any kind +# of binary data over XML-RPC, using BASE64 encoding. +# +# @param data An 8-bit string containing arbitrary data. + +class Binary(object): + """Wrapper for binary data.""" + + def __init__(self, data=None): + if data is None: + data = b"" + else: + if not isinstance(data, (bytes, bytearray)): + raise TypeError("expected bytes or bytearray, not %s" % + data.__class__.__name__) + data = bytes(data) # Make a copy of the bytes! + self.data = data + + ## + # Get buffer contents. + # + # @return Buffer contents, as an 8-bit string. + + def __str__(self): + return str(self.data, "latin-1") # XXX encoding?! + + def __eq__(self, other): + if isinstance(other, Binary): + other = other.data + return self.data == other + + def __ne__(self, other): + if isinstance(other, Binary): + other = other.data + return self.data != other + + def decode(self, data): + self.data = base64.decodebytes(data) + + def encode(self, out): + out.write("\n") + encoded = base64.encodebytes(self.data) + out.write(encoded.decode('ascii')) + out.write("\n") + +def _binary(data): + # decode xml element contents into a Binary structure + value = Binary() + value.decode(data) + return value + +WRAPPERS = (DateTime, Binary) + +# -------------------------------------------------------------------- +# XML parsers + +class ExpatParser(object): + # fast expat parser for Python 2.0 and later. + def __init__(self, target): + self._parser = parser = expat.ParserCreate(None, None) + self._target = target + parser.StartElementHandler = target.start + parser.EndElementHandler = target.end + parser.CharacterDataHandler = target.data + encoding = None + target.xml(encoding, None) + + def feed(self, data): + self._parser.Parse(data, 0) + + def close(self): + self._parser.Parse("", 1) # end of data + del self._target, self._parser # get rid of circular references + +# -------------------------------------------------------------------- +# XML-RPC marshalling and unmarshalling code + +## +# XML-RPC marshaller. +# +# @param encoding Default encoding for 8-bit strings. The default +# value is None (interpreted as UTF-8). +# @see dumps + +class Marshaller(object): + """Generate an XML-RPC params chunk from a Python data structure. + + Create a Marshaller instance for each set of parameters, and use + the "dumps" method to convert your data (represented as a tuple) + to an XML-RPC params chunk. To write a fault response, pass a + Fault instance instead. You may prefer to use the "dumps" module + function for this purpose. + """ + + # by the way, if you don't understand what's going on in here, + # that's perfectly ok. + + def __init__(self, encoding=None, allow_none=False): + self.memo = {} + self.data = None + self.encoding = encoding + self.allow_none = allow_none + + dispatch = {} + + def dumps(self, values): + out = [] + write = out.append + dump = self.__dump + if isinstance(values, Fault): + # fault instance + write("\n") + dump({'faultCode': values.faultCode, + 'faultString': values.faultString}, + write) + write("\n") + else: + # parameter block + # FIXME: the xml-rpc specification allows us to leave out + # the entire block if there are no parameters. + # however, changing this may break older code (including + # old versions of xmlrpclib.py), so this is better left as + # is for now. See @XMLRPC3 for more information. /F + write("\n") + for v in values: + write("\n") + dump(v, write) + write("\n") + write("\n") + result = "".join(out) + return str(result) + + def __dump(self, value, write): + try: + f = self.dispatch[type(ensure_new_type(value))] + except KeyError: + # check if this object can be marshalled as a structure + if not hasattr(value, '__dict__'): + raise TypeError("cannot marshal %s objects" % type(value)) + # check if this class is a sub-class of a basic type, + # because we don't know how to marshal these types + # (e.g. a string sub-class) + for type_ in type(value).__mro__: + if type_ in self.dispatch.keys(): + raise TypeError("cannot marshal %s objects" % type(value)) + # XXX(twouters): using "_arbitrary_instance" as key as a quick-fix + # for the p3yk merge, this should probably be fixed more neatly. + f = self.dispatch["_arbitrary_instance"] + f(self, value, write) + + def dump_nil (self, value, write): + if not self.allow_none: + raise TypeError("cannot marshal None unless allow_none is enabled") + write("") + dispatch[type(None)] = dump_nil + + def dump_bool(self, value, write): + write("") + write(value and "1" or "0") + write("\n") + dispatch[bool] = dump_bool + + def dump_long(self, value, write): + if value > MAXINT or value < MININT: + raise OverflowError("long int exceeds XML-RPC limits") + write("") + write(str(int(value))) + write("\n") + dispatch[int] = dump_long + + # backward compatible + dump_int = dump_long + + def dump_double(self, value, write): + write("") + write(repr(ensure_new_type(value))) + write("\n") + dispatch[float] = dump_double + + def dump_unicode(self, value, write, escape=escape): + write("") + write(escape(value)) + write("\n") + dispatch[str] = dump_unicode + + def dump_bytes(self, value, write): + write("\n") + encoded = base64.encodebytes(value) + write(encoded.decode('ascii')) + write("\n") + dispatch[bytes] = dump_bytes + dispatch[bytearray] = dump_bytes + + def dump_array(self, value, write): + i = id(value) + if i in self.memo: + raise TypeError("cannot marshal recursive sequences") + self.memo[i] = None + dump = self.__dump + write("\n") + for v in value: + dump(v, write) + write("\n") + del self.memo[i] + dispatch[tuple] = dump_array + dispatch[list] = dump_array + + def dump_struct(self, value, write, escape=escape): + i = id(value) + if i in self.memo: + raise TypeError("cannot marshal recursive dictionaries") + self.memo[i] = None + dump = self.__dump + write("\n") + for k, v in value.items(): + write("\n") + if not isinstance(k, str): + raise TypeError("dictionary key must be string") + write("%s\n" % escape(k)) + dump(v, write) + write("\n") + write("\n") + del self.memo[i] + dispatch[dict] = dump_struct + + def dump_datetime(self, value, write): + write("") + write(_strftime(value)) + write("\n") + dispatch[datetime] = dump_datetime + + def dump_instance(self, value, write): + # check for special wrappers + if value.__class__ in WRAPPERS: + self.write = write + value.encode(self) + del self.write + else: + # store instance attributes as a struct (really?) + self.dump_struct(value.__dict__, write) + dispatch[DateTime] = dump_instance + dispatch[Binary] = dump_instance + # XXX(twouters): using "_arbitrary_instance" as key as a quick-fix + # for the p3yk merge, this should probably be fixed more neatly. + dispatch["_arbitrary_instance"] = dump_instance + +## +# XML-RPC unmarshaller. +# +# @see loads + +class Unmarshaller(object): + """Unmarshal an XML-RPC response, based on incoming XML event + messages (start, data, end). Call close() to get the resulting + data structure. + + Note that this reader is fairly tolerant, and gladly accepts bogus + XML-RPC data without complaining (but not bogus XML). + """ + + # and again, if you don't understand what's going on in here, + # that's perfectly ok. + + def __init__(self, use_datetime=False, use_builtin_types=False): + self._type = None + self._stack = [] + self._marks = [] + self._data = [] + self._methodname = None + self._encoding = "utf-8" + self.append = self._stack.append + self._use_datetime = use_builtin_types or use_datetime + self._use_bytes = use_builtin_types + + def close(self): + # return response tuple and target method + if self._type is None or self._marks: + raise ResponseError() + if self._type == "fault": + raise Fault(**self._stack[0]) + return tuple(self._stack) + + def getmethodname(self): + return self._methodname + + # + # event handlers + + def xml(self, encoding, standalone): + self._encoding = encoding + # FIXME: assert standalone == 1 ??? + + def start(self, tag, attrs): + # prepare to handle this element + if tag == "array" or tag == "struct": + self._marks.append(len(self._stack)) + self._data = [] + self._value = (tag == "value") + + def data(self, text): + self._data.append(text) + + def end(self, tag): + # call the appropriate end tag handler + try: + f = self.dispatch[tag] + except KeyError: + pass # unknown tag ? + else: + return f(self, "".join(self._data)) + + # + # accelerator support + + def end_dispatch(self, tag, data): + # dispatch data + try: + f = self.dispatch[tag] + except KeyError: + pass # unknown tag ? + else: + return f(self, data) + + # + # element decoders + + dispatch = {} + + def end_nil (self, data): + self.append(None) + self._value = 0 + dispatch["nil"] = end_nil + + def end_boolean(self, data): + if data == "0": + self.append(False) + elif data == "1": + self.append(True) + else: + raise TypeError("bad boolean value") + self._value = 0 + dispatch["boolean"] = end_boolean + + def end_int(self, data): + self.append(int(data)) + self._value = 0 + dispatch["i4"] = end_int + dispatch["i8"] = end_int + dispatch["int"] = end_int + + def end_double(self, data): + self.append(float(data)) + self._value = 0 + dispatch["double"] = end_double + + def end_string(self, data): + if self._encoding: + data = data.decode(self._encoding) + self.append(data) + self._value = 0 + dispatch["string"] = end_string + dispatch["name"] = end_string # struct keys are always strings + + def end_array(self, data): + mark = self._marks.pop() + # map arrays to Python lists + self._stack[mark:] = [self._stack[mark:]] + self._value = 0 + dispatch["array"] = end_array + + def end_struct(self, data): + mark = self._marks.pop() + # map structs to Python dictionaries + dict = {} + items = self._stack[mark:] + for i in range(0, len(items), 2): + dict[items[i]] = items[i+1] + self._stack[mark:] = [dict] + self._value = 0 + dispatch["struct"] = end_struct + + def end_base64(self, data): + value = Binary() + value.decode(data.encode("ascii")) + if self._use_bytes: + value = value.data + self.append(value) + self._value = 0 + dispatch["base64"] = end_base64 + + def end_dateTime(self, data): + value = DateTime() + value.decode(data) + if self._use_datetime: + value = _datetime_type(data) + self.append(value) + dispatch["dateTime.iso8601"] = end_dateTime + + def end_value(self, data): + # if we stumble upon a value element with no internal + # elements, treat it as a string element + if self._value: + self.end_string(data) + dispatch["value"] = end_value + + def end_params(self, data): + self._type = "params" + dispatch["params"] = end_params + + def end_fault(self, data): + self._type = "fault" + dispatch["fault"] = end_fault + + def end_methodName(self, data): + if self._encoding: + data = data.decode(self._encoding) + self._methodname = data + self._type = "methodName" # no params + dispatch["methodName"] = end_methodName + +## Multicall support +# + +class _MultiCallMethod(object): + # some lesser magic to store calls made to a MultiCall object + # for batch execution + def __init__(self, call_list, name): + self.__call_list = call_list + self.__name = name + def __getattr__(self, name): + return _MultiCallMethod(self.__call_list, "%s.%s" % (self.__name, name)) + def __call__(self, *args): + self.__call_list.append((self.__name, args)) + +class MultiCallIterator(object): + """Iterates over the results of a multicall. Exceptions are + raised in response to xmlrpc faults.""" + + def __init__(self, results): + self.results = results + + def __getitem__(self, i): + item = self.results[i] + if isinstance(type(item), dict): + raise Fault(item['faultCode'], item['faultString']) + elif type(item) == type([]): + return item[0] + else: + raise ValueError("unexpected type in multicall result") + +class MultiCall(object): + """server -> a object used to boxcar method calls + + server should be a ServerProxy object. + + Methods can be added to the MultiCall using normal + method call syntax e.g.: + + multicall = MultiCall(server_proxy) + multicall.add(2,3) + multicall.get_address("Guido") + + To execute the multicall, call the MultiCall object e.g.: + + add_result, address = multicall() + """ + + def __init__(self, server): + self.__server = server + self.__call_list = [] + + def __repr__(self): + return "" % id(self) + + __str__ = __repr__ + + def __getattr__(self, name): + return _MultiCallMethod(self.__call_list, name) + + def __call__(self): + marshalled_list = [] + for name, args in self.__call_list: + marshalled_list.append({'methodName' : name, 'params' : args}) + + return MultiCallIterator(self.__server.system.multicall(marshalled_list)) + +# -------------------------------------------------------------------- +# convenience functions + +FastMarshaller = FastParser = FastUnmarshaller = None + +## +# Create a parser object, and connect it to an unmarshalling instance. +# This function picks the fastest available XML parser. +# +# return A (parser, unmarshaller) tuple. + +def getparser(use_datetime=False, use_builtin_types=False): + """getparser() -> parser, unmarshaller + + Create an instance of the fastest available parser, and attach it + to an unmarshalling object. Return both objects. + """ + if FastParser and FastUnmarshaller: + if use_builtin_types: + mkdatetime = _datetime_type + mkbytes = base64.decodebytes + elif use_datetime: + mkdatetime = _datetime_type + mkbytes = _binary + else: + mkdatetime = _datetime + mkbytes = _binary + target = FastUnmarshaller(True, False, mkbytes, mkdatetime, Fault) + parser = FastParser(target) + else: + target = Unmarshaller(use_datetime=use_datetime, use_builtin_types=use_builtin_types) + if FastParser: + parser = FastParser(target) + else: + parser = ExpatParser(target) + return parser, target + +## +# Convert a Python tuple or a Fault instance to an XML-RPC packet. +# +# @def dumps(params, **options) +# @param params A tuple or Fault instance. +# @keyparam methodname If given, create a methodCall request for +# this method name. +# @keyparam methodresponse If given, create a methodResponse packet. +# If used with a tuple, the tuple must be a singleton (that is, +# it must contain exactly one element). +# @keyparam encoding The packet encoding. +# @return A string containing marshalled data. + +def dumps(params, methodname=None, methodresponse=None, encoding=None, + allow_none=False): + """data [,options] -> marshalled data + + Convert an argument tuple or a Fault instance to an XML-RPC + request (or response, if the methodresponse option is used). + + In addition to the data object, the following options can be given + as keyword arguments: + + methodname: the method name for a methodCall packet + + methodresponse: true to create a methodResponse packet. + If this option is used with a tuple, the tuple must be + a singleton (i.e. it can contain only one element). + + encoding: the packet encoding (default is UTF-8) + + All byte strings in the data structure are assumed to use the + packet encoding. Unicode strings are automatically converted, + where necessary. + """ + + assert isinstance(params, (tuple, Fault)), "argument must be tuple or Fault instance" + if isinstance(params, Fault): + methodresponse = 1 + elif methodresponse and isinstance(params, tuple): + assert len(params) == 1, "response tuple must be a singleton" + + if not encoding: + encoding = "utf-8" + + if FastMarshaller: + m = FastMarshaller(encoding) + else: + m = Marshaller(encoding, allow_none) + + data = m.dumps(params) + + if encoding != "utf-8": + xmlheader = "\n" % str(encoding) + else: + xmlheader = "\n" # utf-8 is default + + # standard XML-RPC wrappings + if methodname: + # a method call + if not isinstance(methodname, str): + methodname = methodname.encode(encoding) + data = ( + xmlheader, + "\n" + "", methodname, "\n", + data, + "\n" + ) + elif methodresponse: + # a method response, or a fault structure + data = ( + xmlheader, + "\n", + data, + "\n" + ) + else: + return data # return as is + return str("").join(data) + +## +# Convert an XML-RPC packet to a Python object. If the XML-RPC packet +# represents a fault condition, this function raises a Fault exception. +# +# @param data An XML-RPC packet, given as an 8-bit string. +# @return A tuple containing the unpacked data, and the method name +# (None if not present). +# @see Fault + +def loads(data, use_datetime=False, use_builtin_types=False): + """data -> unmarshalled data, method name + + Convert an XML-RPC packet to unmarshalled data plus a method + name (None if not present). + + If the XML-RPC packet represents a fault condition, this function + raises a Fault exception. + """ + p, u = getparser(use_datetime=use_datetime, use_builtin_types=use_builtin_types) + p.feed(data) + p.close() + return u.close(), u.getmethodname() + +## +# Encode a string using the gzip content encoding such as specified by the +# Content-Encoding: gzip +# in the HTTP header, as described in RFC 1952 +# +# @param data the unencoded data +# @return the encoded data + +def gzip_encode(data): + """data -> gzip encoded data + + Encode data using the gzip content encoding as described in RFC 1952 + """ + if not gzip: + raise NotImplementedError + f = BytesIO() + gzf = gzip.GzipFile(mode="wb", fileobj=f, compresslevel=1) + gzf.write(data) + gzf.close() + encoded = f.getvalue() + f.close() + return encoded + +## +# Decode a string using the gzip content encoding such as specified by the +# Content-Encoding: gzip +# in the HTTP header, as described in RFC 1952 +# +# @param data The encoded data +# @return the unencoded data +# @raises ValueError if data is not correctly coded. + +def gzip_decode(data): + """gzip encoded data -> unencoded data + + Decode data using the gzip content encoding as described in RFC 1952 + """ + if not gzip: + raise NotImplementedError + f = BytesIO(data) + gzf = gzip.GzipFile(mode="rb", fileobj=f) + try: + decoded = gzf.read() + except IOError: + raise ValueError("invalid data") + f.close() + gzf.close() + return decoded + +## +# Return a decoded file-like object for the gzip encoding +# as described in RFC 1952. +# +# @param response A stream supporting a read() method +# @return a file-like object that the decoded data can be read() from + +class GzipDecodedResponse(gzip.GzipFile if gzip else object): + """a file-like object to decode a response encoded with the gzip + method, as described in RFC 1952. + """ + def __init__(self, response): + #response doesn't support tell() and read(), required by + #GzipFile + if not gzip: + raise NotImplementedError + self.io = BytesIO(response.read()) + gzip.GzipFile.__init__(self, mode="rb", fileobj=self.io) + + def close(self): + gzip.GzipFile.close(self) + self.io.close() + + +# -------------------------------------------------------------------- +# request dispatcher + +class _Method(object): + # some magic to bind an XML-RPC method to an RPC server. + # supports "nested" methods (e.g. examples.getStateName) + def __init__(self, send, name): + self.__send = send + self.__name = name + def __getattr__(self, name): + return _Method(self.__send, "%s.%s" % (self.__name, name)) + def __call__(self, *args): + return self.__send(self.__name, args) + +## +# Standard transport class for XML-RPC over HTTP. +#

+# You can create custom transports by subclassing this method, and +# overriding selected methods. + +class Transport(object): + """Handles an HTTP transaction to an XML-RPC server.""" + + # client identifier (may be overridden) + user_agent = "Python-xmlrpc/%s" % __version__ + + #if true, we'll request gzip encoding + accept_gzip_encoding = True + + # if positive, encode request using gzip if it exceeds this threshold + # note that many server will get confused, so only use it if you know + # that they can decode such a request + encode_threshold = None #None = don't encode + + def __init__(self, use_datetime=False, use_builtin_types=False): + self._use_datetime = use_datetime + self._use_builtin_types = use_builtin_types + self._connection = (None, None) + self._extra_headers = [] + + ## + # Send a complete request, and parse the response. + # Retry request if a cached connection has disconnected. + # + # @param host Target host. + # @param handler Target PRC handler. + # @param request_body XML-RPC request body. + # @param verbose Debugging flag. + # @return Parsed response. + + def request(self, host, handler, request_body, verbose=False): + #retry request once if cached connection has gone cold + for i in (0, 1): + try: + return self.single_request(host, handler, request_body, verbose) + except socket.error as e: + if i or e.errno not in (errno.ECONNRESET, errno.ECONNABORTED, errno.EPIPE): + raise + except http_client.BadStatusLine: #close after we sent request + if i: + raise + + def single_request(self, host, handler, request_body, verbose=False): + # issue XML-RPC request + try: + http_conn = self.send_request(host, handler, request_body, verbose) + resp = http_conn.getresponse() + if resp.status == 200: + self.verbose = verbose + return self.parse_response(resp) + + except Fault: + raise + except Exception: + #All unexpected errors leave connection in + # a strange state, so we clear it. + self.close() + raise + + #We got an error response. + #Discard any response data and raise exception + if resp.getheader("content-length", ""): + resp.read() + raise ProtocolError( + host + handler, + resp.status, resp.reason, + dict(resp.getheaders()) + ) + + + ## + # Create parser. + # + # @return A 2-tuple containing a parser and a unmarshaller. + + def getparser(self): + # get parser and unmarshaller + return getparser(use_datetime=self._use_datetime, + use_builtin_types=self._use_builtin_types) + + ## + # Get authorization info from host parameter + # Host may be a string, or a (host, x509-dict) tuple; if a string, + # it is checked for a "user:pw@host" format, and a "Basic + # Authentication" header is added if appropriate. + # + # @param host Host descriptor (URL or (URL, x509 info) tuple). + # @return A 3-tuple containing (actual host, extra headers, + # x509 info). The header and x509 fields may be None. + + def get_host_info(self, host): + + x509 = {} + if isinstance(host, tuple): + host, x509 = host + + auth, host = urllib_parse.splituser(host) + + if auth: + auth = urllib_parse.unquote_to_bytes(auth) + auth = base64.encodebytes(auth).decode("utf-8") + auth = "".join(auth.split()) # get rid of whitespace + extra_headers = [ + ("Authorization", "Basic " + auth) + ] + else: + extra_headers = [] + + return host, extra_headers, x509 + + ## + # Connect to server. + # + # @param host Target host. + # @return An HTTPConnection object + + def make_connection(self, host): + #return an existing connection if possible. This allows + #HTTP/1.1 keep-alive. + if self._connection and host == self._connection[0]: + return self._connection[1] + # create a HTTP connection object from a host descriptor + chost, self._extra_headers, x509 = self.get_host_info(host) + self._connection = host, http_client.HTTPConnection(chost) + return self._connection[1] + + ## + # Clear any cached connection object. + # Used in the event of socket errors. + # + def close(self): + if self._connection[1]: + self._connection[1].close() + self._connection = (None, None) + + ## + # Send HTTP request. + # + # @param host Host descriptor (URL or (URL, x509 info) tuple). + # @param handler Targer RPC handler (a path relative to host) + # @param request_body The XML-RPC request body + # @param debug Enable debugging if debug is true. + # @return An HTTPConnection. + + def send_request(self, host, handler, request_body, debug): + connection = self.make_connection(host) + headers = self._extra_headers[:] + if debug: + connection.set_debuglevel(1) + if self.accept_gzip_encoding and gzip: + connection.putrequest("POST", handler, skip_accept_encoding=True) + headers.append(("Accept-Encoding", "gzip")) + else: + connection.putrequest("POST", handler) + headers.append(("Content-Type", "text/xml")) + headers.append(("User-Agent", self.user_agent)) + self.send_headers(connection, headers) + self.send_content(connection, request_body) + return connection + + ## + # Send request headers. + # This function provides a useful hook for subclassing + # + # @param connection httpConnection. + # @param headers list of key,value pairs for HTTP headers + + def send_headers(self, connection, headers): + for key, val in headers: + connection.putheader(key, val) + + ## + # Send request body. + # This function provides a useful hook for subclassing + # + # @param connection httpConnection. + # @param request_body XML-RPC request body. + + def send_content(self, connection, request_body): + #optionally encode the request + if (self.encode_threshold is not None and + self.encode_threshold < len(request_body) and + gzip): + connection.putheader("Content-Encoding", "gzip") + request_body = gzip_encode(request_body) + + connection.putheader("Content-Length", str(len(request_body))) + connection.endheaders(request_body) + + ## + # Parse response. + # + # @param file Stream. + # @return Response tuple and target method. + + def parse_response(self, response): + # read response data from httpresponse, and parse it + # Check for new http response object, otherwise it is a file object. + if hasattr(response, 'getheader'): + if response.getheader("Content-Encoding", "") == "gzip": + stream = GzipDecodedResponse(response) + else: + stream = response + else: + stream = response + + p, u = self.getparser() + + while 1: + data = stream.read(1024) + if not data: + break + if self.verbose: + print("body:", repr(data)) + p.feed(data) + + if stream is not response: + stream.close() + p.close() + + return u.close() + +## +# Standard transport class for XML-RPC over HTTPS. + +class SafeTransport(Transport): + """Handles an HTTPS transaction to an XML-RPC server.""" + + # FIXME: mostly untested + + def make_connection(self, host): + if self._connection and host == self._connection[0]: + return self._connection[1] + + if not hasattr(http_client, "HTTPSConnection"): + raise NotImplementedError( + "your version of http.client doesn't support HTTPS") + # create a HTTPS connection object from a host descriptor + # host may be a string, or a (host, x509-dict) tuple + chost, self._extra_headers, x509 = self.get_host_info(host) + self._connection = host, http_client.HTTPSConnection(chost, + None, **(x509 or {})) + return self._connection[1] + +## +# Standard server proxy. This class establishes a virtual connection +# to an XML-RPC server. +#

+# This class is available as ServerProxy and Server. New code should +# use ServerProxy, to avoid confusion. +# +# @def ServerProxy(uri, **options) +# @param uri The connection point on the server. +# @keyparam transport A transport factory, compatible with the +# standard transport class. +# @keyparam encoding The default encoding used for 8-bit strings +# (default is UTF-8). +# @keyparam verbose Use a true value to enable debugging output. +# (printed to standard output). +# @see Transport + +class ServerProxy(object): + """uri [,options] -> a logical connection to an XML-RPC server + + uri is the connection point on the server, given as + scheme://host/target. + + The standard implementation always supports the "http" scheme. If + SSL socket support is available (Python 2.0), it also supports + "https". + + If the target part and the slash preceding it are both omitted, + "/RPC2" is assumed. + + The following options can be given as keyword arguments: + + transport: a transport factory + encoding: the request encoding (default is UTF-8) + + All 8-bit strings passed to the server proxy are assumed to use + the given encoding. + """ + + def __init__(self, uri, transport=None, encoding=None, verbose=False, + allow_none=False, use_datetime=False, use_builtin_types=False): + # establish a "logical" server connection + + # get the url + type, uri = urllib_parse.splittype(uri) + if type not in ("http", "https"): + raise IOError("unsupported XML-RPC protocol") + self.__host, self.__handler = urllib_parse.splithost(uri) + if not self.__handler: + self.__handler = "/RPC2" + + if transport is None: + if type == "https": + handler = SafeTransport + else: + handler = Transport + transport = handler(use_datetime=use_datetime, + use_builtin_types=use_builtin_types) + self.__transport = transport + + self.__encoding = encoding or 'utf-8' + self.__verbose = verbose + self.__allow_none = allow_none + + def __close(self): + self.__transport.close() + + def __request(self, methodname, params): + # call a method on the remote server + + request = dumps(params, methodname, encoding=self.__encoding, + allow_none=self.__allow_none).encode(self.__encoding) + + response = self.__transport.request( + self.__host, + self.__handler, + request, + verbose=self.__verbose + ) + + if len(response) == 1: + response = response[0] + + return response + + def __repr__(self): + return ( + "" % + (self.__host, self.__handler) + ) + + __str__ = __repr__ + + def __getattr__(self, name): + # magic method dispatcher + return _Method(self.__request, name) + + # note: to call a remote object with an non-standard name, use + # result getattr(server, "strange-python-name")(args) + + def __call__(self, attr): + """A workaround to get special attributes on the ServerProxy + without interfering with the magic __getattr__ + """ + if attr == "close": + return self.__close + elif attr == "transport": + return self.__transport + raise AttributeError("Attribute %r not found" % (attr,)) + +# compatibility + +Server = ServerProxy + +# -------------------------------------------------------------------- +# test code + +if __name__ == "__main__": + + # simple test program (from the XML-RPC specification) + + # local server, available from Lib/xmlrpc/server.py + server = ServerProxy("http://localhost:8000") + + try: + print(server.currentTime.getCurrentTime()) + except Error as v: + print("ERROR", v) + + multi = MultiCall(server) + multi.getData() + multi.pow(2,9) + multi.add(1,2) + try: + for response in multi(): + print(response) + except Error as v: + print("ERROR", v) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/server.py b/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/server.py new file mode 100644 index 0000000..28072bf --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/backports/xmlrpc/server.py @@ -0,0 +1,999 @@ +r""" +Ported using Python-Future from the Python 3.3 standard library. + +XML-RPC Servers. + +This module can be used to create simple XML-RPC servers +by creating a server and either installing functions, a +class instance, or by extending the SimpleXMLRPCServer +class. + +It can also be used to handle XML-RPC requests in a CGI +environment using CGIXMLRPCRequestHandler. + +The Doc* classes can be used to create XML-RPC servers that +serve pydoc-style documentation in response to HTTP +GET requests. This documentation is dynamically generated +based on the functions and methods registered with the +server. + +A list of possible usage patterns follows: + +1. Install functions: + +server = SimpleXMLRPCServer(("localhost", 8000)) +server.register_function(pow) +server.register_function(lambda x,y: x+y, 'add') +server.serve_forever() + +2. Install an instance: + +class MyFuncs: + def __init__(self): + # make all of the sys functions available through sys.func_name + import sys + self.sys = sys + def _listMethods(self): + # implement this method so that system.listMethods + # knows to advertise the sys methods + return list_public_methods(self) + \ + ['sys.' + method for method in list_public_methods(self.sys)] + def pow(self, x, y): return pow(x, y) + def add(self, x, y) : return x + y + +server = SimpleXMLRPCServer(("localhost", 8000)) +server.register_introspection_functions() +server.register_instance(MyFuncs()) +server.serve_forever() + +3. Install an instance with custom dispatch method: + +class Math: + def _listMethods(self): + # this method must be present for system.listMethods + # to work + return ['add', 'pow'] + def _methodHelp(self, method): + # this method must be present for system.methodHelp + # to work + if method == 'add': + return "add(2,3) => 5" + elif method == 'pow': + return "pow(x, y[, z]) => number" + else: + # By convention, return empty + # string if no help is available + return "" + def _dispatch(self, method, params): + if method == 'pow': + return pow(*params) + elif method == 'add': + return params[0] + params[1] + else: + raise ValueError('bad method') + +server = SimpleXMLRPCServer(("localhost", 8000)) +server.register_introspection_functions() +server.register_instance(Math()) +server.serve_forever() + +4. Subclass SimpleXMLRPCServer: + +class MathServer(SimpleXMLRPCServer): + def _dispatch(self, method, params): + try: + # We are forcing the 'export_' prefix on methods that are + # callable through XML-RPC to prevent potential security + # problems + func = getattr(self, 'export_' + method) + except AttributeError: + raise Exception('method "%s" is not supported' % method) + else: + return func(*params) + + def export_add(self, x, y): + return x + y + +server = MathServer(("localhost", 8000)) +server.serve_forever() + +5. CGI script: + +server = CGIXMLRPCRequestHandler() +server.register_function(pow) +server.handle_request() +""" + +from __future__ import absolute_import, division, print_function, unicode_literals +from future.builtins import int, str + +# Written by Brian Quinlan (brian@sweetapp.com). +# Based on code written by Fredrik Lundh. + +from future.backports.xmlrpc.client import Fault, dumps, loads, gzip_encode, gzip_decode +from future.backports.http.server import BaseHTTPRequestHandler +import future.backports.http.server as http_server +from future.backports import socketserver +import sys +import os +import re +import pydoc +import inspect +import traceback +try: + import fcntl +except ImportError: + fcntl = None + +def resolve_dotted_attribute(obj, attr, allow_dotted_names=True): + """resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d + + Resolves a dotted attribute name to an object. Raises + an AttributeError if any attribute in the chain starts with a '_'. + + If the optional allow_dotted_names argument is false, dots are not + supported and this function operates similar to getattr(obj, attr). + """ + + if allow_dotted_names: + attrs = attr.split('.') + else: + attrs = [attr] + + for i in attrs: + if i.startswith('_'): + raise AttributeError( + 'attempt to access private attribute "%s"' % i + ) + else: + obj = getattr(obj,i) + return obj + +def list_public_methods(obj): + """Returns a list of attribute strings, found in the specified + object, which represent callable attributes""" + + return [member for member in dir(obj) + if not member.startswith('_') and + callable(getattr(obj, member))] + +class SimpleXMLRPCDispatcher(object): + """Mix-in class that dispatches XML-RPC requests. + + This class is used to register XML-RPC method handlers + and then to dispatch them. This class doesn't need to be + instanced directly when used by SimpleXMLRPCServer but it + can be instanced when used by the MultiPathXMLRPCServer + """ + + def __init__(self, allow_none=False, encoding=None, + use_builtin_types=False): + self.funcs = {} + self.instance = None + self.allow_none = allow_none + self.encoding = encoding or 'utf-8' + self.use_builtin_types = use_builtin_types + + def register_instance(self, instance, allow_dotted_names=False): + """Registers an instance to respond to XML-RPC requests. + + Only one instance can be installed at a time. + + If the registered instance has a _dispatch method then that + method will be called with the name of the XML-RPC method and + its parameters as a tuple + e.g. instance._dispatch('add',(2,3)) + + If the registered instance does not have a _dispatch method + then the instance will be searched to find a matching method + and, if found, will be called. Methods beginning with an '_' + are considered private and will not be called by + SimpleXMLRPCServer. + + If a registered function matches a XML-RPC request, then it + will be called instead of the registered instance. + + If the optional allow_dotted_names argument is true and the + instance does not have a _dispatch method, method names + containing dots are supported and resolved, as long as none of + the name segments start with an '_'. + + *** SECURITY WARNING: *** + + Enabling the allow_dotted_names options allows intruders + to access your module's global variables and may allow + intruders to execute arbitrary code on your machine. Only + use this option on a secure, closed network. + + """ + + self.instance = instance + self.allow_dotted_names = allow_dotted_names + + def register_function(self, function, name=None): + """Registers a function to respond to XML-RPC requests. + + The optional name argument can be used to set a Unicode name + for the function. + """ + + if name is None: + name = function.__name__ + self.funcs[name] = function + + def register_introspection_functions(self): + """Registers the XML-RPC introspection methods in the system + namespace. + + see http://xmlrpc.usefulinc.com/doc/reserved.html + """ + + self.funcs.update({'system.listMethods' : self.system_listMethods, + 'system.methodSignature' : self.system_methodSignature, + 'system.methodHelp' : self.system_methodHelp}) + + def register_multicall_functions(self): + """Registers the XML-RPC multicall method in the system + namespace. + + see http://www.xmlrpc.com/discuss/msgReader$1208""" + + self.funcs.update({'system.multicall' : self.system_multicall}) + + def _marshaled_dispatch(self, data, dispatch_method = None, path = None): + """Dispatches an XML-RPC method from marshalled (XML) data. + + XML-RPC methods are dispatched from the marshalled (XML) data + using the _dispatch method and the result is returned as + marshalled data. For backwards compatibility, a dispatch + function can be provided as an argument (see comment in + SimpleXMLRPCRequestHandler.do_POST) but overriding the + existing method through subclassing is the preferred means + of changing method dispatch behavior. + """ + + try: + params, method = loads(data, use_builtin_types=self.use_builtin_types) + + # generate response + if dispatch_method is not None: + response = dispatch_method(method, params) + else: + response = self._dispatch(method, params) + # wrap response in a singleton tuple + response = (response,) + response = dumps(response, methodresponse=1, + allow_none=self.allow_none, encoding=self.encoding) + except Fault as fault: + response = dumps(fault, allow_none=self.allow_none, + encoding=self.encoding) + except: + # report exception back to server + exc_type, exc_value, exc_tb = sys.exc_info() + response = dumps( + Fault(1, "%s:%s" % (exc_type, exc_value)), + encoding=self.encoding, allow_none=self.allow_none, + ) + + return response.encode(self.encoding) + + def system_listMethods(self): + """system.listMethods() => ['add', 'subtract', 'multiple'] + + Returns a list of the methods supported by the server.""" + + methods = set(self.funcs.keys()) + if self.instance is not None: + # Instance can implement _listMethod to return a list of + # methods + if hasattr(self.instance, '_listMethods'): + methods |= set(self.instance._listMethods()) + # if the instance has a _dispatch method then we + # don't have enough information to provide a list + # of methods + elif not hasattr(self.instance, '_dispatch'): + methods |= set(list_public_methods(self.instance)) + return sorted(methods) + + def system_methodSignature(self, method_name): + """system.methodSignature('add') => [double, int, int] + + Returns a list describing the signature of the method. In the + above example, the add method takes two integers as arguments + and returns a double result. + + This server does NOT support system.methodSignature.""" + + # See http://xmlrpc.usefulinc.com/doc/sysmethodsig.html + + return 'signatures not supported' + + def system_methodHelp(self, method_name): + """system.methodHelp('add') => "Adds two integers together" + + Returns a string containing documentation for the specified method.""" + + method = None + if method_name in self.funcs: + method = self.funcs[method_name] + elif self.instance is not None: + # Instance can implement _methodHelp to return help for a method + if hasattr(self.instance, '_methodHelp'): + return self.instance._methodHelp(method_name) + # if the instance has a _dispatch method then we + # don't have enough information to provide help + elif not hasattr(self.instance, '_dispatch'): + try: + method = resolve_dotted_attribute( + self.instance, + method_name, + self.allow_dotted_names + ) + except AttributeError: + pass + + # Note that we aren't checking that the method actually + # be a callable object of some kind + if method is None: + return "" + else: + return pydoc.getdoc(method) + + def system_multicall(self, call_list): + """system.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => \ +[[4], ...] + + Allows the caller to package multiple XML-RPC calls into a single + request. + + See http://www.xmlrpc.com/discuss/msgReader$1208 + """ + + results = [] + for call in call_list: + method_name = call['methodName'] + params = call['params'] + + try: + # XXX A marshalling error in any response will fail the entire + # multicall. If someone cares they should fix this. + results.append([self._dispatch(method_name, params)]) + except Fault as fault: + results.append( + {'faultCode' : fault.faultCode, + 'faultString' : fault.faultString} + ) + except: + exc_type, exc_value, exc_tb = sys.exc_info() + results.append( + {'faultCode' : 1, + 'faultString' : "%s:%s" % (exc_type, exc_value)} + ) + return results + + def _dispatch(self, method, params): + """Dispatches the XML-RPC method. + + XML-RPC calls are forwarded to a registered function that + matches the called XML-RPC method name. If no such function + exists then the call is forwarded to the registered instance, + if available. + + If the registered instance has a _dispatch method then that + method will be called with the name of the XML-RPC method and + its parameters as a tuple + e.g. instance._dispatch('add',(2,3)) + + If the registered instance does not have a _dispatch method + then the instance will be searched to find a matching method + and, if found, will be called. + + Methods beginning with an '_' are considered private and will + not be called. + """ + + func = None + try: + # check to see if a matching function has been registered + func = self.funcs[method] + except KeyError: + if self.instance is not None: + # check for a _dispatch method + if hasattr(self.instance, '_dispatch'): + return self.instance._dispatch(method, params) + else: + # call instance method directly + try: + func = resolve_dotted_attribute( + self.instance, + method, + self.allow_dotted_names + ) + except AttributeError: + pass + + if func is not None: + return func(*params) + else: + raise Exception('method "%s" is not supported' % method) + +class SimpleXMLRPCRequestHandler(BaseHTTPRequestHandler): + """Simple XML-RPC request handler class. + + Handles all HTTP POST requests and attempts to decode them as + XML-RPC requests. + """ + + # Class attribute listing the accessible path components; + # paths not on this list will result in a 404 error. + rpc_paths = ('/', '/RPC2') + + #if not None, encode responses larger than this, if possible + encode_threshold = 1400 #a common MTU + + #Override form StreamRequestHandler: full buffering of output + #and no Nagle. + wbufsize = -1 + disable_nagle_algorithm = True + + # a re to match a gzip Accept-Encoding + aepattern = re.compile(r""" + \s* ([^\s;]+) \s* #content-coding + (;\s* q \s*=\s* ([0-9\.]+))? #q + """, re.VERBOSE | re.IGNORECASE) + + def accept_encodings(self): + r = {} + ae = self.headers.get("Accept-Encoding", "") + for e in ae.split(","): + match = self.aepattern.match(e) + if match: + v = match.group(3) + v = float(v) if v else 1.0 + r[match.group(1)] = v + return r + + def is_rpc_path_valid(self): + if self.rpc_paths: + return self.path in self.rpc_paths + else: + # If .rpc_paths is empty, just assume all paths are legal + return True + + def do_POST(self): + """Handles the HTTP POST request. + + Attempts to interpret all HTTP POST requests as XML-RPC calls, + which are forwarded to the server's _dispatch method for handling. + """ + + # Check that the path is legal + if not self.is_rpc_path_valid(): + self.report_404() + return + + try: + # Get arguments by reading body of request. + # We read this in chunks to avoid straining + # socket.read(); around the 10 or 15Mb mark, some platforms + # begin to have problems (bug #792570). + max_chunk_size = 10*1024*1024 + size_remaining = int(self.headers["content-length"]) + L = [] + while size_remaining: + chunk_size = min(size_remaining, max_chunk_size) + chunk = self.rfile.read(chunk_size) + if not chunk: + break + L.append(chunk) + size_remaining -= len(L[-1]) + data = b''.join(L) + + data = self.decode_request_content(data) + if data is None: + return #response has been sent + + # In previous versions of SimpleXMLRPCServer, _dispatch + # could be overridden in this class, instead of in + # SimpleXMLRPCDispatcher. To maintain backwards compatibility, + # check to see if a subclass implements _dispatch and dispatch + # using that method if present. + response = self.server._marshaled_dispatch( + data, getattr(self, '_dispatch', None), self.path + ) + except Exception as e: # This should only happen if the module is buggy + # internal error, report as HTTP server error + self.send_response(500) + + # Send information about the exception if requested + if hasattr(self.server, '_send_traceback_header') and \ + self.server._send_traceback_header: + self.send_header("X-exception", str(e)) + trace = traceback.format_exc() + trace = str(trace.encode('ASCII', 'backslashreplace'), 'ASCII') + self.send_header("X-traceback", trace) + + self.send_header("Content-length", "0") + self.end_headers() + else: + self.send_response(200) + self.send_header("Content-type", "text/xml") + if self.encode_threshold is not None: + if len(response) > self.encode_threshold: + q = self.accept_encodings().get("gzip", 0) + if q: + try: + response = gzip_encode(response) + self.send_header("Content-Encoding", "gzip") + except NotImplementedError: + pass + self.send_header("Content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + + def decode_request_content(self, data): + #support gzip encoding of request + encoding = self.headers.get("content-encoding", "identity").lower() + if encoding == "identity": + return data + if encoding == "gzip": + try: + return gzip_decode(data) + except NotImplementedError: + self.send_response(501, "encoding %r not supported" % encoding) + except ValueError: + self.send_response(400, "error decoding gzip content") + else: + self.send_response(501, "encoding %r not supported" % encoding) + self.send_header("Content-length", "0") + self.end_headers() + + def report_404 (self): + # Report a 404 error + self.send_response(404) + response = b'No such page' + self.send_header("Content-type", "text/plain") + self.send_header("Content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + + def log_request(self, code='-', size='-'): + """Selectively log an accepted request.""" + + if self.server.logRequests: + BaseHTTPRequestHandler.log_request(self, code, size) + +class SimpleXMLRPCServer(socketserver.TCPServer, + SimpleXMLRPCDispatcher): + """Simple XML-RPC server. + + Simple XML-RPC server that allows functions and a single instance + to be installed to handle requests. The default implementation + attempts to dispatch XML-RPC calls to the functions or instance + installed in the server. Override the _dispatch method inherited + from SimpleXMLRPCDispatcher to change this behavior. + """ + + allow_reuse_address = True + + # Warning: this is for debugging purposes only! Never set this to True in + # production code, as will be sending out sensitive information (exception + # and stack trace details) when exceptions are raised inside + # SimpleXMLRPCRequestHandler.do_POST + _send_traceback_header = False + + def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler, + logRequests=True, allow_none=False, encoding=None, + bind_and_activate=True, use_builtin_types=False): + self.logRequests = logRequests + + SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding, use_builtin_types) + socketserver.TCPServer.__init__(self, addr, requestHandler, bind_and_activate) + + # [Bug #1222790] If possible, set close-on-exec flag; if a + # method spawns a subprocess, the subprocess shouldn't have + # the listening socket open. + if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'): + flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD) + flags |= fcntl.FD_CLOEXEC + fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags) + +class MultiPathXMLRPCServer(SimpleXMLRPCServer): + """Multipath XML-RPC Server + This specialization of SimpleXMLRPCServer allows the user to create + multiple Dispatcher instances and assign them to different + HTTP request paths. This makes it possible to run two or more + 'virtual XML-RPC servers' at the same port. + Make sure that the requestHandler accepts the paths in question. + """ + def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler, + logRequests=True, allow_none=False, encoding=None, + bind_and_activate=True, use_builtin_types=False): + + SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests, allow_none, + encoding, bind_and_activate, use_builtin_types) + self.dispatchers = {} + self.allow_none = allow_none + self.encoding = encoding or 'utf-8' + + def add_dispatcher(self, path, dispatcher): + self.dispatchers[path] = dispatcher + return dispatcher + + def get_dispatcher(self, path): + return self.dispatchers[path] + + def _marshaled_dispatch(self, data, dispatch_method = None, path = None): + try: + response = self.dispatchers[path]._marshaled_dispatch( + data, dispatch_method, path) + except: + # report low level exception back to server + # (each dispatcher should have handled their own + # exceptions) + exc_type, exc_value = sys.exc_info()[:2] + response = dumps( + Fault(1, "%s:%s" % (exc_type, exc_value)), + encoding=self.encoding, allow_none=self.allow_none) + response = response.encode(self.encoding) + return response + +class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): + """Simple handler for XML-RPC data passed through CGI.""" + + def __init__(self, allow_none=False, encoding=None, use_builtin_types=False): + SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding, use_builtin_types) + + def handle_xmlrpc(self, request_text): + """Handle a single XML-RPC request""" + + response = self._marshaled_dispatch(request_text) + + print('Content-Type: text/xml') + print('Content-Length: %d' % len(response)) + print() + sys.stdout.flush() + sys.stdout.buffer.write(response) + sys.stdout.buffer.flush() + + def handle_get(self): + """Handle a single HTTP GET request. + + Default implementation indicates an error because + XML-RPC uses the POST method. + """ + + code = 400 + message, explain = BaseHTTPRequestHandler.responses[code] + + response = http_server.DEFAULT_ERROR_MESSAGE % \ + { + 'code' : code, + 'message' : message, + 'explain' : explain + } + response = response.encode('utf-8') + print('Status: %d %s' % (code, message)) + print('Content-Type: %s' % http_server.DEFAULT_ERROR_CONTENT_TYPE) + print('Content-Length: %d' % len(response)) + print() + sys.stdout.flush() + sys.stdout.buffer.write(response) + sys.stdout.buffer.flush() + + def handle_request(self, request_text=None): + """Handle a single XML-RPC request passed through a CGI post method. + + If no XML data is given then it is read from stdin. The resulting + XML-RPC response is printed to stdout along with the correct HTTP + headers. + """ + + if request_text is None and \ + os.environ.get('REQUEST_METHOD', None) == 'GET': + self.handle_get() + else: + # POST data is normally available through stdin + try: + length = int(os.environ.get('CONTENT_LENGTH', None)) + except (ValueError, TypeError): + length = -1 + if request_text is None: + request_text = sys.stdin.read(length) + + self.handle_xmlrpc(request_text) + + +# ----------------------------------------------------------------------------- +# Self documenting XML-RPC Server. + +class ServerHTMLDoc(pydoc.HTMLDoc): + """Class used to generate pydoc HTML document for a server""" + + def markup(self, text, escape=None, funcs={}, classes={}, methods={}): + """Mark up some plain text, given a context of symbols to look for. + Each context dictionary maps object names to anchor names.""" + escape = escape or self.escape + results = [] + here = 0 + + # XXX Note that this regular expression does not allow for the + # hyperlinking of arbitrary strings being used as method + # names. Only methods with names consisting of word characters + # and '.'s are hyperlinked. + pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|' + r'RFC[- ]?(\d+)|' + r'PEP[- ]?(\d+)|' + r'(self\.)?((?:\w|\.)+))\b') + while 1: + match = pattern.search(text, here) + if not match: break + start, end = match.span() + results.append(escape(text[here:start])) + + all, scheme, rfc, pep, selfdot, name = match.groups() + if scheme: + url = escape(all).replace('"', '"') + results.append('%s' % (url, url)) + elif rfc: + url = 'http://www.rfc-editor.org/rfc/rfc%d.txt' % int(rfc) + results.append('%s' % (url, escape(all))) + elif pep: + url = 'http://www.python.org/dev/peps/pep-%04d/' % int(pep) + results.append('%s' % (url, escape(all))) + elif text[end:end+1] == '(': + results.append(self.namelink(name, methods, funcs, classes)) + elif selfdot: + results.append('self.%s' % name) + else: + results.append(self.namelink(name, classes)) + here = end + results.append(escape(text[here:])) + return ''.join(results) + + def docroutine(self, object, name, mod=None, + funcs={}, classes={}, methods={}, cl=None): + """Produce HTML documentation for a function or method object.""" + + anchor = (cl and cl.__name__ or '') + '-' + name + note = '' + + title = '%s' % ( + self.escape(anchor), self.escape(name)) + + if inspect.ismethod(object): + args = inspect.getfullargspec(object) + # exclude the argument bound to the instance, it will be + # confusing to the non-Python user + argspec = inspect.formatargspec ( + args.args[1:], + args.varargs, + args.varkw, + args.defaults, + annotations=args.annotations, + formatvalue=self.formatvalue + ) + elif inspect.isfunction(object): + args = inspect.getfullargspec(object) + argspec = inspect.formatargspec( + args.args, args.varargs, args.varkw, args.defaults, + annotations=args.annotations, + formatvalue=self.formatvalue) + else: + argspec = '(...)' + + if isinstance(object, tuple): + argspec = object[0] or argspec + docstring = object[1] or "" + else: + docstring = pydoc.getdoc(object) + + decl = title + argspec + (note and self.grey( + '%s' % note)) + + doc = self.markup( + docstring, self.preformat, funcs, classes, methods) + doc = doc and '

o~0CR;6z9a3$J$)f$dFVO8+0c)!JLIukPrd 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", ">",) + +# used in User-Agent header sent +__version__ = sys.version[:3] + +# xmlrpc integer limits +MAXINT = 2**31-1 +MININT = -2**31 + +# -------------------------------------------------------------------- +# Error constants (from Dan Libby's specification at +# http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php) + +# Ranges of errors +PARSE_ERROR = -32700 +SERVER_ERROR = -32600 +APPLICATION_ERROR = -32500 +SYSTEM_ERROR = -32400 +TRANSPORT_ERROR = -32300 + +# Specific errors +NOT_WELLFORMED_ERROR = -32700 +UNSUPPORTED_ENCODING = -32701 +INVALID_ENCODING_CHAR = -32702 +INVALID_XMLRPC = -32600 +METHOD_NOT_FOUND = -32601 +INVALID_METHOD_PARAMS = -32602 +INTERNAL_ERROR = -32603 + +# -------------------------------------------------------------------- +# Exceptions + +## +# Base class for all kinds of client-side errors. + +class Error(Exception): + """Base class for client errors.""" + def __str__(self): + return repr(self) + +## +# Indicates an HTTP-level protocol error. This is raised by the HTTP +# transport layer, if the server returns an error code other than 200 +# (OK). +# +# @param url The target URL. +# @param errcode The HTTP error code. +# @param errmsg The HTTP error message. +# @param headers The HTTP header dictionary. + +class ProtocolError(Error): + """Indicates an HTTP protocol error.""" + def __init__(self, url, errcode, errmsg, headers): + Error.__init__(self) + self.url = url + self.errcode = errcode + self.errmsg = errmsg + self.headers = headers + def __repr__(self): + return ( + "" % + (self.url, self.errcode, self.errmsg) + ) + +## +# Indicates a broken XML-RPC response package. This exception is +# raised by the unmarshalling layer, if the XML-RPC response is +# malformed. + +class ResponseError(Error): + """Indicates a broken response package.""" + pass + +## +# Indicates an XML-RPC fault response package. This exception is +# raised by the unmarshalling layer, if the XML-RPC response contains +# a fault string. This exception can also be used as a class, to +# generate a fault XML-RPC message. +# +# @param faultCode The XML-RPC fault code. +# @param faultString The XML-RPC fault string. + +class Fault(Error): + """Indicates an XML-RPC fault package.""" + def __init__(self, faultCode, faultString, **extra): + Error.__init__(self) + self.faultCode = faultCode + self.faultString = faultString + def __repr__(self): + return "" % (ensure_new_type(self.faultCode), + ensure_new_type(self.faultString)) + +# -------------------------------------------------------------------- +# Special values + +## +# Backwards compatibility + +boolean = Boolean = bool + +## +# Wrapper for XML-RPC DateTime values. This converts a time value to +# the format used by XML-RPC. +#

%s
' % doc + return '
%s
%s
\n' % (decl, doc) + + def docserver(self, server_name, package_documentation, methods): + """Produce HTML documentation for an XML-RPC server.""" + + fdict = {} + for key, value in methods.items(): + fdict[key] = '#-' + key + fdict[value] = fdict[key] + + server_name = self.escape(server_name) + head = '%s' % server_name + result = self.heading(head, '#ffffff', '#7799ee') + + doc = self.markup(package_documentation, self.preformat, fdict) + doc = doc and '%s' % doc + result = result + '

%s

\n' % doc + + contents = [] + method_items = sorted(methods.items()) + for key, value in method_items: + contents.append(self.docroutine(value, key, funcs=fdict)) + result = result + self.bigsection( + 'Methods', '#ffffff', '#eeaa77', ''.join(contents)) + + return result + +class XMLRPCDocGenerator(object): + """Generates documentation for an XML-RPC server. + + This class is designed as mix-in and should not + be constructed directly. + """ + + def __init__(self): + # setup variables used for HTML documentation + self.server_name = 'XML-RPC Server Documentation' + self.server_documentation = \ + "This server exports the following methods through the XML-RPC "\ + "protocol." + self.server_title = 'XML-RPC Server Documentation' + + def set_server_title(self, server_title): + """Set the HTML title of the generated server documentation""" + + self.server_title = server_title + + def set_server_name(self, server_name): + """Set the name of the generated HTML server documentation""" + + self.server_name = server_name + + def set_server_documentation(self, server_documentation): + """Set the documentation string for the entire server.""" + + self.server_documentation = server_documentation + + def generate_html_documentation(self): + """generate_html_documentation() => html documentation for the server + + Generates HTML documentation for the server using introspection for + installed functions and instances that do not implement the + _dispatch method. Alternatively, instances can choose to implement + the _get_method_argstring(method_name) method to provide the + argument string used in the documentation and the + _methodHelp(method_name) method to provide the help text used + in the documentation.""" + + methods = {} + + for method_name in self.system_listMethods(): + if method_name in self.funcs: + method = self.funcs[method_name] + elif self.instance is not None: + method_info = [None, None] # argspec, documentation + if hasattr(self.instance, '_get_method_argstring'): + method_info[0] = self.instance._get_method_argstring(method_name) + if hasattr(self.instance, '_methodHelp'): + method_info[1] = self.instance._methodHelp(method_name) + + method_info = tuple(method_info) + if method_info != (None, None): + method = method_info + elif not hasattr(self.instance, '_dispatch'): + try: + method = resolve_dotted_attribute( + self.instance, + method_name + ) + except AttributeError: + method = method_info + else: + method = method_info + else: + assert 0, "Could not find method in self.functions and no "\ + "instance installed" + + methods[method_name] = method + + documenter = ServerHTMLDoc() + documentation = documenter.docserver( + self.server_name, + self.server_documentation, + methods + ) + + return documenter.page(self.server_title, documentation) + +class DocXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): + """XML-RPC and documentation request handler class. + + Handles all HTTP POST requests and attempts to decode them as + XML-RPC requests. + + Handles all HTTP GET requests and interprets them as requests + for documentation. + """ + + def do_GET(self): + """Handles the HTTP GET request. + + Interpret all HTTP GET requests as requests for server + documentation. + """ + # Check that the path is legal + if not self.is_rpc_path_valid(): + self.report_404() + return + + response = self.server.generate_html_documentation().encode('utf-8') + self.send_response(200) + self.send_header("Content-type", "text/html") + self.send_header("Content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + +class DocXMLRPCServer( SimpleXMLRPCServer, + XMLRPCDocGenerator): + """XML-RPC and HTML documentation server. + + Adds the ability to serve server documentation to the capabilities + of SimpleXMLRPCServer. + """ + + def __init__(self, addr, requestHandler=DocXMLRPCRequestHandler, + logRequests=True, allow_none=False, encoding=None, + bind_and_activate=True, use_builtin_types=False): + SimpleXMLRPCServer.__init__(self, addr, requestHandler, logRequests, + allow_none, encoding, bind_and_activate, + use_builtin_types) + XMLRPCDocGenerator.__init__(self) + +class DocCGIXMLRPCRequestHandler( CGIXMLRPCRequestHandler, + XMLRPCDocGenerator): + """Handler for XML-RPC data and documentation requests passed through + CGI""" + + def handle_get(self): + """Handles the HTTP GET request. + + Interpret all HTTP GET requests as requests for server + documentation. + """ + + response = self.generate_html_documentation().encode('utf-8') + + print('Content-Type: text/html') + print('Content-Length: %d' % len(response)) + print() + sys.stdout.flush() + sys.stdout.buffer.write(response) + sys.stdout.buffer.flush() + + def __init__(self): + CGIXMLRPCRequestHandler.__init__(self) + XMLRPCDocGenerator.__init__(self) + + +if __name__ == '__main__': + import datetime + + class ExampleService: + def getData(self): + return '42' + + class currentTime: + @staticmethod + def getCurrentTime(): + return datetime.datetime.now() + + server = SimpleXMLRPCServer(("localhost", 8000)) + server.register_function(pow) + server.register_function(lambda x,y: x+y, 'add') + server.register_instance(ExampleService(), allow_dotted_names=True) + server.register_multicall_functions() + print('Serving XML-RPC on localhost port 8000') + print('It is advisable to run this example server within a secure, closed network.') + try: + server.serve_forever() + except KeyboardInterrupt: + print("\nKeyboard interrupt received, exiting.") + server.server_close() + sys.exit(0) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__init__.py new file mode 100644 index 0000000..8bc1649 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__init__.py @@ -0,0 +1,51 @@ +""" +A module that brings in equivalents of the new and modified Python 3 +builtins into Py2. Has no effect on Py3. + +See the docs `here `_ +(``docs/what-else.rst``) for more information. + +""" + +from future.builtins.iterators import (filter, map, zip) +# The isinstance import is no longer needed. We provide it only for +# backward-compatibility with future v0.8.2. It will be removed in future v1.0. +from future.builtins.misc import (ascii, chr, hex, input, isinstance, next, + oct, open, pow, round, super, max, min) +from future.utils import PY3 + +if PY3: + import builtins + bytes = builtins.bytes + dict = builtins.dict + int = builtins.int + list = builtins.list + object = builtins.object + range = builtins.range + str = builtins.str + __all__ = [] +else: + from future.types import (newbytes as bytes, + newdict as dict, + newint as int, + newlist as list, + newobject as object, + newrange as range, + newstr as str) +from future import utils + + +if not utils.PY3: + # We only import names that shadow the builtins on Py2. No other namespace + # pollution on Py2. + + # Only shadow builtins on Py2; no new names + __all__ = ['filter', 'map', 'zip', + 'ascii', 'chr', 'hex', 'input', 'next', 'oct', 'open', 'pow', + 'round', 'super', + 'bytes', 'dict', 'int', 'list', 'object', 'range', 'str', 'max', 'min' + ] + +else: + # No namespace pollution on Py3 + __all__ = [] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38244f65dc07370bfa85118f60e4d3cbf0104a70 GIT binary patch literal 1257 zcmaKs&u=0(6vtm<)B%UOw3N7_1SR2tCw%Z-JLe^V2q6?@D2obIL=~zcf=C>}k*GmU)S)gK&=ALP zESk_1CvYN8;dGztCugDsE!SZ!^)uEAk~Xwi`@RDmWEZ-~9`ulX=pzR(Kn`Ju9KmSq zz`4A{yfC>C&!8g+bj5S%iBF&}K81m}grWEhMtiMt@44Gw|;cTTldP>h|i?(Tpc4?3H>3|ODh@P)IsN`Ec8oY7F7w>Q#G2eG zF4sBXlCXCL{~=D8)Hz94xXOrRTM|oZ6ZncVN^W<0lS*{}-W_-yWwDHoVHh!8hX}m1mnn0z6q$bFV>`?Oo z3v)Skjd%Oq^|#})sbH_}cADj;j3df1Kg0pHXFrkfT$?IRq<8n&o_)BA<(loIa;>mb zP-vdys)QR*o`r7_Sl}IZRN10p5m_8r)GX>24U1!h2@XE|y$R1c@b~iJqjqo*_E1$d zZPp25{L+-?b8Pi|4*kayc{=1N$4-!%sPrIvS7s+D}V;)efzN|)uDR|!J5>H2Oj_#1*mRW|?t literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/disabled.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/disabled.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..209d39f0a8462a874fbf54f51ec39a20c39411be GIT binary patch literal 2331 zcmah~TW{P%6t?%4jhju|P;Px;B#_9W?WRilR6<27`cSD#D-r~(1m20~?0S;%j5{;# zW=s1*D#2et{3E~e#9sg*amKf7S|luaY>#KotgHu3#S zyv<7-m^bm5&sxGyT9a1Np0tzBq~p7}w&*6kNe|yUtjl_AjrG|&3)mI5!3J!TU1itU z_4(#xjcu`aUVD>1^iI}|J-Z2OUwJ=lO#{qaYK&<7;>C(VYwu;Oh%R~X~;H}j3@~N<+N9Ek)qW=Iw>k77bK z1R4_c92l8tm5`@P8{?wA@!mKnttX0Q0*LbihR-Fgw2B-9$qc>R0y{ikhC=6l3Fl9nKhzSVrdXSH71Xw zvEUppfShCo_h`W7M8aaFf(vfrz`9oPFoYO#Pg1{EB)D;d^xQ9%1 z%&4*+j>&z2yFE$3gHX zYOptK=Y7VXbC*|sl{(?bEQBT2`DUuoXIMu#^z&|JxiERR5Rbea#Tthso%BitK_#vf zB=0x{$-6}p1TUExg;+ZLZ{S+RS#U>}$_b;s1)pPt`t^AL zVWV12PuClMy8Ws+X3FD?9SmFfdZSx;54oIBi<2Fy=O*u+F5DAq+HtD*oA=lLj!n{? zl&7~cnWAI^yM+n|;?|uzi&AsMO)9>TbVN1V<5B;GViV44*_y8yJ>u;I4jnf8CaL?;(^z==99t;QhS{O1F zg<&3q=+Mbc7-|=acAU{}J>pRO&|UnPTz~T5@X6zcM-RgX-#mJJ^yuKQu$8x;e!rJ@ zXAYRWR|f2iV;7@A7v9QHMA+Xi731C~_|v#lI;|V6jrN8g_(8ir=;3qA@3sB~IO^&r literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/iterators.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/iterators.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..461acc15c33ef71f55a03ef725775dd10996d6d6 GIT binary patch literal 1486 zcmZux%aY?X6m{afTBN(Dr-v;is;DCAa*~zK-z$>^KCyVr`|(v{A5Lu?(dDv+yj&7*uTe8@4wIY} z2Mf$#k?-30FQb#A$INJfn$Hf|Q?`1jE3MZppwI2egB)SeopATmO0n|rZCQA)IrYdv ziK7iI{>cfP&s}4S$Z}ajn|eM?_u+vdo`@d4N)6OyG~ zamp_rT@}l@E!c|Fv~(2JhGINYXwb{&rftZhU?fSHlu1G-@3_%8Oi$hg)LJ^B)fDY{ zzwrQ2Ghou{4^gy&kRmnA?7_OxcyiSE|FWdBS&R25iwFY3%Y$kY&+osH=_5B5_(3Nby~*!D`URuL{xKs^6@IXz=t|HB6FBuacxfeGlXl(?wo`%OWuT zBCF2Yt|L-?2^d^>K^4CF@wOU@Cb${;rJg_vGlCh95BG)J7u=cwmdsgm1ep!-CX&}Z ztwzU!{~DN&{YgLk_0_`V#i9_!tW;3R1J7ot6PL4BuXby@|LI}Tq*xri7p<)4#l9MS h*<5p9e~MuC6AZoXv+k%f?hZQsJH~T?c{3Yy{s9UN(g6Sf literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/misc.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/misc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1266db0187609588cc989b9d220405a2344343cb GIT binary patch literal 3028 zcmb7G-EJGl72aL`h+319B`c9F$M(drYSNIXKr({FD1tPFgCsBvA#&n)i(Q$Ii6!%!a1&}|3Fd+t5MCX*|b^>>(P?8 z6g9j?wCpV#SuJ#- zjjnlHhIhm3(L3G^!(Re_)4OH(X2_y)1)kiQgC)SOUFsf4%i@*VJc(o z$~a9R-tV%{ea+&8iQ!NLDTCJG?4awqPsU=d&4yVVq%w&$^Obnuy1T63_jMp;zt7r3 zl|;1DT@Af7Q=&INq;$4p^vB}tS7;|e`YW`9u_Eo4C@=)q?`N?rR!mU)gWWM=Qz zwUs~Z%@;2k#Ny282Ywi8?Aq&*q}RiVa>!)L#F^Bo-eDrt0_&xIBmg-t&P*mE{<(uP z>C!?0dFh?bCc?xr@Pm^{qL7dwB?RC`{zwMwT&QH%SEDRKvYAnDcNPgUNUJ1^IUN^^ zDZBltAD;*X`>#lhg1OBGV(g!yKol!;cTl()`6fkV#>LRjLYzLKyf5^+_e)J_;`s$l zx8Ii<#g_VUAP6qhPpA_XWJOO2WdVF#3Xf12O|4QpytsTgIOwcmpxo`BGq8ochnpG z{-VIzoqiv_J@r+Ld^}*E&gOXUFc}dd5ElWK?S4;*C^;4So^d@17ahGn5Adb`KvpUN za7}WlUdw(oB}+hSe<;#fmpvf}rFI8EE<^2NZ6wm-@TBzQb*u;}YWRM?Xm&hDax_le z1fZ&^#5SSuIR)=CEs$!Ykey~>ERT~G7aE`2k!+Pb&dTPZF zs#aP%an;{#i+-j4Ur3AFn-^?~r^4=;6+7Qr9J_TY=l^n9c>#m=8FKlD9d`c54%_{h z#aT2E%3WwYr8ZBesGD-S(MWxzo6hdtL)EfEajb;6pt{)RRg*T^bl5gK-@)4~#SooQ zx+AJByzyipX^gf-chogA2teyjcd^+F@V;_A?$mSlASk0?p5|8rb-qFLyPri8k z@KN4ev>d|D-EaIb6AzV26bi*Y%k5cipZ~*Bn=t*_+78ZWd240R`Wkj)e$! z@86#e_3XQoy`s_f=5N)#Na~ZDuN*$x z&mEZ(uHPKOLXWpA{35VCt`eBUW`k%1);ZD?Ao2f&@H=3EtAQ0 zQn~sD6%&baNrzy1qmBtvQBSEGq;vfZ`}7ch4?w6Usof+(-@fV=8C)q1(%A&>062y+ zDoUfC3~0zHd^cMJ9=;&}USl4Fw|w~Q;C}D$(bq?&8ZMBlWYPF-@dEhxE}rz4AXTSX nsoPC^!@g`cD)k1Q@l^hty3@S5Vy{;kc76VH791p{+}QjCTCanT literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/new_min_max.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/new_min_max.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b7bb85b7635d3bf17c1679f46f5c00fe45261e0 GIT binary patch literal 1531 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 H?H&9F2KM_9 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/newsuper.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/__pycache__/newsuper.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7ec126c7a7e923174b00eafd651944df34809e9 GIT binary patch literal 2823 zcmZ8j&2QYs73YxL6-9kmbzK)Jf@a_pu@;q9fF1N;1WoPMMV%Oq5F2r{K*Ms$;VyUi z<(Z*YG**`?=&eQ2L(x-_Yf+%^r9l3Y9(e7^|3Y)=?+tflH6%D3&b;?~Z{8>G?(FzG z|M>QcJA0P(AM48HVEzj{>US7oYh=YNwlkL7Bb(9O$()gcx0|_nZ`3nuy{w;aj5cy_ zg@kZ=@$woWzX6%1yjdo*i!baC(=czT=3a74R`Ol`Q;&~a@ znc$TyPt#Z^9`ZsgR9y+VKj2ASL^>@Co)-ML(NoOsa6Jt*&(l1O6z0Moi)nb8mbK(% z!q=Q{814@FBh4WR=;@>oG1ny@3tlTsL&cLa%gTki=ldL2BFmfyK~n2liXh-=UX@bw zI6X}j6glAGSe03=MbPaWK=ZWFVCXb`1JXeZ$90YsyQ9`2Hhf7{b<9+z1D){B)O3VceqR zB1uG~hkoa7_+cE9DiIqcDSe2K>_o8h!Wkxb@CZ+M2-@%@Kqk&u;!yUD=>58$|rl!p5z#_+d3 zNqB@XQsRI&Wz8d~pmdsLa8H$`QL3|sSL7N57ktMEfe)k= za$%i)<#+}@Bn^>^GZ7*Fkvm-o^VKdiSWMGs3Yjpip#=sB5i!zc74JA|HeYMdae_Js za#H=(va}S5Z zTmEa5G;6@xYu`!TCs^D5_3Dhzno11p);T`8+q%amcYgMofh(fANLL@v0M9S+s03R} zOIvgAD<(hEY-TU*3wG`_H!M{)(x-neScL^54te?0e_E7vDgW-t78$@45Bj zn@$o=hz>wEcD}!4OY6cu@10=(b3D&2=xlV-H%Mntzt>SOUUk}l>jz|!xhG#8TQ6P# z`D?tteoi)UN%tj#B{#wOg}%A8mh8fQYSHY1p;Po;{_Al%7jUkrqU$=;c{>WLaE#u8 zvTxGe#6IVyt%MQMa#o|TWW-PD`W=kR@Lq)ulHbHCf{pV9stJW(STtAD919v{lAX6s((14- zsxX?1_z-1AWQXs+zerT`Vt&;1?xS_@K3e~h46CN~)*pvd3m#ywHhkN+ZTlv>&UW$k z@wVAE+hsTUzP;zznE9?}+stQs>__Yd^RU~;ci;9LAFJ{wK#2&7F8mvr=M%iuJ_c>g zSjJAY(L=fbA6`4gp!`$STudTnDEF!^J8^`(cG+@xU(L%RW| zlgHZ)SQ_yxjr4)rx)h78J72^~zC)CDksFJ3!@IQ9H+Ii6%oT~UpuNZBPca+pk@wJ3 z;XVJ&FO(!@j1Fy&+@wqhjJ8+*M>RUEl5}L*!_fAO0Qok}`(1;O8?;L%GIB@?GBpUU j=th2(MnUg`?jPaj982mt2G`yugToQ7-M9BX^!on;>YqvJ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/disabled.py b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/disabled.py new file mode 100644 index 0000000..f6d6ea9 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/disabled.py @@ -0,0 +1,66 @@ +""" +This disables builtin functions (and one exception class) which are +removed from Python 3.3. + +This module is designed to be used like this:: + + from future.builtins.disabled import * + +This disables the following obsolete Py2 builtin functions:: + + apply, cmp, coerce, execfile, file, input, long, + raw_input, reduce, reload, unicode, xrange + +We don't hack __builtin__, which is very fragile because it contaminates +imported modules too. Instead, we just create new functions with +the same names as the obsolete builtins from Python 2 which raise +NameError exceptions when called. + +Note that both ``input()`` and ``raw_input()`` are among the disabled +functions (in this module). Although ``input()`` exists as a builtin in +Python 3, the Python 2 ``input()`` builtin is unsafe to use because it +can lead to shell injection. Therefore we shadow it by default upon ``from +future.builtins.disabled import *``, in case someone forgets to import our +replacement ``input()`` somehow and expects Python 3 semantics. + +See the ``future.builtins.misc`` module for a working version of +``input`` with Python 3 semantics. + +(Note that callable() is not among the functions disabled; this was +reintroduced into Python 3.2.) + +This exception class is also disabled: + + StandardError + +""" + +from __future__ import division, absolute_import, print_function + +from future import utils + + +OBSOLETE_BUILTINS = ['apply', 'chr', 'cmp', 'coerce', 'execfile', 'file', + 'input', 'long', 'raw_input', 'reduce', 'reload', + 'unicode', 'xrange', 'StandardError'] + + +def disabled_function(name): + ''' + Returns a function that cannot be called + ''' + def disabled(*args, **kwargs): + ''' + A function disabled by the ``future`` module. This function is + no longer a builtin in Python 3. + ''' + raise NameError('obsolete Python 2 builtin {0} is disabled'.format(name)) + return disabled + + +if not utils.PY3: + for fname in OBSOLETE_BUILTINS: + locals()[fname] = disabled_function(fname) + __all__ = OBSOLETE_BUILTINS +else: + __all__ = [] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/iterators.py b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/iterators.py new file mode 100644 index 0000000..dff651e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/iterators.py @@ -0,0 +1,52 @@ +""" +This module is designed to be used as follows:: + + from future.builtins.iterators import * + +And then, for example:: + + for i in range(10**15): + pass + + for (a, b) in zip(range(10**15), range(-10**15, 0)): + pass + +Note that this is standard Python 3 code, plus some imports that do +nothing on Python 3. + +The iterators this brings in are:: + +- ``range`` +- ``filter`` +- ``map`` +- ``zip`` + +On Python 2, ``range`` is a pure-Python backport of Python 3's ``range`` +iterator with slicing support. The other iterators (``filter``, ``map``, +``zip``) are from the ``itertools`` module on Python 2. On Python 3 these +are available in the module namespace but not exported for * imports via +__all__ (zero no namespace pollution). + +Note that these are also available in the standard library +``future_builtins`` module on Python 2 -- but not Python 3, so using +the standard library version is not portable, nor anywhere near complete. +""" + +from __future__ import division, absolute_import, print_function + +import itertools +from future import utils + +if not utils.PY3: + filter = itertools.ifilter + map = itertools.imap + from future.types import newrange as range + zip = itertools.izip + __all__ = ['filter', 'map', 'range', 'zip'] +else: + import builtins + filter = builtins.filter + map = builtins.map + range = builtins.range + zip = builtins.zip + __all__ = [] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/misc.py b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/misc.py new file mode 100644 index 0000000..f86ce5f --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/misc.py @@ -0,0 +1,135 @@ +""" +A module that brings in equivalents of various modified Python 3 builtins +into Py2. Has no effect on Py3. + +The builtin functions are: + +- ``ascii`` (from Py2's future_builtins module) +- ``hex`` (from Py2's future_builtins module) +- ``oct`` (from Py2's future_builtins module) +- ``chr`` (equivalent to ``unichr`` on Py2) +- ``input`` (equivalent to ``raw_input`` on Py2) +- ``next`` (calls ``__next__`` if it exists, else ``next`` method) +- ``open`` (equivalent to io.open on Py2) +- ``super`` (backport of Py3's magic zero-argument super() function +- ``round`` (new "Banker's Rounding" behaviour from Py3) +- ``max`` (new default option from Py3.4) +- ``min`` (new default option from Py3.4) + +``isinstance`` is also currently exported for backwards compatibility +with v0.8.2, although this has been deprecated since v0.9. + + +input() +------- +Like the new ``input()`` function from Python 3 (without eval()), except +that it returns bytes. Equivalent to Python 2's ``raw_input()``. + +Warning: By default, importing this module *removes* the old Python 2 +input() function entirely from ``__builtin__`` for safety. This is +because forgetting to import the new ``input`` from ``future`` might +otherwise lead to a security vulnerability (shell injection) on Python 2. + +To restore it, you can retrieve it yourself from +``__builtin__._old_input``. + +Fortunately, ``input()`` seems to be seldom used in the wild in Python +2... + +""" + +from future import utils + + +if utils.PY2: + from io import open + from future_builtins import ascii, oct, hex + from __builtin__ import unichr as chr, pow as _builtin_pow + import __builtin__ + + # Only for backward compatibility with future v0.8.2: + isinstance = __builtin__.isinstance + + # Warning: Python 2's input() is unsafe and MUST not be able to be used + # accidentally by someone who expects Python 3 semantics but forgets + # to import it on Python 2. Versions of ``future`` prior to 0.11 + # deleted it from __builtin__. Now we keep in __builtin__ but shadow + # the name like all others. Just be sure to import ``input``. + + input = raw_input + + from future.builtins.newnext import newnext as next + from future.builtins.newround import newround as round + from future.builtins.newsuper import newsuper as super + from future.builtins.new_min_max import newmax as max + from future.builtins.new_min_max import newmin as min + from future.types.newint import newint + + _SENTINEL = object() + + def pow(x, y, z=_SENTINEL): + """ + pow(x, y[, z]) -> number + + With two arguments, equivalent to x**y. With three arguments, + equivalent to (x**y) % z, but may be more efficient (e.g. for ints). + """ + # Handle newints + if isinstance(x, newint): + x = long(x) + if isinstance(y, newint): + y = long(y) + if isinstance(z, newint): + z = long(z) + + try: + if z == _SENTINEL: + return _builtin_pow(x, y) + else: + return _builtin_pow(x, y, z) + except ValueError: + if z == _SENTINEL: + return _builtin_pow(x+0j, y) + else: + return _builtin_pow(x+0j, y, z) + + + # ``future`` doesn't support Py3.0/3.1. If we ever did, we'd add this: + # callable = __builtin__.callable + + __all__ = ['ascii', 'chr', 'hex', 'input', 'isinstance', 'next', 'oct', + 'open', 'pow', 'round', 'super', 'max', 'min'] + +else: + import builtins + ascii = builtins.ascii + chr = builtins.chr + hex = builtins.hex + input = builtins.input + next = builtins.next + # Only for backward compatibility with future v0.8.2: + isinstance = builtins.isinstance + oct = builtins.oct + open = builtins.open + pow = builtins.pow + round = builtins.round + super = builtins.super + if utils.PY34_PLUS: + max = builtins.max + min = builtins.min + __all__ = [] + else: + from future.builtins.new_min_max import newmax as max + from future.builtins.new_min_max import newmin as min + __all__ = ['min', 'max'] + + # The callable() function was removed from Py3.0 and 3.1 and + # reintroduced into Py3.2+. ``future`` doesn't support Py3.0/3.1. If we ever + # did, we'd add this: + # try: + # callable = builtins.callable + # except AttributeError: + # # Definition from Pandas + # def callable(obj): + # return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + # __all__.append('callable') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/new_min_max.py b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/new_min_max.py new file mode 100644 index 0000000..6f0c2a8 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/new_min_max.py @@ -0,0 +1,59 @@ +import itertools + +from future import utils +if utils.PY2: + from __builtin__ import max as _builtin_max, min as _builtin_min +else: + from builtins import max as _builtin_max, min as _builtin_min + +_SENTINEL = object() + + +def newmin(*args, **kwargs): + return new_min_max(_builtin_min, *args, **kwargs) + + +def newmax(*args, **kwargs): + return new_min_max(_builtin_max, *args, **kwargs) + + +def new_min_max(_builtin_func, *args, **kwargs): + """ + To support the argument "default" introduced in python 3.4 for min and max + :param _builtin_func: builtin min or builtin max + :param args: + :param kwargs: + :return: returns the min or max based on the arguments passed + """ + + for key, _ in kwargs.items(): + if key not in set(['key', 'default']): + raise TypeError('Illegal argument %s', key) + + if len(args) == 0: + raise TypeError + + if len(args) != 1 and kwargs.get('default', _SENTINEL) is not _SENTINEL: + raise TypeError + + if len(args) == 1: + iterator = iter(args[0]) + try: + first = next(iterator) + except StopIteration: + if kwargs.get('default', _SENTINEL) is not _SENTINEL: + return kwargs.get('default') + else: + raise ValueError('{}() arg is an empty sequence'.format(_builtin_func.__name__)) + else: + iterator = itertools.chain([first], iterator) + if kwargs.get('key') is not None: + return _builtin_func(iterator, key=kwargs.get('key')) + else: + return _builtin_func(iterator) + + if len(args) > 1: + if kwargs.get('key') is not None: + return _builtin_func(args, key=kwargs.get('key')) + else: + return _builtin_func(args) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newnext.py b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newnext.py new file mode 100644 index 0000000..097638a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newnext.py @@ -0,0 +1,70 @@ +''' +This module provides a newnext() function in Python 2 that mimics the +behaviour of ``next()`` in Python 3, falling back to Python 2's behaviour for +compatibility if this fails. + +``newnext(iterator)`` calls the iterator's ``__next__()`` method if it exists. If this +doesn't exist, it falls back to calling a ``next()`` method. + +For example: + + >>> class Odds(object): + ... def __init__(self, start=1): + ... self.value = start - 2 + ... def __next__(self): # note the Py3 interface + ... self.value += 2 + ... return self.value + ... def __iter__(self): + ... return self + ... + >>> iterator = Odds() + >>> next(iterator) + 1 + >>> next(iterator) + 3 + +If you are defining your own custom iterator class as above, it is preferable +to explicitly decorate the class with the @implements_iterator decorator from +``future.utils`` as follows: + + >>> @implements_iterator + ... class Odds(object): + ... # etc + ... pass + +This next() function is primarily for consuming iterators defined in Python 3 +code elsewhere that we would like to run on Python 2 or 3. +''' + +_builtin_next = next + +_SENTINEL = object() + +def newnext(iterator, default=_SENTINEL): + """ + next(iterator[, default]) + + Return the next item from the iterator. If default is given and the iterator + is exhausted, it is returned instead of raising StopIteration. + """ + + # args = [] + # if default is not _SENTINEL: + # args.append(default) + try: + try: + return iterator.__next__() + except AttributeError: + try: + return iterator.next() + except AttributeError: + raise TypeError("'{0}' object is not an iterator".format( + iterator.__class__.__name__)) + except StopIteration as e: + if default is _SENTINEL: + raise e + else: + return default + + +__all__ = ['newnext'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newround.py b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newround.py new file mode 100644 index 0000000..394a2c6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newround.py @@ -0,0 +1,102 @@ +""" +``python-future``: pure Python implementation of Python 3 round(). +""" + +from future.utils import PYPY, PY26, bind_method + +# Use the decimal module for simplicity of implementation (and +# hopefully correctness). +from decimal import Decimal, ROUND_HALF_EVEN + + +def newround(number, ndigits=None): + """ + See Python 3 documentation: uses Banker's Rounding. + + Delegates to the __round__ method if for some reason this exists. + + If not, rounds a number to a given precision in decimal digits (default + 0 digits). This returns an int when called with one argument, + otherwise the same type as the number. ndigits may be negative. + + See the test_round method in future/tests/test_builtins.py for + examples. + """ + return_int = False + if ndigits is None: + return_int = True + ndigits = 0 + if hasattr(number, '__round__'): + return number.__round__(ndigits) + + if ndigits < 0: + raise NotImplementedError('negative ndigits not supported yet') + exponent = Decimal('10') ** (-ndigits) + + if PYPY: + # Work around issue #24: round() breaks on PyPy with NumPy's types + if 'numpy' in repr(type(number)): + number = float(number) + + if isinstance(number, Decimal): + d = number + else: + if not PY26: + d = Decimal.from_float(number).quantize(exponent, + rounding=ROUND_HALF_EVEN) + else: + d = from_float_26(number).quantize(exponent, rounding=ROUND_HALF_EVEN) + + if return_int: + return int(d) + else: + return float(d) + + +### From Python 2.7's decimal.py. Only needed to support Py2.6: + +def from_float_26(f): + """Converts a float to a decimal number, exactly. + + Note that Decimal.from_float(0.1) is not the same as Decimal('0.1'). + Since 0.1 is not exactly representable in binary floating point, the + value is stored as the nearest representable value which is + 0x1.999999999999ap-4. The exact equivalent of the value in decimal + is 0.1000000000000000055511151231257827021181583404541015625. + + >>> Decimal.from_float(0.1) + Decimal('0.1000000000000000055511151231257827021181583404541015625') + >>> Decimal.from_float(float('nan')) + Decimal('NaN') + >>> Decimal.from_float(float('inf')) + Decimal('Infinity') + >>> Decimal.from_float(-float('inf')) + Decimal('-Infinity') + >>> Decimal.from_float(-0.0) + Decimal('-0') + + """ + import math as _math + from decimal import _dec_from_triple # only available on Py2.6 and Py2.7 (not 3.3) + + if isinstance(f, (int, long)): # handle integer inputs + return Decimal(f) + if _math.isinf(f) or _math.isnan(f): # raises TypeError if not a float + return Decimal(repr(f)) + if _math.copysign(1.0, f) == 1.0: + sign = 0 + else: + sign = 1 + n, d = abs(f).as_integer_ratio() + # int.bit_length() method doesn't exist on Py2.6: + def bit_length(d): + if d != 0: + return len(bin(abs(d))) - 2 + else: + return 0 + k = bit_length(d) - 1 + result = _dec_from_triple(sign, str(n*5**k), -k) + return result + + +__all__ = ['newround'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newsuper.py b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newsuper.py new file mode 100644 index 0000000..5d3402b --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/builtins/newsuper.py @@ -0,0 +1,114 @@ +''' +This module provides a newsuper() function in Python 2 that mimics the +behaviour of super() in Python 3. It is designed to be used as follows: + + from __future__ import division, absolute_import, print_function + from future.builtins import super + +And then, for example: + + class VerboseList(list): + def append(self, item): + print('Adding an item') + super().append(item) # new simpler super() function + +Importing this module on Python 3 has no effect. + +This is based on (i.e. almost identical to) Ryan Kelly's magicsuper +module here: + + https://github.com/rfk/magicsuper.git + +Excerpts from Ryan's docstring: + + "Of course, you can still explicitly pass in the arguments if you want + to do something strange. Sometimes you really do want that, e.g. to + skip over some classes in the method resolution order. + + "How does it work? By inspecting the calling frame to determine the + function object being executed and the object on which it's being + called, and then walking the object's __mro__ chain to find out where + that function was defined. Yuck, but it seems to work..." +''' + +from __future__ import absolute_import +import sys +from types import FunctionType + +from future.utils import PY3, PY26 + + +_builtin_super = super + +_SENTINEL = object() + +def newsuper(typ=_SENTINEL, type_or_obj=_SENTINEL, framedepth=1): + '''Like builtin super(), but capable of magic. + + This acts just like the builtin super() function, but if called + without any arguments it attempts to infer them at runtime. + ''' + # Infer the correct call if used without arguments. + if typ is _SENTINEL: + # We'll need to do some frame hacking. + f = sys._getframe(framedepth) + + try: + # Get the function's first positional argument. + type_or_obj = f.f_locals[f.f_code.co_varnames[0]] + except (IndexError, KeyError,): + raise RuntimeError('super() used in a function with no args') + + try: + # Get the MRO so we can crawl it. + mro = type_or_obj.__mro__ + except (AttributeError, RuntimeError): # see issue #160 + try: + mro = type_or_obj.__class__.__mro__ + except AttributeError: + raise RuntimeError('super() used with a non-newstyle class') + + # A ``for...else`` block? Yes! It's odd, but useful. + # If unfamiliar with for...else, see: + # + # http://psung.blogspot.com/2007/12/for-else-in-python.html + for typ in mro: + # Find the class that owns the currently-executing method. + for meth in typ.__dict__.values(): + # Drill down through any wrappers to the underlying func. + # This handles e.g. classmethod() and staticmethod(). + try: + while not isinstance(meth,FunctionType): + if isinstance(meth, property): + # Calling __get__ on the property will invoke + # user code which might throw exceptions or have + # side effects + meth = meth.fget + else: + try: + meth = meth.__func__ + except AttributeError: + meth = meth.__get__(type_or_obj, typ) + except (AttributeError, TypeError): + continue + if meth.func_code is f.f_code: + break # Aha! Found you. + else: + continue # Not found! Move onto the next class in MRO. + break # Found! Break out of the search loop. + else: + raise RuntimeError('super() called outside a method') + + # Dispatch to builtin super(). + if type_or_obj is not _SENTINEL: + return _builtin_super(typ, type_or_obj) + return _builtin_super(typ) + + +def superm(*args, **kwds): + f = sys._getframe(1) + nm = f.f_code.co_name + return getattr(newsuper(framedepth=2),nm)(*args, **kwds) + + +__all__ = ['newsuper'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__init__.py new file mode 100644 index 0000000..0cd60d3 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__init__.py @@ -0,0 +1,8 @@ +# future.moves package +from __future__ import absolute_import +import sys +__future_module__ = True +from future.standard_library import import_top_level_modules + +if sys.version_info[0] >= 3: + import_top_level_modules() diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a17dada4587dcbf5f57f124ff609a9cbffe30e7 GIT binary patch literal 346 zcmX|5F;2uV5VW1-h@u2U1w7%3TnerL>4bOz4OgXLmBWrOv14O9Ii=<`h#y6CRQCmF zaENp(&1f{5o!#p!OR~@3r!R!ix5sgaSN9%v#CMkhJxTbQ<=d`MPu4CW4UU9x3&5} zCidn({oEE#>Oym!cdf3T8%Fc}3u7W*ulKbb-kM@AE~M(2Exi@-OJ6 z(*}wicyHzn^XAR6EXh9qUcLa}8*!=#r+b9GMdHAT1Vw5>4s#?UMQchxP;-r%%D94U z%Hw);RO1Tx=n3-i4|*Xd;j&rUPI@O;t8`}^uIS_Q3>&$r9`cKjFt+l}8^M@4B-iO6 zr{1;F8j7osG47S>nOhst@cQaxQ62XZogw{y@BwCmwj=#6N~d(GTV43AZeBNn7rV6( ovY5|zE8D+q$|0{*-Mg^mS<+PZVRAQwEC{}|2~tYZC?*MF5Bx}3Y5)KL literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/_markupbase.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/_markupbase.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c0458693a9db67487340528289b72913f0986c0 GIT binary patch literal 317 zcmYjK%TB{E5M0OULnaa8Cy;`a=Fo~$h4=!5L@xM%m10*!u^VH@RQ)8>KgyL8zW^7u zja0hQ%@HEOEk5;lp9 z`RJ&|CCJeeWaDr2LPq+_YUNuUIwfjjTi4-=K0eQ}k(=@%oAgYGb?AaqLbyXRPX;*) zU9G*Nxau#2sazB6s`83ooeZXxL8Gr{|L0F|Q?wlEXIXT{7Phu|*x2f|Q8M4YDW&tp mV!QUc_of)K3e$clU!0}P?5>|Khk!eR4?ROlND{?_A^rfHoL1NX literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/_thread.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/_thread.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cdca18c604917f5ce784533ef4fc1f2aab122d7 GIT binary patch literal 305 zcmX|4%}T>S5T4DZX$cA9O9&CtJ+z1i5uZQ=b7>APX?IIQcbj#8EPWnN;v41a$yd;e z(?&Y*eKX(ud^5}QH2?g4c?WwqSl5>0fTxWxv z2Hz@YDYp7C_Zur4QD2^ybti(tn?4yvA7CfAdZM3O=Cxs_HD%bDX0?@~+;5~*<$S(h kyTj|24L_Lf-lSvy?o)HS5T4DZHN=D>c<}{<2x$)OMUdhXh+r=6!KF1@4BbuE{jv0s#5c;-ldqr` zCrv9Z%s2DR%=hiGvowv6#Kf_d}++4u`RAS2ymxw5VFPVidk);Mg@`^On3a#h}CQ5SQ*_Rbr@ zx#?fPl7UXWtEDv*TV1sBwRCl3+1cN=YAY{M)SYsE7<0}h2k}wx4kki}J$zpmPU%9| zI`@rUK5s;oZ(oFv`Fy@z+uiG?7}SMo--IoW9#g&RqMPBq1%4XX1R)_w5Rw=p3Vs1c Cb6k}G literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/collections.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/collections.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f8f0ca4d800f13cbf6cb2062727f67ca85ef945 GIT binary patch literal 599 zcmYjP%Z}496t$hSbzZcCgv2idsf`39RwINoEO|*YNZWQa^9!)yx&<_`a(r~|IoCIlpA(rzor9@6Zqc72!$wh7o zQJ}^?-)r+NfiGCeure2Ovk(hRvNKW^w>S?esh_VeY_CTrYh{KW-0PD0=n4!fmKs0KAG$8NwzvR&R>N~xE}$2S|hyV_QVQ!3M6OIzI;XEp3RKRHbL3@;0@4-s<8 R*@DK5vzX>#;l5xg{R4r&o}vH% literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/configparser.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/configparser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9ad6ce2b030e06a8f3acd1b224e74baa23b0495 GIT binary patch literal 295 zcmYjK!Ait15S=7lDJ8|f5Gr&F>mF4E@3P=t?7>pEsg_Nem^3c?8~%m(N4a|P7u<`} zE{Fqf=Do+vn~O9}($B-=I{)3OILP^3b`p}RYW?7?s46=?E%{N-{m@Bg z8Crqg>b~usSG9G*2ELh;nbZf^7+0qDb5#t=6s9w|?@hhgiYDK^2qE+3a@V^3>$W&% f7fQbgSNzYJn|+8cm2SKg*8~&Y7|SWA5lQGT9e7W; literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/copyreg.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/copyreg.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7f00903501c68fb8db27b8d7602654118b1053b GIT binary patch literal 363 zcmYjNJx{|h5Vhl^2~i?I;!gxA$NLiVslq=(-T5(InfME^ zaQP6zlHZ;0-g|fQG>*gg@N@rx5&A^`4uSjO*}Zf+etSQR07r8%nS}UOnhqn1-{mlC^4}L~ib;*KcPV z(-_6Gs($4Kd+WMo&65VR+S9M_o*YxyH zI#d|5LC0j^|Bh4$(jLC&c~i+;mNGRvxms^|k?x;37wK%a-{|&bn-4Sde#Ly8mdVxz Ui^2K=J`?E(Ai|O3;uE*SUunH%c>n+a literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/itertools.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/itertools.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..310d44130e4a9fe0558f845e03c669889ff41012 GIT binary patch literal 326 zcmYjMu}*|Q5S`&rIpDPMCon+@sV>IY*j}TFN+CfRbi=}~yNeh67<=O%ZENK(Xyc;E z|7JBan>e(eE{+HW_1nog}uLU0rm8_FO88^bCRT9{+EStd$ipo-XPHX4P zkTODWZDaPzWXVPUNZQzFyNOxDxDz%N*JPvZX1=OAx=>1}cTm$KfAGD`OeZtRWIFV+ zdT6Om*H1(|&GU7m$LBWt_mOqtg><%YaV$q0oOYrfIGv$8r(*}P7odke2Dp#E9@bnb literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/pickle.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/pickle.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bea8ab17acff625bf41d97b07d64f9b178b1e349 GIT binary patch literal 357 zcmX|4Jx_!{5S;<;Lk|4ttxYfiio3+d7#j;4b5RoSC?qHBMZyB>E_mT58UGQjvG6Zw z;{fq?GjHe3zBg}f+ot{T`}73>pH%xZqwbnYtq2lGkVB3kV%KY2%k@x4V7fdbu5%-R z!b^;B)L1p4Am9^5(8){LTUUDc9Bk<`c&S_Ad!D&h#Ps!iYvf| zNg{Qm_h#OF-YoJw&AJHx$!epgkeO=TKW`n_4d?xZM>Z&Ipqxjb&& i>9DKD2bFH$rK<+(xjBW|&FFed(8{Gq8OfrUq=uZa|D4p&WnXEtDjlt=6tn!Ast1(^-!#`mmg1BA3m5If)tPo8W_$oZJ30%Lh3N zzE#drY{iL{#;SJB&QHs_6G7okO#9gf*eNa^>F2uk+SH~sRoI!;^Hz##|01QT7K{DH j9bUKf@S)b-n{@TR_sksP^k%TVC1~a{q@3hQN;1SBVQ^6z literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/socketserver.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/socketserver.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba778637a14816b5fe0e2a0128ca200257f3bf31 GIT binary patch literal 321 zcmYjKO-sW-5S`7YwS*1gpAaIXIkb3E@fV1YT$+QSb+;J0+pPQ1(w`)PKWML>{0n+< znn3BmdoypCH*c1vN&5Ns@&y3jh*L#4JtFKa5(iEsC{h!0oFf@2T2lgonrqZl#uaQC zkLyvd#ue~U3EB7uy^xV`xm?*!dMBDz>CQM@(dWes8@Z{TvWt*3&DuL}MAMjKa?J)g z^{$oHP+SFOyVs3yR+ybI_0`FtI_@PJ11tN3vOo9$GeK8RzxRbxy3no8{Z=pW3(xm& pLdbkR->>cAeNzl^h3a;~7Uw}zeF&4gA>)DIN1Grq!lIZYh<`rZSik@P literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/subprocess.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/subprocess.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b70347fc26e6491b9bf2b3b1d99a09a0d97dd65 GIT binary patch literal 438 zcmYLEOHRWu5VaGxP1BUZf^@O(fBeL@^x0M#9YnFCa)!W;=qF>dOB2O^}QAe8*}A@3{@ z3-zobv;;qEGu6F{1B*>+)C(=m7M+N0dfi;EGc0N5#@e?kvk|p`^BH;KTXT zr6&N_Fvk}Qp!zS&N@ta`egvhlg>|MSK$DbfR&MgPe@GJ_=lRN6r&*rs<{va^+ljL^ zH#!7L6969@w^Uk|%ouuhToST!9Cm$FN+F7EWpuY$=`~j8e^$$)+%yN9iKtDfBbdD- zoiw@zzHc%sRHkY*c3TBnR*iRS#`t(T-L1_2b(6J5nUHVHWdDau)ZRz4_J&&wR^|jC N!KXnK5KJHw`~#=MdTjsz literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/sys.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/sys.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a3959eb2e72183b10d45d7c1fc893eb5bccb8ff GIT binary patch literal 293 zcmX|*O-{ow5QY7dq@g6@9I2EVwOJy>2@n!&$f8zDTw&EtjDM)I=Q4;JdCQ6`z=mln zb)BzW iwqvJQriXXo7zEDE81oxFbU}$*3_&gjDM&$blHh+!1WYOb literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/winreg.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/__pycache__/winreg.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9c155f594b33b164144b3d6d4c61ac1fc9e0ee5 GIT binary patch literal 304 zcmX|4OHRWu5FN*9T1ANvmp}?qnnf$vAjAm}64~GdR;k?*)lQ5Z6ZJf-5I4$}6<2@_ z(^~3C@6EjVyjkRVnt%O0e*nNY;uH~9cL;ZdBtQ@anlM5Rb)+Iq86_a8y+BP>Ttl0Q zm`#oCFl0=nPoxF zecvc&DYnLBXj&_`?EJK=JK+_cj8h(FpI~RWdZgd$s@JA6jVXO=R_mP<Kln~)LU=# z74*iht%wOZIp^c#7Lb#xlO5Kb)rN`JN&vGLeGZvl=yN#UY zStL_Ku~bs@hDU!!74ux8zijWf(R#~QWoxMm^cbfK82kpP_*tY=ESH_Dx`#_+V)IH& z^;k80o%xwc{3J>yxlWero#2!GRtPzn&-a_Oc-r|*mS1Q2nB_AT=_q4tniQpb+O%?x Z-$BwLLKnK04IVBRT*rpKWx)XY@B_mja&7W^oF2vM4&knl1PG!)lbVoFQ$;na83D=c1!|_E3U;Z8 z>e*4vD-g3s$mc)kg`A9M>(=$k53=dB>Ft0m_VBdCk6c#wc|0afv+;wsvT1C%T&I&P z{m?0AS!gXpt4rZ^Tc4k{buYX^(-?;VE_{NGarsEU*L={1o6Zz|XVx!UDT@88l&V;* n_8WJ2+w$oO*ZsS69PK>Bl;$ulZl>s4f@v;6N@+?Xk|6#8w@y*` literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/__pycache__/gnu.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/__pycache__/gnu.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cbea6381cecac866be3128029e4fad9ce0f19fc GIT binary patch literal 303 zcmX|4K~BRk5M0}7Q$>jopFj#y;zKLM0U=(1kjSMu5Vf^iqS}eEW2%0K8{$W~a^eec zVbe&pG~=D!o!NPkM9J6R%Lf2_BhHUv^?-0UNCE^=ph-!{P*X)UD;WXF>=kOJf&!XY z1m)zUrUi(}Go;fW^g>Gdi`Ck-%6GD=wP|gKE%vmW<43NG$29Dts@nR_TUk|hxLn4g z%zalYXW7sS#aidP#+R4pW!(y|(9;Jy9Dafgaq&dIx4hGao7!Z)F{{m9itO+zrOFnI m!`2<&_I$j+b^9(IM?1&t+#LJa-57gMFw8|rF^y?JBE&!D7fn9-Zz&AdgL#_8AJ>jwaQBhHWF^nma;ND?H`V2B`On5m|Q2}VFMcZHhisDvhw zk(iv+v;;YMhHUzSS;$C#v0D39hfY58Z`5_Vc^3_MTvykC76Z(1^r{e>7B3IsgCw literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/dumb.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/dumb.py new file mode 100644 index 0000000..528383f --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/dumb.py @@ -0,0 +1,9 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from dbm.dumb import * +else: + __future_module__ = True + from dumbdbm import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/gnu.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/gnu.py new file mode 100644 index 0000000..68ccf67 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/gnu.py @@ -0,0 +1,9 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from dbm.gnu import * +else: + __future_module__ = True + from gdbm import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/ndbm.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/ndbm.py new file mode 100644 index 0000000..8c6fff8 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/dbm/ndbm.py @@ -0,0 +1,9 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from dbm.ndbm import * +else: + __future_module__ = True + from dbm import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__init__.py new file mode 100644 index 0000000..22ed6e7 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__init__.py @@ -0,0 +1,31 @@ +from __future__ import absolute_import +from future.utils import PY3 +__future_module__ = True + +if PY3: + from html import * +else: + # cgi.escape isn't good enough for the single Py3.3 html test to pass. + # Define it inline here instead. From the Py3.4 stdlib. Note that the + # html.escape() function from the Py3.3 stdlib is not suitable for use on + # Py2.x. + """ + General functions for HTML manipulation. + """ + + def escape(s, quote=True): + """ + Replace special characters "&", "<" and ">" to HTML-safe sequences. + If the optional flag quote is true (the default), the quotation mark + characters, both double quote (") and single quote (') characters are also + translated. + """ + s = s.replace("&", "&") # Must be done first! + s = s.replace("<", "<") + s = s.replace(">", ">") + if quote: + s = s.replace('"', """) + s = s.replace('\'', "'") + return s + + __all__ = ['escape'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5fa11aa9f7fa8ebad808b60e849a4dabf053a83 GIT binary patch literal 817 zcmYjP&2H2%5Vn)-W;b-%@&;CrwoTRTO0*J(R;x;I00|I+y^sTz8+&)dIzP1?N>^}# zmqENyuAF!SR4$B@Dy<`rKTl@9`I4FA(I^=G`uFj#i_mX$Z^0d%!`5>!9C0jBhGUE^ zcBGTJu?yIZJ>jYY@OiSgK>02o@E-5~z;U1VS2*^${~krdKfr+^T#wm>E@Wi{O|!C4 z23+pj5625Q@j>F)C|LHi<)6XU&%t~}pFjY2zB}Jq>~gQeP_DsPoi}klA9U}AJZLe9 zc)*4jp@7`3ccPRm5k!|FNtqKfomz*idOzWJzWp$2Wa%_t-8uK7`}&y@gh^d=lt!^!OJ)SW(|m&`+unp_<>?JR z+j5nZ8ABdG|f{(=}~!I_k~VaDRynsAA&*t z4z`ciSTzREn+PwWK^;)qQcg`$xjkb{+(Ps`4{x! zB*hNAH}i&h^Oi{xB_F>}p8)WMI8}ht9m3uqao|LPA|)Z?9LPY?k`fTqT%o2iETD~f zSk5LjFM!V;A)SAt7g91@Y@cl>y%SZVbY~o{=)-1-ja(P^>DdrfRqdTOqN>c8T*gP4 zd)G*7D6WQN=akGv>l)VxTV9?ls^eawb2uL_rh}e~+P;HXpmCy~HFHWc-RR7>di$~$ vJUi@!klAW=sBQncXU9aQx;J6j_=){z<+>jhx5t<@!Iw5dib))VBtrZF#Isr~ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__pycache__/parser.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/__pycache__/parser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a734a4eda9d6004f1d06530eac59230683a2f523 GIT binary patch literal 317 zcmX|4O-sW-5Z%qDHLMBZ&qyKJLyM;(9zCcO%*7lUqPwM`yUn^Emi{6U|52_z`4{x! zB!Ldhn>UY{_vT4LlkdOvCqn21eXao59kjgx;D}?16fQCDc_0HtN&=jep&(`kS|}$4 z+D8MM7Kl%tQ9AvBUzFnRs(!Vt^iEWb(yehIk=4t*fQe^M=|xAYYU7y*rOZLBaIy)PagRs;V+CW4m%ewWNC&2*zPzt{EKPVnro s6+&i<#bINQ?>jbTG1Yzu%X&*TTITxLMawbm7K5Rs05Ohn7=)Mx|3k-C82|tP literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/entities.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/entities.py new file mode 100644 index 0000000..56a8860 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/entities.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from html.entities import * +else: + __future_module__ = True + from htmlentitydefs import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/parser.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/parser.py new file mode 100644 index 0000000..a6115b5 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/html/parser.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +from future.utils import PY3 +__future_module__ = True + +if PY3: + from html.parser import * +else: + from HTMLParser import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__init__.py new file mode 100644 index 0000000..917b3d7 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__init__.py @@ -0,0 +1,4 @@ +from future.utils import PY3 + +if not PY3: + __future_module__ = True diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ae82445e6f7e68b958755e9c5b7fc814c5787fb GIT binary patch literal 217 zcmXr!<>lgC{X5Q`fq~&M5W@izkmUfx#S%awg&~D8has0Sijk2am9bbPg(-?Dg*li( zljS8)mO+#87IQ$PafqKLa}-ZnX-R2Os$OYHW=?St$do9-_;`q5d~SY9X-;Z<{7Qx* zW}pn1_+_VGl3So(kXfKxnpcpRoSmAYTb_}cnxkuCQl3^^S(vR4(XF4GUzS>|pHWg$ ipdTNfnU`4-AFo$Xd5gmaVyqn_(8yvIAi=}L!UzEDf;e^n literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/client.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/client.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5f02a8b087c4c378aeebc93f6d12212ee32bd6a GIT binary patch literal 298 zcmX|4y-ve05WY*?AEn8_hIoS@B_3KaRfv%VREaEPXjE#KMs-qSJ5+rj2E-d>?Zhj< z!ljWo>At(ueLvGE3Zk#y_LkU!FHV>lnWB zE0!|^!SaC^JV8ACCN0F+`iti&4ZJ3p+-KS1L0Y?dmDyuF%)?FN8Y9!jmCBkfx1DUA z)9G53vUcsLJ5>2%7`^g~qUiZWwHJ+&Mezw{M4vPK%(<&H*QHLHTCdhSDU!ohN|nrJ ohmAeH?Rc-|)&5;t-dXcLC)LMxJnv0!kqm7>5PA#)Z;T=S0no`#3;+NC literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/cookiejar.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/__pycache__/cookiejar.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6e7e8525ab7d448387dc87c0e6a5b3cf7bc9d29 GIT binary patch literal 322 zcmX|)O-{ow6ol%%{ejF3N+{!U#s3mYZCUaC>H}R|472^$P0s zwZ6O7Ukd#J=JXy4468%v)V|OcbV#}#Jn2{@hO=oTV`Y%CZXb>?kV6k~hb2m|Q7l9t zHD@v~6J+=PvrJ1dH8&k6wHX^HCQ+O*h5rJ+QeMuRHj)U-ax-*Bl^tW*V=cTf(79KQRmiKHv1 zvYX6hFq-kOyPR+?y2r=Mv0gpT+`^|D#S5<8%%NL2?8#MH>lfxu2@cfz2o7;*iP(5* O`KF{rnuO98ZPH)7(2pYk literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/client.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/client.py new file mode 100644 index 0000000..55f9c9c --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/client.py @@ -0,0 +1,8 @@ +from future.utils import PY3 + +if PY3: + from http.client import * +else: + from httplib import * + from httplib import HTTPMessage + __future_module__ = True diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/cookiejar.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/cookiejar.py new file mode 100644 index 0000000..ea00df7 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/cookiejar.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from http.cookiejar import * +else: + __future_module__ = True + from cookielib import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/cookies.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/cookies.py new file mode 100644 index 0000000..1b74fe2 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/cookies.py @@ -0,0 +1,9 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from http.cookies import * +else: + __future_module__ = True + from Cookie import * + from Cookie import Morsel # left out of __all__ on Py2.7! diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/server.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/server.py new file mode 100644 index 0000000..4e75cc1 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/http/server.py @@ -0,0 +1,20 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from http.server import * +else: + __future_module__ = True + from BaseHTTPServer import * + from CGIHTTPServer import * + from SimpleHTTPServer import * + try: + from CGIHTTPServer import _url_collapse_path # needed for a test + except ImportError: + try: + # Python 2.7.0 to 2.7.3 + from CGIHTTPServer import ( + _url_collapse_path_split as _url_collapse_path) + except ImportError: + # Doesn't exist on Python 2.6.x. Ignore it. + pass diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/itertools.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/itertools.py new file mode 100644 index 0000000..e5eb20d --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/itertools.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +from itertools import * +try: + zip_longest = izip_longest + filterfalse = ifilterfalse +except NameError: + pass diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/pickle.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/pickle.py new file mode 100644 index 0000000..c53d693 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/pickle.py @@ -0,0 +1,11 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from pickle import * +else: + __future_module__ = True + try: + from cPickle import * + except ImportError: + from pickle import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/queue.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/queue.py new file mode 100644 index 0000000..1cb1437 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/queue.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from queue import * +else: + __future_module__ = True + from Queue import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/reprlib.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/reprlib.py new file mode 100644 index 0000000..a313a13 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/reprlib.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from reprlib import * +else: + __future_module__ = True + from repr import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/socketserver.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/socketserver.py new file mode 100644 index 0000000..062e084 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/socketserver.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from socketserver import * +else: + __future_module__ = True + from SocketServer import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/subprocess.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/subprocess.py new file mode 100644 index 0000000..43ffd2a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/subprocess.py @@ -0,0 +1,11 @@ +from __future__ import absolute_import +from future.utils import PY2, PY26 + +from subprocess import * + +if PY2: + __future_module__ = True + from commands import getoutput, getstatusoutput + +if PY26: + from future.backports.misc import check_output diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/sys.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/sys.py new file mode 100644 index 0000000..1293bcb --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/sys.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +from future.utils import PY2 + +from sys import * + +if PY2: + from __builtin__ import intern diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__init__.py new file mode 100644 index 0000000..5cf428b --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if not PY3: + __future_module__ = True diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7048962df56130365ed87f06e758102d41551c97 GIT binary patch literal 267 zcmX|4%TB{E5ZsLuR8@%(f53rD4yh0A5mkHvLV^o9U={4DR_(<2LDf$}{86r)_yxGI zX{4?+quJTf?6Run)z{xk2LRuM^JJv%2;qiEfv|u_Vh_*Dr~A4X=0a>!OkN4$#}{omt&0@337(DC)j4B(nG8ig z!54Hn(eIi^>$uadNuArg?Uif}JEcssS{=6G_`c^;CAa;D3OuS1xe&V3QHX^*4zt^- Pc8ydSE{IAjvmE~cdjdzZ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__pycache__/support.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/__pycache__/support.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3871874be3a3353a481c17d987bb78015991e7ae GIT binary patch literal 407 zcmYjNOHKnZ40YzypE^Zdv14DPb|l&*AWnezj09vsG$pAzYBCe@q3W6ga1O+cx@E-` zV1s8`A!7O2ezu>bOp~OSeEd9y1mF|?y)Nb#=r%*(z=;G!C?Rzo$Uub@S1=D{q+%Kq z5V1MII+Cpn$|D}rwg_M0ZO}|bvXj9b@YXflz&*xW7`4Ap8AfD#kk4%;y%VfZx-t%_ z#Coem$=R~1Ru+ly>S2n39A}rK?zYF+!aHvSVw|Ror>83JCCbuaGf)HDPrZX_<7xxnXQ@*<)rB7WQs+-A!N=>R v5OO@5trvFlyh?XBQ&qhPo7Ot%UT2~=+s^6k&^dlP*a1SHpal`>p?AnHN&0W& literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/support.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/support.py new file mode 100644 index 0000000..e9aa0f4 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/test/support.py @@ -0,0 +1,10 @@ +from __future__ import absolute_import +from future.standard_library import suspend_hooks +from future.utils import PY3 + +if PY3: + from test.support import * +else: + __future_module__ = True + with suspend_hooks(): + from test.test_support import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__init__.py new file mode 100644 index 0000000..e408296 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__init__.py @@ -0,0 +1,27 @@ +from __future__ import absolute_import +from future.utils import PY3 +__future_module__ = True + +if not PY3: + from Tkinter import * + from Tkinter import (_cnfmerge, _default_root, _flatten, + _support_default_root, _test, + _tkinter, _setit) + + try: # >= 2.7.4 + from Tkinter import (_join) + except ImportError: + pass + + try: # >= 2.7.4 + from Tkinter import (_stringify) + except ImportError: + pass + + try: # >= 2.7.9 + from Tkinter import (_splitdict) + except ImportError: + pass + +else: + from tkinter import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7046b46961a8d4ed0499d74606d7ff4ed7e3b1e8 GIT binary patch literal 677 zcmZXRKX2497{=}VPcFH;7MNJO9MUyIJ0e5}hAyZQC((MqIxbEzXFECDp}H^9?|}FU z3>`c039>Tr6=30Yb0AJ6%H!9Me|h~_J}HW<`10$W@DTcr{&}84{SrR&4WvR97D!@( zv8z4dNuT&o`y^n#xdSf{;lizjB9sw{WK3e2kVK{=l^Mz8h>T=Ta*Vc9pdz3OQegBJ zsmB3g<8`K6jNE&Lly^B$F;EjS*`sd%qY|K|Wa_BR{jS&7Kh);_5~<`N-vQ)H-=JCc z15SiyxSuTFn?`h&Q7+p?Td@3#tCIzc_}MJ(Q@T>MWcr%*1+7@U?1ZJdX>6a+S}d() zs((UF*Seqgfsk5e9B0>DS*H7l8fLlMBBUQ1uAs=Mv6`!EUT=q4E4Z!r%D$c*!Xm9Z z+i6CrhO0p&AEw8h<-%y+SqFa^*;JhXw2v3VemVp|M^0iViIdbx=49j~2kA%W4@ZBc zb)$9R?6I@sUGC3FKXRs%pJ%0&ZQ1g6-l=xETC-|?^MNrjKRvyv&33achm56cJ~317 rT9lM>#Vw`B?Y2*z4^dxWXlRZ=a-8G93vhyu0uN8|7)RdznE1Z|f$FdH literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/colorchooser.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/colorchooser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8bcd0e50e9970c25f7e0b32ba3ab82a6c8b721b GIT binary patch literal 449 zcmY*Wu};G<6nswFQl)8G7#TbvwNev_c0_5vrsKN+egZQJY zO#A{YI86tz<@4Q>-n+9r>UOQ}$Ity00{DbKtE2h3KGM?=L4+72Xo*n84Q3?f(nLT^ zaiq1$8XlyB!rt2N9BI-AUVqw z@oAEAp>)ZdFGl)8gO_V>O|Xh5oN+N(b1sR%36F9{FqJr=QquI%!55rJT<~1rd2x(s zDpkN(peRqZ2w5IgLujgqIGgqNO3U|Gxyl9cePQSnOS_g%t|*hjtV##F1}Ch%!`i#- z{m)W%F1MMdLU8d8qOCi(@I7@^lDQephIyI=VN9aoW=#kij>nsoES_SwwsaHzOr*Or fbN`w-Sy8r6>ers?4+7cKU>mm4K$c-38}-mH4e)_W literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/commondialog.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/commondialog.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..452bb1726de58cd756eef5cad6dec34941fe6983 GIT binary patch literal 449 zcmY*W&riZI82!2d5*T>#=wT-lNZ1nLXw*bFc#vRRqHu7TtUyD5%(j!vqy9C<|7cfF z{tJ4s8yv7rU*G$Z?|ZLlztw8AK7Su?5WpAgt)}6Z=BU6x3^Ag>&K$}y-)1s&P<|LaDM3?> zL&6dvwJF(?Y2RF^`+6I!u&dWsf-%8|B%)&JG7+Z~yF|H+C`I_vbB6*eHxsFJC)ue> zxY7}&ktTv0F{f!<3?W=&c`@!B|Jlqo~L{co_o=x*aTa&0J`j)ckSOqkbCk8};hR zub>yxZO9Vx^4^d9@?OZW({VeWzYk*s@CAFLZTO{GGBS`tiYVl0j!?}lYUTFaMu2T` zVzf=22w1=LHoOtR9k62ua5Hno1VKGnho_|C(#P~QMTYrs)Q-&=RDOE`@}FJC1Fp2Kjv8aCD+2AmZv_cPg0sF z!kG~Zs#EN%j4*}8#iVyoxpBPIN(&sv!ZH!&-c|-$5h{gUmyUJ~!M}0U-b+!nZ#Ge{ zh2Y`?M9cJS;O8n-c@Y+*7-&``iwviO^$KG;7>(9TSw3gs)-25V3zp%|Cj7Svin3~* XZ6A4VJ_TggfM&O1n>p_Mo04-y=0&vh8QtO(F&mhH<*!{D-!`R z#ktldvjWHlrCak>0QZocSwQT>5px8GN$l8qM{j5enehN|>kj(%w|0g;s!pRP$yuRD zNYk7PrAy{wIno;%yv~9h!BZMBzQrkz3q~-NIHgk3Z0q4EClZ&u5O`5uV46u4F%~Jx zGcDGvhzV8+%@h%ndHNhE89(jr0mdnH1)s)H@#V;ySgmoAjzPt8aHJ z1Q#D5+Pb%fpNX&1+|Ow~EV4XWCnO&3cZ9Ivc)Z`p@;ULF5I^NFMEXa2zp?l7vT9#7 WFT2*C0J5jSHC)3&j$t4d_0S)8o^=xd literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/dnd.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/dnd.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e156f8506c9919a35ec5c7bdcbc800d1995519b4 GIT binary patch literal 413 zcmYjNPfx-y9Q}10NMPU>@X(V9By0(AB&fSEz+#(X8%a$Q9q6G8|~`J zub>yp;9#4+zW2+o@3kFwyY24h@52ZIe8IobvHZd=6B4nl~c2199R3ZKiEGL$I5)NxXOTh87^4dmxQl=r_NuGxSk)oII+W8%<-D z6}i;5Glesz6cbMYzRan@Wo{&%mm|!C(h28@X1TCp z#SNiYr%Y%n&u9IksvXB`qm86-EFBxZ^!G9_nsFuFU8!?85ZK77Q72cOoBCo`Qs(jl zWXtx|@G}i{R)hsBhDH?0Dy3w&-B8MhlgW0i%I7rP2ZUMvLREOM4y|=ilvQiGf6|%# Td{8|LzT-O{YC8_{Q4jqAeB^Q5 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/filedialog.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/filedialog.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bb3dff2dd491083c811f732875829f2dc5ee904 GIT binary patch literal 437 zcmYjOK}*9h82!?Ab9CJV&mM9THdqU8M^Rx@@ZcC&(CuKUYqo`^O-)iqJ?gI!|52}= z{0n+9>jpC+FYkTueeZ?zTP?fw`TICT0AKKLH8sD~NBSBfh!BGW%@EpfgBgiAGZ7F| zoM>$_%ZIdEI2Et?a1ZIR1*9I^VvJz3NjsTTg}#Di6aa$yu&Q zK$DCMrAy{y+SeEAzTWyPg0CqfBN{Tk#0igbMlh8)p;FRx>EaP55*Iudcv75Vno1Qi z7Ane9E#@qb2v#vo6%iNX&OvDh!6H|=AVDAuonYo{rJF0tq%b$7qg{i$(9TiiT-y5- zW%H&=dL;xGA0QgKr-GlMr;^OeXx7WqES$$A>aACVu-;&>UdZA(_O@nT!e5B=b~fJL d#?6YdakhQsx&9Q8Z4Hj$7#6Y(139RT{s76gdv5>$ literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/font.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/font.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65f69f67366bc187c9c917fcccbc245aef8492c8 GIT binary patch literal 417 zcmYjOy-ve082p^1p-NMD0ftOSt<*%KW#exEq%Kt@B0)P4g~p{;96Q(!RT$xE5O0)~ ziC2IHC+UDKpYJ~TyR+qSzwh)ve;-Z|z!&@*J|Jlqp0`;@!%X-(CuL9)@%z+o0_C<^{9W1_#gG^ z$$vpFrt82ZIhFk2qB^nqcK7y*QgfjV;uq3 z`JvJ}H9SZpSztv=Dqhc?Z2u3rB zeG;dPOI6Z`qn^4@=k?B8U|UAFScqVb&)Le3S(s656Jf_h2$IYl`;uW{=Pcv)Fh8$nh{JT&Zv|$fAaASClZ%j3p^>$G0mll z8H*L=xe*Jd6M|Jrb4A3}xN}swQMA-b3lc@bG8yLHPWoC=CWXBzo$MQYx%XDayYdc` zRL#*g?@$OXK0!20-xhv{fy#=YphZvTMZ8E!(p#?xVZFg%y_Ds18te>%jK2^W?5%=B dE59hK#>MWfm*#UowhefeXF15VEaag!`Uk=of3W}n literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/simpledialog.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/simpledialog.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fc75eccb3670de4b4d92beedf768aad55776670 GIT binary patch literal 445 zcmYjOPfx-y9Q}10NXEd6M-M%jK*E*?N24C#zy(QIqHu7TtUyDz&i;|iqkbCWH`>*c zUqLUH;ej@Neec)&`d-t1tL3≠>yP;0umM)9_ofWN09P1Tjd_0--&(n3dWK8v(J! zh0!*1Ldd#>SMgd1_mG`CKs`1ZcxDb58Pb^XHBNb=8NpQIluAjnwU39KNL+9&@U*zZG?OZ3 zELN0fMl6|52v%E~DI#tros-gyqLo%!kSG$C$*}Ma($|VIDeQge?7zX6m3LBkm)>!b zvN^8uj)dUi14P60Rq!(kRGJ4l&3ih_nlz1@Zo)*B3VD_J~mgM(p^@)sh5f2-iw d%Fm0kadmj>wfP*7Z3CX=Sq^e73wfxG{s3{0ee4d#}0nbh7rC7@kd#i z_yt&S9|N|0?m1WYo@;y1>G++`--i$Ze8Iofw*0~#67LiPIzt!LN9m&y%xIF( zq7+iwlslOYY(Tx&>v&0UOxL&&nPCJ|g$t?_Ost&nVJG8I`o`8(yaKoMipgk`UG(4p$3RJ?GKRJ}SfuQPJKwvc_Rq)veL)L1*^k SK^Hzxhv*NM&v23e literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/ttk.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/__pycache__/ttk.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..100b6166dd6c706ce3920375171a487fedf176fe GIT binary patch literal 409 zcmYjNJx{|h5IrYpsnWFk0R~Sl_y%GmK!Wa6y%#{4vBAf+$=GBk{aC!IUeVGL~v8xD_jA zGFzEbu8BOG4GwBQN!CUiNs>f5w)HaD%g|`blysX^_pczdEo--d?)7e{ODTnX2idW= zcJMuobWuhnEk}lz=_)7LXuBbVjV6=rT2)VZw6~86@k~_oXB=72u&nCNbpN1J`|+Uq Q76K=5JmfnL3Q!;Y0>Ghg$^ZZW literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/colorchooser.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/colorchooser.py new file mode 100644 index 0000000..6dde6e8 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/colorchooser.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.colorchooser import * +else: + try: + from tkColorChooser import * + except ImportError: + raise ImportError('The tkColorChooser module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/commondialog.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/commondialog.py new file mode 100644 index 0000000..eb7ae8d --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/commondialog.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.commondialog import * +else: + try: + from tkCommonDialog import * + except ImportError: + raise ImportError('The tkCommonDialog module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/constants.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/constants.py new file mode 100644 index 0000000..ffe0981 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/constants.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.constants import * +else: + try: + from Tkconstants import * + except ImportError: + raise ImportError('The Tkconstants module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/dialog.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/dialog.py new file mode 100644 index 0000000..113370c --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/dialog.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.dialog import * +else: + try: + from Dialog import * + except ImportError: + raise ImportError('The Dialog module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/dnd.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/dnd.py new file mode 100644 index 0000000..1ab4379 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/dnd.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.dnd import * +else: + try: + from Tkdnd import * + except ImportError: + raise ImportError('The Tkdnd module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/filedialog.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/filedialog.py new file mode 100644 index 0000000..973923e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/filedialog.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.filedialog import * +else: + try: + from FileDialog import * + except ImportError: + raise ImportError('The FileDialog module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/font.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/font.py new file mode 100644 index 0000000..628f399 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/font.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.font import * +else: + try: + from tkFont import * + except ImportError: + raise ImportError('The tkFont module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/messagebox.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/messagebox.py new file mode 100644 index 0000000..b43d870 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/messagebox.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.messagebox import * +else: + try: + from tkMessageBox import * + except ImportError: + raise ImportError('The tkMessageBox module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/scrolledtext.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/scrolledtext.py new file mode 100644 index 0000000..1c69db6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/scrolledtext.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.scrolledtext import * +else: + try: + from ScrolledText import * + except ImportError: + raise ImportError('The ScrolledText module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/simpledialog.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/simpledialog.py new file mode 100644 index 0000000..dba93fb --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/simpledialog.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.simpledialog import * +else: + try: + from SimpleDialog import * + except ImportError: + raise ImportError('The SimpleDialog module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/tix.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/tix.py new file mode 100644 index 0000000..8d1718a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/tix.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.tix import * +else: + try: + from Tix import * + except ImportError: + raise ImportError('The Tix module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/ttk.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/ttk.py new file mode 100644 index 0000000..081c1b4 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/tkinter/ttk.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import + +from future.utils import PY3 + +if PY3: + from tkinter.ttk import * +else: + try: + from ttk import * + except ImportError: + raise ImportError('The ttk module is missing. Does your Py2 ' + 'installation include tkinter?') diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__init__.py new file mode 100644 index 0000000..5cf428b --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if not PY3: + __future_module__ = True diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c44cc575fc4fc6c63a254b1647d0575d6cca4836 GIT binary patch literal 269 zcmX|4%TB{E5M0LzLRBKfA8_E3L+V3&tWduIA;E)#vX^2LNA$^JJvfgm6nFK{5lDwTz8AGnwTrXP|hvk-W`i{s?vP zO-ZQPaJAWn-lV8dTi5$Y7JqnNJl)sDFhks>n7l&tx9#;NuArg?v-qgZ%UbFxjgQ|>97}5rLg_G3L<%9^j0A1PDjMKI}Mks QsrZgjX}BONS()YR4;R2le*gdg literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/error.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/__pycache__/error.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73fed9445f69f18921bb65719b10f8684fca7187 GIT binary patch literal 489 zcmYjOO-sW-5Z%p3o3sfk2;RL_Xam)wiXegq5w#I@4~FQjv~)KcXA?`${s4c6_>Xe& z;K{$B7bl5`3;X8H%$s=&yB&tT@a_Bdof7gv{v99r0bVmj;Dl326lIjw+>(~EncZ+( zI?81(CBlU<_8i%XNjBy#>k9jsylghAj`Wnz{DyaBPxV<}1uUTCig53oT###w6Eg5W z(TxmfwUXW$Ez3eAGnH#7uoRlo4mWuE<-MugNm_2_2Fp zb))Rol+xBB%~e(E8m!n@Q;CA7_hq>?V0f4B&S9dDZlDluD7#gEnL`4X(g?J zq@p#WgJ^9$OB8n{hwA3;ofUfjYI)|uG~L+RYLTY80}sv??Q(7Etl*jEsmyP6ruW*z z-RQ7u>s%TQUzxZFvY}?(bjT+E@>I#K#MlU`bRRK5_z3(Tbch%tV#E<*1aSQ}QjgJ@ zAdV4J#0)V9d?We{HR9Lvq*hf@<<$yb)!kO`)x*6Ia&>X>urd4HHfbAARQXAmq|Hy7 eme zwoAN(WhfiF%qv)hs%^2V_)2RPUVEi|s=S7EsG|c8HlTqnxY&dydf;ITTG)m*cA$e@ z=wc6g*oQtY!4fXRGOoaiiCyEXIDi4J!5Xf^I&Q!QZo(#R!4_`AHtxU$(f~&$o%~MvGnPj5yy$yIqr>lf&R@9DK7SBYGzM@vuRq|MCPe+Hj>-(3P z$^`R$QKF{9U@;v_6~tj6LZ3(HA`o*?)~jBznyH9OQ6VXBQ?=wXE_x|yB#OF*qoMy| z;c7HBJPrEOEz#EKXmmAt8hwo=jb%da6`@Vf#ERBeH3k}M8tWPx8k-th8rvE>8oLDO z{i_g@FymAx^}?iV?v7GF7DICUVu?e&N#obUiNbV}M(L5hv5RXK9?hnV@uSnz*`=J{ xTu&B_m|$|t+530Ovs5$Xixi z0XB>qAz^9Wym^{=Gm^(i5+xr$kGBNi6aKwE@^cJL5g0HcKoUxb<&JQqOI-roRYzF6 z!ka>M!aUmJPiyf^b^c=P62mSmrQ&tC|kZ@{4Xo6UGey{#=4CB- uv3(Un7K_Dp<#umtI%ZO(--V-N8a?_}nq7Z#GX~va`0Em&6sJ*)6Tm-6EL^w% literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/error.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/error.py new file mode 100644 index 0000000..7d8ada7 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/error.py @@ -0,0 +1,16 @@ +from __future__ import absolute_import +from future.standard_library import suspend_hooks + +from future.utils import PY3 + +if PY3: + from urllib.error import * +else: + __future_module__ = True + + # We use this method to get at the original Py2 urllib before any renaming magic + # ContentTooShortError = sys.py2_modules['urllib'].ContentTooShortError + + with suspend_hooks(): + from urllib import ContentTooShortError + from urllib2 import URLError, HTTPError diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/parse.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/parse.py new file mode 100644 index 0000000..9074b81 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/parse.py @@ -0,0 +1,28 @@ +from __future__ import absolute_import +from future.standard_library import suspend_hooks + +from future.utils import PY3 + +if PY3: + from urllib.parse import * +else: + __future_module__ = True + from urlparse import (ParseResult, SplitResult, parse_qs, parse_qsl, + urldefrag, urljoin, urlparse, urlsplit, + urlunparse, urlunsplit) + + # we use this method to get at the original py2 urllib before any renaming + # quote = sys.py2_modules['urllib'].quote + # quote_plus = sys.py2_modules['urllib'].quote_plus + # unquote = sys.py2_modules['urllib'].unquote + # unquote_plus = sys.py2_modules['urllib'].unquote_plus + # urlencode = sys.py2_modules['urllib'].urlencode + # splitquery = sys.py2_modules['urllib'].splitquery + + with suspend_hooks(): + from urllib import (quote, + quote_plus, + unquote, + unquote_plus, + urlencode, + splitquery) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/request.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/request.py new file mode 100644 index 0000000..972aa4a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/request.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +from future.standard_library import suspend_hooks +from future.utils import PY3 + +if PY3: + from urllib.request import * + # This aren't in __all__: + from urllib.request import (getproxies, + pathname2url, + proxy_bypass, + quote, + request_host, + thishost, + unquote, + url2pathname, + urlcleanup, + urljoin, + urlopen, + urlparse, + urlretrieve, + urlsplit, + urlunparse) + + from urllib.parse import (splitattr, + splithost, + splitpasswd, + splitport, + splitquery, + splittag, + splittype, + splituser, + splitvalue, + to_bytes, + unwrap) +else: + __future_module__ = True + with suspend_hooks(): + from urllib import * + from urllib2 import * + from urlparse import * + + # Rename: + from urllib import toBytes # missing from __all__ on Py2.6 + to_bytes = toBytes + + # from urllib import (pathname2url, + # url2pathname, + # getproxies, + # urlretrieve, + # urlcleanup, + # URLopener, + # FancyURLopener, + # proxy_bypass) + + # from urllib2 import ( + # AbstractBasicAuthHandler, + # AbstractDigestAuthHandler, + # BaseHandler, + # CacheFTPHandler, + # FileHandler, + # FTPHandler, + # HTTPBasicAuthHandler, + # HTTPCookieProcessor, + # HTTPDefaultErrorHandler, + # HTTPDigestAuthHandler, + # HTTPErrorProcessor, + # HTTPHandler, + # HTTPPasswordMgr, + # HTTPPasswordMgrWithDefaultRealm, + # HTTPRedirectHandler, + # HTTPSHandler, + # URLError, + # build_opener, + # install_opener, + # OpenerDirector, + # ProxyBasicAuthHandler, + # ProxyDigestAuthHandler, + # ProxyHandler, + # Request, + # UnknownHandler, + # urlopen, + # ) + + # from urlparse import ( + # urldefrag + # urljoin, + # urlparse, + # urlunparse, + # urlsplit, + # urlunsplit, + # parse_qs, + # parse_q" + # ) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/response.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/response.py new file mode 100644 index 0000000..a287ae2 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/response.py @@ -0,0 +1,12 @@ +from future import standard_library +from future.utils import PY3 + +if PY3: + from urllib.response import * +else: + __future_module__ = True + with standard_library.suspend_hooks(): + from urllib import (addbase, + addclosehook, + addinfo, + addinfourl) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/robotparser.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/robotparser.py new file mode 100644 index 0000000..0dc8f57 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/urllib/robotparser.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from urllib.robotparser import * +else: + __future_module__ = True + from robotparser import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/winreg.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/winreg.py new file mode 100644 index 0000000..c8b1475 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/winreg.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from winreg import * +else: + __future_module__ = True + from _winreg import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..891c341bc5c056ae4afcdf999624f1a9d96f6107 GIT binary patch literal 147 zcmXr!<>lgC{X32U2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUk>^uxdr+KnFYF~ zc?F5d*{LbI5$$v%Id-vQtY^FJu6J4`#r(n3olC{htJX)38=6(b;+xkk@qw1z%D ztJxab=n?YSH{L-`#;eWN4$?bOcS;Y&;fOsvEwGWB`}|@|>U!s$H=?f1^t4KYExqfc zH4H~%_NJuKP1(p!^lrQiR(9JDFflHi%g>5CrMd2O;d{Ml4x%lNdm&`8TpoA!^m5>V h%+>HJEDsPKn590A@vRzKFU5)=(oWozq%1d2clHW?Ghc`T6_&4gg<>|4LBZA>0j;06`RJ(h@T2L?xQGlz^o63O!Zn0(RL+ zO%@>1N2n&>cn1|3E|)9UtKcQ?wCSzK5q)@?Vk6i0)!C49z6m~9$+;b$wnel}@SSp& zj-&ETD{Iz`lXfrda1pKQRv%!`ap6QibLO>SrZaWendN#bMSXaYQq{BBVdIXkTNaa< g?)TEM7{X#^V~#_1t9ucYoD+<68B#%tBqe$B2a*F$?EnA( literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/client.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/client.py new file mode 100644 index 0000000..4708cf8 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/client.py @@ -0,0 +1,7 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from xmlrpc.client import * +else: + from xmlrpclib import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/server.py b/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/server.py new file mode 100644 index 0000000..1a8af34 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/moves/xmlrpc/server.py @@ -0,0 +1,7 @@ +from __future__ import absolute_import +from future.utils import PY3 + +if PY3: + from xmlrpc.server import * +else: + from xmlrpclib import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/standard_library/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/standard_library/__init__.py new file mode 100644 index 0000000..cff02f9 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/standard_library/__init__.py @@ -0,0 +1,815 @@ +""" +Python 3 reorganized the standard library (PEP 3108). This module exposes +several standard library modules to Python 2 under their new Python 3 +names. + +It is designed to be used as follows:: + + from future import standard_library + standard_library.install_aliases() + +And then these normal Py3 imports work on both Py3 and Py2:: + + import builtins + import copyreg + import queue + import reprlib + import socketserver + import winreg # on Windows only + import test.support + import html, html.parser, html.entites + import http, http.client, http.server + import http.cookies, http.cookiejar + import urllib.parse, urllib.request, urllib.response, urllib.error, urllib.robotparser + import xmlrpc.client, xmlrpc.server + + import _thread + import _dummy_thread + import _markupbase + + from itertools import filterfalse, zip_longest + from sys import intern + from collections import UserDict, UserList, UserString + from collections import OrderedDict, Counter, ChainMap # even on Py2.6 + from subprocess import getoutput, getstatusoutput + from subprocess import check_output # even on Py2.6 + +(The renamed modules and functions are still available under their old +names on Python 2.) + +This is a cleaner alternative to this idiom (see +http://docs.pythonsprints.com/python3_porting/py-porting.html):: + + try: + import queue + except ImportError: + import Queue as queue + + +Limitations +----------- +We don't currently support these modules, but would like to:: + + import dbm + import dbm.dumb + import dbm.gnu + import collections.abc # on Py33 + import pickle # should (optionally) bring in cPickle on Python 2 + +""" + +from __future__ import absolute_import, division, print_function + +import sys +import logging +import imp +import contextlib +import types +import copy +import os + +# Make a dedicated logger; leave the root logger to be configured +# by the application. +flog = logging.getLogger('future_stdlib') +_formatter = logging.Formatter(logging.BASIC_FORMAT) +_handler = logging.StreamHandler() +_handler.setFormatter(_formatter) +flog.addHandler(_handler) +flog.setLevel(logging.WARN) + +from future.utils import PY2, PY3 + +# The modules that are defined under the same names on Py3 but with +# different contents in a significant way (e.g. submodules) are: +# pickle (fast one) +# dbm +# urllib +# test +# email + +REPLACED_MODULES = set(['test', 'urllib', 'pickle', 'dbm']) # add email and dbm when we support it + +# The following module names are not present in Python 2.x, so they cause no +# potential clashes between the old and new names: +# http +# html +# tkinter +# xmlrpc +# Keys: Py2 / real module names +# Values: Py3 / simulated module names +RENAMES = { + # 'cStringIO': 'io', # there's a new io module in Python 2.6 + # that provides StringIO and BytesIO + # 'StringIO': 'io', # ditto + # 'cPickle': 'pickle', + '__builtin__': 'builtins', + 'copy_reg': 'copyreg', + 'Queue': 'queue', + 'future.moves.socketserver': 'socketserver', + 'ConfigParser': 'configparser', + 'repr': 'reprlib', + # 'FileDialog': 'tkinter.filedialog', + # 'tkFileDialog': 'tkinter.filedialog', + # 'SimpleDialog': 'tkinter.simpledialog', + # 'tkSimpleDialog': 'tkinter.simpledialog', + # 'tkColorChooser': 'tkinter.colorchooser', + # 'tkCommonDialog': 'tkinter.commondialog', + # 'Dialog': 'tkinter.dialog', + # 'Tkdnd': 'tkinter.dnd', + # 'tkFont': 'tkinter.font', + # 'tkMessageBox': 'tkinter.messagebox', + # 'ScrolledText': 'tkinter.scrolledtext', + # 'Tkconstants': 'tkinter.constants', + # 'Tix': 'tkinter.tix', + # 'ttk': 'tkinter.ttk', + # 'Tkinter': 'tkinter', + '_winreg': 'winreg', + 'thread': '_thread', + 'dummy_thread': '_dummy_thread', + # 'anydbm': 'dbm', # causes infinite import loop + # 'whichdb': 'dbm', # causes infinite import loop + # anydbm and whichdb are handled by fix_imports2 + # 'dbhash': 'dbm.bsd', + # 'dumbdbm': 'dbm.dumb', + # 'dbm': 'dbm.ndbm', + # 'gdbm': 'dbm.gnu', + 'future.moves.xmlrpc': 'xmlrpc', + # 'future.backports.email': 'email', # for use by urllib + # 'DocXMLRPCServer': 'xmlrpc.server', + # 'SimpleXMLRPCServer': 'xmlrpc.server', + # 'httplib': 'http.client', + # 'htmlentitydefs' : 'html.entities', + # 'HTMLParser' : 'html.parser', + # 'Cookie': 'http.cookies', + # 'cookielib': 'http.cookiejar', + # 'BaseHTTPServer': 'http.server', + # 'SimpleHTTPServer': 'http.server', + # 'CGIHTTPServer': 'http.server', + # 'future.backports.test': 'test', # primarily for renaming test_support to support + # 'commands': 'subprocess', + # 'urlparse' : 'urllib.parse', + # 'robotparser' : 'urllib.robotparser', + # 'abc': 'collections.abc', # for Py33 + # 'future.utils.six.moves.html': 'html', + # 'future.utils.six.moves.http': 'http', + 'future.moves.html': 'html', + 'future.moves.http': 'http', + # 'future.backports.urllib': 'urllib', + # 'future.utils.six.moves.urllib': 'urllib', + 'future.moves._markupbase': '_markupbase', + } + + +# It is complicated and apparently brittle to mess around with the +# ``sys.modules`` cache in order to support "import urllib" meaning two +# different things (Py2.7 urllib and backported Py3.3-like urllib) in different +# contexts. So we require explicit imports for these modules. +assert len(set(RENAMES.values()) & set(REPLACED_MODULES)) == 0 + + +# Harmless renames that we can insert. +# These modules need names from elsewhere being added to them: +# subprocess: should provide getoutput and other fns from commands +# module but these fns are missing: getstatus, mk2arg, +# mkarg +# re: needs an ASCII constant that works compatibly with Py3 + +# etc: see lib2to3/fixes/fix_imports.py + +# (New module name, new object name, old module name, old object name) +MOVES = [('collections', 'UserList', 'UserList', 'UserList'), + ('collections', 'UserDict', 'UserDict', 'UserDict'), + ('collections', 'UserString','UserString', 'UserString'), + ('collections', 'ChainMap', 'future.backports.misc', 'ChainMap'), + ('itertools', 'filterfalse','itertools', 'ifilterfalse'), + ('itertools', 'zip_longest','itertools', 'izip_longest'), + ('sys', 'intern','__builtin__', 'intern'), + # The re module has no ASCII flag in Py2, but this is the default. + # Set re.ASCII to a zero constant. stat.ST_MODE just happens to be one + # (and it exists on Py2.6+). + ('re', 'ASCII','stat', 'ST_MODE'), + ('base64', 'encodebytes','base64', 'encodestring'), + ('base64', 'decodebytes','base64', 'decodestring'), + ('subprocess', 'getoutput', 'commands', 'getoutput'), + ('subprocess', 'getstatusoutput', 'commands', 'getstatusoutput'), + ('subprocess', 'check_output', 'future.backports.misc', 'check_output'), + ('math', 'ceil', 'future.backports.misc', 'ceil'), + ('collections', 'OrderedDict', 'future.backports.misc', 'OrderedDict'), + ('collections', 'Counter', 'future.backports.misc', 'Counter'), + ('collections', 'ChainMap', 'future.backports.misc', 'ChainMap'), + ('itertools', 'count', 'future.backports.misc', 'count'), + ('reprlib', 'recursive_repr', 'future.backports.misc', 'recursive_repr'), + ('functools', 'cmp_to_key', 'future.backports.misc', 'cmp_to_key'), + +# This is no use, since "import urllib.request" etc. still fails: +# ('urllib', 'error', 'future.moves.urllib', 'error'), +# ('urllib', 'parse', 'future.moves.urllib', 'parse'), +# ('urllib', 'request', 'future.moves.urllib', 'request'), +# ('urllib', 'response', 'future.moves.urllib', 'response'), +# ('urllib', 'robotparser', 'future.moves.urllib', 'robotparser'), + ] + + +# A minimal example of an import hook: +# class WarnOnImport(object): +# def __init__(self, *args): +# self.module_names = args +# +# def find_module(self, fullname, path=None): +# if fullname in self.module_names: +# self.path = path +# return self +# return None +# +# def load_module(self, name): +# if name in sys.modules: +# return sys.modules[name] +# module_info = imp.find_module(name, self.path) +# module = imp.load_module(name, *module_info) +# sys.modules[name] = module +# flog.warning("Imported deprecated module %s", name) +# return module + + +class RenameImport(object): + """ + A class for import hooks mapping Py3 module names etc. to the Py2 equivalents. + """ + # Different RenameImport classes are created when importing this module from + # different source files. This causes isinstance(hook, RenameImport) checks + # to produce inconsistent results. We add this RENAMER attribute here so + # remove_hooks() and install_hooks() can find instances of these classes + # easily: + RENAMER = True + + def __init__(self, old_to_new): + ''' + Pass in a dictionary-like object mapping from old names to new + names. E.g. {'ConfigParser': 'configparser', 'cPickle': 'pickle'} + ''' + self.old_to_new = old_to_new + both = set(old_to_new.keys()) & set(old_to_new.values()) + assert (len(both) == 0 and + len(set(old_to_new.values())) == len(old_to_new.values())), \ + 'Ambiguity in renaming (handler not implemented)' + self.new_to_old = dict((new, old) for (old, new) in old_to_new.items()) + + def find_module(self, fullname, path=None): + # Handles hierarchical importing: package.module.module2 + new_base_names = set([s.split('.')[0] for s in self.new_to_old]) + # Before v0.12: Was: if fullname in set(self.old_to_new) | new_base_names: + if fullname in new_base_names: + return self + return None + + def load_module(self, name): + path = None + if name in sys.modules: + return sys.modules[name] + elif name in self.new_to_old: + # New name. Look up the corresponding old (Py2) name: + oldname = self.new_to_old[name] + module = self._find_and_load_module(oldname) + # module.__future_module__ = True + else: + module = self._find_and_load_module(name) + # In any case, make it available under the requested (Py3) name + sys.modules[name] = module + return module + + def _find_and_load_module(self, name, path=None): + """ + Finds and loads it. But if there's a . in the name, handles it + properly. + """ + bits = name.split('.') + while len(bits) > 1: + # Treat the first bit as a package + packagename = bits.pop(0) + package = self._find_and_load_module(packagename, path) + try: + path = package.__path__ + except AttributeError: + # This could be e.g. moves. + flog.debug('Package {0} has no __path__.'.format(package)) + if name in sys.modules: + return sys.modules[name] + flog.debug('What to do here?') + + name = bits[0] + module_info = imp.find_module(name, path) + return imp.load_module(name, *module_info) + + +class hooks(object): + """ + Acts as a context manager. Saves the state of sys.modules and restores it + after the 'with' block. + + Use like this: + + >>> from future import standard_library + >>> with standard_library.hooks(): + ... import http.client + >>> import requests + + For this to work, http.client will be scrubbed from sys.modules after the + 'with' block. That way the modules imported in the 'with' block will + continue to be accessible in the current namespace but not from any + imported modules (like requests). + """ + def __enter__(self): + # flog.debug('Entering hooks context manager') + self.old_sys_modules = copy.copy(sys.modules) + self.hooks_were_installed = detect_hooks() + # self.scrubbed = scrub_py2_sys_modules() + install_hooks() + return self + + def __exit__(self, *args): + # flog.debug('Exiting hooks context manager') + # restore_sys_modules(self.scrubbed) + if not self.hooks_were_installed: + remove_hooks() + # scrub_future_sys_modules() + +# Sanity check for is_py2_stdlib_module(): We aren't replacing any +# builtin modules names: +if PY2: + assert len(set(RENAMES.values()) & set(sys.builtin_module_names)) == 0 + + +def is_py2_stdlib_module(m): + """ + Tries to infer whether the module m is from the Python 2 standard library. + This may not be reliable on all systems. + """ + if PY3: + return False + if not 'stdlib_path' in is_py2_stdlib_module.__dict__: + stdlib_files = [contextlib.__file__, os.__file__, copy.__file__] + stdlib_paths = [os.path.split(f)[0] for f in stdlib_files] + if not len(set(stdlib_paths)) == 1: + # This seems to happen on travis-ci.org. Very strange. We'll try to + # ignore it. + flog.warn('Multiple locations found for the Python standard ' + 'library: %s' % stdlib_paths) + # Choose the first one arbitrarily + is_py2_stdlib_module.stdlib_path = stdlib_paths[0] + + if m.__name__ in sys.builtin_module_names: + return True + + if hasattr(m, '__file__'): + modpath = os.path.split(m.__file__) + if (modpath[0].startswith(is_py2_stdlib_module.stdlib_path) and + 'site-packages' not in modpath[0]): + return True + + return False + + +def scrub_py2_sys_modules(): + """ + Removes any Python 2 standard library modules from ``sys.modules`` that + would interfere with Py3-style imports using import hooks. Examples are + modules with the same names (like urllib or email). + + (Note that currently import hooks are disabled for modules like these + with ambiguous names anyway ...) + """ + if PY3: + return {} + scrubbed = {} + for modulename in REPLACED_MODULES & set(RENAMES.keys()): + if not modulename in sys.modules: + continue + + module = sys.modules[modulename] + + if is_py2_stdlib_module(module): + flog.debug('Deleting (Py2) {} from sys.modules'.format(modulename)) + scrubbed[modulename] = sys.modules[modulename] + del sys.modules[modulename] + return scrubbed + + +def scrub_future_sys_modules(): + """ + Deprecated. + """ + return {} + +class suspend_hooks(object): + """ + Acts as a context manager. Use like this: + + >>> from future import standard_library + >>> standard_library.install_hooks() + >>> import http.client + >>> # ... + >>> with standard_library.suspend_hooks(): + >>> import requests # incompatible with ``future``'s standard library hooks + + If the hooks were disabled before the context, they are not installed when + the context is left. + """ + def __enter__(self): + self.hooks_were_installed = detect_hooks() + remove_hooks() + # self.scrubbed = scrub_future_sys_modules() + return self + + def __exit__(self, *args): + if self.hooks_were_installed: + install_hooks() + # restore_sys_modules(self.scrubbed) + + +def restore_sys_modules(scrubbed): + """ + Add any previously scrubbed modules back to the sys.modules cache, + but only if it's safe to do so. + """ + clash = set(sys.modules) & set(scrubbed) + if len(clash) != 0: + # If several, choose one arbitrarily to raise an exception about + first = list(clash)[0] + raise ImportError('future module {} clashes with Py2 module' + .format(first)) + sys.modules.update(scrubbed) + + +def install_aliases(): + """ + Monkey-patches the standard library in Py2.6/7 to provide + aliases for better Py3 compatibility. + """ + if PY3: + return + # if hasattr(install_aliases, 'run_already'): + # return + for (newmodname, newobjname, oldmodname, oldobjname) in MOVES: + __import__(newmodname) + # We look up the module in sys.modules because __import__ just returns the + # top-level package: + newmod = sys.modules[newmodname] + # newmod.__future_module__ = True + + __import__(oldmodname) + oldmod = sys.modules[oldmodname] + + obj = getattr(oldmod, oldobjname) + setattr(newmod, newobjname, obj) + + # Hack for urllib so it appears to have the same structure on Py2 as on Py3 + import urllib + from future.backports.urllib import request + from future.backports.urllib import response + from future.backports.urllib import parse + from future.backports.urllib import error + from future.backports.urllib import robotparser + urllib.request = request + urllib.response = response + urllib.parse = parse + urllib.error = error + urllib.robotparser = robotparser + sys.modules['urllib.request'] = request + sys.modules['urllib.response'] = response + sys.modules['urllib.parse'] = parse + sys.modules['urllib.error'] = error + sys.modules['urllib.robotparser'] = robotparser + + # Patch the test module so it appears to have the same structure on Py2 as on Py3 + try: + import test + except ImportError: + pass + try: + from future.moves.test import support + except ImportError: + pass + else: + test.support = support + sys.modules['test.support'] = support + + # Patch the dbm module so it appears to have the same structure on Py2 as on Py3 + try: + import dbm + except ImportError: + pass + else: + from future.moves.dbm import dumb + dbm.dumb = dumb + sys.modules['dbm.dumb'] = dumb + try: + from future.moves.dbm import gnu + except ImportError: + pass + else: + dbm.gnu = gnu + sys.modules['dbm.gnu'] = gnu + try: + from future.moves.dbm import ndbm + except ImportError: + pass + else: + dbm.ndbm = ndbm + sys.modules['dbm.ndbm'] = ndbm + + # install_aliases.run_already = True + + +def install_hooks(): + """ + This function installs the future.standard_library import hook into + sys.meta_path. + """ + if PY3: + return + + install_aliases() + + flog.debug('sys.meta_path was: {0}'.format(sys.meta_path)) + flog.debug('Installing hooks ...') + + # Add it unless it's there already + newhook = RenameImport(RENAMES) + if not detect_hooks(): + sys.meta_path.append(newhook) + flog.debug('sys.meta_path is now: {0}'.format(sys.meta_path)) + + +def enable_hooks(): + """ + Deprecated. Use install_hooks() instead. This will be removed by + ``future`` v1.0. + """ + install_hooks() + + +def remove_hooks(scrub_sys_modules=False): + """ + This function removes the import hook from sys.meta_path. + """ + if PY3: + return + flog.debug('Uninstalling hooks ...') + # Loop backwards, so deleting items keeps the ordering: + for i, hook in list(enumerate(sys.meta_path))[::-1]: + if hasattr(hook, 'RENAMER'): + del sys.meta_path[i] + + # Explicit is better than implicit. In the future the interface should + # probably change so that scrubbing the import hooks requires a separate + # function call. Left as is for now for backward compatibility with + # v0.11.x. + if scrub_sys_modules: + scrub_future_sys_modules() + + +def disable_hooks(): + """ + Deprecated. Use remove_hooks() instead. This will be removed by + ``future`` v1.0. + """ + remove_hooks() + + +def detect_hooks(): + """ + Returns True if the import hooks are installed, False if not. + """ + flog.debug('Detecting hooks ...') + present = any([hasattr(hook, 'RENAMER') for hook in sys.meta_path]) + if present: + flog.debug('Detected.') + else: + flog.debug('Not detected.') + return present + + +# As of v0.12, this no longer happens implicitly: +# if not PY3: +# install_hooks() + + +if not hasattr(sys, 'py2_modules'): + sys.py2_modules = {} + +def cache_py2_modules(): + """ + Currently this function is unneeded, as we are not attempting to provide import hooks + for modules with ambiguous names: email, urllib, pickle. + """ + if len(sys.py2_modules) != 0: + return + assert not detect_hooks() + import urllib + sys.py2_modules['urllib'] = urllib + + import email + sys.py2_modules['email'] = email + + import pickle + sys.py2_modules['pickle'] = pickle + + # Not all Python installations have test module. (Anaconda doesn't, for example.) + # try: + # import test + # except ImportError: + # sys.py2_modules['test'] = None + # sys.py2_modules['test'] = test + + # import dbm + # sys.py2_modules['dbm'] = dbm + + +def import_(module_name, backport=False): + """ + Pass a (potentially dotted) module name of a Python 3 standard library + module. This function imports the module compatibly on Py2 and Py3 and + returns the top-level module. + + Example use: + >>> http = import_('http.client') + >>> http = import_('http.server') + >>> urllib = import_('urllib.request') + + Then: + >>> conn = http.client.HTTPConnection(...) + >>> response = urllib.request.urlopen('http://mywebsite.com') + >>> # etc. + + Use as follows: + >>> package_name = import_(module_name) + + On Py3, equivalent to this: + + >>> import module_name + + On Py2, equivalent to this if backport=False: + + >>> from future.moves import module_name + + or to this if backport=True: + + >>> from future.backports import module_name + + except that it also handles dotted module names such as ``http.client`` + The effect then is like this: + + >>> from future.backports import module + >>> from future.backports.module import submodule + >>> module.submodule = submodule + + Note that this would be a SyntaxError in Python: + + >>> from future.backports import http.client + + """ + # Python 2.6 doesn't have importlib in the stdlib, so it requires + # the backported ``importlib`` package from PyPI as a dependency to use + # this function: + import importlib + + if PY3: + return __import__(module_name) + else: + # client.blah = blah + # Then http.client = client + # etc. + if backport: + prefix = 'future.backports' + else: + prefix = 'future.moves' + parts = prefix.split('.') + module_name.split('.') + + modules = [] + for i, part in enumerate(parts): + sofar = '.'.join(parts[:i+1]) + modules.append(importlib.import_module(sofar)) + for i, part in reversed(list(enumerate(parts))): + if i == 0: + break + setattr(modules[i-1], part, modules[i]) + + # Return the next-most top-level module after future.backports / future.moves: + return modules[2] + + +def from_import(module_name, *symbol_names, **kwargs): + """ + Example use: + >>> HTTPConnection = from_import('http.client', 'HTTPConnection') + >>> HTTPServer = from_import('http.server', 'HTTPServer') + >>> urlopen, urlparse = from_import('urllib.request', 'urlopen', 'urlparse') + + Equivalent to this on Py3: + + >>> from module_name import symbol_names[0], symbol_names[1], ... + + and this on Py2: + + >>> from future.moves.module_name import symbol_names[0], ... + + or: + + >>> from future.backports.module_name import symbol_names[0], ... + + except that it also handles dotted module names such as ``http.client``. + """ + + if PY3: + return __import__(module_name) + else: + if 'backport' in kwargs and bool(kwargs['backport']): + prefix = 'future.backports' + else: + prefix = 'future.moves' + parts = prefix.split('.') + module_name.split('.') + module = importlib.import_module(prefix + '.' + module_name) + output = [getattr(module, name) for name in symbol_names] + if len(output) == 1: + return output[0] + else: + return output + + +class exclude_local_folder_imports(object): + """ + A context-manager that prevents standard library modules like configparser + from being imported from the local python-future source folder on Py3. + + (This was need prior to v0.16.0 because the presence of a configparser + folder would otherwise have prevented setuptools from running on Py3. Maybe + it's not needed any more?) + """ + def __init__(self, *args): + assert len(args) > 0 + self.module_names = args + # Disallow dotted module names like http.client: + if any(['.' in m for m in self.module_names]): + raise NotImplementedError('Dotted module names are not supported') + + def __enter__(self): + self.old_sys_path = copy.copy(sys.path) + self.old_sys_modules = copy.copy(sys.modules) + if sys.version_info[0] < 3: + return + # The presence of all these indicates we've found our source folder, + # because `builtins` won't have been installed in site-packages by setup.py: + FUTURE_SOURCE_SUBFOLDERS = ['future', 'past', 'libfuturize', 'libpasteurize', 'builtins'] + + # Look for the future source folder: + for folder in self.old_sys_path: + if all([os.path.exists(os.path.join(folder, subfolder)) + for subfolder in FUTURE_SOURCE_SUBFOLDERS]): + # Found it. Remove it. + sys.path.remove(folder) + + # Ensure we import the system module: + for m in self.module_names: + # Delete the module and any submodules from sys.modules: + # for key in list(sys.modules): + # if key == m or key.startswith(m + '.'): + # try: + # del sys.modules[key] + # except KeyError: + # pass + try: + module = __import__(m, level=0) + except ImportError: + # There's a problem importing the system module. E.g. the + # winreg module is not available except on Windows. + pass + + def __exit__(self, *args): + # Restore sys.path and sys.modules: + sys.path = self.old_sys_path + for m in set(self.old_sys_modules.keys()) - set(sys.modules.keys()): + sys.modules[m] = self.old_sys_modules[m] + +TOP_LEVEL_MODULES = ['builtins', + 'copyreg', + 'html', + 'http', + 'queue', + 'reprlib', + 'socketserver', + 'test', + 'tkinter', + 'winreg', + 'xmlrpc', + '_dummy_thread', + '_markupbase', + '_thread', + ] + +def import_top_level_modules(): + with exclude_local_folder_imports(*TOP_LEVEL_MODULES): + for m in TOP_LEVEL_MODULES: + try: + __import__(m) + except ImportError: # e.g. winreg + pass diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/standard_library/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/standard_library/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..904444ff1eb73f57007cc6881debf4bdbb53edb0 GIT binary patch literal 18606 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/tests/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/tests/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/tests/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19917c9fe89c6c734efdced12093ba791b4f03ea GIT binary patch literal 140 zcmXr!<>lgC{X32U2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUzYkMxdr+KnFYF~ zc?F5d*{LbIt%Y!0J literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/tests/__pycache__/base.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/tests/__pycache__/base.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e5a6c2f7360f211c1669ef72ec7ba3d4a6eaf30 GIT binary patch literal 16573 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/tests/base.py b/python/.gradle/python/lib/python3.6/site-packages/future/tests/base.py new file mode 100644 index 0000000..4ef437b --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/tests/base.py @@ -0,0 +1,539 @@ +from __future__ import print_function, absolute_import +import os +import tempfile +import unittest +import sys +import re +import warnings +import io +from textwrap import dedent + +from future.utils import bind_method, PY26, PY3, PY2, PY27 +from future.moves.subprocess import check_output, STDOUT, CalledProcessError + +if PY26: + import unittest2 as unittest + + +def reformat_code(code): + """ + Removes any leading \n and dedents. + """ + if code.startswith('\n'): + code = code[1:] + return dedent(code) + + +def order_future_lines(code): + """ + Returns the code block with any ``__future__`` import lines sorted, and + then any ``future`` import lines sorted, then any ``builtins`` import lines + sorted. + + This only sorts the lines within the expected blocks. + + See test_order_future_lines() for an example. + """ + + # We need .splitlines(keepends=True), which doesn't exist on Py2, + # so we use this instead: + lines = code.split('\n') + + uufuture_line_numbers = [i for i, line in enumerate(lines) + if line.startswith('from __future__ import ')] + + future_line_numbers = [i for i, line in enumerate(lines) + if line.startswith('from future') + or line.startswith('from past')] + + builtins_line_numbers = [i for i, line in enumerate(lines) + if line.startswith('from builtins')] + + assert code.lstrip() == code, ('internal usage error: ' + 'dedent the code before calling order_future_lines()') + + def mymax(numbers): + return max(numbers) if len(numbers) > 0 else 0 + + def mymin(numbers): + return min(numbers) if len(numbers) > 0 else float('inf') + + assert mymax(uufuture_line_numbers) <= mymin(future_line_numbers), \ + 'the __future__ and future imports are out of order' + + # assert mymax(future_line_numbers) <= mymin(builtins_line_numbers), \ + # 'the future and builtins imports are out of order' + + uul = sorted([lines[i] for i in uufuture_line_numbers]) + sorted_uufuture_lines = dict(zip(uufuture_line_numbers, uul)) + + fl = sorted([lines[i] for i in future_line_numbers]) + sorted_future_lines = dict(zip(future_line_numbers, fl)) + + bl = sorted([lines[i] for i in builtins_line_numbers]) + sorted_builtins_lines = dict(zip(builtins_line_numbers, bl)) + + # Replace the old unsorted "from __future__ import ..." lines with the + # new sorted ones: + new_lines = [] + for i in range(len(lines)): + if i in uufuture_line_numbers: + new_lines.append(sorted_uufuture_lines[i]) + elif i in future_line_numbers: + new_lines.append(sorted_future_lines[i]) + elif i in builtins_line_numbers: + new_lines.append(sorted_builtins_lines[i]) + else: + new_lines.append(lines[i]) + return '\n'.join(new_lines) + + +class VerboseCalledProcessError(CalledProcessError): + """ + Like CalledProcessError, but it displays more information (message and + script output) for diagnosing test failures etc. + """ + def __init__(self, msg, returncode, cmd, output=None): + self.msg = msg + self.returncode = returncode + self.cmd = cmd + self.output = output + + def __str__(self): + return ("Command '%s' failed with exit status %d\nMessage: %s\nOutput: %s" + % (self.cmd, self.returncode, self.msg, self.output)) + +class FuturizeError(VerboseCalledProcessError): + pass + +class PasteurizeError(VerboseCalledProcessError): + pass + + +class CodeHandler(unittest.TestCase): + """ + Handy mixin for test classes for writing / reading / futurizing / + running .py files in the test suite. + """ + def setUp(self): + """ + The outputs from the various futurize stages should have the + following headers: + """ + # After stage1: + # TODO: use this form after implementing a fixer to consolidate + # __future__ imports into a single line: + # self.headers1 = """ + # from __future__ import absolute_import, division, print_function + # """ + self.headers1 = reformat_code(""" + from __future__ import absolute_import + from __future__ import division + from __future__ import print_function + """) + + # After stage2 --all-imports: + # TODO: use this form after implementing a fixer to consolidate + # __future__ imports into a single line: + # self.headers2 = """ + # from __future__ import (absolute_import, division, + # print_function, unicode_literals) + # from future import standard_library + # from future.builtins import * + # """ + self.headers2 = reformat_code(""" + from __future__ import absolute_import + from __future__ import division + from __future__ import print_function + from __future__ import unicode_literals + from future import standard_library + standard_library.install_aliases() + from builtins import * + """) + self.interpreters = [sys.executable] + self.tempdir = tempfile.mkdtemp() + os.path.sep + pypath = os.getenv('PYTHONPATH') + if pypath: + self.env = {'PYTHONPATH': os.getcwd() + os.pathsep + pypath} + else: + self.env = {'PYTHONPATH': os.getcwd()} + + def convert(self, code, stages=(1, 2), all_imports=False, from3=False, + reformat=True, run=True, conservative=False): + """ + Converts the code block using ``futurize`` and returns the + resulting code. + + Passing stages=[1] or stages=[2] passes the flag ``--stage1`` or + ``stage2`` to ``futurize``. Passing both stages runs ``futurize`` + with both stages by default. + + If from3 is False, runs ``futurize``, converting from Python 2 to + both 2 and 3. If from3 is True, runs ``pasteurize`` to convert + from Python 3 to both 2 and 3. + + Optionally reformats the code block first using the reformat() function. + + If run is True, runs the resulting code under all Python + interpreters in self.interpreters. + """ + if reformat: + code = reformat_code(code) + self._write_test_script(code) + self._futurize_test_script(stages=stages, all_imports=all_imports, + from3=from3, conservative=conservative) + output = self._read_test_script() + if run: + for interpreter in self.interpreters: + _ = self._run_test_script(interpreter=interpreter) + return output + + def compare(self, output, expected, ignore_imports=True): + """ + Compares whether the code blocks are equal. If not, raises an + exception so the test fails. Ignores any trailing whitespace like + blank lines. + + If ignore_imports is True, passes the code blocks into the + strip_future_imports method. + + If one code block is a unicode string and the other a + byte-string, it assumes the byte-string is encoded as utf-8. + """ + if ignore_imports: + output = self.strip_future_imports(output) + expected = self.strip_future_imports(expected) + if isinstance(output, bytes) and not isinstance(expected, bytes): + output = output.decode('utf-8') + if isinstance(expected, bytes) and not isinstance(output, bytes): + expected = expected.decode('utf-8') + self.assertEqual(order_future_lines(output.rstrip()), + expected.rstrip()) + + def strip_future_imports(self, code): + """ + Strips any of these import lines: + + from __future__ import + from future + from future. + from builtins + + or any line containing: + install_hooks() + or: + install_aliases() + + Limitation: doesn't handle imports split across multiple lines like + this: + + from __future__ import (absolute_import, division, print_function, + unicode_literals) + """ + output = [] + # We need .splitlines(keepends=True), which doesn't exist on Py2, + # so we use this instead: + for line in code.split('\n'): + if not (line.startswith('from __future__ import ') + or line.startswith('from future ') + or line.startswith('from builtins ') + or 'install_hooks()' in line + or 'install_aliases()' in line + # but don't match "from future_builtins" :) + or line.startswith('from future.')): + output.append(line) + return '\n'.join(output) + + def convert_check(self, before, expected, stages=(1, 2), all_imports=False, + ignore_imports=True, from3=False, run=True, + conservative=False): + """ + Convenience method that calls convert() and compare(). + + Reformats the code blocks automatically using the reformat_code() + function. + + If all_imports is passed, we add the appropriate import headers + for the stage(s) selected to the ``expected`` code-block, so they + needn't appear repeatedly in the test code. + + If ignore_imports is True, ignores the presence of any lines + beginning: + + from __future__ import ... + from future import ... + + for the purpose of the comparison. + """ + output = self.convert(before, stages=stages, all_imports=all_imports, + from3=from3, run=run, conservative=conservative) + if all_imports: + headers = self.headers2 if 2 in stages else self.headers1 + else: + headers = '' + + reformatted = reformat_code(expected) + if headers in reformatted: + headers = '' + + self.compare(output, headers + reformatted, + ignore_imports=ignore_imports) + + def unchanged(self, code, **kwargs): + """ + Convenience method to ensure the code is unchanged by the + futurize process. + """ + self.convert_check(code, code, **kwargs) + + def _write_test_script(self, code, filename='mytestscript.py'): + """ + Dedents the given code (a multiline string) and writes it out to + a file in a temporary folder like /tmp/tmpUDCn7x/mytestscript.py. + """ + if isinstance(code, bytes): + code = code.decode('utf-8') + # Be explicit about encoding the temp file as UTF-8 (issue #63): + with io.open(self.tempdir + filename, 'wt', encoding='utf-8') as f: + f.write(dedent(code)) + + def _read_test_script(self, filename='mytestscript.py'): + with io.open(self.tempdir + filename, 'rt', encoding='utf-8') as f: + newsource = f.read() + return newsource + + def _futurize_test_script(self, filename='mytestscript.py', stages=(1, 2), + all_imports=False, from3=False, + conservative=False): + params = [] + stages = list(stages) + if all_imports: + params.append('--all-imports') + if from3: + script = 'pasteurize.py' + else: + script = 'futurize.py' + if stages == [1]: + params.append('--stage1') + elif stages == [2]: + params.append('--stage2') + else: + assert stages == [1, 2] + if conservative: + params.append('--conservative') + # No extra params needed + + # Absolute file path: + fn = self.tempdir + filename + call_args = [sys.executable, script] + params + ['-w', fn] + try: + output = check_output(call_args, stderr=STDOUT, env=self.env) + except CalledProcessError as e: + with open(fn) as f: + msg = ( + 'Error running the command %s\n' + '%s\n' + 'Contents of file %s:\n' + '\n' + '%s') % ( + ' '.join(call_args), + 'env=%s' % self.env, + fn, + '----\n%s\n----' % f.read(), + ) + ErrorClass = (FuturizeError if 'futurize' in script else PasteurizeError) + + if not hasattr(e, 'output'): + # The attribute CalledProcessError.output doesn't exist on Py2.6 + e.output = None + raise ErrorClass(msg, e.returncode, e.cmd, output=e.output) + return output + + def _run_test_script(self, filename='mytestscript.py', + interpreter=sys.executable): + # Absolute file path: + fn = self.tempdir + filename + try: + output = check_output([interpreter, fn], + env=self.env, stderr=STDOUT) + except CalledProcessError as e: + with open(fn) as f: + msg = ( + 'Error running the command %s\n' + '%s\n' + 'Contents of file %s:\n' + '\n' + '%s') % ( + ' '.join([interpreter, fn]), + 'env=%s' % self.env, + fn, + '----\n%s\n----' % f.read(), + ) + if not hasattr(e, 'output'): + # The attribute CalledProcessError.output doesn't exist on Py2.6 + e.output = None + raise VerboseCalledProcessError(msg, e.returncode, e.cmd, output=e.output) + return output + + +# Decorator to skip some tests on Python 2.6 ... +skip26 = unittest.skipIf(PY26, "this test is known to fail on Py2.6") + + +def expectedFailurePY3(func): + if not PY3: + return func + return unittest.expectedFailure(func) + +def expectedFailurePY26(func): + if not PY26: + return func + return unittest.expectedFailure(func) + + +def expectedFailurePY27(func): + if not PY27: + return func + return unittest.expectedFailure(func) + + +def expectedFailurePY2(func): + if not PY2: + return func + return unittest.expectedFailure(func) + + +# Renamed in Py3.3: +if not hasattr(unittest.TestCase, 'assertRaisesRegex'): + unittest.TestCase.assertRaisesRegex = unittest.TestCase.assertRaisesRegexp + +# From Py3.3: +def assertRegex(self, text, expected_regex, msg=None): + """Fail the test unless the text matches the regular expression.""" + if isinstance(expected_regex, (str, unicode)): + assert expected_regex, "expected_regex must not be empty." + expected_regex = re.compile(expected_regex) + if not expected_regex.search(text): + msg = msg or "Regex didn't match" + msg = '%s: %r not found in %r' % (msg, expected_regex.pattern, text) + raise self.failureException(msg) + +if not hasattr(unittest.TestCase, 'assertRegex'): + bind_method(unittest.TestCase, 'assertRegex', assertRegex) + +class _AssertRaisesBaseContext(object): + + def __init__(self, expected, test_case, callable_obj=None, + expected_regex=None): + self.expected = expected + self.test_case = test_case + if callable_obj is not None: + try: + self.obj_name = callable_obj.__name__ + except AttributeError: + self.obj_name = str(callable_obj) + else: + self.obj_name = None + if isinstance(expected_regex, (bytes, str)): + expected_regex = re.compile(expected_regex) + self.expected_regex = expected_regex + self.msg = None + + def _raiseFailure(self, standardMsg): + msg = self.test_case._formatMessage(self.msg, standardMsg) + raise self.test_case.failureException(msg) + + def handle(self, name, callable_obj, args, kwargs): + """ + If callable_obj is None, assertRaises/Warns is being used as a + context manager, so check for a 'msg' kwarg and return self. + If callable_obj is not None, call it passing args and kwargs. + """ + if callable_obj is None: + self.msg = kwargs.pop('msg', None) + return self + with self: + callable_obj(*args, **kwargs) + +class _AssertWarnsContext(_AssertRaisesBaseContext): + """A context manager used to implement TestCase.assertWarns* methods.""" + + def __enter__(self): + # The __warningregistry__'s need to be in a pristine state for tests + # to work properly. + for v in sys.modules.values(): + if getattr(v, '__warningregistry__', None): + v.__warningregistry__ = {} + self.warnings_manager = warnings.catch_warnings(record=True) + self.warnings = self.warnings_manager.__enter__() + warnings.simplefilter("always", self.expected) + return self + + def __exit__(self, exc_type, exc_value, tb): + self.warnings_manager.__exit__(exc_type, exc_value, tb) + if exc_type is not None: + # let unexpected exceptions pass through + return + try: + exc_name = self.expected.__name__ + except AttributeError: + exc_name = str(self.expected) + first_matching = None + for m in self.warnings: + w = m.message + if not isinstance(w, self.expected): + continue + if first_matching is None: + first_matching = w + if (self.expected_regex is not None and + not self.expected_regex.search(str(w))): + continue + # store warning for later retrieval + self.warning = w + self.filename = m.filename + self.lineno = m.lineno + return + # Now we simply try to choose a helpful failure message + if first_matching is not None: + self._raiseFailure('"{}" does not match "{}"'.format( + self.expected_regex.pattern, str(first_matching))) + if self.obj_name: + self._raiseFailure("{} not triggered by {}".format(exc_name, + self.obj_name)) + else: + self._raiseFailure("{} not triggered".format(exc_name)) + + +def assertWarns(self, expected_warning, callable_obj=None, *args, **kwargs): + """Fail unless a warning of class warnClass is triggered + by callable_obj when invoked with arguments args and keyword + arguments kwargs. If a different type of warning is + triggered, it will not be handled: depending on the other + warning filtering rules in effect, it might be silenced, printed + out, or raised as an exception. + + If called with callable_obj omitted or None, will return a + context object used like this:: + + with self.assertWarns(SomeWarning): + do_something() + + An optional keyword argument 'msg' can be provided when assertWarns + is used as a context object. + + The context manager keeps a reference to the first matching + warning as the 'warning' attribute; similarly, the 'filename' + and 'lineno' attributes give you information about the line + of Python code from which the warning was triggered. + This allows you to inspect the warning after the assertion:: + + with self.assertWarns(SomeWarning) as cm: + do_something() + the_warning = cm.warning + self.assertEqual(the_warning.some_attribute, 147) + """ + context = _AssertWarnsContext(expected_warning, self, callable_obj) + return context.handle('assertWarns', callable_obj, args, kwargs) + +if not hasattr(unittest.TestCase, 'assertWarns'): + bind_method(unittest.TestCase, 'assertWarns', assertWarns) diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/__init__.py new file mode 100644 index 0000000..0625077 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/__init__.py @@ -0,0 +1,257 @@ +""" +This module contains backports the data types that were significantly changed +in the transition from Python 2 to Python 3. + +- an implementation of Python 3's bytes object (pure Python subclass of + Python 2's builtin 8-bit str type) +- an implementation of Python 3's str object (pure Python subclass of + Python 2's builtin unicode type) +- a backport of the range iterator from Py3 with slicing support + +It is used as follows:: + + from __future__ import division, absolute_import, print_function + from builtins import bytes, dict, int, range, str + +to bring in the new semantics for these functions from Python 3. And +then, for example:: + + b = bytes(b'ABCD') + assert list(b) == [65, 66, 67, 68] + assert repr(b) == "b'ABCD'" + assert [65, 66] in b + + # These raise TypeErrors: + # b + u'EFGH' + # b.split(u'B') + # bytes(b',').join([u'Fred', u'Bill']) + + + s = str(u'ABCD') + + # These raise TypeErrors: + # s.join([b'Fred', b'Bill']) + # s.startswith(b'A') + # b'B' in s + # s.find(b'A') + # s.replace(u'A', b'a') + + # This raises an AttributeError: + # s.decode('utf-8') + + assert repr(s) == 'ABCD' # consistent repr with Py3 (no u prefix) + + + for i in range(10**11)[:10]: + pass + +and:: + + class VerboseList(list): + def append(self, item): + print('Adding an item') + super().append(item) # new simpler super() function + +For more information: +--------------------- + +- future.types.newbytes +- future.types.newdict +- future.types.newint +- future.types.newobject +- future.types.newrange +- future.types.newstr + + +Notes +===== + +range() +------- +``range`` is a custom class that backports the slicing behaviour from +Python 3 (based on the ``xrange`` module by Dan Crosta). See the +``newrange`` module docstring for more details. + + +super() +------- +``super()`` is based on Ryan Kelly's ``magicsuper`` module. See the +``newsuper`` module docstring for more details. + + +round() +------- +Python 3 modifies the behaviour of ``round()`` to use "Banker's Rounding". +See http://stackoverflow.com/a/10825998. See the ``newround`` module +docstring for more details. + +""" + +from __future__ import absolute_import, division, print_function + +import functools +from numbers import Integral + +from future import utils + + +# Some utility functions to enforce strict type-separation of unicode str and +# bytes: +def disallow_types(argnums, disallowed_types): + """ + A decorator that raises a TypeError if any of the given numbered + arguments is of the corresponding given type (e.g. bytes or unicode + string). + + For example: + + @disallow_types([0, 1], [unicode, bytes]) + def f(a, b): + pass + + raises a TypeError when f is called if a unicode object is passed as + `a` or a bytes object is passed as `b`. + + This also skips over keyword arguments, so + + @disallow_types([0, 1], [unicode, bytes]) + def g(a, b=None): + pass + + doesn't raise an exception if g is called with only one argument a, + e.g.: + + g(b'Byte string') + + Example use: + + >>> class newbytes(object): + ... @disallow_types([1], [unicode]) + ... def __add__(self, other): + ... pass + + >>> newbytes('1234') + u'1234' #doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + TypeError: can't concat 'bytes' to (unicode) str + """ + + def decorator(function): + + @functools.wraps(function) + def wrapper(*args, **kwargs): + # These imports are just for this decorator, and are defined here + # to prevent circular imports: + from .newbytes import newbytes + from .newint import newint + from .newstr import newstr + + errmsg = "argument can't be {0}" + for (argnum, mytype) in zip(argnums, disallowed_types): + # Handle the case where the type is passed as a string like 'newbytes'. + if isinstance(mytype, str) or isinstance(mytype, bytes): + mytype = locals()[mytype] + + # Only restrict kw args only if they are passed: + if len(args) <= argnum: + break + + # Here we use type() rather than isinstance() because + # __instancecheck__ is being overridden. E.g. + # isinstance(b'abc', newbytes) is True on Py2. + if type(args[argnum]) == mytype: + raise TypeError(errmsg.format(mytype)) + + return function(*args, **kwargs) + return wrapper + return decorator + + +def no(mytype, argnums=(1,)): + """ + A shortcut for the disallow_types decorator that disallows only one type + (in any position in argnums). + + Example use: + + >>> class newstr(object): + ... @no('bytes') + ... def __add__(self, other): + ... pass + + >>> newstr(u'1234') + b'1234' #doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + TypeError: argument can't be bytes + + The object can also be passed directly, but passing the string helps + to prevent circular import problems. + """ + if isinstance(argnums, Integral): + argnums = (argnums,) + disallowed_types = [mytype] * len(argnums) + return disallow_types(argnums, disallowed_types) + + +def issubset(list1, list2): + """ + Examples: + + >>> issubset([], [65, 66, 67]) + True + >>> issubset([65], [65, 66, 67]) + True + >>> issubset([65, 66], [65, 66, 67]) + True + >>> issubset([65, 67], [65, 66, 67]) + False + """ + n = len(list1) + for startpos in range(len(list2) - n + 1): + if list2[startpos:startpos+n] == list1: + return True + return False + + +if utils.PY3: + import builtins + bytes = builtins.bytes + dict = builtins.dict + int = builtins.int + list = builtins.list + object = builtins.object + range = builtins.range + str = builtins.str + + # The identity mapping + newtypes = {bytes: bytes, + dict: dict, + int: int, + list: list, + object: object, + range: range, + str: str} + + __all__ = ['newtypes'] + +else: + + from .newbytes import newbytes + from .newdict import newdict + from .newint import newint + from .newlist import newlist + from .newrange import newrange + from .newobject import newobject + from .newstr import newstr + + newtypes = {bytes: newbytes, + dict: newdict, + int: newint, + long: newint, + list: newlist, + object: newobject, + range: newrange, + str: newbytes, + unicode: newstr} + + __all__ = ['newbytes', 'newdict', 'newint', 'newlist', 'newrange', 'newstr', 'newtypes'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45c457f5660b9b697f880a9f86f157d87c9863c8 GIT binary patch literal 5958 zcmcgwTW=f372aK5wUK05mSahlorw*UWFk?P$vt+f|s zW@%Zj^irj;fuecppGf;qpueFneeT=7_9=g%ed%{*c1c-LlBO-n1&70#GiT0izH??* zCnoHPKmPNVf0{RpzZ-`>)98PIue@yuZ_Km5G@aMH*Sv9zjPtQ46XMTm{iHL=C!d^fPN1D~ zrqG^rPNJQ5rqP~qPNAJ~X3(B?PV*CZrtqA^GmYmIo*6u+`Dwr6yzWi(Oy^AWl~?s9 zgV}J_nS~Tp??f;c&N*|cKNZY}^Ul2LpA621XPvXEKOHQD3(kV-p9;=}=bUq@KNFk} z&pYQ$13S-R=Q->=&)>jznxDn)=dk+%_Mhd9pZCWg!)fnz?~FI=&3W^Xr{bLP3ZEE_ zbMEI=!>~8De96Mt8w8wn;wW+bNV2xu+3v?8ku2Hb%ySc$CA)o2f8B)baKV}Mdy(Ju zJ8qN&yR5V2Mm_G?exz0;!i}V#_;JL#A`aPu-DC^>%PfiW{%X^_FyFJW-X zKyr_{l6B)ChHsGNNt6b!{-}VMeJG@f{|42><&X5)yXa;*zs` zAB-Jx{c4k~N1hE5NJzx|nM;n(wQ95L+S&DXZT;r0+qH(06AtE3F7RbiZ#UTW>+I3h zcNW>ztN6Z)@3qH=$pr6ich3iB14FvfeAz~rd)VhnT z&E95%+MT-}{5ugvz5&8{DLuaL+l z3>UZ^PC`NCcFo1|pWgSVUbv;Rh-$ryPGv!v2O^?$FsMiKbcj;QbI`f`#i&Wmz zN|VSWH1I~kvpD;VX!L1#u)E6YQOpL2Ti*4b<%Xl6@ktXEl=YQMZ@sm$(s;DCa_O-a zgLw9_rER;Bm&cXHh@W%OjwSzy!iZw2F+rA6c!Wh`*N6<1Vsi3BjhHaDN;+_Uu6-etGp zoLeHsS!gubCmfKx#UTcabcEK6J5Ye!NpYo&?{Or*Kq4>MnKKV5l8tCphH^aI#eP5I zL9mO&v$+|%JzyaP0_e0*N2GXll6}7vA|4xdG^vP}3CLzk*C5*E%Ce(&<*kT8?2OkY_%QezcqC=$`+SM=TnI zZPYiOV&aP4fJzgjNGdc`+<~d!vL7o`GQEh7BCGReubEdYf@MX4;-f>YfzTpIpyQsW zKRrUDA9%iWDbu&q!LC2Lw8&N-FS17&Bj7S+86*;-rVl|^x9(!%C|)TPB$8v4-a!gx zT~ern?QovR3c0j-{exM8QdNMc{WjfA2C>~-KV6X>CS#lJ%}ha6Q@VkSncVjKupFX` zZS&ooSfHZGZHl@g{%_UqDfO@4k0bt_Ht=FDqZ(3-O7S?b{8@+hRj~=xQO^u5p{lVs zLOlz9LqVCls7yfa&1x_*Z4Wv0COksf9EU2;d3SVOLq{(ozH#G5hIu(w*EQH?5;vPo z;`i+UIPCq*?Kv&EzSVL)uhq)ZRt%&QM>s0BIwew<1R07@Te-Y?rPfg8jp{05b`ggf zQI@Q+x9@#;|Ko>uT6aFXb?3pxy^rs=Zr|BhzxR={#fCt+Kc8Lvz2N`o+Ks zt$n&kmi9}}Hj~0jfbvG+<(UfZi2m~A*k0Ck&a#5T zu@g}XSp!rtXyhU_%GznrZK~#&W zJ+n&(#^{-ewTGyj!I?-3d*+^XK*`i}PvG3C)4R^(7A~2cL6Tqea7#R#t&S$!d=}WB z!zsB@F{`77r?lITvsVQ4Uj>oOGvp6|C}R0LAT)~W8KUSk`MZeESr<2xPbmJPU*N1Qx&H-(LtO7JNK<;R}zzA7C36n0?Y*+Np<b*q`ZT+>W6aw2t{A;|KR$46-A+1(wkKS?#ssKcR8VVFa zHGosmwYpTnh`goVh>0@ID;%Ww(&`i*e7>4i^Y>k15))~Wlt~N7uW6CANXuGiagmly zP*Wp1h=Z!8)%tEN-X>a71&rdTmsYYu=8)M5;5B?#-`5wz8=qlFK15TrW~?fb*LbOV h*PgG=l;MT);iphEM^DwN>SRX=FH3r(S?X1-e*v13ey#uj literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newbytes.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newbytes.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01ae4e2901e8815112fd79443b4214d9cb33331a GIT binary patch literal 14358 zcmd5@U2GiJb)K31Uo9z$qGU-{Ms_Q7qY(NDjGw zx-%<@n`PUWO47QG;|4_w6ljr$258y@MSxUEsFZ3FL^24hxYr< zotd2_DgVT1(v{}Uo%?g{Ip^Mc{_f?&Q&ZKcKl|^m{`uz&<6n);uZaBPc!Iw~;u;OZ zHC?N1cC3bFGM{Vb8aa9A8+p9*?Lw#6D0WJXQm5P~cPfoar`o7W+d_L^r`D)-rW#Z7 zU2IQx_BZyMhF4bW=v!*fbPhBQm`1lIU$gqlJJ^`>D(VgIP~-5^hFf+kw+*-A-L;)- z9C54ezS~CQD9UT@6w0T(s&~Yj+qO`9%$-^_8+W_8tH#3g@UN;b43u}~h0SoS*R}ml zzwLFrZs>$QK6@*+W5-nwpK1FWp1r&odV$?rUiVs|z0y-j_4#_W`pVj-?e^?&%@00j zzv2VpAhi8(5hY&QZW4kYV1yf<+FX>h>iR1yo&o~)vgZV$9THsH`QeGq_3As|zOi6N z(n29B`a$U33Zs%A2(nS`g|D1v@^CbL6G$~XUg)&iP7o|uk=5-*Wj_c8 z%YhdHQl;zN)Wiwc&{NKG+iP*02FL^3i$W5ZIjp*b=`YumbNgt?Kqo*x;^y9Q>+BuQmprD>`9f!_^6 zr`z(P>E`mlZ-;)jnbv_0p)9I2o04fZL1eDg4nSqx?+1n==I?&`Y}o0a?fd;RgKpnx zZFugPn`@reKJ&;UH&=qq>lJP(1!of!>ix~=K(m=ZYpr>$jb`%%N#d?B z%(7Xvh9|NNsPAgNw2+U=&1To>c+F;1Z8keSchF|O)@)uMIBi{{4g;WIn@J9_tcK)c zcmndYY|3}bM4mssQ$E}H2+3)4+fs8QV;ys~Z3?FizJ<%yQdDq)mhUg*)igRpxgbK=SgteFA|_zT_!zT-91$bHLL!OC%S zx66&ZkGXea+*$9Sd))n)z?;kTJ>lLX zeGg^IZ1>|*c9>=EtJ{{qIpy9brFXgayYqm4#C=W5A8;SMU1=Q6^j~z(NXuiHvbuX# z%I?->?pLMnL+<(86;OEGZOZo}?k522V{sct${uw;DQ!+{dl{#o}qT%tcl>LhPqR_Dzm%37V)qP1y&&b!8 z+?Ua>p27DO_sfFsS?^%n?<;PDRDo;fzGdW%#zT-Xo|?ki9Db^5<9EqkhA`;&R7mlE zN8wA!{KDpW>5^`|62R=kv!6?S8cW?Zx1a{M^4NeF(zPJ$PK6M46maV~q}+(QF1Jxo zFNJxw+cM*_Jla18fmql!wooJQTv!|d(oysc39qfc0H>sLVHq3!n>xQ$c-!nY(wfS) z^|q-NH!rw_k+o4&KOOrS(^yI+^j5u38kZxt{X1w9XF z`(NSQ`W(M87nwOm36&X27iOGiu_$ECaH(BUy-vKs63y=RT9CYcclEJq+Dx?DX+PG* z&E5)>PZ%uNXD(`UU`IpUf6*4<4M?vdt5i<~uivqYjL_^UC{&ss($4R61|gNd-Rku> zxfgb{+A%C}8pBTvB=idWp=Yo9H@q$Y2(^7jLGOVa+wc0J@3hgvwP~8z-9fv(Cs6|0 z>-57-T^$cFX3`TqsCPAhQRdK$OK^9Ta>mHpE8zHJDdM($Mq0<5wKsjQ?Sf;#3+9xk z0%UCEbXUF8=Rfi2!el?2MwYFat$7V12Cz<6g~*`qwfq$yWyw5DcJBf!ZA7LvXVO(q zf_>?QXX-opB#5QOONzSw9V{y29cuijoQwwLEt5XH_mWy2(4-wt0*wn0?%MrcfC=bz zhYt?AK2?1}kCXJ_tk8-DQ&Y&Wt@Ki8{tQDJsq`Zjc|2F~h;g_Iv*YzzBF%osx}LwP zt(gT=Oa$7W^>d20(+p8`g51OEn>_MjX7OzftGLs72nb)!Ns=!13C2(WMT zC{dokqg=n&kMcAJ#Yj>V^HC{gT{L|u2s}l0K1I$)m6y;^XNyk1?{!^uTso{dffI&G zox+!*x`--7Se9y3ec5RbbT>t!qdd3YLP^ca2PP(niW@iiRwoJIUX~Ybuveo5p0Eb| zJ-|BJxk~KC2a!96CwL8saUgHzt(rMw)?lsjDHmq)Wpf(&8PiJ2@KrGCJTM4SKznay{jOxkNTH zH`S-{-iBaP0!?_GkQ_v|}$#|mwG@gLt!O!5-ns0%f+KaOk0b_f$ z{g$_22@>j)DB7|0=>cH?Y1VB1J^{wldT0`bxWxnuxxAiWm&-_KB8b;>7zUTQO2f+P z9wQ@T)9LhxC1uvKF3fAzBBjv)rA_a%7&}DJ39=v+XGc|-EFwwRncMI-8~YLr@v#S4 ztsVjka2%V>KS0lbKAZvW)^atoi0w1X5;$&~5=b_r`-fYbYXn5f{vinot8*Gr?jedW z$93rj>uE3aVA8^y+bJM8bKl3KnLW9U1;7LvL`C>a8nm%G(i<2YGiCT>zXVK2&#f>;$fP@z3b0TnD%wS=O^6_u(eHlso~KrBw3XX(RCM5BF?Ran!A zmtbNGdQIn{{Q^;b%tYpm$lTbm;?(o#_!B$d&wnIx9MZ^TOr*Fn#fco_!$3kn zoU&%X3S9I*vfhfLqFEa$zv6dO#hybDR21uOE?on}h@b@#E5jKA_^4PER0a*@V4ORk zv5cyJ$)EvyT!(k-0^uF5A!Q?Jkr(`NIq?y`(2AZ^eIskd8s*5FWG7}+prXl(xTaV= zxnA3iav1LpsIl!&@gy7?YlC>&Crlo)QA{4K1{qjIq(IxT!w1D-@@%-eYdzP7)emO` zUa;#2T-`4Hl7w*Bw$qp36Zp%6P#gb=5ZS{*5;x-CQzXsd{sc^25BY9k5U!m0R3uBX z6{cKFGzYmFkR3FB+eQZ(0O1%!VG&NcA7%Nr)q%i3S$-QK9*PRFiL7<#1Ly`ZKNkwl zzhR!SXJTGk^{Df_>Vrdv!Z?EaS-h!q{bhQudF1IpZ~RL$z$>t?~>*fk!-H zNgU6*{iL_z4BBB@k`9hzlzE|fz8(iV><;{XIDb0wfM6ZYH-Ovtd_~;j6u=tX;Wi!c z00I3D@J`1fXm0IRIFG4xy4p*3#z-UsD#s7J6rf{&NxRgVO7Q~$^?6!f^t%I}p%ro4 zz%%99^ZshLr@VP_%;)3PHa~_J*f%`{N3e<<#tsCIIPw{8Neo4J7}S&ErVxsl1W@*a zF+2_rwg}@mc;DZ+GW>nNO8|@DU@NnTmdpO*2`W{yAk#xA7b*08ZeU4I>bCkM< zp?oaA#__mj5c=()zN4qwK$Edgqh7~ntRvJ(R^7{laHQpKX~z!l;0dUxjp-UpY#Q2` z?V=_4N0ob3oJXlJAoCM%px9U5iht`4LZ%ILj$!X4Lgrw)f5(tMDpCjpxmlD{2ZP=L zAKDcsGWd+`kp#$6DnlrRDL?oGHj=D{qHJKmn`eQe97C_Li*id7GLry4P=tu)0i@vl zctv@{40k#aY92N73EBt_ogA~V-}b}3LPHagg+jn)sb&bgepK!_x1=;GaKt?VDSZrj zl7o^CBR^|0niOj<>3L<>%n7S#c4k>chcjlBl`v}fAL;hITo+&vNnUXJ)eX;M{3wp# zG8V;ntW=K0sTRPtgK}NZvkPfMO>=qCURIv7LGcAiz;b(;7Mr7dFSFO5lM1%fVyWAM z*yy&}16OM-0##lBDNIN*)S%n;g1}CYOlg4R)Y6xsM#N^lu|)aED?;_a&mFdwEQm)k z3u1n9W`q~-yDF+<#wWYEoRFphjJjLUgi@NUiRz3w%sAssOT!hEG<&h>-O7bkuM3w)U3@%YR^Aximokf@LgMHdekDD?8oD^* z>_nBcrCLH^yuLKs_U70vH2ZAIF+^X7v%81=|Hw4Ou>DgRcHN)itx_($AHS;OrXQ4H zn;7=;1jELAaSScxSfb9via&+E+M!QeErdpLE>B_Y5K2v~dtMtV3~#4W?rI&!b*^{o zG~6!x)kV?Zctc#jt`FQ0I2;S<=Xi$*UFa#DUa(>AkFPJl z?=X4n+&vMO(hGTUWa*#GH#01w&p*d~%5HJo$1P#< z%flb0lb<*}vI3}+xd@bgeOr!y6fN_*Wp+iCbs-|MHXc9L^qQ$P zh=Abc2`n4AfR-#Vp4`Vi{gwDMK!+(GLDw-kQL)+duD@Tj`RnM@Np}~poXPql8o~sk zRAQpYv<{3(Nl5MroKLVo&sL5$=}VC*ze-g6`kI3(DA)V-bUxIO^}=wc+Dn9_{EU}{_0J18)$t{625`9zy4k% z0O~J{gw+BbjD*yFNMQy z^EznB=$Zsdaqk)z>oN-LII#P0(Ns%9q>{kySwa7d9GsE!W!}J$Xlp7FqddcDySS@< z6WxC|oz?;_OPIr>sWH0~*aU-9!FT7=+Tk}-W?ThEeK6MX;V-UgiArV6Gvl%Iov7AqMC&3yps^rJ_ zha-4^>r?+11Pk2vB3K&Sk>Kxuke{Rkmokw+4VdzkKfX!u6L^9dB%I-O+&W3mQcUM1 zz)7e0a=im19g?6MoL*5K`~gW%W?M?y`fpR@Zss1dzN?LW+KFXJeBqFxL+vf_HXO`+ zU&G>+RQ`D8LYWSygz{N7Kiv#w^nJ=?jP!5|E-Q{OJg2oLtx`e&0{BxRb$A61VL<)& zECfXtgzy92MoexZ%AmdR`g>`NfZUc01fGb2UV6a~1f_s9Wn%!z0{$x49#vAdqL^DP z$^pHG74~*G!ipE5{yLr7eVM4s7=$(Usvs#>(L=2<86v?&HvKlQ?D&>WyjX<)=ha>8 zzQ6-tp(qhWN+|9e;c+wtn}~ml)WYEw=%%8SB$20wSU}B0r!u&P zq@2r}_h*xO+UmOZYUO~r=I*W) zYen3CETsP`s4elSmFFr}91c9LzKgMNsbtVuhM<)DbBc>dJ<9T0_T)-mbl?tG42Y;A zlTx;sI7xciDl9*|^GHl@O~sQcOjxgtzq#T~(m>x2-JdC`JIgKgs~llJle?M7Qm8Xm zV{#7@@=R`jP4ZQ9m|Ts@7xZ5pT_nEZ2=h`X>>KMiU27|kOP#e`-on4!Ou1Y-{A&jP G-TS{ZPWnaw literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newdict.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newdict.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..969f20449f90ed232612273a7b1a1970f85d60bf GIT binary patch literal 3667 zcmb_ePj4GV6yJZ2*Bd7d1u7M_XhcEDmd2rJMNvhfLR&x_0#Z2{!D{0fHyf{a&CEC^ zAw8w2p9OK^z=1oTVy`{*E5L={oAugGVZ0LR+u}BNQoC*A@1{=QZM!zjd8ya0wQIH|7TR@T@B7^0wV$1fR=e@J z#TR(}vBm2mIC0yH82h||aYMLbQPfWy%r<%Bq1|5M&I2n9;-|J{1)ngUbTm`L-A)=S z#k#pCd&C0g_q>kBBw70dDwlR^(=Mhi05xl|0= zR!X;i4Aw@8-eXGWb)&N}K#~vTscpBy)>vOy42NWFjbFdU_-1%JXti3T9D_jxl+SX_ z5=Dx}Sx2n#7KykPUV}-M4qv#tROSEgH~LPuKZ8$MJE2`HlUfn%5F4m5)5ydq-`y7- z{mj9p4(+TSnz(~cy@5tp@I|ZbkY7Hw+AeqDL0+-=X{^MK7~O*lb%=l-`n&k<;#2RS zIkvRbbL4q#AKThFf%9qi*xvV!E$VX%tn8hzR@5O4Ib#t_ja4i~V^@l*rOH){Mid!E zq9}95lldSX^ zrgO}18j22biFxQhLH{NO8Yv0ruN+(Z_6e}Y*vFV*?2N~aUQK?0u}fpVK*{Oocf*#1 z`D!LMZ@qteGEZywT4QHt>)R}zhU{3tfy@sQo@5WPc94h>1@JwjE<-e7G<(2@|HXfr zF<5>eVEhV6`G4V{Xd<)-MfSMIRME%O~ z`D3mD&*D?vGB1ZvNj3L~GZ>vZVIE4)F?%&Q1%y+{85awX8uu5<|G%KcfYklDXf0Q0 zmGl$5DDo-XDWR*c(P-<~K0yVCWOqs9;-l+s-$iR933|s^xrn}Yu>N5=dgNw))tjX_ zcIl!Fo%m0x*eLJOL-!$yC?q~eG*dApc^1pV)7$#-V1P6@*-fr+x4rK`doUq2(puH`KQ?Q_b}84!T>zyhOO zat6l3zR0wx<52N^20=wx58oc+lV@TJRiPf`TbtoTG;<}O;&D@v6*V;+2x+e0qK=9| zj8G(aRFH(8T!bSP9%)c4l$sPZBOUxUz}ifLxq{&Xd}V@JYT7G!1IM?I&Q&fu=05RR zx|yiFxJzU{8u+a7&(J>Fnn?Rap7#t0q>3X`^V5&L$x&@96xDpoTR{yFjjBO}<9Wc{F4ro_C^1(v>GEtx84>=`ZODM9o+h zh8>Zn*f&YUmCZ~(ru+Fle8yb9>)HM?z0Efb65+DEN~~OUsM^h0r6tMQzA&CLbz=)+ zmlcPk3?SF2A#)Z@T;~dbhFTI{O!tO-ml`VWCWyzUrJO=q_#c;5<2Grp$PS+4J59R@ MahKf{|H7C507!#}W&i*H literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newint.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newint.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22c4524e9bb2be04811c8d5ba6104213034d71f6 GIT binary patch literal 12704 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newlist.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newlist.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43abae5689fa6bafb44ecb3294b7a32df4b8a91c GIT binary patch literal 3014 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newrange.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/types/__pycache__/newrange.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7e8385363b815ffd7c8907ff5784c2ea3891fbb GIT binary patch literal 6026 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 Nx#IkHt?yc!{||eh>7D=p literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/newbytes.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/newbytes.py new file mode 100644 index 0000000..c9d584a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/newbytes.py @@ -0,0 +1,460 @@ +""" +Pure-Python implementation of a Python 3-like bytes object for Python 2. + +Why do this? Without it, the Python 2 bytes object is a very, very +different beast to the Python 3 bytes object. +""" + +from numbers import Integral +import string +import copy + +from future.utils import istext, isbytes, PY2, PY3, with_metaclass +from future.types import no, issubset +from future.types.newobject import newobject + +if PY2: + from collections import Iterable +else: + from collections.abc import Iterable + + +_builtin_bytes = bytes + +if PY3: + # We'll probably never use newstr on Py3 anyway... + unicode = str + + +class BaseNewBytes(type): + def __instancecheck__(cls, instance): + if cls == newbytes: + return isinstance(instance, _builtin_bytes) + else: + return issubclass(instance.__class__, cls) + + +def _newchr(x): + if isinstance(x, str): # this happens on pypy + return x.encode('ascii') + else: + return chr(x) + + +class newbytes(with_metaclass(BaseNewBytes, _builtin_bytes)): + """ + A backport of the Python 3 bytes object to Py2 + """ + def __new__(cls, *args, **kwargs): + """ + From the Py3 bytes docstring: + + bytes(iterable_of_ints) -> bytes + bytes(string, encoding[, errors]) -> bytes + bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer + bytes(int) -> bytes object of size given by the parameter initialized with null bytes + bytes() -> empty bytes object + + Construct an immutable array of bytes from: + - an iterable yielding integers in range(256) + - a text string encoded using the specified encoding + - any object implementing the buffer API. + - an integer + """ + + encoding = None + errors = None + + if len(args) == 0: + return super(newbytes, cls).__new__(cls) + elif len(args) >= 2: + args = list(args) + if len(args) == 3: + errors = args.pop() + encoding=args.pop() + # Was: elif isinstance(args[0], newbytes): + # We use type() instead of the above because we're redefining + # this to be True for all unicode string subclasses. Warning: + # This may render newstr un-subclassable. + if type(args[0]) == newbytes: + # Special-case: for consistency with Py3.3, we return the same object + # (with the same id) if a newbytes object is passed into the + # newbytes constructor. + return args[0] + elif isinstance(args[0], _builtin_bytes): + value = args[0] + elif isinstance(args[0], unicode): + try: + if 'encoding' in kwargs: + assert encoding is None + encoding = kwargs['encoding'] + if 'errors' in kwargs: + assert errors is None + errors = kwargs['errors'] + except AssertionError: + raise TypeError('Argument given by name and position') + if encoding is None: + raise TypeError('unicode string argument without an encoding') + ### + # Was: value = args[0].encode(**kwargs) + # Python 2.6 string encode() method doesn't take kwargs: + # Use this instead: + newargs = [encoding] + if errors is not None: + newargs.append(errors) + value = args[0].encode(*newargs) + ### + elif hasattr(args[0], '__bytes__'): + value = args[0].__bytes__() + elif isinstance(args[0], Iterable): + if len(args[0]) == 0: + # This could be an empty list or tuple. Return b'' as on Py3. + value = b'' + else: + # Was: elif len(args[0])>0 and isinstance(args[0][0], Integral): + # # It's a list of integers + # But then we can't index into e.g. frozensets. Try to proceed + # anyway. + try: + value = bytearray([_newchr(x) for x in args[0]]) + except: + raise ValueError('bytes must be in range(0, 256)') + elif isinstance(args[0], Integral): + if args[0] < 0: + raise ValueError('negative count') + value = b'\x00' * args[0] + else: + value = args[0] + if type(value) == newbytes: + # Above we use type(...) rather than isinstance(...) because the + # newbytes metaclass overrides __instancecheck__. + # oldbytes(value) gives the wrong thing on Py2: the same + # result as str(value) on Py3, e.g. "b'abc'". (Issue #193). + # So we handle this case separately: + return copy.copy(value) + else: + return super(newbytes, cls).__new__(cls, value) + + def __repr__(self): + return 'b' + super(newbytes, self).__repr__() + + def __str__(self): + return 'b' + "'{0}'".format(super(newbytes, self).__str__()) + + def __getitem__(self, y): + value = super(newbytes, self).__getitem__(y) + if isinstance(y, Integral): + return ord(value) + else: + return newbytes(value) + + def __getslice__(self, *args): + return self.__getitem__(slice(*args)) + + def __contains__(self, key): + if isinstance(key, int): + newbyteskey = newbytes([key]) + # Don't use isinstance() here because we only want to catch + # newbytes, not Python 2 str: + elif type(key) == newbytes: + newbyteskey = key + else: + newbyteskey = newbytes(key) + return issubset(list(newbyteskey), list(self)) + + @no(unicode) + def __add__(self, other): + return newbytes(super(newbytes, self).__add__(other)) + + @no(unicode) + def __radd__(self, left): + return newbytes(left) + self + + @no(unicode) + def __mul__(self, other): + return newbytes(super(newbytes, self).__mul__(other)) + + @no(unicode) + def __rmul__(self, other): + return newbytes(super(newbytes, self).__rmul__(other)) + + def __mod__(self, vals): + if isinstance(vals, newbytes): + vals = _builtin_bytes.__str__(vals) + + elif isinstance(vals, tuple): + newvals = [] + for v in vals: + if isinstance(v, newbytes): + v = _builtin_bytes.__str__(v) + newvals.append(v) + vals = tuple(newvals) + + elif (hasattr(vals.__class__, '__getitem__') and + hasattr(vals.__class__, 'iteritems')): + for k, v in vals.iteritems(): + if isinstance(v, newbytes): + vals[k] = _builtin_bytes.__str__(v) + + return _builtin_bytes.__mod__(self, vals) + + def __imod__(self, other): + return self.__mod__(other) + + def join(self, iterable_of_bytes): + errmsg = 'sequence item {0}: expected bytes, {1} found' + if isbytes(iterable_of_bytes) or istext(iterable_of_bytes): + raise TypeError(errmsg.format(0, type(iterable_of_bytes))) + for i, item in enumerate(iterable_of_bytes): + if istext(item): + raise TypeError(errmsg.format(i, type(item))) + return newbytes(super(newbytes, self).join(iterable_of_bytes)) + + @classmethod + def fromhex(cls, string): + # Only on Py2: + return cls(string.replace(' ', '').decode('hex')) + + @no(unicode) + def find(self, sub, *args): + return super(newbytes, self).find(sub, *args) + + @no(unicode) + def rfind(self, sub, *args): + return super(newbytes, self).rfind(sub, *args) + + @no(unicode, (1, 2)) + def replace(self, old, new, *args): + return newbytes(super(newbytes, self).replace(old, new, *args)) + + def encode(self, *args): + raise AttributeError("encode method has been disabled in newbytes") + + def decode(self, encoding='utf-8', errors='strict'): + """ + Returns a newstr (i.e. unicode subclass) + + Decode B using the codec registered for encoding. Default encoding + is 'utf-8'. errors may be given to set a different error + handling scheme. Default is 'strict' meaning that encoding errors raise + a UnicodeDecodeError. Other possible values are 'ignore' and 'replace' + as well as any other name registered with codecs.register_error that is + able to handle UnicodeDecodeErrors. + """ + # Py2 str.encode() takes encoding and errors as optional parameter, + # not keyword arguments as in Python 3 str. + + from future.types.newstr import newstr + + if errors == 'surrogateescape': + from future.utils.surrogateescape import register_surrogateescape + register_surrogateescape() + + return newstr(super(newbytes, self).decode(encoding, errors)) + + # This is currently broken: + # # We implement surrogateescape error handling here in addition rather + # # than relying on the custom error handler from + # # future.utils.surrogateescape to be registered globally, even though + # # that is fine in the case of decoding. (But not encoding: see the + # # comments in newstr.encode()``.) + # + # if errors == 'surrogateescape': + # # Decode char by char + # mybytes = [] + # for code in self: + # # Code is an int + # if 0x80 <= code <= 0xFF: + # b = 0xDC00 + code + # elif code <= 0x7F: + # b = _unichr(c).decode(encoding=encoding) + # else: + # # # It may be a bad byte + # # FIXME: What to do in this case? See the Py3 docs / tests. + # # # Try swallowing it. + # # continue + # # print("RAISE!") + # raise NotASurrogateError + # mybytes.append(b) + # return newbytes(mybytes) + # return newbytes(super(newstr, self).decode(encoding, errors)) + + @no(unicode) + def startswith(self, prefix, *args): + return super(newbytes, self).startswith(prefix, *args) + + @no(unicode) + def endswith(self, prefix, *args): + return super(newbytes, self).endswith(prefix, *args) + + @no(unicode) + def split(self, sep=None, maxsplit=-1): + # Py2 str.split() takes maxsplit as an optional parameter, not as a + # keyword argument as in Python 3 bytes. + parts = super(newbytes, self).split(sep, maxsplit) + return [newbytes(part) for part in parts] + + def splitlines(self, keepends=False): + """ + B.splitlines([keepends]) -> list of lines + + Return a list of the lines in B, breaking at line boundaries. + Line breaks are not included in the resulting list unless keepends + is given and true. + """ + # Py2 str.splitlines() takes keepends as an optional parameter, + # not as a keyword argument as in Python 3 bytes. + parts = super(newbytes, self).splitlines(keepends) + return [newbytes(part) for part in parts] + + @no(unicode) + def rsplit(self, sep=None, maxsplit=-1): + # Py2 str.rsplit() takes maxsplit as an optional parameter, not as a + # keyword argument as in Python 3 bytes. + parts = super(newbytes, self).rsplit(sep, maxsplit) + return [newbytes(part) for part in parts] + + @no(unicode) + def partition(self, sep): + parts = super(newbytes, self).partition(sep) + return tuple(newbytes(part) for part in parts) + + @no(unicode) + def rpartition(self, sep): + parts = super(newbytes, self).rpartition(sep) + return tuple(newbytes(part) for part in parts) + + @no(unicode, (1,)) + def rindex(self, sub, *args): + ''' + S.rindex(sub [,start [,end]]) -> int + + Like S.rfind() but raise ValueError when the substring is not found. + ''' + pos = self.rfind(sub, *args) + if pos == -1: + raise ValueError('substring not found') + + @no(unicode) + def index(self, sub, *args): + ''' + Returns index of sub in bytes. + Raises ValueError if byte is not in bytes and TypeError if can't + be converted bytes or its length is not 1. + ''' + if isinstance(sub, int): + if len(args) == 0: + start, end = 0, len(self) + elif len(args) == 1: + start = args[0] + elif len(args) == 2: + start, end = args + else: + raise TypeError('takes at most 3 arguments') + return list(self)[start:end].index(sub) + if not isinstance(sub, bytes): + try: + sub = self.__class__(sub) + except (TypeError, ValueError): + raise TypeError("can't convert sub to bytes") + try: + return super(newbytes, self).index(sub, *args) + except ValueError: + raise ValueError('substring not found') + + def __eq__(self, other): + if isinstance(other, (_builtin_bytes, bytearray)): + return super(newbytes, self).__eq__(other) + else: + return False + + def __ne__(self, other): + if isinstance(other, _builtin_bytes): + return super(newbytes, self).__ne__(other) + else: + return True + + unorderable_err = 'unorderable types: bytes() and {0}' + + def __lt__(self, other): + if isinstance(other, _builtin_bytes): + return super(newbytes, self).__lt__(other) + raise TypeError(self.unorderable_err.format(type(other))) + + def __le__(self, other): + if isinstance(other, _builtin_bytes): + return super(newbytes, self).__le__(other) + raise TypeError(self.unorderable_err.format(type(other))) + + def __gt__(self, other): + if isinstance(other, _builtin_bytes): + return super(newbytes, self).__gt__(other) + raise TypeError(self.unorderable_err.format(type(other))) + + def __ge__(self, other): + if isinstance(other, _builtin_bytes): + return super(newbytes, self).__ge__(other) + raise TypeError(self.unorderable_err.format(type(other))) + + def __native__(self): + # We can't just feed a newbytes object into str(), because + # newbytes.__str__() returns e.g. "b'blah'", consistent with Py3 bytes. + return super(newbytes, self).__str__() + + def __getattribute__(self, name): + """ + A trick to cause the ``hasattr`` builtin-fn to return False for + the 'encode' method on Py2. + """ + if name in ['encode', u'encode']: + raise AttributeError("encode method has been disabled in newbytes") + return super(newbytes, self).__getattribute__(name) + + @no(unicode) + def rstrip(self, bytes_to_strip=None): + """ + Strip trailing bytes contained in the argument. + If the argument is omitted, strip trailing ASCII whitespace. + """ + return newbytes(super(newbytes, self).rstrip(bytes_to_strip)) + + @no(unicode) + def strip(self, bytes_to_strip=None): + """ + Strip leading and trailing bytes contained in the argument. + If the argument is omitted, strip trailing ASCII whitespace. + """ + return newbytes(super(newbytes, self).strip(bytes_to_strip)) + + def lower(self): + """ + b.lower() -> copy of b + + Return a copy of b with all ASCII characters converted to lowercase. + """ + return newbytes(super(newbytes, self).lower()) + + @no(unicode) + def upper(self): + """ + b.upper() -> copy of b + + Return a copy of b with all ASCII characters converted to uppercase. + """ + return newbytes(super(newbytes, self).upper()) + + @classmethod + @no(unicode) + def maketrans(cls, frm, to): + """ + B.maketrans(frm, to) -> translation table + + Return a translation table (a bytes object of length 256) suitable + for use in the bytes or bytearray translate method where each byte + in frm is mapped to the byte at the same position in to. + The bytes objects frm and to must be of the same length. + """ + return newbytes(string.maketrans(frm, to)) + + +__all__ = ['newbytes'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/newdict.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/newdict.py new file mode 100644 index 0000000..3f3a559 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/newdict.py @@ -0,0 +1,111 @@ +""" +A dict subclass for Python 2 that behaves like Python 3's dict + +Example use: + +>>> from builtins import dict +>>> d1 = dict() # instead of {} for an empty dict +>>> d2 = dict(key1='value1', key2='value2') + +The keys, values and items methods now return iterators on Python 2.x +(with set-like behaviour on Python 2.7). + +>>> for d in (d1, d2): +... assert not isinstance(d.keys(), list) +... assert not isinstance(d.values(), list) +... assert not isinstance(d.items(), list) +""" + +import sys + +from future.utils import with_metaclass +from future.types.newobject import newobject + + +_builtin_dict = dict +ver = sys.version_info[:2] + + +class BaseNewDict(type): + def __instancecheck__(cls, instance): + if cls == newdict: + return isinstance(instance, _builtin_dict) + else: + return issubclass(instance.__class__, cls) + + +class newdict(with_metaclass(BaseNewDict, _builtin_dict)): + """ + A backport of the Python 3 dict object to Py2 + """ + def items(self): + """ + On Python 2.7+: + D.items() -> a set-like object providing a view on D's items + On Python 2.6: + D.items() -> an iterator over D's items + """ + if ver == (2, 7): + return self.viewitems() + elif ver == (2, 6): + return self.iteritems() + elif ver >= (3, 0): + return self.items() + + def keys(self): + """ + On Python 2.7+: + D.keys() -> a set-like object providing a view on D's keys + On Python 2.6: + D.keys() -> an iterator over D's keys + """ + if ver == (2, 7): + return self.viewkeys() + elif ver == (2, 6): + return self.iterkeys() + elif ver >= (3, 0): + return self.keys() + + def values(self): + """ + On Python 2.7+: + D.values() -> a set-like object providing a view on D's values + On Python 2.6: + D.values() -> an iterator over D's values + """ + if ver == (2, 7): + return self.viewvalues() + elif ver == (2, 6): + return self.itervalues() + elif ver >= (3, 0): + return self.values() + + def __new__(cls, *args, **kwargs): + """ + dict() -> new empty dictionary + dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs + dict(iterable) -> new dictionary initialized as if via: + d = {} + for k, v in iterable: + d[k] = v + dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2) + """ + + if len(args) == 0: + return super(newdict, cls).__new__(cls) + elif type(args[0]) == newdict: + value = args[0] + else: + value = args[0] + return super(newdict, cls).__new__(cls, value) + + def __native__(self): + """ + Hook for the future.utils.native() function + """ + return dict(self) + + +__all__ = ['newdict'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/newint.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/newint.py new file mode 100644 index 0000000..748dba9 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/newint.py @@ -0,0 +1,381 @@ +""" +Backport of Python 3's int, based on Py2's long. + +They are very similar. The most notable difference is: + +- representation: trailing L in Python 2 removed in Python 3 +""" +from __future__ import division + +import struct + +from future.types.newbytes import newbytes +from future.types.newobject import newobject +from future.utils import PY3, isint, istext, isbytes, with_metaclass, native + + +if PY3: + long = int + from collections.abc import Iterable +else: + from collections import Iterable + + +class BaseNewInt(type): + def __instancecheck__(cls, instance): + if cls == newint: + # Special case for Py2 short or long int + return isinstance(instance, (int, long)) + else: + return issubclass(instance.__class__, cls) + + +class newint(with_metaclass(BaseNewInt, long)): + """ + A backport of the Python 3 int object to Py2 + """ + def __new__(cls, x=0, base=10): + """ + From the Py3 int docstring: + + | int(x=0) -> integer + | int(x, base=10) -> integer + | + | Convert a number or string to an integer, or return 0 if no + | arguments are given. If x is a number, return x.__int__(). For + | floating point numbers, this truncates towards zero. + | + | If x is not a number or if base is given, then x must be a string, + | bytes, or bytearray instance representing an integer literal in the + | given base. The literal can be preceded by '+' or '-' and be + | surrounded by whitespace. The base defaults to 10. Valid bases are + | 0 and 2-36. Base 0 means to interpret the base from the string as an + | integer literal. + | >>> int('0b100', base=0) + | 4 + + """ + try: + val = x.__int__() + except AttributeError: + val = x + else: + if not isint(val): + raise TypeError('__int__ returned non-int ({0})'.format( + type(val))) + + if base != 10: + # Explicit base + if not (istext(val) or isbytes(val) or isinstance(val, bytearray)): + raise TypeError( + "int() can't convert non-string with explicit base") + try: + return super(newint, cls).__new__(cls, val, base) + except TypeError: + return super(newint, cls).__new__(cls, newbytes(val), base) + # After here, base is 10 + try: + return super(newint, cls).__new__(cls, val) + except TypeError: + # Py2 long doesn't handle bytearray input with an explicit base, so + # handle this here. + # Py3: int(bytearray(b'10'), 2) == 2 + # Py2: int(bytearray(b'10'), 2) == 2 raises TypeError + # Py2: long(bytearray(b'10'), 2) == 2 raises TypeError + try: + return super(newint, cls).__new__(cls, newbytes(val)) + except: + raise TypeError("newint argument must be a string or a number," + "not '{0}'".format(type(val))) + + def __repr__(self): + """ + Without the L suffix + """ + value = super(newint, self).__repr__() + assert value[-1] == 'L' + return value[:-1] + + def __add__(self, other): + value = super(newint, self).__add__(other) + if value is NotImplemented: + return long(self) + other + return newint(value) + + def __radd__(self, other): + value = super(newint, self).__radd__(other) + if value is NotImplemented: + return other + long(self) + return newint(value) + + def __sub__(self, other): + value = super(newint, self).__sub__(other) + if value is NotImplemented: + return long(self) - other + return newint(value) + + def __rsub__(self, other): + value = super(newint, self).__rsub__(other) + if value is NotImplemented: + return other - long(self) + return newint(value) + + def __mul__(self, other): + value = super(newint, self).__mul__(other) + if isint(value): + return newint(value) + elif value is NotImplemented: + return long(self) * other + return value + + def __rmul__(self, other): + value = super(newint, self).__rmul__(other) + if isint(value): + return newint(value) + elif value is NotImplemented: + return other * long(self) + return value + + def __div__(self, other): + # We override this rather than e.g. relying on object.__div__ or + # long.__div__ because we want to wrap the value in a newint() + # call if other is another int + value = long(self) / other + if isinstance(other, (int, long)): + return newint(value) + else: + return value + + def __rdiv__(self, other): + value = other / long(self) + if isinstance(other, (int, long)): + return newint(value) + else: + return value + + def __idiv__(self, other): + # long has no __idiv__ method. Use __itruediv__ and cast back to + # newint: + value = self.__itruediv__(other) + if isinstance(other, (int, long)): + return newint(value) + else: + return value + + def __truediv__(self, other): + value = super(newint, self).__truediv__(other) + if value is NotImplemented: + value = long(self) / other + return value + + def __rtruediv__(self, other): + return super(newint, self).__rtruediv__(other) + + def __itruediv__(self, other): + # long has no __itruediv__ method + mylong = long(self) + mylong /= other + return mylong + + def __floordiv__(self, other): + return newint(super(newint, self).__floordiv__(other)) + + def __rfloordiv__(self, other): + return newint(super(newint, self).__rfloordiv__(other)) + + def __ifloordiv__(self, other): + # long has no __ifloordiv__ method + mylong = long(self) + mylong //= other + return newint(mylong) + + def __mod__(self, other): + value = super(newint, self).__mod__(other) + if value is NotImplemented: + return long(self) % other + return newint(value) + + def __rmod__(self, other): + value = super(newint, self).__rmod__(other) + if value is NotImplemented: + return other % long(self) + return newint(value) + + def __divmod__(self, other): + value = super(newint, self).__divmod__(other) + if value is NotImplemented: + mylong = long(self) + return (mylong // other, mylong % other) + return (newint(value[0]), newint(value[1])) + + def __rdivmod__(self, other): + value = super(newint, self).__rdivmod__(other) + if value is NotImplemented: + mylong = long(self) + return (other // mylong, other % mylong) + return (newint(value[0]), newint(value[1])) + + def __pow__(self, other): + value = super(newint, self).__pow__(other) + if value is NotImplemented: + return long(self) ** other + return newint(value) + + def __rpow__(self, other): + value = super(newint, self).__rpow__(other) + if value is NotImplemented: + return other ** long(self) + return newint(value) + + def __lshift__(self, other): + if not isint(other): + raise TypeError( + "unsupported operand type(s) for <<: '%s' and '%s'" % + (type(self).__name__, type(other).__name__)) + return newint(super(newint, self).__lshift__(other)) + + def __rshift__(self, other): + if not isint(other): + raise TypeError( + "unsupported operand type(s) for >>: '%s' and '%s'" % + (type(self).__name__, type(other).__name__)) + return newint(super(newint, self).__rshift__(other)) + + def __and__(self, other): + if not isint(other): + raise TypeError( + "unsupported operand type(s) for &: '%s' and '%s'" % + (type(self).__name__, type(other).__name__)) + return newint(super(newint, self).__and__(other)) + + def __or__(self, other): + if not isint(other): + raise TypeError( + "unsupported operand type(s) for |: '%s' and '%s'" % + (type(self).__name__, type(other).__name__)) + return newint(super(newint, self).__or__(other)) + + def __xor__(self, other): + if not isint(other): + raise TypeError( + "unsupported operand type(s) for ^: '%s' and '%s'" % + (type(self).__name__, type(other).__name__)) + return newint(super(newint, self).__xor__(other)) + + def __neg__(self): + return newint(super(newint, self).__neg__()) + + def __pos__(self): + return newint(super(newint, self).__pos__()) + + def __abs__(self): + return newint(super(newint, self).__abs__()) + + def __invert__(self): + return newint(super(newint, self).__invert__()) + + def __int__(self): + return self + + def __nonzero__(self): + return self.__bool__() + + def __bool__(self): + """ + So subclasses can override this, Py3-style + """ + return super(newint, self).__nonzero__() + + def __native__(self): + return long(self) + + def to_bytes(self, length, byteorder='big', signed=False): + """ + Return an array of bytes representing an integer. + + The integer is represented using length bytes. An OverflowError is + raised if the integer is not representable with the given number of + bytes. + + The byteorder argument determines the byte order used to represent the + integer. If byteorder is 'big', the most significant byte is at the + beginning of the byte array. If byteorder is 'little', the most + significant byte is at the end of the byte array. To request the native + byte order of the host system, use `sys.byteorder' as the byte order value. + + The signed keyword-only argument determines whether two's complement is + used to represent the integer. If signed is False and a negative integer + is given, an OverflowError is raised. + """ + if length < 0: + raise ValueError("length argument must be non-negative") + if length == 0 and self == 0: + return newbytes() + if signed and self < 0: + bits = length * 8 + num = (2**bits) + self + if num <= 0: + raise OverflowError("int too smal to convert") + else: + if self < 0: + raise OverflowError("can't convert negative int to unsigned") + num = self + if byteorder not in ('little', 'big'): + raise ValueError("byteorder must be either 'little' or 'big'") + h = b'%x' % num + s = newbytes((b'0'*(len(h) % 2) + h).zfill(length*2).decode('hex')) + if signed: + high_set = s[0] & 0x80 + if self > 0 and high_set: + raise OverflowError("int too big to convert") + if self < 0 and not high_set: + raise OverflowError("int too small to convert") + if len(s) > length: + raise OverflowError("int too big to convert") + return s if byteorder == 'big' else s[::-1] + + @classmethod + def from_bytes(cls, mybytes, byteorder='big', signed=False): + """ + Return the integer represented by the given array of bytes. + + The mybytes argument must either support the buffer protocol or be an + iterable object producing bytes. Bytes and bytearray are examples of + built-in objects that support the buffer protocol. + + The byteorder argument determines the byte order used to represent the + integer. If byteorder is 'big', the most significant byte is at the + beginning of the byte array. If byteorder is 'little', the most + significant byte is at the end of the byte array. To request the native + byte order of the host system, use `sys.byteorder' as the byte order value. + + The signed keyword-only argument indicates whether two's complement is + used to represent the integer. + """ + if byteorder not in ('little', 'big'): + raise ValueError("byteorder must be either 'little' or 'big'") + if isinstance(mybytes, unicode): + raise TypeError("cannot convert unicode objects to bytes") + # mybytes can also be passed as a sequence of integers on Py3. + # Test for this: + elif isinstance(mybytes, Iterable): + mybytes = newbytes(mybytes) + b = mybytes if byteorder == 'big' else mybytes[::-1] + if len(b) == 0: + b = b'\x00' + # The encode() method has been disabled by newbytes, but Py2's + # str has it: + num = int(native(b).encode('hex'), 16) + if signed and (b[0] & 0x80): + num = num - (2 ** (len(b)*8)) + return cls(num) + + +# def _twos_comp(val, bits): +# """compute the 2's compliment of int value val""" +# if( (val&(1<<(bits-1))) != 0 ): +# val = val - (1<>> from builtins import list +>>> l1 = list() # instead of {} for an empty list +>>> l1.append('hello') +>>> l2 = l1.copy() + +""" + +import sys +import copy + +from future.utils import with_metaclass +from future.types.newobject import newobject + + +_builtin_list = list +ver = sys.version_info[:2] + + +class BaseNewList(type): + def __instancecheck__(cls, instance): + if cls == newlist: + return isinstance(instance, _builtin_list) + else: + return issubclass(instance.__class__, cls) + + +class newlist(with_metaclass(BaseNewList, _builtin_list)): + """ + A backport of the Python 3 list object to Py2 + """ + def copy(self): + """ + L.copy() -> list -- a shallow copy of L + """ + return copy.copy(self) + + def clear(self): + """L.clear() -> None -- remove all items from L""" + for i in range(len(self)): + self.pop() + + def __new__(cls, *args, **kwargs): + """ + list() -> new empty list + list(iterable) -> new list initialized from iterable's items + """ + + if len(args) == 0: + return super(newlist, cls).__new__(cls) + elif type(args[0]) == newlist: + value = args[0] + else: + value = args[0] + return super(newlist, cls).__new__(cls, value) + + def __add__(self, value): + return newlist(super(newlist, self).__add__(value)) + + def __radd__(self, left): + " left + self " + try: + return newlist(left) + self + except: + return NotImplemented + + def __getitem__(self, y): + """ + x.__getitem__(y) <==> x[y] + + Warning: a bug in Python 2.x prevents indexing via a slice from + returning a newlist object. + """ + if isinstance(y, slice): + return newlist(super(newlist, self).__getitem__(y)) + else: + return super(newlist, self).__getitem__(y) + + def __native__(self): + """ + Hook for the future.utils.native() function + """ + return list(self) + + def __nonzero__(self): + return len(self) > 0 + + +__all__ = ['newlist'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/newmemoryview.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/newmemoryview.py new file mode 100644 index 0000000..09f804d --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/newmemoryview.py @@ -0,0 +1,29 @@ +""" +A pretty lame implementation of a memoryview object for Python 2.6. +""" +from numbers import Integral +import string + +from future.utils import istext, isbytes, PY2, with_metaclass +from future.types import no, issubset + +if PY2: + from collections import Iterable +else: + from collections.abc import Iterable + +# class BaseNewBytes(type): +# def __instancecheck__(cls, instance): +# return isinstance(instance, _builtin_bytes) + + +class newmemoryview(object): # with_metaclass(BaseNewBytes, _builtin_bytes)): + """ + A pretty lame backport of the Python 2.7 and Python 3.x + memoryviewview object to Py2.6. + """ + def __init__(self, obj): + return obj + + +__all__ = ['newmemoryview'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/newobject.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/newobject.py new file mode 100644 index 0000000..31b84fc --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/newobject.py @@ -0,0 +1,117 @@ +""" +An object subclass for Python 2 that gives new-style classes written in the +style of Python 3 (with ``__next__`` and unicode-returning ``__str__`` methods) +the appropriate Python 2-style ``next`` and ``__unicode__`` methods for compatible. + +Example use:: + + from builtins import object + + my_unicode_str = u'Unicode string: \u5b54\u5b50' + + class A(object): + def __str__(self): + return my_unicode_str + + a = A() + print(str(a)) + + # On Python 2, these relations hold: + assert unicode(a) == my_unicode_string + assert str(a) == my_unicode_string.encode('utf-8') + + +Another example:: + + from builtins import object + + class Upper(object): + def __init__(self, iterable): + self._iter = iter(iterable) + def __next__(self): # note the Py3 interface + return next(self._iter).upper() + def __iter__(self): + return self + + assert list(Upper('hello')) == list('HELLO') + +""" + + +class newobject(object): + """ + A magical object class that provides Python 2 compatibility methods:: + next + __unicode__ + __nonzero__ + + Subclasses of this class can merely define the Python 3 methods (__next__, + __str__, and __bool__). + """ + def next(self): + if hasattr(self, '__next__'): + return type(self).__next__(self) + raise TypeError('newobject is not an iterator') + + def __unicode__(self): + # All subclasses of the builtin object should have __str__ defined. + # Note that old-style classes do not have __str__ defined. + if hasattr(self, '__str__'): + s = type(self).__str__(self) + else: + s = str(self) + if isinstance(s, unicode): + return s + else: + return s.decode('utf-8') + + def __nonzero__(self): + if hasattr(self, '__bool__'): + return type(self).__bool__(self) + if hasattr(self, '__len__'): + return type(self).__len__(self) + # object has no __nonzero__ method + return True + + # Are these ever needed? + # def __div__(self): + # return self.__truediv__() + + # def __idiv__(self, other): + # return self.__itruediv__(other) + + def __long__(self): + if not hasattr(self, '__int__'): + return NotImplemented + return self.__int__() # not type(self).__int__(self) + + # def __new__(cls, *args, **kwargs): + # """ + # dict() -> new empty dictionary + # dict(mapping) -> new dictionary initialized from a mapping object's + # (key, value) pairs + # dict(iterable) -> new dictionary initialized as if via: + # d = {} + # for k, v in iterable: + # d[k] = v + # dict(**kwargs) -> new dictionary initialized with the name=value pairs + # in the keyword argument list. For example: dict(one=1, two=2) + # """ + + # if len(args) == 0: + # return super(newdict, cls).__new__(cls) + # elif type(args[0]) == newdict: + # return args[0] + # else: + # value = args[0] + # return super(newdict, cls).__new__(cls, value) + + def __native__(self): + """ + Hook for the future.utils.native() function + """ + return object(self) + + __slots__ = [] + +__all__ = ['newobject'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/newopen.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/newopen.py new file mode 100644 index 0000000..b75d45a --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/newopen.py @@ -0,0 +1,32 @@ +""" +A substitute for the Python 3 open() function. + +Note that io.open() is more complete but maybe slower. Even so, the +completeness may be a better default. TODO: compare these +""" + +_builtin_open = open + +class newopen(object): + """Wrapper providing key part of Python 3 open() interface. + + From IPython's py3compat.py module. License: BSD. + """ + def __init__(self, fname, mode="r", encoding="utf-8"): + self.f = _builtin_open(fname, mode) + self.enc = encoding + + def write(self, s): + return self.f.write(s.encode(self.enc)) + + def read(self, size=-1): + return self.f.read(size).decode(self.enc) + + def close(self): + return self.f.close() + + def __enter__(self): + return self + + def __exit__(self, etype, value, traceback): + self.f.close() diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/newrange.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/newrange.py new file mode 100644 index 0000000..eda01a5 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/newrange.py @@ -0,0 +1,170 @@ +""" +Nearly identical to xrange.py, by Dan Crosta, from + + https://github.com/dcrosta/xrange.git + +This is included here in the ``future`` package rather than pointed to as +a dependency because there is no package for ``xrange`` on PyPI. It is +also tweaked to appear like a regular Python 3 ``range`` object rather +than a Python 2 xrange. + +From Dan Crosta's README: + + "A pure-Python implementation of Python 2.7's xrange built-in, with + some features backported from the Python 3.x range built-in (which + replaced xrange) in that version." + + Read more at + https://late.am/post/2012/06/18/what-the-heck-is-an-xrange +""" +from __future__ import absolute_import + +from future.utils import PY2 + +if PY2: + from collections import Sequence, Iterator +else: + from collections.abc import Sequence, Iterator +from itertools import islice + +from future.backports.misc import count # with step parameter on Py2.6 +# For backward compatibility with python-future versions < 0.14.4: +_count = count + + +class newrange(Sequence): + """ + Pure-Python backport of Python 3's range object. See `the CPython + documentation for details: + `_ + """ + + def __init__(self, *args): + if len(args) == 1: + start, stop, step = 0, args[0], 1 + elif len(args) == 2: + start, stop, step = args[0], args[1], 1 + elif len(args) == 3: + start, stop, step = args + else: + raise TypeError('range() requires 1-3 int arguments') + + try: + start, stop, step = int(start), int(stop), int(step) + except ValueError: + raise TypeError('an integer is required') + + if step == 0: + raise ValueError('range() arg 3 must not be zero') + elif step < 0: + stop = min(stop, start) + else: + stop = max(stop, start) + + self._start = start + self._stop = stop + self._step = step + self._len = (stop - start) // step + bool((stop - start) % step) + + @property + def start(self): + return self._start + + @property + def stop(self): + return self._stop + + @property + def step(self): + return self._step + + def __repr__(self): + if self._step == 1: + return 'range(%d, %d)' % (self._start, self._stop) + return 'range(%d, %d, %d)' % (self._start, self._stop, self._step) + + def __eq__(self, other): + return (isinstance(other, newrange) and + (self._len == 0 == other._len or + (self._start, self._step, self._len) == + (other._start, other._step, self._len))) + + def __len__(self): + return self._len + + def index(self, value): + """Return the 0-based position of integer `value` in + the sequence this range represents.""" + try: + diff = value - self._start + except TypeError: + raise ValueError('%r is not in range' % value) + quotient, remainder = divmod(diff, self._step) + if remainder == 0 and 0 <= quotient < self._len: + return abs(quotient) + raise ValueError('%r is not in range' % value) + + def count(self, value): + """Return the number of ocurrences of integer `value` + in the sequence this range represents.""" + # a value can occur exactly zero or one times + return int(value in self) + + def __contains__(self, value): + """Return ``True`` if the integer `value` occurs in + the sequence this range represents.""" + try: + self.index(value) + return True + except ValueError: + return False + + def __reversed__(self): + return iter(self[::-1]) + + def __getitem__(self, index): + """Return the element at position ``index`` in the sequence + this range represents, or raise :class:`IndexError` if the + position is out of range.""" + if isinstance(index, slice): + return self.__getitem_slice(index) + if index < 0: + # negative indexes access from the end + index = self._len + index + if index < 0 or index >= self._len: + raise IndexError('range object index out of range') + return self._start + index * self._step + + def __getitem_slice(self, slce): + """Return a range which represents the requested slce + of the sequence represented by this range. + """ + scaled_indices = (self._step * n for n in slce.indices(self._len)) + start_offset, stop_offset, new_step = scaled_indices + return newrange(self._start + start_offset, + self._start + stop_offset, + new_step) + + def __iter__(self): + """Return an iterator which enumerates the elements of the + sequence this range represents.""" + return range_iterator(self) + + +class range_iterator(Iterator): + """An iterator for a :class:`range`. + """ + def __init__(self, range_): + self._stepper = islice(count(range_.start, range_.step), len(range_)) + + def __iter__(self): + return self + + def __next__(self): + return next(self._stepper) + + def next(self): + return next(self._stepper) + + +__all__ = ['newrange'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/types/newstr.py b/python/.gradle/python/lib/python3.6/site-packages/future/types/newstr.py new file mode 100644 index 0000000..8ca191f --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/types/newstr.py @@ -0,0 +1,426 @@ +""" +This module redefines ``str`` on Python 2.x to be a subclass of the Py2 +``unicode`` type that behaves like the Python 3.x ``str``. + +The main differences between ``newstr`` and Python 2.x's ``unicode`` type are +the stricter type-checking and absence of a `u''` prefix in the representation. + +It is designed to be used together with the ``unicode_literals`` import +as follows: + + >>> from __future__ import unicode_literals + >>> from builtins import str, isinstance + +On Python 3.x and normally on Python 2.x, these expressions hold + + >>> str('blah') is 'blah' + True + >>> isinstance('blah', str) + True + +However, on Python 2.x, with this import: + + >>> from __future__ import unicode_literals + +the same expressions are False: + + >>> str('blah') is 'blah' + False + >>> isinstance('blah', str) + False + +This module is designed to be imported together with ``unicode_literals`` on +Python 2 to bring the meaning of ``str`` back into alignment with unprefixed +string literals (i.e. ``unicode`` subclasses). + +Note that ``str()`` (and ``print()``) would then normally call the +``__unicode__`` method on objects in Python 2. To define string +representations of your objects portably across Py3 and Py2, use the +:func:`python_2_unicode_compatible` decorator in :mod:`future.utils`. + +""" + +from numbers import Number + +from future.utils import PY3, istext, with_metaclass, isnewbytes +from future.types import no, issubset +from future.types.newobject import newobject + + +if PY3: + # We'll probably never use newstr on Py3 anyway... + unicode = str + from collections.abc import Iterable +else: + from collections import Iterable + + +class BaseNewStr(type): + def __instancecheck__(cls, instance): + if cls == newstr: + return isinstance(instance, unicode) + else: + return issubclass(instance.__class__, cls) + + +class newstr(with_metaclass(BaseNewStr, unicode)): + """ + A backport of the Python 3 str object to Py2 + """ + no_convert_msg = "Can't convert '{0}' object to str implicitly" + + def __new__(cls, *args, **kwargs): + """ + From the Py3 str docstring: + + str(object='') -> str + str(bytes_or_buffer[, encoding[, errors]]) -> str + + Create a new string object from the given object. If encoding or + errors is specified, then the object must expose a data buffer + that will be decoded using the given encoding and error handler. + Otherwise, returns the result of object.__str__() (if defined) + or repr(object). + encoding defaults to sys.getdefaultencoding(). + errors defaults to 'strict'. + + """ + if len(args) == 0: + return super(newstr, cls).__new__(cls) + # Special case: If someone requests str(str(u'abc')), return the same + # object (same id) for consistency with Py3.3. This is not true for + # other objects like list or dict. + elif type(args[0]) == newstr and cls == newstr: + return args[0] + elif isinstance(args[0], unicode): + value = args[0] + elif isinstance(args[0], bytes): # i.e. Py2 bytes or newbytes + if 'encoding' in kwargs or len(args) > 1: + value = args[0].decode(*args[1:], **kwargs) + else: + value = args[0].__str__() + else: + value = args[0] + return super(newstr, cls).__new__(cls, value) + + def __repr__(self): + """ + Without the u prefix + """ + + value = super(newstr, self).__repr__() + # assert value[0] == u'u' + return value[1:] + + def __getitem__(self, y): + """ + Warning: Python <= 2.7.6 has a bug that causes this method never to be called + when y is a slice object. Therefore the type of newstr()[:2] is wrong + (unicode instead of newstr). + """ + return newstr(super(newstr, self).__getitem__(y)) + + def __contains__(self, key): + errmsg = "'in ' requires string as left operand, not {0}" + # Don't use isinstance() here because we only want to catch + # newstr, not Python 2 unicode: + if type(key) == newstr: + newkey = key + elif isinstance(key, unicode) or isinstance(key, bytes) and not isnewbytes(key): + newkey = newstr(key) + else: + raise TypeError(errmsg.format(type(key))) + return issubset(list(newkey), list(self)) + + @no('newbytes') + def __add__(self, other): + return newstr(super(newstr, self).__add__(other)) + + @no('newbytes') + def __radd__(self, left): + " left + self " + try: + return newstr(left) + self + except: + return NotImplemented + + def __mul__(self, other): + return newstr(super(newstr, self).__mul__(other)) + + def __rmul__(self, other): + return newstr(super(newstr, self).__rmul__(other)) + + def join(self, iterable): + errmsg = 'sequence item {0}: expected unicode string, found bytes' + for i, item in enumerate(iterable): + # Here we use type() rather than isinstance() because + # __instancecheck__ is being overridden. E.g. + # isinstance(b'abc', newbytes) is True on Py2. + if isnewbytes(item): + raise TypeError(errmsg.format(i)) + # Support use as a staticmethod: str.join('-', ['a', 'b']) + if type(self) == newstr: + return newstr(super(newstr, self).join(iterable)) + else: + return newstr(super(newstr, newstr(self)).join(iterable)) + + @no('newbytes') + def find(self, sub, *args): + return super(newstr, self).find(sub, *args) + + @no('newbytes') + def rfind(self, sub, *args): + return super(newstr, self).rfind(sub, *args) + + @no('newbytes', (1, 2)) + def replace(self, old, new, *args): + return newstr(super(newstr, self).replace(old, new, *args)) + + def decode(self, *args): + raise AttributeError("decode method has been disabled in newstr") + + def encode(self, encoding='utf-8', errors='strict'): + """ + Returns bytes + + Encode S using the codec registered for encoding. Default encoding + is 'utf-8'. errors may be given to set a different error + handling scheme. Default is 'strict' meaning that encoding errors raise + a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and + 'xmlcharrefreplace' as well as any other name registered with + codecs.register_error that can handle UnicodeEncodeErrors. + """ + from future.types.newbytes import newbytes + # Py2 unicode.encode() takes encoding and errors as optional parameter, + # not keyword arguments as in Python 3 str. + + # For the surrogateescape error handling mechanism, the + # codecs.register_error() function seems to be inadequate for an + # implementation of it when encoding. (Decoding seems fine, however.) + # For example, in the case of + # u'\udcc3'.encode('ascii', 'surrogateescape_handler') + # after registering the ``surrogateescape_handler`` function in + # future.utils.surrogateescape, both Python 2.x and 3.x raise an + # exception anyway after the function is called because the unicode + # string it has to return isn't encodable strictly as ASCII. + + if errors == 'surrogateescape': + if encoding == 'utf-16': + # Known to fail here. See test_encoding_works_normally() + raise NotImplementedError('FIXME: surrogateescape handling is ' + 'not yet implemented properly') + # Encode char by char, building up list of byte-strings + mybytes = [] + for c in self: + code = ord(c) + if 0xD800 <= code <= 0xDCFF: + mybytes.append(newbytes([code - 0xDC00])) + else: + mybytes.append(c.encode(encoding=encoding)) + return newbytes(b'').join(mybytes) + return newbytes(super(newstr, self).encode(encoding, errors)) + + @no('newbytes', 1) + def startswith(self, prefix, *args): + if isinstance(prefix, Iterable): + for thing in prefix: + if isnewbytes(thing): + raise TypeError(self.no_convert_msg.format(type(thing))) + return super(newstr, self).startswith(prefix, *args) + + @no('newbytes', 1) + def endswith(self, prefix, *args): + # Note we need the decorator above as well as the isnewbytes() + # check because prefix can be either a bytes object or e.g. a + # tuple of possible prefixes. (If it's a bytes object, each item + # in it is an int.) + if isinstance(prefix, Iterable): + for thing in prefix: + if isnewbytes(thing): + raise TypeError(self.no_convert_msg.format(type(thing))) + return super(newstr, self).endswith(prefix, *args) + + @no('newbytes', 1) + def split(self, sep=None, maxsplit=-1): + # Py2 unicode.split() takes maxsplit as an optional parameter, + # not as a keyword argument as in Python 3 str. + parts = super(newstr, self).split(sep, maxsplit) + return [newstr(part) for part in parts] + + @no('newbytes', 1) + def rsplit(self, sep=None, maxsplit=-1): + # Py2 unicode.rsplit() takes maxsplit as an optional parameter, + # not as a keyword argument as in Python 3 str. + parts = super(newstr, self).rsplit(sep, maxsplit) + return [newstr(part) for part in parts] + + @no('newbytes', 1) + def partition(self, sep): + parts = super(newstr, self).partition(sep) + return tuple(newstr(part) for part in parts) + + @no('newbytes', 1) + def rpartition(self, sep): + parts = super(newstr, self).rpartition(sep) + return tuple(newstr(part) for part in parts) + + @no('newbytes', 1) + def index(self, sub, *args): + """ + Like newstr.find() but raise ValueError when the substring is not + found. + """ + pos = self.find(sub, *args) + if pos == -1: + raise ValueError('substring not found') + return pos + + def splitlines(self, keepends=False): + """ + S.splitlines(keepends=False) -> list of strings + + Return a list of the lines in S, breaking at line boundaries. + Line breaks are not included in the resulting list unless keepends + is given and true. + """ + # Py2 unicode.splitlines() takes keepends as an optional parameter, + # not as a keyword argument as in Python 3 str. + parts = super(newstr, self).splitlines(keepends) + return [newstr(part) for part in parts] + + def __eq__(self, other): + if (isinstance(other, unicode) or + isinstance(other, bytes) and not isnewbytes(other)): + return super(newstr, self).__eq__(other) + else: + return NotImplemented + + def __hash__(self): + if (isinstance(self, unicode) or + isinstance(self, bytes) and not isnewbytes(self)): + return super(newstr, self).__hash__() + else: + raise NotImplementedError() + + def __ne__(self, other): + if (isinstance(other, unicode) or + isinstance(other, bytes) and not isnewbytes(other)): + return super(newstr, self).__ne__(other) + else: + return True + + unorderable_err = 'unorderable types: str() and {0}' + + def __lt__(self, other): + if (isinstance(other, unicode) or + isinstance(other, bytes) and not isnewbytes(other)): + return super(newstr, self).__lt__(other) + raise TypeError(self.unorderable_err.format(type(other))) + + def __le__(self, other): + if (isinstance(other, unicode) or + isinstance(other, bytes) and not isnewbytes(other)): + return super(newstr, self).__le__(other) + raise TypeError(self.unorderable_err.format(type(other))) + + def __gt__(self, other): + if (isinstance(other, unicode) or + isinstance(other, bytes) and not isnewbytes(other)): + return super(newstr, self).__gt__(other) + raise TypeError(self.unorderable_err.format(type(other))) + + def __ge__(self, other): + if (isinstance(other, unicode) or + isinstance(other, bytes) and not isnewbytes(other)): + return super(newstr, self).__ge__(other) + raise TypeError(self.unorderable_err.format(type(other))) + + def __getattribute__(self, name): + """ + A trick to cause the ``hasattr`` builtin-fn to return False for + the 'decode' method on Py2. + """ + if name in ['decode', u'decode']: + raise AttributeError("decode method has been disabled in newstr") + return super(newstr, self).__getattribute__(name) + + def __native__(self): + """ + A hook for the future.utils.native() function. + """ + return unicode(self) + + @staticmethod + def maketrans(x, y=None, z=None): + """ + Return a translation table usable for str.translate(). + + If there is only one argument, it must be a dictionary mapping Unicode + ordinals (integers) or characters to Unicode ordinals, strings or None. + Character keys will be then converted to ordinals. + If there are two arguments, they must be strings of equal length, and + in the resulting dictionary, each character in x will be mapped to the + character at the same position in y. If there is a third argument, it + must be a string, whose characters will be mapped to None in the result. + """ + + if y is None: + assert z is None + if not isinstance(x, dict): + raise TypeError('if you give only one argument to maketrans it must be a dict') + result = {} + for (key, value) in x.items(): + if len(key) > 1: + raise ValueError('keys in translate table must be strings or integers') + result[ord(key)] = value + else: + if not isinstance(x, unicode) and isinstance(y, unicode): + raise TypeError('x and y must be unicode strings') + if not len(x) == len(y): + raise ValueError('the first two maketrans arguments must have equal length') + result = {} + for (xi, yi) in zip(x, y): + if len(xi) > 1: + raise ValueError('keys in translate table must be strings or integers') + result[ord(xi)] = ord(yi) + + if z is not None: + for char in z: + result[ord(char)] = None + return result + + def translate(self, table): + """ + S.translate(table) -> str + + Return a copy of the string S, where all characters have been mapped + through the given translation table, which must be a mapping of + Unicode ordinals to Unicode ordinals, strings, or None. + Unmapped characters are left untouched. Characters mapped to None + are deleted. + """ + l = [] + for c in self: + if ord(c) in table: + val = table[ord(c)] + if val is None: + continue + elif isinstance(val, unicode): + l.append(val) + else: + l.append(chr(val)) + else: + l.append(c) + return ''.join(l) + + def isprintable(self): + raise NotImplementedError('fixme') + + def isidentifier(self): + raise NotImplementedError('fixme') + + def format_map(self): + raise NotImplementedError('fixme') + + +__all__ = ['newstr'] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/utils/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/future/utils/__init__.py new file mode 100644 index 0000000..46bd96d --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/utils/__init__.py @@ -0,0 +1,767 @@ +""" +A selection of cross-compatible functions for Python 2 and 3. + +This module exports useful functions for 2/3 compatible code: + + * bind_method: binds functions to classes + * ``native_str_to_bytes`` and ``bytes_to_native_str`` + * ``native_str``: always equal to the native platform string object (because + this may be shadowed by imports from future.builtins) + * lists: lrange(), lmap(), lzip(), lfilter() + * iterable method compatibility: + - iteritems, iterkeys, itervalues + - viewitems, viewkeys, viewvalues + + These use the original method if available, otherwise they use items, + keys, values. + + * types: + + * text_type: unicode in Python 2, str in Python 3 + * string_types: basestring in Python 2, str in Python 3 + * binary_type: str in Python 2, bytes in Python 3 + * integer_types: (int, long) in Python 2, int in Python 3 + * class_types: (type, types.ClassType) in Python 2, type in Python 3 + + * bchr(c): + Take an integer and make a 1-character byte string + * bord(c) + Take the result of indexing on a byte string and make an integer + * tobytes(s) + Take a text string, a byte string, or a sequence of characters taken + from a byte string, and make a byte string. + + * raise_from() + * raise_with_traceback() + +This module also defines these decorators: + + * ``python_2_unicode_compatible`` + * ``with_metaclass`` + * ``implements_iterator`` + +Some of the functions in this module come from the following sources: + + * Jinja2 (BSD licensed: see + https://github.com/mitsuhiko/jinja2/blob/master/LICENSE) + * Pandas compatibility module pandas.compat + * six.py by Benjamin Peterson + * Django +""" + +import types +import sys +import numbers +import functools +import copy +import inspect + + +PY3 = sys.version_info[0] >= 3 +PY34_PLUS = sys.version_info[0:2] >= (3, 4) +PY35_PLUS = sys.version_info[0:2] >= (3, 5) +PY36_PLUS = sys.version_info[0:2] >= (3, 6) +PY2 = sys.version_info[0] == 2 +PY26 = sys.version_info[0:2] == (2, 6) +PY27 = sys.version_info[0:2] == (2, 7) +PYPY = hasattr(sys, 'pypy_translation_info') + + +def python_2_unicode_compatible(cls): + """ + A decorator that defines __unicode__ and __str__ methods under Python + 2. Under Python 3, this decorator is a no-op. + + To support Python 2 and 3 with a single code base, define a __str__ + method returning unicode text and apply this decorator to the class, like + this:: + + >>> from future.utils import python_2_unicode_compatible + + >>> @python_2_unicode_compatible + ... class MyClass(object): + ... def __str__(self): + ... return u'Unicode string: \u5b54\u5b50' + + >>> a = MyClass() + + Then, after this import: + + >>> from future.builtins import str + + the following is ``True`` on both Python 3 and 2:: + + >>> str(a) == a.encode('utf-8').decode('utf-8') + True + + and, on a Unicode-enabled terminal with the right fonts, these both print the + Chinese characters for Confucius:: + + >>> print(a) + >>> print(str(a)) + + The implementation comes from django.utils.encoding. + """ + if not PY3: + cls.__unicode__ = cls.__str__ + cls.__str__ = lambda self: self.__unicode__().encode('utf-8') + return cls + + +def with_metaclass(meta, *bases): + """ + Function from jinja2/_compat.py. License: BSD. + + Use it like this:: + + class BaseForm(object): + pass + + class FormType(type): + pass + + class Form(with_metaclass(FormType, BaseForm)): + pass + + This requires a bit of explanation: the basic idea is to make a + dummy metaclass for one level of class instantiation that replaces + itself with the actual metaclass. Because of internal type checks + we also need to make sure that we downgrade the custom metaclass + for one level to something closer to type (that's why __call__ and + __init__ comes back from type etc.). + + This has the advantage over six.with_metaclass of not introducing + dummy classes into the final MRO. + """ + class metaclass(meta): + __call__ = type.__call__ + __init__ = type.__init__ + def __new__(cls, name, this_bases, d): + if this_bases is None: + return type.__new__(cls, name, (), d) + return meta(name, bases, d) + return metaclass('temporary_class', None, {}) + + +# Definitions from pandas.compat and six.py follow: +if PY3: + def bchr(s): + return bytes([s]) + def bstr(s): + if isinstance(s, str): + return bytes(s, 'latin-1') + else: + return bytes(s) + def bord(s): + return s + + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + +else: + # Python 2 + def bchr(s): + return chr(s) + def bstr(s): + return str(s) + def bord(s): + return ord(s) + + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + +### + +if PY3: + def tobytes(s): + if isinstance(s, bytes): + return s + else: + if isinstance(s, str): + return s.encode('latin-1') + else: + return bytes(s) +else: + # Python 2 + def tobytes(s): + if isinstance(s, unicode): + return s.encode('latin-1') + else: + return ''.join(s) + +tobytes.__doc__ = """ + Encodes to latin-1 (where the first 256 chars are the same as + ASCII.) + """ + +if PY3: + def native_str_to_bytes(s, encoding='utf-8'): + return s.encode(encoding) + + def bytes_to_native_str(b, encoding='utf-8'): + return b.decode(encoding) + + def text_to_native_str(t, encoding=None): + return t +else: + # Python 2 + def native_str_to_bytes(s, encoding=None): + from future.types import newbytes # to avoid a circular import + return newbytes(s) + + def bytes_to_native_str(b, encoding=None): + return native(b) + + def text_to_native_str(t, encoding='ascii'): + """ + Use this to create a Py2 native string when "from __future__ import + unicode_literals" is in effect. + """ + return unicode(t).encode(encoding) + +native_str_to_bytes.__doc__ = """ + On Py3, returns an encoded string. + On Py2, returns a newbytes type, ignoring the ``encoding`` argument. + """ + +if PY3: + # list-producing versions of the major Python iterating functions + def lrange(*args, **kwargs): + return list(range(*args, **kwargs)) + + def lzip(*args, **kwargs): + return list(zip(*args, **kwargs)) + + def lmap(*args, **kwargs): + return list(map(*args, **kwargs)) + + def lfilter(*args, **kwargs): + return list(filter(*args, **kwargs)) +else: + import __builtin__ + # Python 2-builtin ranges produce lists + lrange = __builtin__.range + lzip = __builtin__.zip + lmap = __builtin__.map + lfilter = __builtin__.filter + + +def isidentifier(s, dotted=False): + ''' + A function equivalent to the str.isidentifier method on Py3 + ''' + if dotted: + return all(isidentifier(a) for a in s.split('.')) + if PY3: + return s.isidentifier() + else: + import re + _name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$") + return bool(_name_re.match(s)) + + +def viewitems(obj, **kwargs): + """ + Function for iterating over dictionary items with the same set-like + behaviour on Py2.7 as on Py3. + + Passes kwargs to method.""" + func = getattr(obj, "viewitems", None) + if not func: + func = obj.items + return func(**kwargs) + + +def viewkeys(obj, **kwargs): + """ + Function for iterating over dictionary keys with the same set-like + behaviour on Py2.7 as on Py3. + + Passes kwargs to method.""" + func = getattr(obj, "viewkeys", None) + if not func: + func = obj.keys + return func(**kwargs) + + +def viewvalues(obj, **kwargs): + """ + Function for iterating over dictionary values with the same set-like + behaviour on Py2.7 as on Py3. + + Passes kwargs to method.""" + func = getattr(obj, "viewvalues", None) + if not func: + func = obj.values + return func(**kwargs) + + +def iteritems(obj, **kwargs): + """Use this only if compatibility with Python versions before 2.7 is + required. Otherwise, prefer viewitems(). + """ + func = getattr(obj, "iteritems", None) + if not func: + func = obj.items + return func(**kwargs) + + +def iterkeys(obj, **kwargs): + """Use this only if compatibility with Python versions before 2.7 is + required. Otherwise, prefer viewkeys(). + """ + func = getattr(obj, "iterkeys", None) + if not func: + func = obj.keys + return func(**kwargs) + + +def itervalues(obj, **kwargs): + """Use this only if compatibility with Python versions before 2.7 is + required. Otherwise, prefer viewvalues(). + """ + func = getattr(obj, "itervalues", None) + if not func: + func = obj.values + return func(**kwargs) + + +def bind_method(cls, name, func): + """Bind a method to class, python 2 and python 3 compatible. + + Parameters + ---------- + + cls : type + class to receive bound method + name : basestring + name of method on class instance + func : function + function to be bound as method + + Returns + ------- + None + """ + # only python 2 has an issue with bound/unbound methods + if not PY3: + setattr(cls, name, types.MethodType(func, None, cls)) + else: + setattr(cls, name, func) + + +def getexception(): + return sys.exc_info()[1] + + +def _get_caller_globals_and_locals(): + """ + Returns the globals and locals of the calling frame. + + Is there an alternative to frame hacking here? + """ + caller_frame = inspect.stack()[2] + myglobals = caller_frame[0].f_globals + mylocals = caller_frame[0].f_locals + return myglobals, mylocals + + +def _repr_strip(mystring): + """ + Returns the string without any initial or final quotes. + """ + r = repr(mystring) + if r.startswith("'") and r.endswith("'"): + return r[1:-1] + else: + return r + + +if PY3: + def raise_from(exc, cause): + """ + Equivalent to: + + raise EXCEPTION from CAUSE + + on Python 3. (See PEP 3134). + """ + myglobals, mylocals = _get_caller_globals_and_locals() + + # We pass the exception and cause along with other globals + # when we exec(): + myglobals = myglobals.copy() + myglobals['__python_future_raise_from_exc'] = exc + myglobals['__python_future_raise_from_cause'] = cause + execstr = "raise __python_future_raise_from_exc from __python_future_raise_from_cause" + exec(execstr, myglobals, mylocals) + + def raise_(tp, value=None, tb=None): + """ + A function that matches the Python 2.x ``raise`` statement. This + allows re-raising exceptions with the cls value and traceback on + Python 2 and 3. + """ + if isinstance(tp, BaseException): + # If the first object is an instance, the type of the exception + # is the class of the instance, the instance itself is the value, + # and the second object must be None. + if value is not None: + raise TypeError("instance exception may not have a separate value") + exc = tp + elif isinstance(tp, type) and not issubclass(tp, BaseException): + # If the first object is a class, it becomes the type of the + # exception. + raise TypeError("class must derive from BaseException, not %s" % tp.__name__) + else: + # The second object is used to determine the exception value: If it + # is an instance of the class, the instance becomes the exception + # value. If the second object is a tuple, it is used as the argument + # list for the class constructor; if it is None, an empty argument + # list is used, and any other object is treated as a single argument + # to the constructor. The instance so created by calling the + # constructor is used as the exception value. + if isinstance(value, tp): + exc = value + elif isinstance(value, tuple): + exc = tp(*value) + elif value is None: + exc = tp() + else: + exc = tp(value) + + if exc.__traceback__ is not tb: + raise exc.with_traceback(tb) + raise exc + + def raise_with_traceback(exc, traceback=Ellipsis): + if traceback == Ellipsis: + _, _, traceback = sys.exc_info() + raise exc.with_traceback(traceback) + +else: + def raise_from(exc, cause): + """ + Equivalent to: + + raise EXCEPTION from CAUSE + + on Python 3. (See PEP 3134). + """ + # Is either arg an exception class (e.g. IndexError) rather than + # instance (e.g. IndexError('my message here')? If so, pass the + # name of the class undisturbed through to "raise ... from ...". + if isinstance(exc, type) and issubclass(exc, Exception): + e = exc() + # exc = exc.__name__ + # execstr = "e = " + _repr_strip(exc) + "()" + # myglobals, mylocals = _get_caller_globals_and_locals() + # exec(execstr, myglobals, mylocals) + else: + e = exc + e.__suppress_context__ = False + if isinstance(cause, type) and issubclass(cause, Exception): + e.__cause__ = cause() + e.__cause__.__traceback__ = sys.exc_info()[2] + e.__suppress_context__ = True + elif cause is None: + e.__cause__ = None + e.__suppress_context__ = True + elif isinstance(cause, BaseException): + e.__cause__ = cause + object.__setattr__(e.__cause__, '__traceback__', sys.exc_info()[2]) + e.__suppress_context__ = True + else: + raise TypeError("exception causes must derive from BaseException") + e.__context__ = sys.exc_info()[1] + raise e + + exec(''' +def raise_(tp, value=None, tb=None): + raise tp, value, tb + +def raise_with_traceback(exc, traceback=Ellipsis): + if traceback == Ellipsis: + _, _, traceback = sys.exc_info() + raise exc, None, traceback +'''.strip()) + + +raise_with_traceback.__doc__ = ( +"""Raise exception with existing traceback. +If traceback is not passed, uses sys.exc_info() to get traceback.""" +) + + +# Deprecated alias for backward compatibility with ``future`` versions < 0.11: +reraise = raise_ + + +def implements_iterator(cls): + ''' + From jinja2/_compat.py. License: BSD. + + Use as a decorator like this:: + + @implements_iterator + class UppercasingIterator(object): + def __init__(self, iterable): + self._iter = iter(iterable) + def __iter__(self): + return self + def __next__(self): + return next(self._iter).upper() + + ''' + if PY3: + return cls + else: + cls.next = cls.__next__ + del cls.__next__ + return cls + +if PY3: + get_next = lambda x: x.next +else: + get_next = lambda x: x.__next__ + + +def encode_filename(filename): + if PY3: + return filename + else: + if isinstance(filename, unicode): + return filename.encode('utf-8') + return filename + + +def is_new_style(cls): + """ + Python 2.7 has both new-style and old-style classes. Old-style classes can + be pesky in some circumstances, such as when using inheritance. Use this + function to test for whether a class is new-style. (Python 3 only has + new-style classes.) + """ + return hasattr(cls, '__class__') and ('__dict__' in dir(cls) + or hasattr(cls, '__slots__')) + +# The native platform string and bytes types. Useful because ``str`` and +# ``bytes`` are redefined on Py2 by ``from future.builtins import *``. +native_str = str +native_bytes = bytes + + +def istext(obj): + """ + Deprecated. Use:: + >>> isinstance(obj, str) + after this import: + >>> from future.builtins import str + """ + return isinstance(obj, type(u'')) + + +def isbytes(obj): + """ + Deprecated. Use:: + >>> isinstance(obj, bytes) + after this import: + >>> from future.builtins import bytes + """ + return isinstance(obj, type(b'')) + + +def isnewbytes(obj): + """ + Equivalent to the result of ``type(obj) == type(newbytes)`` + in other words, it is REALLY a newbytes instance, not a Py2 native str + object? + + Note that this does not cover subclasses of newbytes, and it is not + equivalent to ininstance(obj, newbytes) + """ + return type(obj).__name__ == 'newbytes' + + +def isint(obj): + """ + Deprecated. Tests whether an object is a Py3 ``int`` or either a Py2 ``int`` or + ``long``. + + Instead of using this function, you can use: + + >>> from future.builtins import int + >>> isinstance(obj, int) + + The following idiom is equivalent: + + >>> from numbers import Integral + >>> isinstance(obj, Integral) + """ + + return isinstance(obj, numbers.Integral) + + +def native(obj): + """ + On Py3, this is a no-op: native(obj) -> obj + + On Py2, returns the corresponding native Py2 types that are + superclasses for backported objects from Py3: + + >>> from builtins import str, bytes, int + + >>> native(str(u'ABC')) + u'ABC' + >>> type(native(str(u'ABC'))) + unicode + + >>> native(bytes(b'ABC')) + b'ABC' + >>> type(native(bytes(b'ABC'))) + bytes + + >>> native(int(10**20)) + 100000000000000000000L + >>> type(native(int(10**20))) + long + + Existing native types on Py2 will be returned unchanged: + + >>> type(native(u'ABC')) + unicode + """ + if hasattr(obj, '__native__'): + return obj.__native__() + else: + return obj + + +# Implementation of exec_ is from ``six``: +if PY3: + import builtins + exec_ = getattr(builtins, "exec") +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""") + + +# Defined here for backward compatibility: +def old_div(a, b): + """ + DEPRECATED: import ``old_div`` from ``past.utils`` instead. + + Equivalent to ``a / b`` on Python 2 without ``from __future__ import + division``. + + TODO: generalize this to other objects (like arrays etc.) + """ + if isinstance(a, numbers.Integral) and isinstance(b, numbers.Integral): + return a // b + else: + return a / b + + +def as_native_str(encoding='utf-8'): + ''' + A decorator to turn a function or method call that returns text, i.e. + unicode, into one that returns a native platform str. + + Use it as a decorator like this:: + + from __future__ import unicode_literals + + class MyClass(object): + @as_native_str(encoding='ascii') + def __repr__(self): + return next(self._iter).upper() + ''' + if PY3: + return lambda f: f + else: + def encoder(f): + @functools.wraps(f) + def wrapper(*args, **kwargs): + return f(*args, **kwargs).encode(encoding=encoding) + return wrapper + return encoder + +# listvalues and listitems definitions from Nick Coghlan's (withdrawn) +# PEP 496: +try: + dict.iteritems +except AttributeError: + # Python 3 + def listvalues(d): + return list(d.values()) + def listitems(d): + return list(d.items()) +else: + # Python 2 + def listvalues(d): + return d.values() + def listitems(d): + return d.items() + +if PY3: + def ensure_new_type(obj): + return obj +else: + def ensure_new_type(obj): + from future.types.newbytes import newbytes + from future.types.newstr import newstr + from future.types.newint import newint + from future.types.newdict import newdict + + native_type = type(native(obj)) + + # Upcast only if the type is already a native (non-future) type + if issubclass(native_type, type(obj)): + # Upcast + if native_type == str: # i.e. Py2 8-bit str + return newbytes(obj) + elif native_type == unicode: + return newstr(obj) + elif native_type == int: + return newint(obj) + elif native_type == long: + return newint(obj) + elif native_type == dict: + return newdict(obj) + else: + return obj + else: + # Already a new type + assert type(obj) in [newbytes, newstr] + return obj + + +__all__ = ['PY2', 'PY26', 'PY3', 'PYPY', + 'as_native_str', 'binary_type', 'bind_method', 'bord', 'bstr', + 'bytes_to_native_str', 'class_types', 'encode_filename', + 'ensure_new_type', 'exec_', 'get_next', 'getexception', + 'implements_iterator', 'integer_types', 'is_new_style', 'isbytes', + 'isidentifier', 'isint', 'isnewbytes', 'istext', 'iteritems', + 'iterkeys', 'itervalues', 'lfilter', 'listitems', 'listvalues', + 'lmap', 'lrange', 'lzip', 'native', 'native_bytes', 'native_str', + 'native_str_to_bytes', 'old_div', + 'python_2_unicode_compatible', 'raise_', + 'raise_with_traceback', 'reraise', 'string_types', + 'text_to_native_str', 'text_type', 'tobytes', 'viewitems', + 'viewkeys', 'viewvalues', 'with_metaclass' + ] diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/utils/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/future/utils/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71cfc8dfd63b548b011d99c3450dda0d11f2a952 GIT binary patch literal 20209 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 Z^3KmX-UV;jyX>K0@R(Pw*j~ls{{!q7im3nq literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/future/utils/surrogateescape.py b/python/.gradle/python/lib/python3.6/site-packages/future/utils/surrogateescape.py new file mode 100644 index 0000000..0dcc9fa --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/future/utils/surrogateescape.py @@ -0,0 +1,198 @@ +""" +This is Victor Stinner's pure-Python implementation of PEP 383: the "surrogateescape" error +handler of Python 3. + +Source: misc/python/surrogateescape.py in https://bitbucket.org/haypo/misc +""" + +# This code is released under the Python license and the BSD 2-clause license + +import codecs +import sys + +from future import utils + + +FS_ERRORS = 'surrogateescape' + +# # -- Python 2/3 compatibility ------------------------------------- +# FS_ERRORS = 'my_surrogateescape' + +def u(text): + if utils.PY3: + return text + else: + return text.decode('unicode_escape') + +def b(data): + if utils.PY3: + return data.encode('latin1') + else: + return data + +if utils.PY3: + _unichr = chr + bytes_chr = lambda code: bytes((code,)) +else: + _unichr = unichr + bytes_chr = chr + +def surrogateescape_handler(exc): + """ + Pure Python implementation of the PEP 383: the "surrogateescape" error + handler of Python 3. Undecodable bytes will be replaced by a Unicode + character U+DCxx on decoding, and these are translated into the + original bytes on encoding. + """ + mystring = exc.object[exc.start:exc.end] + + try: + if isinstance(exc, UnicodeDecodeError): + # mystring is a byte-string in this case + decoded = replace_surrogate_decode(mystring) + elif isinstance(exc, UnicodeEncodeError): + # In the case of u'\udcc3'.encode('ascii', + # 'this_surrogateescape_handler'), both Python 2.x and 3.x raise an + # exception anyway after this function is called, even though I think + # it's doing what it should. It seems that the strict encoder is called + # to encode the unicode string that this function returns ... + decoded = replace_surrogate_encode(mystring) + else: + raise exc + except NotASurrogateError: + raise exc + return (decoded, exc.end) + + +class NotASurrogateError(Exception): + pass + + +def replace_surrogate_encode(mystring): + """ + Returns a (unicode) string, not the more logical bytes, because the codecs + register_error functionality expects this. + """ + decoded = [] + for ch in mystring: + # if utils.PY3: + # code = ch + # else: + code = ord(ch) + + # The following magic comes from Py3.3's Python/codecs.c file: + if not 0xD800 <= code <= 0xDCFF: + # Not a surrogate. Fail with the original exception. + raise NotASurrogateError + # mybytes = [0xe0 | (code >> 12), + # 0x80 | ((code >> 6) & 0x3f), + # 0x80 | (code & 0x3f)] + # Is this a good idea? + if 0xDC00 <= code <= 0xDC7F: + decoded.append(_unichr(code - 0xDC00)) + elif code <= 0xDCFF: + decoded.append(_unichr(code - 0xDC00)) + else: + raise NotASurrogateError + return str().join(decoded) + + +def replace_surrogate_decode(mybytes): + """ + Returns a (unicode) string + """ + decoded = [] + for ch in mybytes: + # We may be parsing newbytes (in which case ch is an int) or a native + # str on Py2 + if isinstance(ch, int): + code = ch + else: + code = ord(ch) + if 0x80 <= code <= 0xFF: + decoded.append(_unichr(0xDC00 + code)) + elif code <= 0x7F: + decoded.append(_unichr(code)) + else: + # # It may be a bad byte + # # Try swallowing it. + # continue + # print("RAISE!") + raise NotASurrogateError + return str().join(decoded) + + +def encodefilename(fn): + if FS_ENCODING == 'ascii': + # ASCII encoder of Python 2 expects that the error handler returns a + # Unicode string encodable to ASCII, whereas our surrogateescape error + # handler has to return bytes in 0x80-0xFF range. + encoded = [] + for index, ch in enumerate(fn): + code = ord(ch) + if code < 128: + ch = bytes_chr(code) + elif 0xDC80 <= code <= 0xDCFF: + ch = bytes_chr(code - 0xDC00) + else: + raise UnicodeEncodeError(FS_ENCODING, + fn, index, index+1, + 'ordinal not in range(128)') + encoded.append(ch) + return bytes().join(encoded) + elif FS_ENCODING == 'utf-8': + # UTF-8 encoder of Python 2 encodes surrogates, so U+DC80-U+DCFF + # doesn't go through our error handler + encoded = [] + for index, ch in enumerate(fn): + code = ord(ch) + if 0xD800 <= code <= 0xDFFF: + if 0xDC80 <= code <= 0xDCFF: + ch = bytes_chr(code - 0xDC00) + encoded.append(ch) + else: + raise UnicodeEncodeError( + FS_ENCODING, + fn, index, index+1, 'surrogates not allowed') + else: + ch_utf8 = ch.encode('utf-8') + encoded.append(ch_utf8) + return bytes().join(encoded) + else: + return fn.encode(FS_ENCODING, FS_ERRORS) + +def decodefilename(fn): + return fn.decode(FS_ENCODING, FS_ERRORS) + +FS_ENCODING = 'ascii'; fn = b('[abc\xff]'); encoded = u('[abc\udcff]') +# FS_ENCODING = 'cp932'; fn = b('[abc\x81\x00]'); encoded = u('[abc\udc81\x00]') +# FS_ENCODING = 'UTF-8'; fn = b('[abc\xff]'); encoded = u('[abc\udcff]') + + +# normalize the filesystem encoding name. +# For example, we expect "utf-8", not "UTF8". +FS_ENCODING = codecs.lookup(FS_ENCODING).name + + +def register_surrogateescape(): + """ + Registers the surrogateescape error handler on Python 2 (only) + """ + if utils.PY3: + return + try: + codecs.lookup_error(FS_ERRORS) + except LookupError: + codecs.register_error(FS_ERRORS, surrogateescape_handler) + + +if __name__ == '__main__': + pass + # # Tests: + # register_surrogateescape() + + # b = decodefilename(fn) + # assert b == encoded, "%r != %r" % (b, encoded) + # c = encodefilename(b) + # assert c == fn, '%r != %r' % (c, fn) + # # print("ok") diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/DESCRIPTION.rst b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..f0db0b6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/DESCRIPTION.rst @@ -0,0 +1,192 @@ +Simple module to parse ISO 8601 dates + +This module parses the most common forms of ISO 8601 date strings (e.g. +2007-01-14T20:34:22+00:00) into datetime objects. + +>>> import iso8601 +>>> iso8601.parse_date("2007-01-25T12:00:00Z") +datetime.datetime(2007, 1, 25, 12, 0, tzinfo=) +>>> + +See the LICENSE file for the license this package is released under. + +If you want more full featured parsing look at: + +- http://labix.org/python-dateutil - python-dateutil + +Parsed Formats +============== + +You can parse full date + times, or just the date. In both cases a datetime instance is returned but with missing times defaulting to 0, and missing days / months defaulting to 1. + +Dates +----- + +- YYYY-MM-DD +- YYYYMMDD +- YYYY-MM (defaults to 1 for the day) +- YYYY (defaults to 1 for month and day) + +Times +----- + +- hh:mm:ss.nn +- hhmmss.nn +- hh:mm (defaults to 0 for seconds) +- hhmm (defaults to 0 for seconds) +- hh (defaults to 0 for minutes and seconds) + +Time Zones +---------- + +- Nothing, will use the default timezone given (which in turn defaults to UTC). +- Z (UTC) +- +/-hh:mm +- +/-hhmm +- +/-hh + +Where it Differs From ISO 8601 +============================== + +Known differences from the ISO 8601 spec: + +- You can use a " " (space) instead of T for separating date from time. +- Days and months without a leading 0 (2 vs 02) will be parsed. +- If time zone information is omitted the default time zone given is used (which in turn defaults to UTC). Use a default of None to yield naive datetime instances. + +Homepage +======== + +- Documentation: http://pyiso8601.readthedocs.org/ +- Source: https://bitbucket.org/micktwomey/pyiso8601/ + +This was originally hosted at https://code.google.com/p/pyiso8601/ + +References +========== + +- http://en.wikipedia.org/wiki/ISO_8601 + +- http://www.cl.cam.ac.uk/~mgk25/iso-time.html - simple overview + +- http://hydracen.com/dx/iso8601.htm - more detailed enumeration of valid formats. + +Testing +======= + +1. pip install -r dev-requirements.txt +2. tox + +Note that you need all the pythons installed to perform a tox run (see below). Homebrew helps a lot on the mac, however you wind up having to add cellars to your PATH or symlinking the pythonX.Y executables. + +Alternatively, to test only with your current python: + +1. pip install -r dev-requirements.txt +2. py.test --verbose iso8601 + +Supported Python Versions +========================= + +Tested against: + +- Python 2.6 +- Python 2.7 +- Python 3.2 +- Python 3.3 +- Python 3.4 +- Python 3.5 +- Python 3.6 +- PyPy +- PyPy 3 + +Python 3.0 and 3.1 are untested but should work (tests didn't run under them when last tried). + +Jython is untested but should work (tests failed to run). + +Python 2.5 is not supported (too old for the tests for the most part). It could work with some small changes but I'm not supporting it. + +Changes +======= + +0.1.12 +------ + +* Fix class reference for iso8601.Utc in module docstring (thanks to felixschwarz in https://bitbucket.org/micktwomey/pyiso8601/pull-requests/7/fix-class-reference-for-iso8601utc-in/diff) + +0.1.11 +------ + +* Remove logging (thanks to Quentin Pradet in https://bitbucket.org/micktwomey/pyiso8601/pull-requests/6/remove-debug-logging/diff) +* Add support for , as separator for fractional part (thanks to ecksun in https://bitbucket.org/micktwomey/pyiso8601/pull-requests/5/add-support-for-as-separator-for/diff) +* Add Python 3.4 and 3.5 to tox test config. +* Add PyPy 3 to tox test config. +* Link to documentation at http://pyiso8601.readthedocs.org/ + + +0.1.10 +------ + +* Fixes https://bitbucket.org/micktwomey/pyiso8601/issue/14/regression-yyyy-mm-no-longer-parses (thanks to Kevin Gill for reporting) +* Adds YYYY as a valid date (uses 1 for both month and day) +* Woo, semantic versioning, .10 at last. + +0.1.9 +----- + +* Lots of fixes tightening up parsing from jdanjou. In particular more invalid cases are treated as errors. Also includes fixes for tests (which is how these invalid cases got in in the first place). +* Release addresses https://bitbucket.org/micktwomey/pyiso8601/issue/13/new-release-based-on-critical-bug-fix + +0.1.8 +----- + +* Remove +/- chars from README.rst and ensure tox tests run using LC_ALL=C. The setup.py egg_info command was failing in python 3.* on some setups (basically any where the system encoding wasn't UTF-8). (https://bitbucket.org/micktwomey/pyiso8601/issue/10/setuppy-broken-for-python-33) (thanks to klmitch) + +0.1.7 +----- + +* Fix parsing of microseconds (https://bitbucket.org/micktwomey/pyiso8601/issue/9/regression-parsing-microseconds) (Thanks to dims and bnemec) + +0.1.6 +----- + +* Correct negative timezone offsets (https://bitbucket.org/micktwomey/pyiso8601/issue/8/015-parses-negative-timezones-incorrectly) (thanks to Jonathan Lange) + +0.1.5 +----- + +* Wow, it's alive! First update since 2007 +* Moved over to https://bitbucket.org/micktwomey/pyiso8601 +* Add support for python 3. https://code.google.com/p/pyiso8601/issues/detail?id=23 (thanks to zefciu) +* Switched to py.test and tox for testing +* Make seconds optional in date format ("1997-07-16T19:20+01:00" now valid). https://bitbucket.org/micktwomey/pyiso8601/pull-request/1/make-the-inclusion-of-seconds-optional-in/diff (thanks to Chris Down) +* Correctly raise ParseError for more invalid inputs (https://bitbucket.org/micktwomey/pyiso8601/issue/1/raise-parseerror-for-invalid-input) (thanks to manish.tomar) +* Support more variations of ISO 8601 dates, times and time zone specs. +* Fix microsecond rounding issues (https://bitbucket.org/micktwomey/pyiso8601/issue/2/roundoff-issues-when-parsing-decimal) (thanks to nielsenb@jetfuse.net) +* Fix pickling and deepcopy of returned datetime objects (https://bitbucket.org/micktwomey/pyiso8601/issue/3/dates-returned-by-parse_date-do-not) (thanks to fogathmann and john@openlearning.com) +* Fix timezone offsets without a separator (https://bitbucket.org/micktwomey/pyiso8601/issue/4/support-offsets-without-a-separator) (thanks to joe.walton.gglcd) +* "Z" produces default timezone if one is specified (https://bitbucket.org/micktwomey/pyiso8601/issue/5/z-produces-default-timezone-if-one-is) (thanks to vfaronov). This one may cause problems if you've been relying on default_timezone to use that timezone instead of UTC. Strictly speaking that was wrong but this is potentially backwards incompatible. +* Handle compact date format (https://bitbucket.org/micktwomey/pyiso8601/issue/6/handle-compact-date-format) (thanks to rvandolson@esri.com) + +0.1.4 +----- + +* The default_timezone argument wasn't being passed through correctly, UTC was being used in every case. Fixes issue 10. + +0.1.3 +----- + +* Fixed the microsecond handling, the generated microsecond values were way too small. Fixes issue 9. + +0.1.2 +----- + +* Adding ParseError to __all__ in iso8601 module, allows people to import it. Addresses issue 7. +* Be a little more flexible when dealing with dates without leading zeroes. This violates the spec a little, but handles more dates as seen in the field. Addresses issue 6. +* Allow date/time separators other than T. + +0.1.1 +----- + +* When parsing dates without a timezone the specified default is used. If no default is specified then UTC is used. Addresses issue 4. + + diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/INSTALLER b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/METADATA b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/METADATA new file mode 100644 index 0000000..eabc7ce --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/METADATA @@ -0,0 +1,205 @@ +Metadata-Version: 2.0 +Name: iso8601 +Version: 0.1.12 +Summary: Simple module to parse ISO 8601 dates +Home-page: https://bitbucket.org/micktwomey/pyiso8601 +Author: Michael Twomey +Author-email: micktwomey+iso8601@gmail.com +License: MIT +Platform: UNKNOWN +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 + +Simple module to parse ISO 8601 dates + +This module parses the most common forms of ISO 8601 date strings (e.g. +2007-01-14T20:34:22+00:00) into datetime objects. + +>>> import iso8601 +>>> iso8601.parse_date("2007-01-25T12:00:00Z") +datetime.datetime(2007, 1, 25, 12, 0, tzinfo=) +>>> + +See the LICENSE file for the license this package is released under. + +If you want more full featured parsing look at: + +- http://labix.org/python-dateutil - python-dateutil + +Parsed Formats +============== + +You can parse full date + times, or just the date. In both cases a datetime instance is returned but with missing times defaulting to 0, and missing days / months defaulting to 1. + +Dates +----- + +- YYYY-MM-DD +- YYYYMMDD +- YYYY-MM (defaults to 1 for the day) +- YYYY (defaults to 1 for month and day) + +Times +----- + +- hh:mm:ss.nn +- hhmmss.nn +- hh:mm (defaults to 0 for seconds) +- hhmm (defaults to 0 for seconds) +- hh (defaults to 0 for minutes and seconds) + +Time Zones +---------- + +- Nothing, will use the default timezone given (which in turn defaults to UTC). +- Z (UTC) +- +/-hh:mm +- +/-hhmm +- +/-hh + +Where it Differs From ISO 8601 +============================== + +Known differences from the ISO 8601 spec: + +- You can use a " " (space) instead of T for separating date from time. +- Days and months without a leading 0 (2 vs 02) will be parsed. +- If time zone information is omitted the default time zone given is used (which in turn defaults to UTC). Use a default of None to yield naive datetime instances. + +Homepage +======== + +- Documentation: http://pyiso8601.readthedocs.org/ +- Source: https://bitbucket.org/micktwomey/pyiso8601/ + +This was originally hosted at https://code.google.com/p/pyiso8601/ + +References +========== + +- http://en.wikipedia.org/wiki/ISO_8601 + +- http://www.cl.cam.ac.uk/~mgk25/iso-time.html - simple overview + +- http://hydracen.com/dx/iso8601.htm - more detailed enumeration of valid formats. + +Testing +======= + +1. pip install -r dev-requirements.txt +2. tox + +Note that you need all the pythons installed to perform a tox run (see below). Homebrew helps a lot on the mac, however you wind up having to add cellars to your PATH or symlinking the pythonX.Y executables. + +Alternatively, to test only with your current python: + +1. pip install -r dev-requirements.txt +2. py.test --verbose iso8601 + +Supported Python Versions +========================= + +Tested against: + +- Python 2.6 +- Python 2.7 +- Python 3.2 +- Python 3.3 +- Python 3.4 +- Python 3.5 +- Python 3.6 +- PyPy +- PyPy 3 + +Python 3.0 and 3.1 are untested but should work (tests didn't run under them when last tried). + +Jython is untested but should work (tests failed to run). + +Python 2.5 is not supported (too old for the tests for the most part). It could work with some small changes but I'm not supporting it. + +Changes +======= + +0.1.12 +------ + +* Fix class reference for iso8601.Utc in module docstring (thanks to felixschwarz in https://bitbucket.org/micktwomey/pyiso8601/pull-requests/7/fix-class-reference-for-iso8601utc-in/diff) + +0.1.11 +------ + +* Remove logging (thanks to Quentin Pradet in https://bitbucket.org/micktwomey/pyiso8601/pull-requests/6/remove-debug-logging/diff) +* Add support for , as separator for fractional part (thanks to ecksun in https://bitbucket.org/micktwomey/pyiso8601/pull-requests/5/add-support-for-as-separator-for/diff) +* Add Python 3.4 and 3.5 to tox test config. +* Add PyPy 3 to tox test config. +* Link to documentation at http://pyiso8601.readthedocs.org/ + + +0.1.10 +------ + +* Fixes https://bitbucket.org/micktwomey/pyiso8601/issue/14/regression-yyyy-mm-no-longer-parses (thanks to Kevin Gill for reporting) +* Adds YYYY as a valid date (uses 1 for both month and day) +* Woo, semantic versioning, .10 at last. + +0.1.9 +----- + +* Lots of fixes tightening up parsing from jdanjou. In particular more invalid cases are treated as errors. Also includes fixes for tests (which is how these invalid cases got in in the first place). +* Release addresses https://bitbucket.org/micktwomey/pyiso8601/issue/13/new-release-based-on-critical-bug-fix + +0.1.8 +----- + +* Remove +/- chars from README.rst and ensure tox tests run using LC_ALL=C. The setup.py egg_info command was failing in python 3.* on some setups (basically any where the system encoding wasn't UTF-8). (https://bitbucket.org/micktwomey/pyiso8601/issue/10/setuppy-broken-for-python-33) (thanks to klmitch) + +0.1.7 +----- + +* Fix parsing of microseconds (https://bitbucket.org/micktwomey/pyiso8601/issue/9/regression-parsing-microseconds) (Thanks to dims and bnemec) + +0.1.6 +----- + +* Correct negative timezone offsets (https://bitbucket.org/micktwomey/pyiso8601/issue/8/015-parses-negative-timezones-incorrectly) (thanks to Jonathan Lange) + +0.1.5 +----- + +* Wow, it's alive! First update since 2007 +* Moved over to https://bitbucket.org/micktwomey/pyiso8601 +* Add support for python 3. https://code.google.com/p/pyiso8601/issues/detail?id=23 (thanks to zefciu) +* Switched to py.test and tox for testing +* Make seconds optional in date format ("1997-07-16T19:20+01:00" now valid). https://bitbucket.org/micktwomey/pyiso8601/pull-request/1/make-the-inclusion-of-seconds-optional-in/diff (thanks to Chris Down) +* Correctly raise ParseError for more invalid inputs (https://bitbucket.org/micktwomey/pyiso8601/issue/1/raise-parseerror-for-invalid-input) (thanks to manish.tomar) +* Support more variations of ISO 8601 dates, times and time zone specs. +* Fix microsecond rounding issues (https://bitbucket.org/micktwomey/pyiso8601/issue/2/roundoff-issues-when-parsing-decimal) (thanks to nielsenb@jetfuse.net) +* Fix pickling and deepcopy of returned datetime objects (https://bitbucket.org/micktwomey/pyiso8601/issue/3/dates-returned-by-parse_date-do-not) (thanks to fogathmann and john@openlearning.com) +* Fix timezone offsets without a separator (https://bitbucket.org/micktwomey/pyiso8601/issue/4/support-offsets-without-a-separator) (thanks to joe.walton.gglcd) +* "Z" produces default timezone if one is specified (https://bitbucket.org/micktwomey/pyiso8601/issue/5/z-produces-default-timezone-if-one-is) (thanks to vfaronov). This one may cause problems if you've been relying on default_timezone to use that timezone instead of UTC. Strictly speaking that was wrong but this is potentially backwards incompatible. +* Handle compact date format (https://bitbucket.org/micktwomey/pyiso8601/issue/6/handle-compact-date-format) (thanks to rvandolson@esri.com) + +0.1.4 +----- + +* The default_timezone argument wasn't being passed through correctly, UTC was being used in every case. Fixes issue 10. + +0.1.3 +----- + +* Fixed the microsecond handling, the generated microsecond values were way too small. Fixes issue 9. + +0.1.2 +----- + +* Adding ParseError to __all__ in iso8601 module, allows people to import it. Addresses issue 7. +* Be a little more flexible when dealing with dates without leading zeroes. This violates the spec a little, but handles more dates as seen in the field. Addresses issue 6. +* Allow date/time separators other than T. + +0.1.1 +----- + +* When parsing dates without a timezone the specified default is used. If no default is specified then UTC is used. Addresses issue 4. + + diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/RECORD b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/RECORD new file mode 100644 index 0000000..adff62c --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/RECORD @@ -0,0 +1,13 @@ +iso8601-0.1.12.dist-info/DESCRIPTION.rst,sha256=ZiPpREoiO4b8pOFGi3cX5leP0gdZtw7-o4bxRk5f4W0,7119 +iso8601-0.1.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +iso8601-0.1.12.dist-info/METADATA,sha256=jeTGuaKH3XSnvPV4hnco7D-XImp9LXvwoBfUdQJPbM0,7517 +iso8601-0.1.12.dist-info/RECORD,, +iso8601-0.1.12.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +iso8601-0.1.12.dist-info/metadata.json,sha256=L9qGQgx4w4N4kbz6ZGeFhM-EOjCrhDGCN5CjWrVyj9M,574 +iso8601-0.1.12.dist-info/top_level.txt,sha256=QcuZrOQny2sMGrMdLZVtCilwlURtG50VMJZ4bYLwGQw,8 +iso8601/__init__.py,sha256=2fxA8Xny1V5PTJR49nA43wY6rHrMKswvqblfGyngt2k,23 +iso8601/__pycache__/__init__.cpython-36.pyc,, +iso8601/__pycache__/iso8601.cpython-36.pyc,, +iso8601/__pycache__/test_iso8601.cpython-36.pyc,, +iso8601/iso8601.py,sha256=_Gua5DZ0c6kdpiRUrdrpB6-yAO6LltpcGIVzy7u8yi8,6670 +iso8601/test_iso8601.py,sha256=SKjKlgkKJ6Dej0hhcWOIYskzDM3cAFztyka-AoJZ1iw,7802 diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/WHEEL b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/metadata.json b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/metadata.json new file mode 100644 index 0000000..b4a0ba4 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3"], "extensions": {"python.details": {"contacts": [{"email": "micktwomey+iso8601@gmail.com", "name": "Michael Twomey", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/micktwomey/pyiso8601"}}}, "generator": "bdist_wheel (0.29.0)", "license": "MIT", "metadata_version": "2.0", "name": "iso8601", "summary": "Simple module to parse ISO 8601 dates", "version": "0.1.12"} \ No newline at end of file diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/top_level.txt b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/top_level.txt new file mode 100644 index 0000000..57c80f0 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601-0.1.12.dist-info/top_level.txt @@ -0,0 +1 @@ +iso8601 diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601/__init__.py b/python/.gradle/python/lib/python3.6/site-packages/iso8601/__init__.py new file mode 100644 index 0000000..11b1adc --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601/__init__.py @@ -0,0 +1 @@ +from .iso8601 import * diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/__init__.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..725ae275e6e5a4c875a4f170e31779edbedf3815 GIT binary patch literal 159 zcmXr!<>lgC{X0&afq~&M5W@izkmUfx#XLYFg&~D8harR^g(;XplldhhP)L*U7NeG* zCSw$PW^ulSnStR-h9YL5IGFflqF<6*pkI(#pj(<(keHmEnxb2tk(!#LYhIF*oo|+E kp%2xiA0MBYmst`YuUAlci^C>2KczG$)edAqF%UBV0Kl9j7XSbN literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/iso8601.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/iso8601.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bd3e5243c97b85e6d37ff42ea5768625ab9b7a2 GIT binary patch literal 6597 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 PpP4QiGgqDI@wxv3V07U= literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/test_iso8601.cpython-36.pyc b/python/.gradle/python/lib/python3.6/site-packages/iso8601/__pycache__/test_iso8601.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52a3c81be5551a24e1878a59c4c169cb74a22aaf GIT binary patch literal 5346 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 literal 0 HcmV?d00001 diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601/iso8601.py b/python/.gradle/python/lib/python3.6/site-packages/iso8601/iso8601.py new file mode 100644 index 0000000..0c149f6 --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601/iso8601.py @@ -0,0 +1,214 @@ +"""ISO 8601 date time string parsing + +Basic usage: +>>> import iso8601 +>>> iso8601.parse_date("2007-01-25T12:00:00Z") +datetime.datetime(2007, 1, 25, 12, 0, tzinfo=) +>>> + +""" + +import datetime +from decimal import Decimal +import sys +import re + +__all__ = ["parse_date", "ParseError", "UTC", + "FixedOffset"] + +if sys.version_info >= (3, 0, 0): + _basestring = str +else: + _basestring = basestring + + +# Adapted from http://delete.me.uk/2005/03/iso8601.html +ISO8601_REGEX = re.compile( + r""" + (?P[0-9]{4}) + ( + ( + (-(?P[0-9]{1,2})) + | + (?P[0-9]{2}) + (?!$) # Don't allow YYYYMM + ) + ( + ( + (-(?P[0-9]{1,2})) + | + (?P[0-9]{2}) + ) + ( + ( + (?P[ T]) + (?P[0-9]{2}) + (:{0,1}(?P[0-9]{2})){0,1} + ( + :{0,1}(?P[0-9]{1,2}) + ([.,](?P[0-9]+)){0,1} + ){0,1} + (?P + Z + | + ( + (?P[-+]) + (?P[0-9]{2}) + :{0,1} + (?P[0-9]{2}){0,1} + ) + ){0,1} + ){0,1} + ) + ){0,1} # YYYY-MM + ){0,1} # YYYY only + $ + """, + re.VERBOSE +) + +class ParseError(Exception): + """Raised when there is a problem parsing a date string""" + +if sys.version_info >= (3, 2, 0): + UTC = datetime.timezone.utc + def FixedOffset(offset_hours, offset_minutes, name): + return datetime.timezone( + datetime.timedelta( + hours=offset_hours, minutes=offset_minutes), + name) +else: + # Yoinked from python docs + ZERO = datetime.timedelta(0) + class Utc(datetime.tzinfo): + """UTC Timezone + + """ + def utcoffset(self, dt): + return ZERO + + def tzname(self, dt): + return "UTC" + + def dst(self, dt): + return ZERO + + def __repr__(self): + return "" + + UTC = Utc() + + class FixedOffset(datetime.tzinfo): + """Fixed offset in hours and minutes from UTC + + """ + def __init__(self, offset_hours, offset_minutes, name): + self.__offset_hours = offset_hours # Keep for later __getinitargs__ + self.__offset_minutes = offset_minutes # Keep for later __getinitargs__ + self.__offset = datetime.timedelta( + hours=offset_hours, minutes=offset_minutes) + self.__name = name + + def __eq__(self, other): + if isinstance(other, FixedOffset): + return ( + (other.__offset == self.__offset) + and + (other.__name == self.__name) + ) + return NotImplemented + + def __getinitargs__(self): + return (self.__offset_hours, self.__offset_minutes, self.__name) + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return ZERO + + def __repr__(self): + return "" % (self.__name, self.__offset) + + +def to_int(d, key, default_to_zero=False, default=None, required=True): + """Pull a value from the dict and convert to int + + :param default_to_zero: If the value is None or empty, treat it as zero + :param default: If the value is missing in the dict use this default + + """ + value = d.get(key) or default + if (value in ["", None]) and default_to_zero: + return 0 + if value is None: + if required: + raise ParseError("Unable to read %s from %s" % (key, d)) + else: + return int(value) + +def parse_timezone(matches, default_timezone=UTC): + """Parses ISO 8601 time zone specs into tzinfo offsets + + """ + + if matches["timezone"] == "Z": + return UTC + # This isn't strictly correct, but it's common to encounter dates without + # timezones so I'll assume the default (which defaults to UTC). + # Addresses issue 4. + if matches["timezone"] is None: + return default_timezone + sign = matches["tz_sign"] + hours = to_int(matches, "tz_hour") + minutes = to_int(matches, "tz_minute", default_to_zero=True) + description = "%s%02d:%02d" % (sign, hours, minutes) + if sign == "-": + hours = -hours + minutes = -minutes + return FixedOffset(hours, minutes, description) + +def parse_date(datestring, default_timezone=UTC): + """Parses ISO 8601 dates into datetime objects + + The timezone is parsed from the date string. However it is quite common to + have dates without a timezone (not strictly correct). In this case the + default timezone specified in default_timezone is used. This is UTC by + default. + + :param datestring: The date to parse as a string + :param default_timezone: A datetime tzinfo instance to use when no timezone + is specified in the datestring. If this is set to + None then a naive datetime object is returned. + :returns: A datetime.datetime instance + :raises: ParseError when there is a problem parsing the date or + constructing the datetime instance. + + """ + if not isinstance(datestring, _basestring): + raise ParseError("Expecting a string %r" % datestring) + m = ISO8601_REGEX.match(datestring) + if not m: + raise ParseError("Unable to parse date string %r" % datestring) + groups = m.groupdict() + + tz = parse_timezone(groups, default_timezone=default_timezone) + + groups["second_fraction"] = int(Decimal("0.%s" % (groups["second_fraction"] or 0)) * Decimal("1000000.0")) + + try: + return datetime.datetime( + year=to_int(groups, "year"), + month=to_int(groups, "month", default=to_int(groups, "monthdash", required=False, default=1)), + day=to_int(groups, "day", default=to_int(groups, "daydash", required=False, default=1)), + hour=to_int(groups, "hour", default_to_zero=True), + minute=to_int(groups, "minute", default_to_zero=True), + second=to_int(groups, "second", default_to_zero=True), + microsecond=groups["second_fraction"], + tzinfo=tz, + ) + except Exception as e: + raise ParseError(e) diff --git a/python/.gradle/python/lib/python3.6/site-packages/iso8601/test_iso8601.py b/python/.gradle/python/lib/python3.6/site-packages/iso8601/test_iso8601.py new file mode 100644 index 0000000..0d01ffb --- /dev/null +++ b/python/.gradle/python/lib/python3.6/site-packages/iso8601/test_iso8601.py @@ -0,0 +1,102 @@ +# coding=UTF-8 +from __future__ import absolute_import + +import copy +import datetime +import pickle + +import pytest + +from iso8601 import iso8601 + +def test_iso8601_regex(): + assert iso8601.ISO8601_REGEX.match("2006-10-11T00:14:33Z") + +def test_fixedoffset_eq(): + # See https://bitbucket.org/micktwomey/pyiso8601/issues/19 + datetime.tzinfo() == iso8601.FixedOffset(2, 0, '+2:00') + +def test_parse_no_timezone_different_default(): + tz = iso8601.FixedOffset(2, 0, "test offset") + d = iso8601.parse_date("2007-01-01T08:00:00", default_timezone=tz) + assert d == datetime.datetime(2007, 1, 1, 8, 0, 0, 0, tz) + assert d.tzinfo == tz + +def test_parse_utc_different_default(): + """Z should mean 'UTC', not 'default'. + + """ + tz = iso8601.FixedOffset(2, 0, "test offset") + d = iso8601.parse_date("2007-01-01T08:00:00Z", default_timezone=tz) + assert d == datetime.datetime(2007, 1, 1, 8, 0, 0, 0, iso8601.UTC) + +@pytest.mark.parametrize("invalid_date, error_string", [ + ("2013-10-", "Unable to parse date string"), + ("2013-", "Unable to parse date string"), + ("", "Unable to parse date string"), + (None, "Expecting a string"), + ("wibble", "Unable to parse date string"), + ("23", "Unable to parse date string"), + ("131015T142533Z", "Unable to parse date string"), + ("131015", "Unable to parse date string"), + ("20141", "Unable to parse date string"), + ("201402", "Unable to parse date string"), + ("2007-06-23X06:40:34.00Z", "Unable to parse date string"), # https://code.google.com/p/pyiso8601/issues/detail?id=14 + ("2007-06-23 06:40:34.00Zrubbish", "Unable to parse date string"), # https://code.google.com/p/pyiso8601/issues/detail?id=14 + ("20114-01-03T01:45:49", "Unable to parse date string"), +]) +def test_parse_invalid_date(invalid_date, error_string): + assert isinstance(invalid_date, str) or invalid_date is None # Why? 'cos I've screwed up the parametrize before :) + with pytest.raises(iso8601.ParseError) as exc: + iso8601.parse_date(invalid_date) + assert exc.errisinstance(iso8601.ParseError) + assert str(exc.value).startswith(error_string) + +@pytest.mark.parametrize("valid_date,expected_datetime,isoformat", [ + ("2007-06-23 06:40:34.00Z", datetime.datetime(2007, 6, 23, 6, 40, 34, 0, iso8601.UTC), "2007-06-23T06:40:34+00:00"), # Handle a separator other than T + ("1997-07-16T19:20+01:00", datetime.datetime(1997, 7, 16, 19, 20, 0, 0, iso8601.FixedOffset(1, 0, "+01:00")), "1997-07-16T19:20:00+01:00"), # Parse with no seconds + ("2007-01-01T08:00:00", datetime.datetime(2007, 1, 1, 8, 0, 0, 0, iso8601.UTC), "2007-01-01T08:00:00+00:00"), # Handle timezone-less dates. Assumes UTC. http://code.google.com/p/pyiso8601/issues/detail?id=4 + ("2006-10-20T15:34:56.123+02:30", datetime.datetime(2006, 10, 20, 15, 34, 56, 123000, iso8601.FixedOffset(2, 30, "+02:30")), None), + ("2006-10-20T15:34:56Z", datetime.datetime(2006, 10, 20, 15, 34, 56, 0, iso8601.UTC), "2006-10-20T15:34:56+00:00"), + ("2007-5-7T11:43:55.328Z", datetime.datetime(2007, 5, 7, 11, 43, 55, 328000, iso8601.UTC), "2007-05-07T11:43:55.328000+00:00"), # http://code.google.com/p/pyiso8601/issues/detail?id=6 + ("2006-10-20T15:34:56.123Z", datetime.datetime(2006, 10, 20, 15, 34, 56, 123000, iso8601.UTC), "2006-10-20T15:34:56.123000+00:00"), + ("2013-10-15T18:30Z", datetime.datetime(2013, 10, 15, 18, 30, 0, 0, iso8601.UTC), "2013-10-15T18:30:00+00:00"), + ("2013-10-15T22:30+04", datetime.datetime(2013, 10, 15, 22, 30, 0, 0, iso8601.FixedOffset(4, 0, "+04:00")), "2013-10-15T22:30:00+04:00"), #