diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..15201ac
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,171 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# UV
+# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+#uv.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+# in version control.
+# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
+.pdm.toml
+.pdm-python
+.pdm-build/
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# PyPI configuration file
+.pypirc
diff --git a/.idea/game_space.iml b/.idea/game_space.iml
deleted file mode 100644
index 74d515a..0000000
--- a/.idea/game_space.iml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644
index 105ce2d..0000000
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 9e9314a..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 5ed1d73..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index e65bd71..0000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1629449328367
-
-
- 1629449328367
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/__pycache__/bullet.cpython-39.pyc b/__pycache__/bullet.cpython-39.pyc
deleted file mode 100644
index bf9284f..0000000
Binary files a/__pycache__/bullet.cpython-39.pyc and /dev/null differ
diff --git a/__pycache__/controls.cpython-39.pyc b/__pycache__/controls.cpython-39.pyc
deleted file mode 100644
index 50a6ab8..0000000
Binary files a/__pycache__/controls.cpython-39.pyc and /dev/null differ
diff --git a/__pycache__/gun.cpython-39.pyc b/__pycache__/gun.cpython-39.pyc
deleted file mode 100644
index afab35a..0000000
Binary files a/__pycache__/gun.cpython-39.pyc and /dev/null differ
diff --git a/__pycache__/ino.cpython-39.pyc b/__pycache__/ino.cpython-39.pyc
deleted file mode 100644
index 72712f7..0000000
Binary files a/__pycache__/ino.cpython-39.pyc and /dev/null differ
diff --git a/__pycache__/scores.cpython-39.pyc b/__pycache__/scores.cpython-39.pyc
deleted file mode 100644
index efa4f83..0000000
Binary files a/__pycache__/scores.cpython-39.pyc and /dev/null differ
diff --git a/__pycache__/stats.cpython-39.pyc b/__pycache__/stats.cpython-39.pyc
deleted file mode 100644
index 930e32d..0000000
Binary files a/__pycache__/stats.cpython-39.pyc and /dev/null differ
diff --git a/venv/Include/site/python3.9/pygame/_camera.h b/venv/Include/site/python3.9/pygame/_camera.h
deleted file mode 100644
index 68ae989..0000000
--- a/venv/Include/site/python3.9/pygame/_camera.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- pygame - Python Game Library
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-
-#ifndef _CAMERA_H
-#define _CAMERA_H
-
-#include "_pygame.h"
-#include "camera.h"
-
-#endif
-
diff --git a/venv/Include/site/python3.9/pygame/_pygame.h b/venv/Include/site/python3.9/pygame/_pygame.h
deleted file mode 100644
index 95f5127..0000000
--- a/venv/Include/site/python3.9/pygame/_pygame.h
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-/* This will use PYGAMEAPI_EXTERN_SLOTS instead
- * of PYGAMEAPI_DEFINE_SLOTS for base modules.
- */
-#ifndef _PYGAME_INTERNAL_H
-#define _PYGAME_INTERNAL_H
-
-#include "pgplatform.h"
-/*
- If PY_SSIZE_T_CLEAN is defined before including Python.h, length is a
- Py_ssize_t rather than an int for all # variants of formats (s#, y#, etc.)
-*/
-#define PY_SSIZE_T_CLEAN
-#include
-#include
-
-/* IS_SDLv1 is 1 if SDL 1.x.x, 0 otherwise */
-/* IS_SDLv2 is 1 if at least SDL 2.0.0, 0 otherwise */
-#if (SDL_VERSION_ATLEAST(2, 0, 0))
-#define IS_SDLv2 1
-#define IS_SDLv1 0
-#else
-#define IS_SDLv2 0
-#define IS_SDLv1 1
-#endif
-
-/*#if IS_SDLv1 && PG_MAJOR_VERSION >= 2
-#error pygame 2 requires SDL 2
-#endif*/
-
-#if IS_SDLv2
-/* SDL 1.2 constants removed from SDL 2 */
-typedef enum {
- SDL_HWSURFACE = 0,
- SDL_RESIZABLE = SDL_WINDOW_RESIZABLE,
- SDL_ASYNCBLIT = 0,
- SDL_OPENGL = SDL_WINDOW_OPENGL,
- SDL_OPENGLBLIT = 0,
- SDL_ANYFORMAT = 0,
- SDL_HWPALETTE = 0,
- SDL_DOUBLEBUF = 0,
- SDL_FULLSCREEN = SDL_WINDOW_FULLSCREEN,
- SDL_HWACCEL = 0,
- SDL_SRCCOLORKEY = 0,
- SDL_RLEACCELOK = 0,
- SDL_SRCALPHA = 0,
- SDL_NOFRAME = SDL_WINDOW_BORDERLESS,
- SDL_GL_SWAP_CONTROL = 0,
- TIMER_RESOLUTION = 0
-} PygameVideoFlags;
-
-/* the wheel button constants were removed from SDL 2 */
-typedef enum {
- PGM_BUTTON_LEFT = SDL_BUTTON_LEFT,
- PGM_BUTTON_RIGHT = SDL_BUTTON_RIGHT,
- PGM_BUTTON_MIDDLE = SDL_BUTTON_MIDDLE,
- PGM_BUTTON_WHEELUP = 4,
- PGM_BUTTON_WHEELDOWN = 5,
- PGM_BUTTON_X1 = SDL_BUTTON_X1 + 2,
- PGM_BUTTON_X2 = SDL_BUTTON_X2 + 2,
- PGM_BUTTON_KEEP = 0x80
-} PygameMouseFlags;
-
-typedef enum {
- /* Any SDL_* events here are for backward compatibility. */
- SDL_NOEVENT = 0,
-
- SDL_ACTIVEEVENT = SDL_USEREVENT,
- SDL_VIDEORESIZE,
- SDL_VIDEOEXPOSE,
-
- PGE_MIDIIN,
- PGE_MIDIOUT,
- PGE_KEYREPEAT, /* Special internal pygame event, for managing key-presses */
-
- /* DO NOT CHANGE THE ORDER OF EVENTS HERE */
- PGE_WINDOWSHOWN,
- PGE_WINDOWHIDDEN,
- PGE_WINDOWEXPOSED,
- PGE_WINDOWMOVED,
- PGE_WINDOWRESIZED,
- PGE_WINDOWSIZECHANGED,
- PGE_WINDOWMINIMIZED,
- PGE_WINDOWMAXIMIZED,
- PGE_WINDOWRESTORED,
- PGE_WINDOWENTER,
- PGE_WINDOWLEAVE,
- PGE_WINDOWFOCUSGAINED,
- PGE_WINDOWFOCUSLOST,
- PGE_WINDOWCLOSE,
- PGE_WINDOWTAKEFOCUS,
- PGE_WINDOWHITTEST,
-
- /* Here we define PGPOST_* events, events that act as a one-to-one
- * proxy for SDL events (and some extra events too!), the proxy is used
- * internally when pygame users use event.post()
- *
- * Thankfully, SDL2 provides over 8000 userevents, so theres no need
- * to worry about wasting userevent space.
- *
- * IMPORTANT NOTE: Do not post events directly with these proxy types,
- * use the appropriate functions in event.c, that handle these proxy
- * events for you.
- * Proxy events are for internal use only */
- PGPOST_EVENTBEGIN, /* mark start of proxy-events */
- PGPOST_ACTIVEEVENT = PGPOST_EVENTBEGIN,
- PGPOST_AUDIODEVICEADDED,
- PGPOST_AUDIODEVICEREMOVED,
- PGPOST_CONTROLLERAXISMOTION,
- PGPOST_CONTROLLERBUTTONDOWN,
- PGPOST_CONTROLLERBUTTONUP,
- PGPOST_CONTROLLERDEVICEADDED,
- PGPOST_CONTROLLERDEVICEREMOVED,
- PGPOST_CONTROLLERDEVICEREMAPPED,
- PGPOST_DOLLARGESTURE,
- PGPOST_DOLLARRECORD,
- PGPOST_DROPFILE,
- PGPOST_DROPTEXT,
- PGPOST_DROPBEGIN,
- PGPOST_DROPCOMPLETE,
- PGPOST_FINGERMOTION,
- PGPOST_FINGERDOWN,
- PGPOST_FINGERUP,
- PGPOST_KEYDOWN,
- PGPOST_KEYUP,
- PGPOST_JOYAXISMOTION,
- PGPOST_JOYBALLMOTION,
- PGPOST_JOYHATMOTION,
- PGPOST_JOYBUTTONDOWN,
- PGPOST_JOYBUTTONUP,
- PGPOST_JOYDEVICEADDED,
- PGPOST_JOYDEVICEREMOVED,
- PGPOST_MIDIIN,
- PGPOST_MIDIOUT,
- PGPOST_MOUSEMOTION,
- PGPOST_MOUSEBUTTONDOWN,
- PGPOST_MOUSEBUTTONUP,
- PGPOST_MOUSEWHEEL,
- PGPOST_MULTIGESTURE,
- PGPOST_NOEVENT,
- PGPOST_QUIT,
- PGPOST_SYSWMEVENT,
- PGPOST_TEXTEDITING,
- PGPOST_TEXTINPUT,
- PGPOST_VIDEORESIZE,
- PGPOST_VIDEOEXPOSE,
- PGPOST_WINDOWSHOWN,
- PGPOST_WINDOWHIDDEN,
- PGPOST_WINDOWEXPOSED,
- PGPOST_WINDOWMOVED,
- PGPOST_WINDOWRESIZED,
- PGPOST_WINDOWSIZECHANGED,
- PGPOST_WINDOWMINIMIZED,
- PGPOST_WINDOWMAXIMIZED,
- PGPOST_WINDOWRESTORED,
- PGPOST_WINDOWENTER,
- PGPOST_WINDOWLEAVE,
- PGPOST_WINDOWFOCUSGAINED,
- PGPOST_WINDOWFOCUSLOST,
- PGPOST_WINDOWCLOSE,
- PGPOST_WINDOWTAKEFOCUS,
- PGPOST_WINDOWHITTEST,
-
- PGE_USEREVENT, /* this event must stay in this position only */
-
- PG_NUMEVENTS = SDL_LASTEVENT /* Not an event. Indicates end of user events. */
-} PygameEventCode;
-
-typedef enum {
- SDL_APPFOCUSMOUSE,
- SDL_APPINPUTFOCUS,
- SDL_APPACTIVE
-} PygameAppCode;
-
-/* Surface flags: based on SDL 1.2 flags */
-typedef enum {
- PGS_SWSURFACE = 0x00000000,
- PGS_HWSURFACE = 0x00000001,
- PGS_ASYNCBLIT = 0x00000004,
-
- PGS_ANYFORMAT = 0x10000000,
- PGS_HWPALETTE = 0x20000000,
- PGS_DOUBLEBUF = 0x40000000,
- PGS_FULLSCREEN = 0x80000000,
- PGS_SCALED = 0x00000200,
-
- PGS_OPENGL = 0x00000002,
- PGS_OPENGLBLIT = 0x0000000A,
- PGS_RESIZABLE = 0x00000010,
- PGS_NOFRAME = 0x00000020,
- PGS_SHOWN = 0x00000040, /* Added from SDL 2 */
- PGS_HIDDEN = 0x00000080, /* Added from SDL 2 */
-
- PGS_HWACCEL = 0x00000100,
- PGS_SRCCOLORKEY = 0x00001000,
- PGS_RLEACCELOK = 0x00002000,
- PGS_RLEACCEL = 0x00004000,
- PGS_SRCALPHA = 0x00010000,
- PGS_PREALLOC = 0x01000000
-} PygameSurfaceFlags;
-
-#else /* IS_SDLv2 */
-
-/* To maintain SDL 1.2 build support. */
-#define PGE_USEREVENT SDL_USEREVENT
-#define PG_NUMEVENTS SDL_NUMEVENTS
-#define PGPOST_EVENTBEGIN 0
-/* These midi events were originally defined in midi.py.
- * Note: They are outside the SDL_USEREVENT/SDL_NUMEVENTS event range for
- * SDL 1.2. */
-#define PGE_MIDIIN PGE_USEREVENT + 10
-#define PGE_MIDIOUT PGE_USEREVENT + 11
-#endif /* IS_SDLv1 */
-
-//TODO Implement check below in a way that does not break CI
-/* New buffer protocol (PEP 3118) implemented on all supported Py versions.
-#if !defined(Py_TPFLAGS_HAVE_NEWBUFFER)
-#error No support for PEP 3118/Py_TPFLAGS_HAVE_NEWBUFFER. Please use a supported Python version.
-#endif */
-
-#define RAISE(x, y) (PyErr_SetString((x), (y)), (PyObject *)NULL)
-#define DEL_ATTR_NOT_SUPPORTED_CHECK(name, value) \
- do { \
- if (!value) { \
- if (name) { \
- PyErr_Format(PyExc_AttributeError, \
- "Cannot delete attribute %s", \
- name); \
- } else { \
- PyErr_SetString(PyExc_AttributeError, \
- "Cannot delete attribute"); \
- } \
- return -1; \
- } \
- } while (0)
-
-/*
- * Initialization checks
- */
-
-#define VIDEO_INIT_CHECK() \
- if (!SDL_WasInit(SDL_INIT_VIDEO)) \
- return RAISE(pgExc_SDLError, "video system not initialized")
-
-#define CDROM_INIT_CHECK() \
- if (!SDL_WasInit(SDL_INIT_CDROM)) \
- return RAISE(pgExc_SDLError, "cdrom system not initialized")
-
-#define JOYSTICK_INIT_CHECK() \
- if (!SDL_WasInit(SDL_INIT_JOYSTICK)) \
- return RAISE(pgExc_SDLError, "joystick system not initialized")
-
-/* thread check */
-#ifdef WITH_THREAD
-#define PG_CHECK_THREADS() (1)
-#else /* ~WITH_THREAD */
-#define PG_CHECK_THREADS() \
- (RAISE(PyExc_NotImplementedError, \
- "Python built without thread support"))
-#endif /* ~WITH_THREAD */
-
-#define PyType_Init(x) (((x).ob_type) = &PyType_Type)
-
-/*
- * event module internals
- */
-struct pgEventObject {
- PyObject_HEAD int type;
- PyObject *dict;
-};
-
-/*
- * surflock module internals
- */
-typedef struct {
- PyObject_HEAD PyObject *surface;
- PyObject *lockobj;
- PyObject *weakrefs;
-} pgLifetimeLockObject;
-
-/*
- * surface module internals
- */
-struct pgSubSurface_Data {
- PyObject *owner;
- int pixeloffset;
- int offsetx, offsety;
-};
-
-/*
- * color module internals
- */
-struct pgColorObject {
- PyObject_HEAD
- Uint8 data[4];
- Uint8 len;
-};
-
-/*
- * include public API
- */
-#include "include/_pygame.h"
-
-#include "pgimport.h"
-
-/* Slot counts.
- * Remember to keep these constants up to date.
- */
-
-#define PYGAMEAPI_RECT_NUMSLOTS 5
-#define PYGAMEAPI_JOYSTICK_NUMSLOTS 2
-#define PYGAMEAPI_DISPLAY_NUMSLOTS 2
-#define PYGAMEAPI_SURFACE_NUMSLOTS 4
-#define PYGAMEAPI_SURFLOCK_NUMSLOTS 8
-#define PYGAMEAPI_RWOBJECT_NUMSLOTS 6
-#define PYGAMEAPI_PIXELARRAY_NUMSLOTS 2
-#define PYGAMEAPI_COLOR_NUMSLOTS 5
-#define PYGAMEAPI_MATH_NUMSLOTS 2
-#define PYGAMEAPI_CDROM_NUMSLOTS 2
-
-#if PG_API_VERSION == 1
-#define PYGAMEAPI_BASE_NUMSLOTS 19
-#define PYGAMEAPI_EVENT_NUMSLOTS 4
-#else /* PG_API_VERSION == 2 */
-#define PYGAMEAPI_BASE_NUMSLOTS 24
-#define PYGAMEAPI_EVENT_NUMSLOTS 6
-#endif /* PG_API_VERSION == 2 */
-
-#endif /* _PYGAME_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/_surface.h b/venv/Include/site/python3.9/pygame/_surface.h
deleted file mode 100644
index 016aac0..0000000
--- a/venv/Include/site/python3.9/pygame/_surface.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
- Copyright (C) 2007 Marcus von Appen
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-#ifndef _SURFACE_H
-#define _SURFACE_H
-
-#include "_pygame.h"
-#include "surface.h"
-
-#endif
-
diff --git a/venv/Include/site/python3.9/pygame/camera.h b/venv/Include/site/python3.9/pygame/camera.h
deleted file mode 100644
index 5001061..0000000
--- a/venv/Include/site/python3.9/pygame/camera.h
+++ /dev/null
@@ -1,205 +0,0 @@
-#ifndef CAMERA_H
-#define CAMERA_H
-/*
- pygame - Python Game Library
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-
-#include "pygame.h"
-#include "doc/camera_doc.h"
-
-#if defined(__unix__)
- #include
- #include
- #include
- #include
- #include
-
- #include /* low-level i/o */
- #include
- #include
- #include
- #include
- #include
- #include
- #include
-
- /* on freebsd there is no asm/types */
- #ifdef linux
- #include /* for videodev2.h */
- #endif
-
- #include
-#elif defined(__APPLE__)
- #include
- /* We support OSX 10.6 and below. */
- #if __MAC_OS_X_VERSION_MAX_ALLOWED <= 1060
- #define PYGAME_MAC_CAMERA_OLD 1
- #endif
-#endif
-
-#if defined(PYGAME_MAC_CAMERA_OLD)
- #include
- #include
- #include
-#endif
-
-/* some constants used which are not defined on non-v4l machines. */
-#ifndef V4L2_PIX_FMT_RGB24
- #define V4L2_PIX_FMT_RGB24 'RGB3'
-#endif
-#ifndef V4L2_PIX_FMT_RGB444
- #define V4L2_PIX_FMT_RGB444 'R444'
-#endif
-#ifndef V4L2_PIX_FMT_YUYV
- #define V4L2_PIX_FMT_YUYV 'YUYV'
-#endif
-
-#define CLEAR(x) memset (&(x), 0, sizeof (x))
-#define SAT(c) if (c & (~255)) { if (c < 0) c = 0; else c = 255; }
-#define SAT2(c) ((c) & (~255) ? ((c) < 0 ? 0 : 255) : (c))
-#define DEFAULT_WIDTH 640
-#define DEFAULT_HEIGHT 480
-#define RGB_OUT 1
-#define YUV_OUT 2
-#define HSV_OUT 4
-#define CAM_V4L 1 /* deprecated. the incomplete support in pygame was removed */
-#define CAM_V4L2 2
-
-struct buffer {
- void * start;
- size_t length;
-};
-
-#if defined(__unix__)
-typedef struct pgCameraObject {
- PyObject_HEAD
- char* device_name;
- int camera_type;
- unsigned long pixelformat;
- unsigned int color_out;
- struct buffer* buffers;
- unsigned int n_buffers;
- int width;
- int height;
- int size;
- int hflip;
- int vflip;
- int brightness;
- int fd;
-} pgCameraObject;
-#elif defined(PYGAME_MAC_CAMERA_OLD)
-typedef struct pgCameraObject {
- PyObject_HEAD
- char* device_name; /* unique name of the device */
- OSType pixelformat;
- unsigned int color_out;
- SeqGrabComponent component; /* A type used by the Sequence Grabber API */
- SGChannel channel; /* Channel of the Sequence Grabber */
- GWorldPtr gworld; /* Pointer to the struct that holds the data of the captured image */
- Rect boundsRect; /* bounds of the image frame */
- long size; /* size of the image in our buffer to draw */
- int hflip;
- int vflip;
- short depth;
- struct buffer pixels;
- //struct buffer tmp_pixels /* place where the flipped image in temporarily stored if hflip or vflip is true.*/
-} pgCameraObject;
-
-#else
-/* generic definition.
-*/
-
-typedef struct pgCameraObject {
- PyObject_HEAD
- char* device_name;
- int camera_type;
- unsigned long pixelformat;
- unsigned int color_out;
- struct buffer* buffers;
- unsigned int n_buffers;
- int width;
- int height;
- int size;
- int hflip;
- int vflip;
- int brightness;
- int fd;
-} pgCameraObject;
-#endif
-
-/* internal functions for colorspace conversion */
-void colorspace (SDL_Surface *src, SDL_Surface *dst, int cspace);
-void rgb24_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format);
-void rgb444_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format);
-void rgb_to_yuv (const void* src, void* dst, int length,
- unsigned long source, SDL_PixelFormat* format);
-void rgb_to_hsv (const void* src, void* dst, int length,
- unsigned long source, SDL_PixelFormat* format);
-void yuyv_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format);
-void yuyv_to_yuv (const void* src, void* dst, int length, SDL_PixelFormat* format);
-void uyvy_to_rgb (const void* src, void* dst, int length, SDL_PixelFormat* format);
-void uyvy_to_yuv (const void* src, void* dst, int length, SDL_PixelFormat* format);
-void sbggr8_to_rgb (const void* src, void* dst, int width, int height,
- SDL_PixelFormat* format);
-void yuv420_to_rgb (const void* src, void* dst, int width, int height,
- SDL_PixelFormat* format);
-void yuv420_to_yuv (const void* src, void* dst, int width, int height,
- SDL_PixelFormat* format);
-
-#if defined(__unix__)
-/* internal functions specific to v4l2 */
-char** v4l2_list_cameras (int* num_devices);
-int v4l2_get_control (int fd, int id, int *value);
-int v4l2_set_control (int fd, int id, int value);
-PyObject* v4l2_read_raw (pgCameraObject* self);
-int v4l2_xioctl (int fd, int request, void *arg);
-int v4l2_process_image (pgCameraObject* self, const void *image,
- unsigned int buffer_size, SDL_Surface* surf);
-int v4l2_query_buffer (pgCameraObject* self);
-int v4l2_read_frame (pgCameraObject* self, SDL_Surface* surf);
-int v4l2_stop_capturing (pgCameraObject* self);
-int v4l2_start_capturing (pgCameraObject* self);
-int v4l2_uninit_device (pgCameraObject* self);
-int v4l2_init_mmap (pgCameraObject* self);
-int v4l2_init_device (pgCameraObject* self);
-int v4l2_close_device (pgCameraObject* self);
-int v4l2_open_device (pgCameraObject* self);
-
-#elif defined(PYGAME_MAC_CAMERA_OLD)
-/* internal functions specific to mac */
-char** mac_list_cameras(int* num_devices);
-int mac_open_device (pgCameraObject* self);
-int mac_init_device(pgCameraObject* self);
-int mac_close_device (pgCameraObject* self);
-int mac_start_capturing(pgCameraObject* self);
-int mac_stop_capturing (pgCameraObject* self);
-
-int mac_get_control(pgCameraObject* self, int id, int* value);
-int mac_set_control(pgCameraObject* self, int id, int value);
-
-PyObject* mac_read_raw(pgCameraObject *self);
-int mac_read_frame(pgCameraObject* self, SDL_Surface* surf);
-int mac_camera_idle(pgCameraObject* self);
-int mac_copy_gworld_to_surface(pgCameraObject* self, SDL_Surface* surf);
-
-void flip_image(const void* image, void* flipped_image, int width, int height,
- short depth, int hflip, int vflip);
-
-#endif
-
-#endif /* !CAMERA_H */
diff --git a/venv/Include/site/python3.9/pygame/fastevents.h b/venv/Include/site/python3.9/pygame/fastevents.h
deleted file mode 100644
index 04098c3..0000000
--- a/venv/Include/site/python3.9/pygame/fastevents.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef _FASTEVENTS_H_
-#define _FASTEVENTS_H_
-/*
- NET2 is a threaded, event based, network IO library for SDL.
- Copyright (C) 2002 Bob Pendleton
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License
- as published by the Free Software Foundation; either version 2.1
- of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA
-
- If you do not wish to comply with the terms of the LGPL please
- contact the author as other terms are available for a fee.
-
- Bob Pendleton
- Bob@Pendleton.com
-*/
-
-#include "SDL.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- int FE_Init(void); // Initialize FE
- void FE_Quit(void); // shutdown FE
-
- void FE_PumpEvents(void); // replacement for SDL_PumpEvents
- int FE_PollEvent(SDL_Event *event); // replacement for SDL_PollEvent
- int FE_WaitEvent(SDL_Event *event); // replacement for SDL_WaitEvent
- int FE_PushEvent(SDL_Event *event); // replacement for SDL_PushEvent
-
- char *FE_GetError(void); // get the last error
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/venv/Include/site/python3.9/pygame/font.h b/venv/Include/site/python3.9/pygame/font.h
deleted file mode 100644
index 9878435..0000000
--- a/venv/Include/site/python3.9/pygame/font.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef PGFONT_INTERNAL_H
-#define PGFONT_INTERNAL_H
-
-#include
-
-/* test font initialization */
-#define FONT_INIT_CHECK() \
- if(!(*(int*)PyFONT_C_API[2])) \
- return RAISE(pgExc_SDLError, "font system not initialized")
-
-#include "include/pygame_font.h"
-
-#define PYGAMEAPI_FONT_NUMSLOTS 3
-
-#endif /* ~PGFONT_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/freetype.h b/venv/Include/site/python3.9/pygame/freetype.h
deleted file mode 100644
index 2f75319..0000000
--- a/venv/Include/site/python3.9/pygame/freetype.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2009 Vicent Marti
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-#ifndef _PYGAME_FREETYPE_INTERNAL_H_
-#define _PYGAME_FREETYPE_INTERNAL_H_
-
-#define PGFT_PYGAME1_COMPAT
-#define HAVE_PYGAME_SDL_VIDEO
-#define HAVE_PYGAME_SDL_RWOPS
-
-#include "pgcompat.h"
-#include "pgplatform.h"
-#include
-
-#include
-#include FT_FREETYPE_H
-#include FT_CACHE_H
-#include FT_XFREE86_H
-#include FT_TRIGONOMETRY_H
-
-/**********************************************************
- * Global module constants
- **********************************************************/
-
-/* Render styles */
-#define FT_STYLE_NORMAL 0x00
-#define FT_STYLE_STRONG 0x01
-#define FT_STYLE_OBLIQUE 0x02
-#define FT_STYLE_UNDERLINE 0x04
-#define FT_STYLE_WIDE 0x08
-#define FT_STYLE_DEFAULT 0xFF
-
-/* Bounding box modes */
-#define FT_BBOX_EXACT FT_GLYPH_BBOX_SUBPIXELS
-#define FT_BBOX_EXACT_GRIDFIT FT_GLYPH_BBOX_GRIDFIT
-#define FT_BBOX_PIXEL FT_GLYPH_BBOX_TRUNCATE
-#define FT_BBOX_PIXEL_GRIDFIT FT_GLYPH_BBOX_PIXELS
-
-/* Rendering flags */
-#define FT_RFLAG_NONE (0)
-#define FT_RFLAG_ANTIALIAS (1 << 0)
-#define FT_RFLAG_AUTOHINT (1 << 1)
-#define FT_RFLAG_VERTICAL (1 << 2)
-#define FT_RFLAG_HINTED (1 << 3)
-#define FT_RFLAG_KERNING (1 << 4)
-#define FT_RFLAG_TRANSFORM (1 << 5)
-#define FT_RFLAG_PAD (1 << 6)
-#define FT_RFLAG_ORIGIN (1 << 7)
-#define FT_RFLAG_UCS4 (1 << 8)
-#define FT_RFLAG_USE_BITMAP_STRIKES (1 << 9)
-#define FT_RFLAG_DEFAULTS (FT_RFLAG_HINTED | \
- FT_RFLAG_USE_BITMAP_STRIKES | \
- FT_RFLAG_ANTIALIAS)
-
-
-#define FT_RENDER_NEWBYTEARRAY 0x0
-#define FT_RENDER_NEWSURFACE 0x1
-#define FT_RENDER_EXISTINGSURFACE 0x2
-
-/**********************************************************
- * Global module types
- **********************************************************/
-
-typedef struct _scale_s {
- FT_UInt x, y;
-} Scale_t;
-typedef FT_Angle Angle_t;
-
-struct fontinternals_;
-struct freetypeinstance_;
-
-typedef struct {
- FT_Long font_index;
- FT_Open_Args open_args;
-} pgFontId;
-
-typedef struct {
- PyObject_HEAD
- pgFontId id;
- PyObject *path;
- int is_scalable;
- int is_bg_col_set;
-
- Scale_t face_size;
- FT_Int16 style;
- FT_Int16 render_flags;
- double strength;
- double underline_adjustment;
- FT_UInt resolution;
- Angle_t rotation;
- FT_Matrix transform;
- FT_Byte fgcolor[4];
- FT_Byte bgcolor[4];
-
- struct freetypeinstance_ *freetype; /* Personal reference */
- struct fontinternals_ *_internals;
-} pgFontObject;
-
-#define pgFont_IS_ALIVE(o) \
- (((pgFontObject *)(o))->_internals != 0)
-
-/* import public API */
-#include "include/pygame_freetype.h"
-
-#define PYGAMEAPI_FREETYPE_NUMSLOTS 2
-
-#endif /* ~_PYGAME_FREETYPE_INTERNAL_H_ */
diff --git a/venv/Include/site/python3.9/pygame/include/_pygame.h b/venv/Include/site/python3.9/pygame/include/_pygame.h
deleted file mode 100644
index cb7f5a2..0000000
--- a/venv/Include/site/python3.9/pygame/include/_pygame.h
+++ /dev/null
@@ -1,649 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-#ifndef _PYGAME_H
-#define _PYGAME_H
-
-/** This header file includes all the definitions for the
- ** base pygame extensions. This header only requires
- ** Python includes (and SDL.h for functions that use SDL types).
- ** The reason for functions prototyped with #define's is
- ** to allow for maximum Python portability. It also uses
- ** Python as the runtime linker, which allows for late binding.
- '' For more information on this style of development, read
- ** the Python docs on this subject.
- ** http://www.python.org/doc/current/ext/using-cobjects.html
- **
- ** If using this to build your own derived extensions,
- ** you'll see that the functions available here are mainly
- ** used to help convert between python objects and SDL objects.
- ** Since this library doesn't add a lot of functionality to
- ** the SDL library, it doesn't need to offer a lot either.
- **
- ** When initializing your extension module, you must manually
- ** import the modules you want to use. (this is the part about
- ** using python as the runtime linker). Each module has its
- ** own import_xxx() routine. You need to perform this import
- ** after you have initialized your own module, and before
- ** you call any routines from that module. Since every module
- ** in pygame does this, there are plenty of examples.
- **
- ** The base module does include some useful conversion routines
- ** that you are free to use in your own extension.
- **/
-
-#include "pgplatform.h"
-#include
-
-
-/* version macros (defined since version 1.9.5) */
-#define PG_MAJOR_VERSION 2
-#define PG_MINOR_VERSION 0
-#define PG_PATCH_VERSION 1
-#define PG_VERSIONNUM(MAJOR, MINOR, PATCH) (1000*(MAJOR) + 100*(MINOR) + (PATCH))
-#define PG_VERSION_ATLEAST(MAJOR, MINOR, PATCH) \
- (PG_VERSIONNUM(PG_MAJOR_VERSION, PG_MINOR_VERSION, PG_PATCH_VERSION) >= \
- PG_VERSIONNUM(MAJOR, MINOR, PATCH))
-
-/* SDL 1.x/2.x and pygame 1.x/2.x
- */
-#if defined(SDL_VERSION_ATLEAST)
-#if (SDL_VERSION_ATLEAST(2, 0, 0))
-#define PG_API_VERSION 2
-#else /* SDL 1 */
-/* for now: allow pygame 2 to be compiled with SDL 1. */
-#define PG_API_VERSION 1
-#endif /* SDL 1 */
-#else /* NO SDL */
-#define PG_API_VERSION ((PG_MAJOR_VERSION == 1) ? 1 : 2)
-#endif /* NO SDL */
-
-#include "pgcompat.h"
-
-
-/* Flag indicating a pg_buffer; used for assertions within callbacks */
-#ifndef NDEBUG
-#define PyBUF_PYGAME 0x4000
-#endif
-#define PyBUF_HAS_FLAG(f, F) (((f) & (F)) == (F))
-
-/* Array information exchange struct C type; inherits from Py_buffer
- *
- * Pygame uses its own Py_buffer derived C struct as an internal representation
- * of an imported array buffer. The extended Py_buffer allows for a
- * per-instance release callback,
- */
-typedef void (*pybuffer_releaseproc)(Py_buffer *);
-
-typedef struct pg_bufferinfo_s {
- Py_buffer view;
- PyObject *consumer; /* Input: Borrowed reference */
- pybuffer_releaseproc release_buffer;
-} pg_buffer;
-
-#include "pgimport.h"
-
-/*
- * BASE module
- */
-#ifndef PYGAMEAPI_BASE_INTERNAL
-#define pgExc_SDLError \
- ((PyObject *) \
- PYGAMEAPI_GET_SLOT(base, 0))
-
-#define pg_RegisterQuit \
- (*(void (*)(void (*)(void))) \
- PYGAMEAPI_GET_SLOT(base, 1))
-
-#define pg_IntFromObj \
- (*(int (*)(PyObject *, int *)) \
- PYGAMEAPI_GET_SLOT(base, 2))
-
-#define pg_IntFromObjIndex \
- (*(int (*)(PyObject *, int, int *)) \
- PYGAMEAPI_GET_SLOT(base, 3))
-
-#define pg_TwoIntsFromObj \
- (*(int (*)(PyObject *, int *, int *)) \
- PYGAMEAPI_GET_SLOT(base, 4))
-
-#define pg_FloatFromObj \
- (*(int (*)(PyObject *, float *)) \
- PYGAMEAPI_GET_SLOT(base, 5))
-
-#define pg_FloatFromObjIndex \
- (*(int (*)(PyObject *, int, float *)) \
- PYGAMEAPI_GET_SLOT(base, 6))
-
-#define pg_TwoFloatsFromObj \
- (*(int (*)(PyObject *, float *, float *)) \
- PYGAMEAPI_GET_SLOT(base, 7))
-
-#define pg_UintFromObj \
- (*(int (*)(PyObject *, Uint32 *)) \
- PYGAMEAPI_GET_SLOT(base, 8))
-
-#define pg_UintFromObjIndex \
- (*(int (*)(PyObject *, int, Uint32 *)) \
- PYGAMEAPI_GET_SLOT(base, 9))
-
-#define pgVideo_AutoQuit \
- (*(void (*)(void)) \
- PYGAMEAPI_GET_SLOT(base, 10))
-
-#define pgVideo_AutoInit \
- (*(int (*)(void)) \
- PYGAMEAPI_GET_SLOT(base, 11))
-
-#define pg_RGBAFromObj \
- (*(int (*)(PyObject *, Uint8 *)) \
- PYGAMEAPI_GET_SLOT(base, 12))
-
-#define pgBuffer_AsArrayInterface \
- (*(PyObject * (*)(Py_buffer *)) \
- PYGAMEAPI_GET_SLOT(base, 13))
-
-#define pgBuffer_AsArrayStruct \
- (*(PyObject * (*)(Py_buffer *)) \
- PYGAMEAPI_GET_SLOT(base, 14))
-
-#define pgObject_GetBuffer \
- (*(int (*)(PyObject *, pg_buffer *, int)) \
- PYGAMEAPI_GET_SLOT(base, 15))
-
-#define pgBuffer_Release \
- (*(void (*)(pg_buffer *)) \
- PYGAMEAPI_GET_SLOT(base, 16))
-
-#define pgDict_AsBuffer \
- (*(int (*)(pg_buffer *, PyObject *, int)) \
- PYGAMEAPI_GET_SLOT(base, 17))
-
-#define pgExc_BufferError \
- ((PyObject *) \
- PYGAMEAPI_GET_SLOT(base, 18))
-
-#if PG_API_VERSION == 2
-#define pg_GetDefaultWindow \
- (*(SDL_Window * (*)(void)) \
- PYGAMEAPI_GET_SLOT(base, 19))
-
-#define pg_SetDefaultWindow \
- (*(void (*)(SDL_Window *)) \
- PYGAMEAPI_GET_SLOT(base, 20))
-
-#define pg_GetDefaultWindowSurface \
- (*(pgSurfaceObject * (*)(void)) \
- PYGAMEAPI_GET_SLOT(base, 21))
-
-#define pg_SetDefaultWindowSurface \
- (*(void (*)(pgSurfaceObject *)) \
- PYGAMEAPI_GET_SLOT(base, 22))
-
-#define pg_EnvShouldBlendAlphaSDL2 \
- (*(char * (*)(void)) \
- PYGAMEAPI_GET_SLOT(base, 23))
-
-#endif /* PG_API_VERSION == 2 */
-
-#define import_pygame_base() IMPORT_PYGAME_MODULE(base)
-#endif /* ~PYGAMEAPI_BASE_INTERNAL */
-
-/*
- * RECT module
- */
-#if !defined(SDL_VERSION_ATLEAST) || PG_API_VERSION == 1
-typedef struct {
- int x, y;
- int w, h;
-} GAME_Rect;
-#else /* SDL 2+ */
-typedef SDL_Rect GAME_Rect;
-#endif /* SDL 2+ */
-
-typedef struct {
- PyObject_HEAD GAME_Rect r;
- PyObject *weakreflist;
-} pgRectObject;
-
-#define pgRect_AsRect(x) (((pgRectObject *)x)->r)
-#ifndef PYGAMEAPI_RECT_INTERNAL
-#define pgRect_Type \
- (*(PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(rect, 0))
-
-#define pgRect_Check(x) \
- ((x)->ob_type == &pgRect_Type)
-#define pgRect_New \
- (*(PyObject * (*)(SDL_Rect *)) \
- PYGAMEAPI_GET_SLOT(rect, 1))
-
-#define pgRect_New4 \
- (*(PyObject * (*)(int, int, int, int)) \
- PYGAMEAPI_GET_SLOT(rect, 2))
-
-#define pgRect_FromObject \
- (*(GAME_Rect * (*)(PyObject *, GAME_Rect *)) \
- PYGAMEAPI_GET_SLOT(rect, 3))
-
-#define pgRect_Normalize (*(void (*)(GAME_Rect *)) PYGAMEAPI_GET_SLOT(rect, 4))
-
-#define import_pygame_rect() IMPORT_PYGAME_MODULE(rect)
-#endif /* ~PYGAMEAPI_RECT_INTERNAL */
-
-/*
- * CDROM module
- */
-
-typedef struct {
- PyObject_HEAD int id;
-} pgCDObject;
-
-#define pgCD_AsID(x) (((pgCDObject *)x)->id)
-#ifndef PYGAMEAPI_CDROM_INTERNAL
-#define pgCD_Type \
- (*(PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(cdrom, 0))
-
-#define pgCD_Check(x) \
- ((x)->ob_type == &pgCD_Type)
-#define pgCD_New \
- (*(PyObject * (*)(int)) \
- PYGAMEAPI_GET_SLOT(cdrom, 1))
-
-#define import_pygame_cd() IMPORT_PYGAME_MODULE(cdrom)
-#endif
-
-/*
- * JOYSTICK module
- */
-typedef struct pgJoystickObject {
- PyObject_HEAD
- int id;
- SDL_Joystick *joy;
-
- /* Joysticks form an intrusive linked list.
- *
- * Note that we don't maintain refcounts for these so they are weakrefs from
- * the Python side.
- */
- struct pgJoystickObject *next;
- struct pgJoystickObject *prev;
-} pgJoystickObject;
-
-#define pgJoystick_AsID(x) (((pgJoystickObject *)x)->id)
-#define pgJoystick_AsSDL(x) (((pgJoystickObject *)x)->joy)
-
-#ifndef PYGAMEAPI_JOYSTICK_INTERNAL
-#define pgJoystick_Type \
- (*(PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(joystick, 0))
-
-#define pgJoystick_Check(x) \
- ((x)->ob_type == &pgJoystick_Type)
-#define pgJoystick_New \
- (*(PyObject * (*)(int)) \
- PYGAMEAPI_GET_SLOT(joystick, 1))
-
-#define import_pygame_joystick() IMPORT_PYGAME_MODULE(joystick)
-#endif
-
-/*
- * DISPLAY module
- */
-
-#if defined(SDL_VERSION_ATLEAST)
-
-#if PG_API_VERSION == 2
-typedef struct {
- Uint32 hw_available:1;
- Uint32 wm_available:1;
- Uint32 blit_hw:1;
- Uint32 blit_hw_CC:1;
- Uint32 blit_hw_A:1;
- Uint32 blit_sw:1;
- Uint32 blit_sw_CC:1;
- Uint32 blit_sw_A:1;
- Uint32 blit_fill:1;
- Uint32 video_mem;
- SDL_PixelFormat *vfmt;
- SDL_PixelFormat vfmt_data;
- int current_w;
- int current_h;
-} pg_VideoInfo;
-#endif /* PG_API_VERSION == 2 */
-
-typedef struct {
-#if PG_API_VERSION == 1
- PyObject_HEAD SDL_VideoInfo info;
-#else
- PyObject_HEAD pg_VideoInfo info;
-#endif
-} pgVidInfoObject;
-
-#define pgVidInfo_AsVidInfo(x) (((pgVidInfoObject *)x)->info)
-#endif /* defined(SDL_VERSION_ATLEAST) */
-
-#ifndef PYGAMEAPI_DISPLAY_INTERNAL
-#define pgVidInfo_Type \
- (*(PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(display, 0))
-
-#define pgVidInfo_Check(x) \
- ((x)->ob_type == &pgVidInfo_Type)
-
-#if PG_API_VERSION == 1
-#define pgVidInfo_New \
- (*(PyObject * (*)(SDL_VideoInfo *)) \
- PYGAMEAPI_GET_SLOT(display, 1))
-#else
-#define pgVidInfo_New \
- (*(PyObject * (*)(pg_VideoInfo *)) \
- PYGAMEAPI_GET_SLOT(display, 1))
-#endif
-
-#define import_pygame_display() IMPORT_PYGAME_MODULE(display)
-#endif /* ~PYGAMEAPI_DISPLAY_INTERNAL */
-
-/*
- * SURFACE module
- */
-struct pgSubSurface_Data;
-struct SDL_Surface;
-
-typedef struct {
- PyObject_HEAD struct SDL_Surface *surf;
-#if PG_API_VERSION == 2
- int owner;
-#endif /* PG_API_VERSION == 2 */
- struct pgSubSurface_Data *subsurface; /* ptr to subsurface data (if a
- * subsurface)*/
- PyObject *weakreflist;
- PyObject *locklist;
- PyObject *dependency;
-} pgSurfaceObject;
-#define pgSurface_AsSurface(x) (((pgSurfaceObject *)x)->surf)
-
-#ifndef PYGAMEAPI_SURFACE_INTERNAL
-#define pgSurface_Type \
- (*(PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(surface, 0))
-
-#define pgSurface_Check(x) \
- (PyObject_IsInstance((x), (PyObject *) &pgSurface_Type))
-#if PG_API_VERSION == 1
-#define pgSurface_New \
- (*(pgSurfaceObject * (*)(SDL_Surface *)) \
- PYGAMEAPI_GET_SLOT(surface, 1))
-
-#define pgSurface_SetSurface \
- (*(int (*)(pgSurfaceObject *, SDL_Surface *)) \
- PYGAMEAPI_GET_SLOT(surface, 3))
-
-#else /* PG_API_VERSION == 2 */
-#define pgSurface_New2 \
- (*(pgSurfaceObject * (*)(SDL_Surface *, int)) \
- PYGAMEAPI_GET_SLOT(surface, 1))
-
-#define pgSurface_SetSurface \
- (*(int (*)(pgSurfaceObject *, SDL_Surface *, int)) \
- PYGAMEAPI_GET_SLOT(surface, 3))
-
-#endif /* PG_API_VERSION == 2 */
-#define pgSurface_Blit \
- (*(int (*)(pgSurfaceObject *, pgSurfaceObject *, GAME_Rect *, GAME_Rect *, int)) \
- PYGAMEAPI_GET_SLOT(surface, 2))
-
-#define import_pygame_surface() \
- do { \
- IMPORT_PYGAME_MODULE(surface); \
- if (PyErr_Occurred() != NULL) \
- break; \
- IMPORT_PYGAME_MODULE(surflock); \
- } while (0)
-
-#if PG_API_VERSION == 2
-#define pgSurface_New(surface) pgSurface_New2((surface), 1)
-#define pgSurface_NewNoOwn(surface) pgSurface_New2((surface), 0)
-#endif /* PG_API_VERSION == 2 */
-
-#endif /* ~PYGAMEAPI_SURFACE_INTERNAL */
-
-/*
- * SURFLOCK module
- * auto imported/initialized by surface
- */
-#ifndef PYGAMEAPI_SURFLOCK_INTERNAL
-#define pgLifetimeLock_Type \
- (*(PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(surflock, 0))
-
-#define pgLifetimeLock_Check(x) \
- ((x)->ob_type == &pgLifetimeLock_Type)
-
-#define pgSurface_Prep(x) \
- if ((x)->subsurface) \
- (*(*(void (*)(pgSurfaceObject *)) \
- PYGAMEAPI_GET_SLOT(surflock, 1)))(x)
-
-#define pgSurface_Unprep(x) \
- if ((x)->subsurface) \
- (*(*(void (*)(pgSurfaceObject *)) \
- PYGAMEAPI_GET_SLOT(surflock, 2)))(x)
-
-#define pgSurface_Lock \
- (*(int (*)(pgSurfaceObject *)) \
- PYGAMEAPI_GET_SLOT(surflock, 3))
-
-#define pgSurface_Unlock \
- (*(int (*)(pgSurfaceObject *)) \
- PYGAMEAPI_GET_SLOT(surflock, 4))
-
-#define pgSurface_LockBy \
- (*(int (*)(pgSurfaceObject *, PyObject *)) \
- PYGAMEAPI_GET_SLOT(surflock, 5))
-
-#define pgSurface_UnlockBy \
- (*(int (*)(pgSurfaceObject *, PyObject *)) \
- PYGAMEAPI_GET_SLOT(surflock, 6))
-
-#define pgSurface_LockLifetime \
- (*(PyObject * (*)(PyObject *, PyObject *)) \
- PYGAMEAPI_GET_SLOT(surflock, 7))
-#endif
-
-/*
- * EVENT module
- */
-typedef struct pgEventObject pgEventObject;
-
-#ifndef PYGAMEAPI_EVENT_INTERNAL
-#define pgEvent_Type \
- (*(PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(event, 0))
-
-#define pgEvent_Check(x) \
- ((x)->ob_type == &pgEvent_Type)
-
-#define pgEvent_New \
- (*(PyObject * (*)(SDL_Event *)) \
- PYGAMEAPI_GET_SLOT(event, 1))
-
-#define pgEvent_New2 \
- (*(PyObject * (*)(int, PyObject *)) \
- PYGAMEAPI_GET_SLOT(event, 2))
-
-#define pgEvent_FillUserEvent \
- (*(int (*)(pgEventObject *, SDL_Event *)) \
- PYGAMEAPI_GET_SLOT(event, 3))
-
-#if PG_API_VERSION == 2
-#define pg_EnableKeyRepeat \
- (*(int (*)(int, int)) \
- PYGAMEAPI_GET_SLOT(event, 4))
-
-#define pg_GetKeyRepeat \
- (*(void (*)(int *, int *)) \
- PYGAMEAPI_GET_SLOT(event, 5))
-#endif /* PG_API_VERSION == 2 */
-
-#define import_pygame_event() IMPORT_PYGAME_MODULE(event)
-#endif
-
-/*
- * RWOBJECT module
- * the rwobject are only needed for C side work, not accessable from python.
- */
-#ifndef PYGAMEAPI_RWOBJECT_INTERNAL
-#define pgRWops_FromObject \
- (*(SDL_RWops * (*)(PyObject *)) \
- PYGAMEAPI_GET_SLOT(rwobject, 0))
-
-#define pgRWops_IsFileObject \
- (*(int (*)(SDL_RWops *)) \
- PYGAMEAPI_GET_SLOT(rwobject, 1))
-
-#define pg_EncodeFilePath \
- (*(PyObject * (*)(PyObject *, PyObject *)) \
- PYGAMEAPI_GET_SLOT(rwobject, 2))
-
-#define pg_EncodeString \
- (*(PyObject * (*)(PyObject *, const char *, const char *, PyObject *)) \
- PYGAMEAPI_GET_SLOT(rwobject, 3))
-
-#define pgRWops_FromFileObject \
- (*(SDL_RWops * (*)(PyObject *)) \
- PYGAMEAPI_GET_SLOT(rwobject, 4))
-
-#define pgRWops_ReleaseObject \
- (*(int (*)(SDL_RWops *)) \
- PYGAMEAPI_GET_SLOT(rwobject, 5))
-
-#define import_pygame_rwobject() IMPORT_PYGAME_MODULE(rwobject)
-
-#endif
-
-/*
- * PixelArray module
- */
-#ifndef PYGAMEAPI_PIXELARRAY_INTERNAL
-#define PyPixelArray_Type \
- ((PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(pixelarray, 0))
-
-#define PyPixelArray_Check(x) \
- ((x)->ob_type == &PyPixelArray_Type)
-#define PyPixelArray_New \
- (*(PyObject * (*)) \
- PYGAMEAPI_GET_SLOT(pixelarray, 1))
-
-#define import_pygame_pixelarray() IMPORT_PYGAME_MODULE(pixelarray)
-#endif /* PYGAMEAPI_PIXELARRAY_INTERNAL */
-
-/*
- * Color module
- */
-typedef struct pgColorObject pgColorObject;
-
-#ifndef PYGAMEAPI_COLOR_INTERNAL
-#define pgColor_Type (*(PyObject *) \
- PYGAMEAPI_GET_SLOT(color, 0))
-
-#define pgColor_Check(x) \
- ((x)->ob_type == &pgColor_Type)
-#define pgColor_New \
- (*(PyObject * (*)(Uint8 *)) \
- PYGAMEAPI_GET_SLOT(color, 1))
-
-#define pgColor_NewLength \
- (*(PyObject * (*)(Uint8 *, Uint8)) \
- PYGAMEAPI_GET_SLOT(color, 3))
-
-#define pg_RGBAFromColorObj \
- (*(int (*)(PyObject *, Uint8 *)) \
- PYGAMEAPI_GET_SLOT(color, 2))
-
-#define pg_RGBAFromFuzzyColorObj \
- (*(int (*)(PyObject *, Uint8 *)) \
- PYGAMEAPI_GET_SLOT(color, 4))
-
-#define pgColor_AsArray(x) (((pgColorObject *)x)->data)
-#define pgColor_NumComponents(x) (((pgColorObject *)x)->len)
-
-
-#define import_pygame_color() IMPORT_PYGAME_MODULE(color)
-#endif /* PYGAMEAPI_COLOR_INTERNAL */
-
-/*
- * Math module
- */
-#ifndef PYGAMEAPI_MATH_INTERNAL
-#define pgVector2_Check(x) \
- ((x)->ob_type == (PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(math, 0))
-
-#define pgVector3_Check(x) \
- ((x)->ob_type == (PyTypeObject *) \
- PYGAMEAPI_GET_SLOT(math, 1))
-/*
-#define pgVector2_New \
- (*(PyObject*(*)) \
- PYGAMEAPI_GET_SLOT(PyGAME_C_API, 1))
-*/
-#define import_pygame_math() IMPORT_PYGAME_MODULE(math)
-#endif /* PYGAMEAPI_MATH_INTERNAL */
-
-#define IMPORT_PYGAME_MODULE _IMPORT_PYGAME_MODULE
-
-/*
- * base pygame API slots
- * disable slots with NO_PYGAME_C_API
- */
-#ifdef PYGAME_H
-PYGAMEAPI_DEFINE_SLOTS(base);
-PYGAMEAPI_DEFINE_SLOTS(rect);
-PYGAMEAPI_DEFINE_SLOTS(cdrom);
-PYGAMEAPI_DEFINE_SLOTS(joystick);
-PYGAMEAPI_DEFINE_SLOTS(display);
-PYGAMEAPI_DEFINE_SLOTS(surface);
-PYGAMEAPI_DEFINE_SLOTS(surflock);
-PYGAMEAPI_DEFINE_SLOTS(event);
-PYGAMEAPI_DEFINE_SLOTS(rwobject);
-PYGAMEAPI_DEFINE_SLOTS(pixelarray);
-PYGAMEAPI_DEFINE_SLOTS(color);
-PYGAMEAPI_DEFINE_SLOTS(math);
-#else /* ~PYGAME_H */
-PYGAMEAPI_EXTERN_SLOTS(base);
-PYGAMEAPI_EXTERN_SLOTS(rect);
-PYGAMEAPI_EXTERN_SLOTS(cdrom);
-PYGAMEAPI_EXTERN_SLOTS(joystick);
-PYGAMEAPI_EXTERN_SLOTS(display);
-PYGAMEAPI_EXTERN_SLOTS(surface);
-PYGAMEAPI_EXTERN_SLOTS(surflock);
-PYGAMEAPI_EXTERN_SLOTS(event);
-PYGAMEAPI_EXTERN_SLOTS(rwobject);
-PYGAMEAPI_EXTERN_SLOTS(pixelarray);
-PYGAMEAPI_EXTERN_SLOTS(color);
-PYGAMEAPI_EXTERN_SLOTS(math);
-#endif /* ~PYGAME_H */
-
-#endif /* PYGAME_H */
diff --git a/venv/Include/site/python3.9/pygame/include/bitmask.h b/venv/Include/site/python3.9/pygame/include/bitmask.h
deleted file mode 100644
index d95297e..0000000
--- a/venv/Include/site/python3.9/pygame/include/bitmask.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- Bitmask 1.7 - A pixel-perfect collision detection library.
-
- Copyright (C) 2002-2005 Ulf Ekstrom except for the bitcount
- function which is copyright (C) Donald W. Gillies, 1992.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#ifndef BITMASK_H
-#define BITMASK_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include
-/* Define INLINE for different compilers. If your compiler does not
- support inlining then there might be a performance hit in
- bitmask_overlap_area().
-*/
-#ifndef INLINE
-# ifdef __GNUC__
-# define INLINE inline
-# else
-# ifdef _MSC_VER
-# define INLINE __inline
-# else
-# define INLINE
-# endif
-# endif
-#endif
-
-#define BITMASK_W unsigned long int
-#define BITMASK_W_LEN (sizeof(BITMASK_W)*CHAR_BIT)
-#define BITMASK_W_MASK (BITMASK_W_LEN - 1)
-#define BITMASK_N(n) ((BITMASK_W)1 << (n))
-
-typedef struct bitmask
-{
- int w,h;
- BITMASK_W bits[1];
-} bitmask_t;
-
-/* Creates a bitmask of width w and height h, where
- w and h must both be greater than or equal to 0.
- The mask is automatically cleared when created.
- */
-bitmask_t *bitmask_create(int w, int h);
-
-/* Frees all the memory allocated by bitmask_create for m. */
-void bitmask_free(bitmask_t *m);
-
-/* Create a copy of the given bitmask. */
-bitmask_t *bitmask_copy(bitmask_t *m);
-
-/* Clears all bits in the mask */
-void bitmask_clear(bitmask_t *m);
-
-/* Sets all bits in the mask */
-void bitmask_fill(bitmask_t *m);
-
-/* Flips all bits in the mask */
-void bitmask_invert(bitmask_t *m);
-
-/* Counts the bits in the mask */
-unsigned int bitmask_count(bitmask_t *m);
-
-/* Returns nonzero if the bit at (x,y) is set. Coordinates start at
- (0,0) */
-static INLINE int bitmask_getbit(const bitmask_t *m, int x, int y)
-{
- return (m->bits[x/BITMASK_W_LEN*m->h + y] & BITMASK_N(x & BITMASK_W_MASK)) != 0;
-}
-
-/* Sets the bit at (x,y) */
-static INLINE void bitmask_setbit(bitmask_t *m, int x, int y)
-{
- m->bits[x/BITMASK_W_LEN*m->h + y] |= BITMASK_N(x & BITMASK_W_MASK);
-}
-
-/* Clears the bit at (x,y) */
-static INLINE void bitmask_clearbit(bitmask_t *m, int x, int y)
-{
- m->bits[x/BITMASK_W_LEN*m->h + y] &= ~BITMASK_N(x & BITMASK_W_MASK);
-}
-
-/* Returns nonzero if the masks overlap with the given offset.
- The overlap tests uses the following offsets (which may be negative):
-
- +----+----------..
- |A | yoffset
- | +-+----------..
- +--|B
- |xoffset
- | |
- : :
-*/
-int bitmask_overlap(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset);
-
-/* Like bitmask_overlap(), but will also give a point of intersection.
- x and y are given in the coordinates of mask a, and are untouched
- if there is no overlap. */
-int bitmask_overlap_pos(const bitmask_t *a, const bitmask_t *b,
- int xoffset, int yoffset, int *x, int *y);
-
-/* Returns the number of overlapping 'pixels' */
-int bitmask_overlap_area(const bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset);
-
-/* Fills a mask with the overlap of two other masks. A bitwise AND. */
-void bitmask_overlap_mask (const bitmask_t *a, const bitmask_t *b, bitmask_t *c, int xoffset, int yoffset);
-
-/* Draws mask b onto mask a (bitwise OR). Can be used to compose large
- (game background?) mask from several submasks, which may speed up
- the testing. */
-
-void bitmask_draw(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset);
-
-void bitmask_erase(bitmask_t *a, const bitmask_t *b, int xoffset, int yoffset);
-
-/* Return a new scaled bitmask, with dimensions w*h. The quality of the
- scaling may not be perfect for all circumstances, but it should
- be reasonable. If either w or h is 0 a clear 1x1 mask is returned. */
-bitmask_t *bitmask_scale(const bitmask_t *m, int w, int h);
-
-/* Convolve b into a, drawing the output into o, shifted by offset. If offset
- * is 0, then the (x,y) bit will be set if and only if
- * bitmask_overlap(a, b, x - b->w - 1, y - b->h - 1) returns true.
- *
- * Modifies bits o[xoffset ... xoffset + a->w + b->w - 1)
- * [yoffset ... yoffset + a->h + b->h - 1). */
-void bitmask_convolve(const bitmask_t *a, const bitmask_t *b, bitmask_t *o, int xoffset, int yoffset);
-
-#ifdef __cplusplus
-} /* End of extern "C" { */
-#endif
-
-#endif
diff --git a/venv/Include/site/python3.9/pygame/include/pgcompat.h b/venv/Include/site/python3.9/pygame/include/pgcompat.h
deleted file mode 100644
index 2ba1b6b..0000000
--- a/venv/Include/site/python3.9/pygame/include/pgcompat.h
+++ /dev/null
@@ -1,180 +0,0 @@
-/* Python 2.x/3.x and SDL compatibility tools
- */
-
-#if !defined(PGCOMPAT_H)
-#define PGCOMPAT_H
-
-#include
-
-/* Cobjects vanish in Python 3.2; so we will code as though we use capsules */
-#if defined(Py_CAPSULE_H)
-#define PG_HAVE_CAPSULE 1
-#else
-#define PG_HAVE_CAPSULE 0
-#endif
-#if defined(Py_COBJECT_H)
-#define PG_HAVE_COBJECT 1
-#else
-#define PG_HAVE_COBJECT 0
-#endif
-#if !PG_HAVE_CAPSULE
-#define PyCapsule_New(ptr, n, dfn) PyCObject_FromVoidPtr(ptr, dfn)
-#define PyCapsule_GetPointer(obj, n) PyCObject_AsVoidPtr(obj)
-#define PyCapsule_CheckExact(obj) PyCObject_Check(obj)
-#endif
-
-/* Pygame uses Py_buffer (PEP 3118) to exchange array information internally;
- * define here as needed.
- */
-#if !defined(PyBUF_SIMPLE)
-typedef struct bufferinfo {
- void *buf;
- PyObject *obj;
- Py_ssize_t len;
- Py_ssize_t itemsize;
- int readonly;
- int ndim;
- char *format;
- Py_ssize_t *shape;
- Py_ssize_t *strides;
- Py_ssize_t *suboffsets;
- void *internal;
-} Py_buffer;
-
-/* Flags for getting buffers */
-#define PyBUF_SIMPLE 0
-#define PyBUF_WRITABLE 0x0001
-/* we used to include an E, backwards compatible alias */
-#define PyBUF_WRITEABLE PyBUF_WRITABLE
-#define PyBUF_FORMAT 0x0004
-#define PyBUF_ND 0x0008
-#define PyBUF_STRIDES (0x0010 | PyBUF_ND)
-#define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
-#define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
-#define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
-#define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-
-#define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE)
-#define PyBUF_CONTIG_RO (PyBUF_ND)
-
-#define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE)
-#define PyBUF_STRIDED_RO (PyBUF_STRIDES)
-
-#define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT)
-#define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT)
-
-#define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT)
-#define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT)
-
-#define PyBUF_READ 0x100
-#define PyBUF_WRITE 0x200
-#define PyBUF_SHADOW 0x400
-
-typedef int(*getbufferproc)(PyObject *, Py_buffer *, int);
-typedef void(*releasebufferproc)(Py_buffer *);
-#endif /* ~defined(PyBUF_SIMPLE) */
-
-/* define common types where SDL is not included */
-#ifndef SDL_VERSION_ATLEAST
-#ifdef _MSC_VER
-typedef unsigned __int8 uint8_t;
-typedef unsigned __int32 uint32_t;
-#else
-#include
-#endif
-typedef uint32_t Uint32;
-typedef uint8_t Uint8;
-#endif /* no SDL */
-
-
-#if defined(SDL_VERSION_ATLEAST)
-
-#ifndef SDL_WINDOW_VULKAN
-#define SDL_WINDOW_VULKAN 0
-#endif
-
-#ifndef SDL_WINDOW_ALWAYS_ON_TOP
-#define SDL_WINDOW_ALWAYS_ON_TOP 0
-#endif
-
-#ifndef SDL_WINDOW_SKIP_TASKBAR
-#define SDL_WINDOW_SKIP_TASKBAR 0
-#endif
-
-#ifndef SDL_WINDOW_UTILITY
-#define SDL_WINDOW_UTILITY 0
-#endif
-
-#ifndef SDL_WINDOW_TOOLTIP
-#define SDL_WINDOW_TOOLTIP 0
-#endif
-
-#ifndef SDL_WINDOW_POPUP_MENU
-#define SDL_WINDOW_POPUP_MENU 0
-#endif
-
-
-#ifndef SDL_WINDOW_INPUT_GRABBED
-#define SDL_WINDOW_INPUT_GRABBED 0
-#endif
-
-#ifndef SDL_WINDOW_INPUT_FOCUS
-#define SDL_WINDOW_INPUT_FOCUS 0
-#endif
-
-#ifndef SDL_WINDOW_MOUSE_FOCUS
-#define SDL_WINDOW_MOUSE_FOCUS 0
-#endif
-
-#ifndef SDL_WINDOW_FOREIGN
-#define SDL_WINDOW_FOREIGN 0
-#endif
-
-#ifndef SDL_WINDOW_ALLOW_HIGHDPI
-#define SDL_WINDOW_ALLOW_HIGHDPI 0
-#endif
-
-#ifndef SDL_WINDOW_MOUSE_CAPTURE
-#define SDL_WINDOW_MOUSE_CAPTURE 0
-#endif
-
-#ifndef SDL_WINDOW_ALWAYS_ON_TOP
-#define SDL_WINDOW_ALWAYS_ON_TOP 0
-#endif
-
-#ifndef SDL_WINDOW_SKIP_TASKBAR
-#define SDL_WINDOW_SKIP_TASKBAR 0
-#endif
-
-#ifndef SDL_WINDOW_UTILITY
-#define SDL_WINDOW_UTILITY 0
-#endif
-
-#ifndef SDL_WINDOW_TOOLTIP
-#define SDL_WINDOW_TOOLTIP 0
-#endif
-
-#ifndef SDL_WINDOW_POPUP_MENU
-#define SDL_WINDOW_POPUP_MENU 0
-#endif
-
-#if SDL_VERSION_ATLEAST(2, 0, 4)
-/* To control the use of:
- * SDL_AUDIODEVICEADDED
- * SDL_AUDIODEVICEREMOVED
- *
- * Ref: https://wiki.libsdl.org/SDL_EventType
- * Ref: https://wiki.libsdl.org/SDL_AudioDeviceEvent
- */
-#define SDL2_AUDIODEVICE_SUPPORTED
-#endif
-
-#ifndef SDL_MOUSEWHEEL_FLIPPED
-#define NO_SDL_MOUSEWHEEL_FLIPPED
-#endif
-
-
-#endif /* defined(SDL_VERSION_ATLEAST) */
-
-
-#endif /* ~defined(PGCOMPAT_H) */
diff --git a/venv/Include/site/python3.9/pygame/include/pgimport.h b/venv/Include/site/python3.9/pygame/include/pgimport.h
deleted file mode 100644
index 6649865..0000000
--- a/venv/Include/site/python3.9/pygame/include/pgimport.h
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef PGIMPORT_H
-#define PGIMPORT_H
-
-/* Prefix when initializing module */
-#define MODPREFIX ""
-/* Prefix when importing module */
-#define IMPPREFIX "pygame."
-
-#ifdef __SYMBIAN32__
-
-/* On Symbian there is no pygame package. The extensions are built-in or in
- * sys\bin. */
-#undef MODPREFIX
-#undef IMPPREFIX
-#define MODPREFIX "pygame_"
-#define IMPPREFIX "pygame_"
-
-#endif /* __SYMBIAN32__ */
-
-#include "pgcompat.h"
-
-#define PYGAMEAPI_LOCAL_ENTRY "_PYGAME_C_API"
-#define PG_CAPSULE_NAME(m) (IMPPREFIX m "." PYGAMEAPI_LOCAL_ENTRY)
-
-/*
- * fill API slots defined by PYGAMEAPI_DEFINE_SLOTS/PYGAMEAPI_EXTERN_SLOTS
- */
-#define _IMPORT_PYGAME_MODULE(module) \
- { \
- PyObject *_mod_##module = PyImport_ImportModule(IMPPREFIX #module); \
- \
- if (_mod_##module != NULL) { \
- PyObject *_c_api = \
- PyObject_GetAttrString(_mod_##module, PYGAMEAPI_LOCAL_ENTRY);\
- \
- Py_DECREF(_mod_##module); \
- if (_c_api != NULL && PyCapsule_CheckExact(_c_api)) { \
- void **localptr = (void **)PyCapsule_GetPointer( \
- _c_api, PG_CAPSULE_NAME(#module)); \
- _PGSLOTS_ ## module = localptr; \
- } \
- Py_XDECREF(_c_api); \
- } \
- }
-
-#define PYGAMEAPI_IS_IMPORTED(module) (_PGSLOTS_ ## module != NULL)
-
-/*
- * source file must include one of these in order to use _IMPORT_PYGAME_MODULE.
- * this is set by import_pygame_*() functions.
- * disable with NO_PYGAME_C_API
- */
-#define PYGAMEAPI_DEFINE_SLOTS(module) \
- void ** _PGSLOTS_ ## module = NULL
-#define PYGAMEAPI_EXTERN_SLOTS(module) \
- extern void **_PGSLOTS_ ## module
-#define PYGAMEAPI_GET_SLOT(module, index) \
- _PGSLOTS_ ## module [(index)]
-
-/*
- * disabled API with NO_PYGAME_C_API; do nothing instead
- */
-#ifdef NO_PYGAME_C_API
-
-#undef PYGAMEAPI_DEFINE_SLOTS
-#undef PYGAMEAPI_EXTERN_SLOTS
-
-#define PYGAMEAPI_DEFINE_SLOTS(module)
-#define PYGAMEAPI_EXTERN_SLOTS(module)
-
-/* intentionally leave this defined to cause a compiler error *
-#define PYGAMEAPI_GET_SLOT(api_root, index)
-#undef PYGAMEAPI_GET_SLOT*/
-
-#undef _IMPORT_PYGAME_MODULE
-#define _IMPORT_PYGAME_MODULE(module)
-
-#endif /* NO_PYGAME_C_API */
-
-#endif /* ~PGIMPORT_H */
diff --git a/venv/Include/site/python3.9/pygame/include/pgplatform.h b/venv/Include/site/python3.9/pygame/include/pgplatform.h
deleted file mode 100644
index 659ea62..0000000
--- a/venv/Include/site/python3.9/pygame/include/pgplatform.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* platform/compiler adjustments */
-#ifndef PG_PLATFORM_H
-#define PG_PLATFORM_H
-
-#if defined(HAVE_SNPRINTF) /* defined in python.h (pyerrors.h) and SDL.h \
- (SDL_config.h) */
-#undef HAVE_SNPRINTF /* remove GCC redefine warning */
-#endif /* HAVE_SNPRINTF */
-
-#ifndef PG_INLINE
-#if defined(__clang__)
-#define PG_INLINE __inline__ __attribute__((__unused__))
-#elif defined(__GNUC__)
-#define PG_INLINE __inline__
-#elif defined(_MSC_VER)
-#define PG_INLINE __inline
-#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-#define PG_INLINE inline
-#else
-#define PG_INLINE
-#endif
-#endif /* ~PG_INLINE */
-
-// Worth trying this on MSVC/win32 builds to see if provides any speed up
-#ifndef PG_FORCEINLINE
-#if defined(__clang__)
-#define PG_FORCEINLINE __inline__ __attribute__((__unused__))
-#elif defined(__GNUC__)
-#define PG_FORCEINLINE __inline__
-#elif defined(_MSC_VER)
-#define PG_FORCEINLINE __forceinline
-#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-#define PG_FORCEINLINE inline
-#else
-#define PG_FORCEINLINE
-#endif
-#endif /* ~PG_FORCEINLINE */
-
-/* This is unconditionally defined in Python.h */
-#if defined(_POSIX_C_SOURCE)
-#undef _POSIX_C_SOURCE
-#endif
-
-/* No signal() */
-#if defined(__SYMBIAN32__) && defined(HAVE_SIGNAL_H)
-#undef HAVE_SIGNAL_H
-#endif
-
-#if defined(HAVE_SNPRINTF)
-#undef HAVE_SNPRINTF
-#endif
-
-/* SDL needs WIN32 */
-#if !defined(WIN32) && \
- (defined(MS_WIN32) || defined(_WIN32) || \
- defined(__WIN32) || defined(__WIN32__) || defined(_WINDOWS))
-#define WIN32
-#endif
-
-/* Commenting out SSE4_2 stuff because it does not do runtime detection.
-#ifndef PG_TARGET_SSE4_2
-#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 9) || __GNUC__ >= 5 ))
-//The old gcc 4.8 on centos used by manylinux1 does not seem to get sse4.2 intrinsics
-#define PG_FUNCTION_TARGET_SSE4_2 __attribute__((target("sse4.2")))
-// No else; we define the fallback later
-#endif
-#endif
-*/
-/* ~PG_TARGET_SSE4_2 */
-
-/*
-#ifdef PG_FUNCTION_TARGET_SSE4_2
-#if !defined(__SSE4_2__) && !defined(PG_COMPILE_SSE4_2)
-#if defined(__x86_64__) || defined(__i386__)
-#define PG_COMPILE_SSE4_2 1
-#endif
-#endif
-#endif
-*/
-/* ~PG_TARGET_SSE4_2 */
-
-/* Fallback definition of target attribute */
-#ifndef PG_FUNCTION_TARGET_SSE4_2
-#define PG_FUNCTION_TARGET_SSE4_2
-#endif
-
-#ifndef PG_COMPILE_SSE4_2
-#define PG_COMPILE_SSE4_2 0
-#endif
-
-#endif /* ~PG_PLATFORM_H */
diff --git a/venv/Include/site/python3.9/pygame/include/pygame.h b/venv/Include/site/python3.9/pygame/include/pygame.h
deleted file mode 100644
index bcbf1d9..0000000
--- a/venv/Include/site/python3.9/pygame/include/pygame.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-/* To allow the Pygame C api to be globally shared by all code within an
- * extension module built from multiple C files, only include the pygame.h
- * header within the top level C file, the one which calls the
- * 'import_pygame_*' macros. All other C source files of the module should
- * include _pygame.h instead.
- */
-#ifndef PYGAME_H
-#define PYGAME_H
-
-#include "_pygame.h"
-
-#endif
diff --git a/venv/Include/site/python3.9/pygame/include/pygame_bufferproxy.h b/venv/Include/site/python3.9/pygame/include/pygame_bufferproxy.h
deleted file mode 100644
index d7c4ac6..0000000
--- a/venv/Include/site/python3.9/pygame/include/pygame_bufferproxy.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
- Copyright (C) 2007 Rene Dudfield, Richard Goedeken
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-/* Bufferproxy module C api. */
-#if !defined(PG_BUFPROXY_HEADER)
-#define PG_BUFPROXY_HEADER
-
-#include
-
-typedef PyObject *(*_pgbufproxy_new_t)(PyObject *, getbufferproc);
-typedef PyObject *(*_pgbufproxy_get_obj_t)(PyObject *);
-typedef int (*_pgbufproxy_trip_t)(PyObject *);
-
-#ifndef PYGAMEAPI_BUFPROXY_INTERNAL
-
-#include "pgimport.h"
-
-PYGAMEAPI_DEFINE_SLOTS(bufferproxy);
-
-#define pgBufproxy_Type (*(PyTypeObject*) \
- PYGAMEAPI_GET_SLOT(bufferproxy, 0) )
-
-#define pgBufproxy_Check(x) ((x)->ob_type == &pgBufproxy_Type)
-
-#define pgBufproxy_New (*(_pgbufproxy_new_t) \
- PYGAMEAPI_GET_SLOT(bufferproxy, 1))
-
-#define pgBufproxy_GetParent \
- (*(_pgbufproxy_get_obj_t) \
- PYGAMEAPI_GET_SLOT(bufferproxy, 2))
-
-#define pgBufproxy_Trip (*(_pgbufproxy_trip_t) \
- PYGAMEAPI_GET_SLOT(bufferproxy, 3))
-
-#define import_pygame_bufferproxy() _IMPORT_PYGAME_MODULE(bufferproxy)
-
-#endif /* ~PYGAMEAPI_BUFPROXY_INTERNAL */
-
-#endif /* ~defined(PG_BUFPROXY_HEADER) */
diff --git a/venv/Include/site/python3.9/pygame/include/pygame_font.h b/venv/Include/site/python3.9/pygame/include/pygame_font.h
deleted file mode 100644
index 3fe4500..0000000
--- a/venv/Include/site/python3.9/pygame/include/pygame_font.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-#include
-#include "pgplatform.h"
-
-struct TTF_Font;
-
-typedef struct {
- PyObject_HEAD
- TTF_Font* font;
- PyObject* weakreflist;
-} PyFontObject;
-#define PyFont_AsFont(x) (((PyFontObject*)x)->font)
-
-#ifndef PYGAMEAPI_FONT_INTERNAL
-
-#include "pgimport.h"
-
-PYGAMEAPI_DEFINE_SLOTS(font);
-
-#define PyFont_Type (*(PyTypeObject*) \
- PYGAMEAPI_GET_SLOT(font, 0))
-#define PyFont_Check(x) ((x)->ob_type == &PyFont_Type)
-
-#define PyFont_New (*(PyObject*(*)(TTF_Font*))\
- PYGAMEAPI_GET_SLOT(font, 1))
-
-/*slot 2 taken by FONT_INIT_CHECK*/
-
-#define import_pygame_font() _IMPORT_PYGAME_MODULE(font)
-
-#endif
-
diff --git a/venv/Include/site/python3.9/pygame/include/pygame_freetype.h b/venv/Include/site/python3.9/pygame/include/pygame_freetype.h
deleted file mode 100644
index f727ee2..0000000
--- a/venv/Include/site/python3.9/pygame/include/pygame_freetype.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2009 Vicent Marti
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-#ifndef PYGAME_FREETYPE_H_
-#define PYGAME_FREETYPE_H_
-
-#include "pgplatform.h"
-#include "pgimport.h"
-#include "pgcompat.h"
-
-#ifndef PYGAME_FREETYPE_INTERNAL
-
-PYGAMEAPI_DEFINE_SLOTS(_freetype);
-
-#define pgFont_Type (*(PyTypeObject*) \
- PYGAMEAPI_GET_SLOT(_freetype, 0))
-
-#define pgFont_Check(x) ((x)->ob_type == &pgFont_Type)
-
-#define pgFont_New (*(PyObject*(*)(const char*, long)) \
- PYGAMEAPI_GET_SLOT(_freetype, 1))
-
-#define import_pygame_freetype() _IMPORT_PYGAME_MODULE(_freetype)
-
-#endif /* PYGAME_FREETYPE_INTERNAL */
-
-#endif /* PYGAME_FREETYPE_H_ */
diff --git a/venv/Include/site/python3.9/pygame/include/pygame_mask.h b/venv/Include/site/python3.9/pygame/include/pygame_mask.h
deleted file mode 100644
index 1b25553..0000000
--- a/venv/Include/site/python3.9/pygame/include/pygame_mask.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- pygame - Python Game Library
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#ifndef PGMASK_H
-#define PGMASK_H
-
-#include
-#include "bitmask.h"
-
-typedef struct {
- PyObject_HEAD
- bitmask_t *mask;
- void *bufdata;
-} pgMaskObject;
-
-#define pgMask_AsBitmap(x) (((pgMaskObject*)x)->mask)
-
-#ifndef PYGAMEAPI_MASK_INTERNAL
-
-#include "pgimport.h"
-
-PYGAMEAPI_DEFINE_SLOTS(mask);
-
-#define pgMask_Type (*(PyTypeObject*) \
- PYGAMEAPI_GET_SLOT(mask, 0))
-#define pgMask_Check(x) ((x)->ob_type == &pgMask_Type)
-
-#define import_pygame_mask() _IMPORT_PYGAME_MODULE(mask)
-
-#endif /* ~PYGAMEAPI_MASK_INTERNAL */
-
-#endif /* ~PGMASK_H */
diff --git a/venv/Include/site/python3.9/pygame/include/pygame_mixer.h b/venv/Include/site/python3.9/pygame/include/pygame_mixer.h
deleted file mode 100644
index 52e76ae..0000000
--- a/venv/Include/site/python3.9/pygame/include/pygame_mixer.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-#ifndef PGMIXER_H
-#define PGMIXER_H
-
-#include
-#include
-
-#include "pgcompat.h"
-
-struct Mix_Chunk;
-
-typedef struct {
- PyObject_HEAD
- Mix_Chunk *chunk;
- Uint8 *mem;
- PyObject *weakreflist;
-} pgSoundObject;
-
-typedef struct {
- PyObject_HEAD
- int chan;
-} pgChannelObject;
-
-#define pgSound_AsChunk(x) (((pgSoundObject*)x)->chunk)
-#define pgChannel_AsInt(x) (((pgChannelObject*)x)->chan)
-
-#include "pgimport.h"
-
-#ifndef PYGAMEAPI_MIXER_INTERNAL
-
-PYGAMEAPI_DEFINE_SLOTS(mixer);
-
-#define pgSound_Type (*(PyTypeObject*) \
- PYGAMEAPI_GET_SLOT(mixer, 0))
-
-#define pgSound_Check(x) ((x)->ob_type == &pgSound_Type)
-
-#define pgSound_New (*(PyObject*(*)(Mix_Chunk*)) \
- PYGAMEAPI_GET_SLOT(mixer, 1))
-
-#define pgSound_Play (*(PyObject*(*)(PyObject*, PyObject*)) \
- PYGAMEAPI_GET_SLOT(mixer, 2))
-
-#define pgChannel_Type (*(PyTypeObject*) \
- PYGAMEAPI_GET_SLOT(mixer, 3))
-#define pgChannel_Check(x) ((x)->ob_type == &pgChannel_Type)
-
-#define pgChannel_New (*(PyObject*(*)(int)) \
- PYGAMEAPI_GET_SLOT(mixer, 4))
-
-#define pgMixer_AutoInit (*(PyObject*(*)(PyObject*, PyObject*)) \
- PYGAMEAPI_GET_SLOT(mixer, 5))
-
-#define pgMixer_AutoQuit (*(void(*)(void)) \
- PYGAMEAPI_GET_SLOT(mixer, 6))
-
-#define import_pygame_mixer() _IMPORT_PYGAME_MODULE(mixer)
-
-#endif /* PYGAMEAPI_MIXER_INTERNAL */
-
-#endif /* ~PGMIXER_H */
diff --git a/venv/Include/site/python3.9/pygame/include/sse2neon.h b/venv/Include/site/python3.9/pygame/include/sse2neon.h
deleted file mode 100644
index 7dbb4dd..0000000
--- a/venv/Include/site/python3.9/pygame/include/sse2neon.h
+++ /dev/null
@@ -1,3676 +0,0 @@
-#ifndef SSE2NEON_H
-#define SSE2NEON_H
-
-// This header file provides a simple API translation layer
-// between SSE intrinsics to their corresponding Arm/Aarch64 NEON versions
-//
-// This header file does not yet translate all of the SSE intrinsics.
-//
-// Contributors to this work are:
-// John W. Ratcliff
-// Brandon Rowlett
-// Ken Fast
-// Eric van Beurden
-// Alexander Potylitsin
-// Hasindu Gamaarachchi
-// Jim Huang
-// Mark Cheng
-// Malcolm James MacLeod
-// Devin Hussey (easyaspi314)
-// Sebastian Pop
-
-/*
- * The MIT license:
- *
- * 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.
- */
-
-#if defined(__GNUC__) || defined(__clang__)
-
-#pragma push_macro("FORCE_INLINE")
-#pragma push_macro("ALIGN_STRUCT")
-#define FORCE_INLINE static inline __attribute__((always_inline))
-#define ALIGN_STRUCT(x) __attribute__((aligned(x)))
-
-#else
-
-#error "Macro name collisions may happens with unknown compiler"
-#ifdef FORCE_INLINE
-#undef FORCE_INLINE
-#endif
-#define FORCE_INLINE static inline
-#ifndef ALIGN_STRUCT
-#define ALIGN_STRUCT(x) __declspec(align(x))
-#endif
-
-#endif
-
-#include
-#include
-
-#include
-
-/**
- * MACRO for shuffle parameter for _mm_shuffle_ps().
- * Argument fp3 is a digit[0123] that represents the fp from argument "b"
- * of mm_shuffle_ps that will be placed in fp3 of result. fp2 is the same
- * for fp2 in result. fp1 is a digit[0123] that represents the fp from
- * argument "a" of mm_shuffle_ps that will be places in fp1 of result.
- * fp0 is the same for fp0 of result.
- */
-#define _MM_SHUFFLE(fp3, fp2, fp1, fp0) \
- (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0)))
-
-/* indicate immediate constant argument in a given range */
-#define __constrange(a, b) const
-
-typedef float32x2_t __m64;
-typedef float32x4_t __m128;
-typedef int64x2_t __m128i;
-
-// ******************************************
-// type-safe casting between types
-// ******************************************
-
-#define vreinterpretq_m128_f16(x) vreinterpretq_f32_f16(x)
-#define vreinterpretq_m128_f32(x) (x)
-#define vreinterpretq_m128_f64(x) vreinterpretq_f32_f64(x)
-
-#define vreinterpretq_m128_u8(x) vreinterpretq_f32_u8(x)
-#define vreinterpretq_m128_u16(x) vreinterpretq_f32_u16(x)
-#define vreinterpretq_m128_u32(x) vreinterpretq_f32_u32(x)
-#define vreinterpretq_m128_u64(x) vreinterpretq_f32_u64(x)
-
-#define vreinterpretq_m128_s8(x) vreinterpretq_f32_s8(x)
-#define vreinterpretq_m128_s16(x) vreinterpretq_f32_s16(x)
-#define vreinterpretq_m128_s32(x) vreinterpretq_f32_s32(x)
-#define vreinterpretq_m128_s64(x) vreinterpretq_f32_s64(x)
-
-#define vreinterpretq_f16_m128(x) vreinterpretq_f16_f32(x)
-#define vreinterpretq_f32_m128(x) (x)
-#define vreinterpretq_f64_m128(x) vreinterpretq_f64_f32(x)
-
-#define vreinterpretq_u8_m128(x) vreinterpretq_u8_f32(x)
-#define vreinterpretq_u16_m128(x) vreinterpretq_u16_f32(x)
-#define vreinterpretq_u32_m128(x) vreinterpretq_u32_f32(x)
-#define vreinterpretq_u64_m128(x) vreinterpretq_u64_f32(x)
-
-#define vreinterpretq_s8_m128(x) vreinterpretq_s8_f32(x)
-#define vreinterpretq_s16_m128(x) vreinterpretq_s16_f32(x)
-#define vreinterpretq_s32_m128(x) vreinterpretq_s32_f32(x)
-#define vreinterpretq_s64_m128(x) vreinterpretq_s64_f32(x)
-
-#define vreinterpretq_m128i_s8(x) vreinterpretq_s64_s8(x)
-#define vreinterpretq_m128i_s16(x) vreinterpretq_s64_s16(x)
-#define vreinterpretq_m128i_s32(x) vreinterpretq_s64_s32(x)
-#define vreinterpretq_m128i_s64(x) (x)
-
-#define vreinterpretq_m128i_u8(x) vreinterpretq_s64_u8(x)
-#define vreinterpretq_m128i_u16(x) vreinterpretq_s64_u16(x)
-#define vreinterpretq_m128i_u32(x) vreinterpretq_s64_u32(x)
-#define vreinterpretq_m128i_u64(x) vreinterpretq_s64_u64(x)
-
-#define vreinterpretq_s8_m128i(x) vreinterpretq_s8_s64(x)
-#define vreinterpretq_s16_m128i(x) vreinterpretq_s16_s64(x)
-#define vreinterpretq_s32_m128i(x) vreinterpretq_s32_s64(x)
-#define vreinterpretq_s64_m128i(x) (x)
-
-#define vreinterpretq_u8_m128i(x) vreinterpretq_u8_s64(x)
-#define vreinterpretq_u16_m128i(x) vreinterpretq_u16_s64(x)
-#define vreinterpretq_u32_m128i(x) vreinterpretq_u32_s64(x)
-#define vreinterpretq_u64_m128i(x) vreinterpretq_u64_s64(x)
-
-// A struct is defined in this header file called 'SIMDVec' which can be used
-// by applications which attempt to access the contents of an _m128 struct
-// directly. It is important to note that accessing the __m128 struct directly
-// is bad coding practice by Microsoft: @see:
-// https://msdn.microsoft.com/en-us/library/ayeb3ayc.aspx
-//
-// However, some legacy source code may try to access the contents of an __m128
-// struct directly so the developer can use the SIMDVec as an alias for it. Any
-// casting must be done manually by the developer, as you cannot cast or
-// otherwise alias the base NEON data type for intrinsic operations.
-//
-// union intended to allow direct access to an __m128 variable using the names
-// that the MSVC compiler provides. This union should really only be used when
-// trying to access the members of the vector as integer values. GCC/clang
-// allow native access to the float members through a simple array access
-// operator (in C since 4.6, in C++ since 4.8).
-//
-// Ideally direct accesses to SIMD vectors should not be used since it can cause
-// a performance hit. If it really is needed however, the original __m128
-// variable can be aliased with a pointer to this union and used to access
-// individual components. The use of this union should be hidden behind a macro
-// that is used throughout the codebase to access the members instead of always
-// declaring this type of variable.
-typedef union ALIGN_STRUCT(16) SIMDVec {
- float m128_f32[4]; // as floats - do not to use this. Added for convenience.
- int8_t m128_i8[16]; // as signed 8-bit integers.
- int16_t m128_i16[8]; // as signed 16-bit integers.
- int32_t m128_i32[4]; // as signed 32-bit integers.
- int64_t m128_i64[2]; // as signed 64-bit integers.
- uint8_t m128_u8[16]; // as unsigned 8-bit integers.
- uint16_t m128_u16[8]; // as unsigned 16-bit integers.
- uint32_t m128_u32[4]; // as unsigned 32-bit integers.
- uint64_t m128_u64[2]; // as unsigned 64-bit integers.
-} SIMDVec;
-
-// casting using SIMDVec
-#define vreinterpretq_nth_u64_m128i(x, n) (((SIMDVec *) &x)->m128_u64[n])
-#define vreinterpretq_nth_u32_m128i(x, n) (((SIMDVec *) &x)->m128_u32[n])
-
-
-// ******************************************
-// Backwards compatibility for compilers with lack of specific type support
-// ******************************************
-
-// Older gcc does not define vld1q_u8_x4 type
-#if defined(__GNUC__) && !defined(__clang__)
-#if __GNUC__ <= 9
-FORCE_INLINE uint8x16x4_t vld1q_u8_x4(const uint8_t *p)
-{
- uint8x16x4_t ret;
- ret.val[0] = vld1q_u8(p + 0);
- ret.val[1] = vld1q_u8(p + 16);
- ret.val[2] = vld1q_u8(p + 32);
- ret.val[3] = vld1q_u8(p + 48);
- return ret;
-}
-#endif
-#endif
-
-
-// ******************************************
-// Set/get methods
-// ******************************************
-
-// Loads one cache line of data from address p to a location closer to the
-// processor. https://msdn.microsoft.com/en-us/library/84szxsww(v=vs.100).aspx
-FORCE_INLINE void _mm_prefetch(const void *p, int i)
-{
- (void)i;
- __builtin_prefetch(p);
-}
-
-// extracts the lower order floating point value from the parameter :
-// https://msdn.microsoft.com/en-us/library/bb514059%28v=vs.120%29.aspx?f=255&MSPPError=-2147217396
-FORCE_INLINE float _mm_cvtss_f32(__m128 a)
-{
- return vgetq_lane_f32(vreinterpretq_f32_m128(a), 0);
-}
-
-// Sets the 128-bit value to zero
-// https://msdn.microsoft.com/en-us/library/vstudio/ys7dw0kh(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_setzero_si128(void)
-{
- return vreinterpretq_m128i_s32(vdupq_n_s32(0));
-}
-
-// Clears the four single-precision, floating-point values.
-// https://msdn.microsoft.com/en-us/library/vstudio/tk1t2tbz(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_setzero_ps(void)
-{
- return vreinterpretq_m128_f32(vdupq_n_f32(0));
-}
-
-// Sets the four single-precision, floating-point values to w.
-//
-// r0 := r1 := r2 := r3 := w
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/2x1se8ha(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_set1_ps(float _w)
-{
- return vreinterpretq_m128_f32(vdupq_n_f32(_w));
-}
-
-// Sets the four single-precision, floating-point values to w.
-// https://msdn.microsoft.com/en-us/library/vstudio/2x1se8ha(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_set_ps1(float _w)
-{
- return vreinterpretq_m128_f32(vdupq_n_f32(_w));
-}
-
-// Sets the four single-precision, floating-point values to the four inputs.
-// https://msdn.microsoft.com/en-us/library/vstudio/afh0zf75(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_set_ps(float w, float z, float y, float x)
-{
- float __attribute__((aligned(16))) data[4] = {x, y, z, w};
- return vreinterpretq_m128_f32(vld1q_f32(data));
-}
-
-// Sets the four single-precision, floating-point values to the four inputs in
-// reverse order.
-// https://msdn.microsoft.com/en-us/library/vstudio/d2172ct3(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_setr_ps(float w, float z, float y, float x)
-{
- float __attribute__((aligned(16))) data[4] = {w, z, y, x};
- return vreinterpretq_m128_f32(vld1q_f32(data));
-}
-
-// Sets the 8 signed 16-bit integer values in reverse order.
-//
-// Return Value
-// r0 := w0
-// r1 := w1
-// ...
-// r7 := w7
-FORCE_INLINE __m128i _mm_setr_epi16(short w0,
- short w1,
- short w2,
- short w3,
- short w4,
- short w5,
- short w6,
- short w7)
-{
- int16_t __attribute__((aligned(16)))
- data[8] = {w0, w1, w2, w3, w4, w5, w6, w7};
- return vreinterpretq_m128i_s16(vld1q_s16((int16_t *) data));
-}
-
-// Sets the 4 signed 32-bit integer values in reverse order
-// https://technet.microsoft.com/en-us/library/security/27yb3ee5(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_setr_epi32(int i3, int i2, int i1, int i0)
-{
- int32_t __attribute__((aligned(16))) data[4] = {i3, i2, i1, i0};
- return vreinterpretq_m128i_s32(vld1q_s32(data));
-}
-
-// Sets the 16 signed 8-bit integer values to b.
-//
-// r0 := b
-// r1 := b
-// ...
-// r15 := b
-//
-// https://msdn.microsoft.com/en-us/library/6e14xhyf(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_set1_epi8(signed char w)
-{
- return vreinterpretq_m128i_s8(vdupq_n_s8(w));
-}
-
-// Sets the 8 signed 16-bit integer values to w.
-//
-// r0 := w
-// r1 := w
-// ...
-// r7 := w
-//
-// https://msdn.microsoft.com/en-us/library/k0ya3x0e(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_set1_epi16(short w)
-{
- return vreinterpretq_m128i_s16(vdupq_n_s16(w));
-}
-
-// Sets the 16 signed 8-bit integer values.
-// https://msdn.microsoft.com/en-us/library/x0cx8zd3(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_set_epi8(signed char b15,
- signed char b14,
- signed char b13,
- signed char b12,
- signed char b11,
- signed char b10,
- signed char b9,
- signed char b8,
- signed char b7,
- signed char b6,
- signed char b5,
- signed char b4,
- signed char b3,
- signed char b2,
- signed char b1,
- signed char b0)
-{
- int8_t __attribute__((aligned(16)))
- data[16] = {(int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3,
- (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7,
- (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11,
- (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15};
- return (__m128i) vld1q_s8(data);
-}
-
-// Sets the 8 signed 16-bit integer values.
-// https://msdn.microsoft.com/en-au/library/3e0fek84(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_set_epi16(short i7,
- short i6,
- short i5,
- short i4,
- short i3,
- short i2,
- short i1,
- short i0)
-{
- int16_t __attribute__((aligned(16)))
- data[8] = {i0, i1, i2, i3, i4, i5, i6, i7};
- return vreinterpretq_m128i_s16(vld1q_s16(data));
-}
-
-// Sets the 16 signed 8-bit integer values in reverse order.
-// https://msdn.microsoft.com/en-us/library/2khb9c7k(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_setr_epi8(signed char b0,
- signed char b1,
- signed char b2,
- signed char b3,
- signed char b4,
- signed char b5,
- signed char b6,
- signed char b7,
- signed char b8,
- signed char b9,
- signed char b10,
- signed char b11,
- signed char b12,
- signed char b13,
- signed char b14,
- signed char b15)
-{
- int8_t __attribute__((aligned(16)))
- data[16] = {(int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3,
- (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7,
- (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11,
- (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15};
- return (__m128i) vld1q_s8(data);
-}
-
-// Sets the 4 signed 32-bit integer values to i.
-//
-// r0 := i
-// r1 := i
-// r2 := i
-// r3 := I
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/h4xscxat(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_set1_epi32(int _i)
-{
- return vreinterpretq_m128i_s32(vdupq_n_s32(_i));
-}
-
-// Sets the 2 signed 64-bit integer values to i.
-// https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/whtfzhzk(v=vs.100)
-FORCE_INLINE __m128i _mm_set1_epi64(int64_t _i)
-{
- return vreinterpretq_m128i_s64(vdupq_n_s64(_i));
-}
-
-// Sets the 2 signed 64-bit integer values to i.
-// https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_set1_epi64x&expand=4961
-FORCE_INLINE __m128i _mm_set1_epi64x(int64_t _i)
-{
- return vreinterpretq_m128i_s64(vdupq_n_s64(_i));
-}
-
-// Sets the 4 signed 32-bit integer values.
-// https://msdn.microsoft.com/en-us/library/vstudio/019beekt(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_set_epi32(int i3, int i2, int i1, int i0)
-{
- int32_t __attribute__((aligned(16))) data[4] = {i0, i1, i2, i3};
- return vreinterpretq_m128i_s32(vld1q_s32(data));
-}
-
-// Returns the __m128i structure with its two 64-bit integer values
-// initialized to the values of the two 64-bit integers passed in.
-// https://msdn.microsoft.com/en-us/library/dk2sdw0h(v=vs.120).aspx
-FORCE_INLINE __m128i _mm_set_epi64x(int64_t i1, int64_t i2)
-{
- int64_t __attribute__((aligned(16))) data[2] = {i2, i1};
- return vreinterpretq_m128i_s64(vld1q_s64(data));
-}
-
-// Stores four single-precision, floating-point values.
-// https://msdn.microsoft.com/en-us/library/vstudio/s3h4ay6y(v=vs.100).aspx
-FORCE_INLINE void _mm_store_ps(float *p, __m128 a)
-{
- vst1q_f32(p, vreinterpretq_f32_m128(a));
-}
-
-// Stores four single-precision, floating-point values.
-// https://msdn.microsoft.com/en-us/library/44e30x22(v=vs.100).aspx
-FORCE_INLINE void _mm_storeu_ps(float *p, __m128 a)
-{
- vst1q_f32(p, vreinterpretq_f32_m128(a));
-}
-
-// Stores four 32-bit integer values as (as a __m128i value) at the address p.
-// https://msdn.microsoft.com/en-us/library/vstudio/edk11s13(v=vs.100).aspx
-FORCE_INLINE void _mm_store_si128(__m128i *p, __m128i a)
-{
- vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a));
-}
-
-// Stores four 32-bit integer values as (as a __m128i value) at the address p.
-// https://msdn.microsoft.com/en-us/library/vstudio/edk11s13(v=vs.100).aspx
-FORCE_INLINE void _mm_storeu_si128(__m128i *p, __m128i a)
-{
- vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a));
-}
-
-// Stores the lower single - precision, floating - point value.
-// https://msdn.microsoft.com/en-us/library/tzz10fbx(v=vs.100).aspx
-FORCE_INLINE void _mm_store_ss(float *p, __m128 a)
-{
- vst1q_lane_f32(p, vreinterpretq_f32_m128(a), 0);
-}
-
-// Reads the lower 64 bits of b and stores them into the lower 64 bits of a.
-// https://msdn.microsoft.com/en-us/library/hhwf428f%28v=vs.90%29.aspx
-FORCE_INLINE void _mm_storel_epi64(__m128i *a, __m128i b)
-{
- uint64x1_t hi = vget_high_u64(vreinterpretq_u64_m128i(*a));
- uint64x1_t lo = vget_low_u64(vreinterpretq_u64_m128i(b));
- *a = vreinterpretq_m128i_u64(vcombine_u64(lo, hi));
-}
-
-// Stores the lower two single-precision floating point values of a to the
-// address p.
-//
-// *p0 := a0
-// *p1 := a1
-//
-// https://msdn.microsoft.com/en-us/library/h54t98ks(v=vs.90).aspx
-FORCE_INLINE void _mm_storel_pi(__m64 *p, __m128 a)
-{
- *p = vget_low_f32(a);
-}
-
-// Stores the upper two single-precision, floating-point values of a to the
-// address p.
-//
-// *p0 := a2
-// *p1 := a3
-//
-// https://msdn.microsoft.com/en-us/library/a7525fs8(v%3dvs.90).aspx
-FORCE_INLINE void _mm_storeh_pi(__m64 * p, __m128 a)
-{
- *p = vget_high_f32(a);
-}
-
-// Loads a single single-precision, floating-point value, copying it into all
-// four words
-// https://msdn.microsoft.com/en-us/library/vstudio/5cdkf716(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_load1_ps(const float *p)
-{
- return vreinterpretq_m128_f32(vld1q_dup_f32(p));
-}
-#define _mm_load_ps1 _mm_load1_ps
-
-// Sets the lower two single-precision, floating-point values with 64
-// bits of data loaded from the address p; the upper two values are passed
-// through from a.
-//
-// Return Value
-// r0 := *p0
-// r1 := *p1
-// r2 := a2
-// r3 := a3
-//
-// https://msdn.microsoft.com/en-us/library/s57cyak2(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_loadl_pi(__m128 a, __m64 const *p)
-{
- return vreinterpretq_m128_f32(
- vcombine_f32(vld1_f32((const float32_t *) p), vget_high_f32(a)));
-}
-
-// Sets the upper two single-precision, floating-point values with 64
-// bits of data loaded from the address p; the lower two values are passed
-// through from a.
-//
-// r0 := a0
-// r1 := a1
-// r2 := *p0
-// r3 := *p1
-//
-// https://msdn.microsoft.com/en-us/library/w92wta0x(v%3dvs.100).aspx
-FORCE_INLINE __m128 _mm_loadh_pi(__m128 a, __m64 const *p)
-{
- return vreinterpretq_m128_f32(
- vcombine_f32(vget_low_f32(a), vld1_f32((const float32_t *) p)));
-}
-
-// Loads four single-precision, floating-point values.
-// https://msdn.microsoft.com/en-us/library/vstudio/zzd50xxt(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_load_ps(const float *p)
-{
- return vreinterpretq_m128_f32(vld1q_f32(p));
-}
-
-// Loads four single-precision, floating-point values.
-// https://msdn.microsoft.com/en-us/library/x1b16s7z%28v=vs.90%29.aspx
-FORCE_INLINE __m128 _mm_loadu_ps(const float *p)
-{
- // for neon, alignment doesn't matter, so _mm_load_ps and _mm_loadu_ps are
- // equivalent for neon
- return vreinterpretq_m128_f32(vld1q_f32(p));
-}
-
-// Loads an single - precision, floating - point value into the low word and
-// clears the upper three words.
-// https://msdn.microsoft.com/en-us/library/548bb9h4%28v=vs.90%29.aspx
-FORCE_INLINE __m128 _mm_load_ss(const float *p)
-{
- return vreinterpretq_m128_f32(vsetq_lane_f32(*p, vdupq_n_f32(0), 0));
-}
-
-FORCE_INLINE __m128i _mm_loadl_epi64(__m128i const *p)
-{
- /* Load the lower 64 bits of the value pointed to by p into the
- * lower 64 bits of the result, zeroing the upper 64 bits of the result.
- */
- return vreinterpretq_m128i_s32(vcombine_s32(vld1_s32((int32_t const *) p), vcreate_s32(0)));
-}
-
-// ******************************************
-// Logic/Binary operations
-// ******************************************
-
-// Compares for inequality.
-// https://msdn.microsoft.com/en-us/library/sf44thbx(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_cmpneq_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_u32(vmvnq_u32(
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))));
-}
-
-// Computes the bitwise AND-NOT of the four single-precision, floating-point
-// values of a and b.
-//
-// r0 := ~a0 & b0
-// r1 := ~a1 & b1
-// r2 := ~a2 & b2
-// r3 := ~a3 & b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/68h7wd02(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_andnot_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_s32(
- vbicq_s32(vreinterpretq_s32_m128(b),
- vreinterpretq_s32_m128(a))); // *NOTE* argument swap
-}
-
-// Computes the bitwise AND of the 128-bit value in b and the bitwise NOT of the
-// 128-bit value in a.
-//
-// r := (~a) & b
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/1beaceh8(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_andnot_si128(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- vbicq_s32(vreinterpretq_s32_m128i(b),
- vreinterpretq_s32_m128i(a))); // *NOTE* argument swap
-}
-
-// Computes the bitwise AND of the 128-bit value in a and the 128-bit value in
-// b.
-//
-// r := a & b
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/6d1txsa8(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_and_si128(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- vandq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Computes the bitwise AND of the four single-precision, floating-point values
-// of a and b.
-//
-// r0 := a0 & b0
-// r1 := a1 & b1
-// r2 := a2 & b2
-// r3 := a3 & b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/73ck1xc5(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_and_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_s32(
- vandq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b)));
-}
-
-// Computes the bitwise OR of the four single-precision, floating-point values
-// of a and b.
-// https://msdn.microsoft.com/en-us/library/vstudio/7ctdsyy0(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_or_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_s32(
- vorrq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b)));
-}
-
-// Computes bitwise EXOR (exclusive-or) of the four single-precision,
-// floating-point values of a and b.
-// https://msdn.microsoft.com/en-us/library/ss6k3wk8(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_xor_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_s32(
- veorq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b)));
-}
-
-// Computes the bitwise OR of the 128-bit value in a and the 128-bit value in b.
-//
-// r := a | b
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/ew8ty0db(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_or_si128(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- vorrq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Computes the bitwise XOR of the 128-bit value in a and the 128-bit value in
-// b. https://msdn.microsoft.com/en-us/library/fzt08www(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_xor_si128(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- veorq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Moves the upper two values of B into the lower two values of A.
-//
-// r3 := a3
-// r2 := a2
-// r1 := b3
-// r0 := b2
-FORCE_INLINE __m128 _mm_movehl_ps(__m128 __A, __m128 __B)
-{
- float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(__A));
- float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(__B));
- return vreinterpretq_m128_f32(vcombine_f32(b32, a32));
-}
-
-// Moves the lower two values of B into the upper two values of A.
-//
-// r3 := b1
-// r2 := b0
-// r1 := a1
-// r0 := a0
-FORCE_INLINE __m128 _mm_movelh_ps(__m128 __A, __m128 __B)
-{
- float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(__A));
- float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(__B));
- return vreinterpretq_m128_f32(vcombine_f32(a10, b10));
-}
-
-FORCE_INLINE __m128i _mm_abs_epi32(__m128i a)
-{
- return vreinterpretq_m128i_s32(vabsq_s32(vreinterpretq_s32_m128i(a)));
-}
-
-FORCE_INLINE __m128i _mm_abs_epi16(__m128i a)
-{
- return vreinterpretq_m128i_s16(vabsq_s16(vreinterpretq_s16_m128i(a)));
-}
-
-FORCE_INLINE __m128i _mm_abs_epi8(__m128i a)
-{
- return vreinterpretq_m128i_s8(vabsq_s8(vreinterpretq_s8_m128i(a)));
-}
-
-// Takes the upper 64 bits of a and places it in the low end of the result
-// Takes the lower 64 bits of b and places it into the high end of the result.
-FORCE_INLINE __m128 _mm_shuffle_ps_1032(__m128 a, __m128 b)
-{
- float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a));
- float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b));
- return vreinterpretq_m128_f32(vcombine_f32(a32, b10));
-}
-
-// takes the lower two 32-bit values from a and swaps them and places in high
-// end of result takes the higher two 32 bit values from b and swaps them and
-// places in low end of result.
-FORCE_INLINE __m128 _mm_shuffle_ps_2301(__m128 a, __m128 b)
-{
- float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a)));
- float32x2_t b23 = vrev64_f32(vget_high_f32(vreinterpretq_f32_m128(b)));
- return vreinterpretq_m128_f32(vcombine_f32(a01, b23));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_0321(__m128 a, __m128 b)
-{
- float32x2_t a21 = vget_high_f32(
- vextq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 3));
- float32x2_t b03 = vget_low_f32(
- vextq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b), 3));
- return vreinterpretq_m128_f32(vcombine_f32(a21, b03));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_2103(__m128 a, __m128 b)
-{
- float32x2_t a03 = vget_low_f32(
- vextq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 3));
- float32x2_t b21 = vget_high_f32(
- vextq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b), 3));
- return vreinterpretq_m128_f32(vcombine_f32(a03, b21));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_1010(__m128 a, __m128 b)
-{
- float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a));
- float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b));
- return vreinterpretq_m128_f32(vcombine_f32(a10, b10));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_1001(__m128 a, __m128 b)
-{
- float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a)));
- float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b));
- return vreinterpretq_m128_f32(vcombine_f32(a01, b10));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_0101(__m128 a, __m128 b)
-{
- float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a)));
- float32x2_t b01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(b)));
- return vreinterpretq_m128_f32(vcombine_f32(a01, b01));
-}
-
-// keeps the low 64 bits of b in the low and puts the high 64 bits of a in the
-// high
-FORCE_INLINE __m128 _mm_shuffle_ps_3210(__m128 a, __m128 b)
-{
- float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a));
- float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b));
- return vreinterpretq_m128_f32(vcombine_f32(a10, b32));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_0011(__m128 a, __m128 b)
-{
- float32x2_t a11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 1);
- float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
- return vreinterpretq_m128_f32(vcombine_f32(a11, b00));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_0022(__m128 a, __m128 b)
-{
- float32x2_t a22 =
- vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0);
- float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
- return vreinterpretq_m128_f32(vcombine_f32(a22, b00));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_2200(__m128 a, __m128 b)
-{
- float32x2_t a00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 0);
- float32x2_t b22 =
- vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(b)), 0);
- return vreinterpretq_m128_f32(vcombine_f32(a00, b22));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_3202(__m128 a, __m128 b)
-{
- float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0);
- float32x2_t a22 =
- vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0);
- float32x2_t a02 = vset_lane_f32(a0, a22, 1); /* TODO: use vzip ?*/
- float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b));
- return vreinterpretq_m128_f32(vcombine_f32(a02, b32));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_1133(__m128 a, __m128 b)
-{
- float32x2_t a33 =
- vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 1);
- float32x2_t b11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 1);
- return vreinterpretq_m128_f32(vcombine_f32(a33, b11));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_2010(__m128 a, __m128 b)
-{
- float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a));
- float32_t b2 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 2);
- float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
- float32x2_t b20 = vset_lane_f32(b2, b00, 1);
- return vreinterpretq_m128_f32(vcombine_f32(a10, b20));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_2001(__m128 a, __m128 b)
-{
- float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a)));
- float32_t b2 = vgetq_lane_f32(b, 2);
- float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
- float32x2_t b20 = vset_lane_f32(b2, b00, 1);
- return vreinterpretq_m128_f32(vcombine_f32(a01, b20));
-}
-
-FORCE_INLINE __m128 _mm_shuffle_ps_2032(__m128 a, __m128 b)
-{
- float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a));
- float32_t b2 = vgetq_lane_f32(b, 2);
- float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0);
- float32x2_t b20 = vset_lane_f32(b2, b00, 1);
- return vreinterpretq_m128_f32(vcombine_f32(a32, b20));
-}
-
-// NEON does not support a general purpose permute intrinsic
-// Selects four specific single-precision, floating-point values from a and b,
-// based on the mask i.
-// https://msdn.microsoft.com/en-us/library/vstudio/5f0858x0(v=vs.100).aspx
-#if 0 /* C version */
-FORCE_INLINE __m128 _mm_shuffle_ps_default(__m128 a,
- __m128 b,
- __constrange(0, 255) int imm)
-{
- __m128 ret;
- ret[0] = a[imm & 0x3];
- ret[1] = a[(imm >> 2) & 0x3];
- ret[2] = b[(imm >> 4) & 0x03];
- ret[3] = b[(imm >> 6) & 0x03];
- return ret;
-}
-#endif
-#define _mm_shuffle_ps_default(a, b, imm) \
- __extension__({ \
- float32x4_t ret; \
- ret = vmovq_n_f32( \
- vgetq_lane_f32(vreinterpretq_f32_m128(a), (imm) &0x3)); \
- ret = vsetq_lane_f32( \
- vgetq_lane_f32(vreinterpretq_f32_m128(a), ((imm) >> 2) & 0x3), \
- ret, 1); \
- ret = vsetq_lane_f32( \
- vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 4) & 0x3), \
- ret, 2); \
- ret = vsetq_lane_f32( \
- vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 6) & 0x3), \
- ret, 3); \
- vreinterpretq_m128_f32(ret); \
- })
-
-// FORCE_INLINE __m128 _mm_shuffle_ps(__m128 a, __m128 b, __constrange(0,255)
-// int imm)
-#if defined(__clang__)
-#define _mm_shuffle_ps(a, b, imm) \
- __extension__({ \
- float32x4_t _input1 = vreinterpretq_f32_m128(a); \
- float32x4_t _input2 = vreinterpretq_f32_m128(b); \
- float32x4_t _shuf = \
- __builtin_shufflevector(_input1, _input2, \
- (imm) & 0x3, \
- ((imm) >> 2) & 0x3, \
- (((imm) >> 4) & 0x3) + 4, \
- (((imm) >> 6) & 0x3) + 4); \
- vreinterpretq_m128_f32(_shuf); \
- })
-#else // generic
-#define _mm_shuffle_ps(a, b, imm) \
- __extension__({ \
- __m128 ret; \
- switch (imm) { \
- case _MM_SHUFFLE(1, 0, 3, 2): \
- ret = _mm_shuffle_ps_1032((a), (b)); \
- break; \
- case _MM_SHUFFLE(2, 3, 0, 1): \
- ret = _mm_shuffle_ps_2301((a), (b)); \
- break; \
- case _MM_SHUFFLE(0, 3, 2, 1): \
- ret = _mm_shuffle_ps_0321((a), (b)); \
- break; \
- case _MM_SHUFFLE(2, 1, 0, 3): \
- ret = _mm_shuffle_ps_2103((a), (b)); \
- break; \
- case _MM_SHUFFLE(1, 0, 1, 0): \
- ret = _mm_movelh_ps((a), (b)); \
- break; \
- case _MM_SHUFFLE(1, 0, 0, 1): \
- ret = _mm_shuffle_ps_1001((a), (b)); \
- break; \
- case _MM_SHUFFLE(0, 1, 0, 1): \
- ret = _mm_shuffle_ps_0101((a), (b)); \
- break; \
- case _MM_SHUFFLE(3, 2, 1, 0): \
- ret = _mm_shuffle_ps_3210((a), (b)); \
- break; \
- case _MM_SHUFFLE(0, 0, 1, 1): \
- ret = _mm_shuffle_ps_0011((a), (b)); \
- break; \
- case _MM_SHUFFLE(0, 0, 2, 2): \
- ret = _mm_shuffle_ps_0022((a), (b)); \
- break; \
- case _MM_SHUFFLE(2, 2, 0, 0): \
- ret = _mm_shuffle_ps_2200((a), (b)); \
- break; \
- case _MM_SHUFFLE(3, 2, 0, 2): \
- ret = _mm_shuffle_ps_3202((a), (b)); \
- break; \
- case _MM_SHUFFLE(3, 2, 3, 2): \
- ret = _mm_movehl_ps((b), (a)); \
- break; \
- case _MM_SHUFFLE(1, 1, 3, 3): \
- ret = _mm_shuffle_ps_1133((a), (b)); \
- break; \
- case _MM_SHUFFLE(2, 0, 1, 0): \
- ret = _mm_shuffle_ps_2010((a), (b)); \
- break; \
- case _MM_SHUFFLE(2, 0, 0, 1): \
- ret = _mm_shuffle_ps_2001((a), (b)); \
- break; \
- case _MM_SHUFFLE(2, 0, 3, 2): \
- ret = _mm_shuffle_ps_2032((a), (b)); \
- break; \
- default: \
- ret = _mm_shuffle_ps_default((a), (b), (imm)); \
- break; \
- } \
- ret; \
- })
-#endif // not clang
-
-// Takes the upper 64 bits of a and places it in the low end of the result
-// Takes the lower 64 bits of a and places it into the high end of the result.
-FORCE_INLINE __m128i _mm_shuffle_epi_1032(__m128i a)
-{
- int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a));
- int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a));
- return vreinterpretq_m128i_s32(vcombine_s32(a32, a10));
-}
-
-// takes the lower two 32-bit values from a and swaps them and places in low end
-// of result takes the higher two 32 bit values from a and swaps them and places
-// in high end of result.
-FORCE_INLINE __m128i _mm_shuffle_epi_2301(__m128i a)
-{
- int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a)));
- int32x2_t a23 = vrev64_s32(vget_high_s32(vreinterpretq_s32_m128i(a)));
- return vreinterpretq_m128i_s32(vcombine_s32(a01, a23));
-}
-
-// rotates the least significant 32 bits into the most signficant 32 bits, and
-// shifts the rest down
-FORCE_INLINE __m128i _mm_shuffle_epi_0321(__m128i a)
-{
- return vreinterpretq_m128i_s32(
- vextq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(a), 1));
-}
-
-// rotates the most significant 32 bits into the least signficant 32 bits, and
-// shifts the rest up
-FORCE_INLINE __m128i _mm_shuffle_epi_2103(__m128i a)
-{
- return vreinterpretq_m128i_s32(
- vextq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(a), 3));
-}
-
-// gets the lower 64 bits of a, and places it in the upper 64 bits
-// gets the lower 64 bits of a and places it in the lower 64 bits
-FORCE_INLINE __m128i _mm_shuffle_epi_1010(__m128i a)
-{
- int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a));
- return vreinterpretq_m128i_s32(vcombine_s32(a10, a10));
-}
-
-// gets the lower 64 bits of a, swaps the 0 and 1 elements, and places it in the
-// lower 64 bits gets the lower 64 bits of a, and places it in the upper 64 bits
-FORCE_INLINE __m128i _mm_shuffle_epi_1001(__m128i a)
-{
- int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a)));
- int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a));
- return vreinterpretq_m128i_s32(vcombine_s32(a01, a10));
-}
-
-// gets the lower 64 bits of a, swaps the 0 and 1 elements and places it in the
-// upper 64 bits gets the lower 64 bits of a, swaps the 0 and 1 elements, and
-// places it in the lower 64 bits
-FORCE_INLINE __m128i _mm_shuffle_epi_0101(__m128i a)
-{
- int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a)));
- return vreinterpretq_m128i_s32(vcombine_s32(a01, a01));
-}
-
-FORCE_INLINE __m128i _mm_shuffle_epi_2211(__m128i a)
-{
- int32x2_t a11 = vdup_lane_s32(vget_low_s32(vreinterpretq_s32_m128i(a)), 1);
- int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0);
- return vreinterpretq_m128i_s32(vcombine_s32(a11, a22));
-}
-
-FORCE_INLINE __m128i _mm_shuffle_epi_0122(__m128i a)
-{
- int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0);
- int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a)));
- return vreinterpretq_m128i_s32(vcombine_s32(a22, a01));
-}
-
-FORCE_INLINE __m128i _mm_shuffle_epi_3332(__m128i a)
-{
- int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a));
- int32x2_t a33 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 1);
- return vreinterpretq_m128i_s32(vcombine_s32(a32, a33));
-}
-
-// Shuffle packed 8-bit integers in a according to shuffle control mask in the
-// corresponding 8-bit element of b, and store the results in dst.
-// https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_shuffle_epi8&expand=5146
-FORCE_INLINE __m128i _mm_shuffle_epi8(__m128i a, __m128i b)
-{
- int8x16_t tbl = vreinterpretq_s8_m128i(a); // input a
- uint8x16_t idx = vreinterpretq_u8_m128i(b); // input b
- uint8x16_t idx_masked =
- vandq_u8(idx, vdupq_n_u8(0x8F)); // avoid using meaningless bits
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s8(vqtbl1q_s8(tbl, idx_masked));
-#elif defined(__GNUC__)
-
- int8x16_t ret;
- // %e and %f represent the even and odd D registers
- // respectively.
- __asm__(
- " vtbl.8 %e[ret], {%e[tbl], %f[tbl]}, %e[idx]\n"
- " vtbl.8 %f[ret], {%e[tbl], %f[tbl]}, %f[idx]\n"
- : [ret] "=&w" (ret)
- : [tbl] "w" (tbl), [idx] "w" (idx_masked));
- return vreinterpretq_m128i_s8(ret);
-#else
- // use this line if testing on aarch64
- int8x8x2_t a_split = { vget_low_s8(tbl), vget_high_s8(tbl) };
- return vreinterpretq_m128i_s8(
- vcombine_s8(
- vtbl2_s8(a_split, vget_low_u8(idx_masked)),
- vtbl2_s8(a_split, vget_high_u8(idx_masked))
- )
- );
-#endif
-}
-
-
-#if 0 /* C version */
-FORCE_INLINE __m128i _mm_shuffle_epi32_default(__m128i a,
- __constrange(0, 255) int imm)
-{
- __m128i ret;
- ret[0] = a[imm & 0x3];
- ret[1] = a[(imm >> 2) & 0x3];
- ret[2] = a[(imm >> 4) & 0x03];
- ret[3] = a[(imm >> 6) & 0x03];
- return ret;
-}
-#endif
-#define _mm_shuffle_epi32_default(a, imm) \
- __extension__({ \
- int32x4_t ret; \
- ret = vmovq_n_s32( \
- vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm) &0x3)); \
- ret = vsetq_lane_s32( \
- vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 2) & 0x3), \
- ret, 1); \
- ret = vsetq_lane_s32( \
- vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 4) & 0x3), \
- ret, 2); \
- ret = vsetq_lane_s32( \
- vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 6) & 0x3), \
- ret, 3); \
- vreinterpretq_m128i_s32(ret); \
- })
-
-// FORCE_INLINE __m128i _mm_shuffle_epi32_splat(__m128i a, __constrange(0,255)
-// int imm)
-#if defined(__aarch64__)
-#define _mm_shuffle_epi32_splat(a, imm) \
- __extension__({ \
- vreinterpretq_m128i_s32( \
- vdupq_laneq_s32(vreinterpretq_s32_m128i(a), (imm))); \
- })
-#else
-#define _mm_shuffle_epi32_splat(a, imm) \
- __extension__({ \
- vreinterpretq_m128i_s32( \
- vdupq_n_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)))); \
- })
-#endif
-
-// Shuffles the 4 signed or unsigned 32-bit integers in a as specified by imm.
-// https://msdn.microsoft.com/en-us/library/56f67xbk%28v=vs.90%29.aspx
-// FORCE_INLINE __m128i _mm_shuffle_epi32(__m128i a, __constrange(0,255) int
-// imm)
-#if defined(__clang__)
-#define _mm_shuffle_epi32(a, imm) \
- __extension__({ \
- int32x4_t _input = vreinterpretq_s32_m128i(a); \
- int32x4_t _shuf = \
- __builtin_shufflevector(_input, _input, \
- (imm) & 0x3, ((imm) >> 2) & 0x3, \
- ((imm) >> 4) & 0x3, ((imm) >> 6) & 0x3); \
- vreinterpretq_m128i_s32(_shuf); \
- })
-#else // generic
-#define _mm_shuffle_epi32(a, imm) \
- __extension__({ \
- __m128i ret; \
- switch (imm) { \
- case _MM_SHUFFLE(1, 0, 3, 2): \
- ret = _mm_shuffle_epi_1032((a)); \
- break; \
- case _MM_SHUFFLE(2, 3, 0, 1): \
- ret = _mm_shuffle_epi_2301((a)); \
- break; \
- case _MM_SHUFFLE(0, 3, 2, 1): \
- ret = _mm_shuffle_epi_0321((a)); \
- break; \
- case _MM_SHUFFLE(2, 1, 0, 3): \
- ret = _mm_shuffle_epi_2103((a)); \
- break; \
- case _MM_SHUFFLE(1, 0, 1, 0): \
- ret = _mm_shuffle_epi_1010((a)); \
- break; \
- case _MM_SHUFFLE(1, 0, 0, 1): \
- ret = _mm_shuffle_epi_1001((a)); \
- break; \
- case _MM_SHUFFLE(0, 1, 0, 1): \
- ret = _mm_shuffle_epi_0101((a)); \
- break; \
- case _MM_SHUFFLE(2, 2, 1, 1): \
- ret = _mm_shuffle_epi_2211((a)); \
- break; \
- case _MM_SHUFFLE(0, 1, 2, 2): \
- ret = _mm_shuffle_epi_0122((a)); \
- break; \
- case _MM_SHUFFLE(3, 3, 3, 2): \
- ret = _mm_shuffle_epi_3332((a)); \
- break; \
- case _MM_SHUFFLE(0, 0, 0, 0): \
- ret = _mm_shuffle_epi32_splat((a), 0); \
- break; \
- case _MM_SHUFFLE(1, 1, 1, 1): \
- ret = _mm_shuffle_epi32_splat((a), 1); \
- break; \
- case _MM_SHUFFLE(2, 2, 2, 2): \
- ret = _mm_shuffle_epi32_splat((a), 2); \
- break; \
- case _MM_SHUFFLE(3, 3, 3, 3): \
- ret = _mm_shuffle_epi32_splat((a), 3); \
- break; \
- default: \
- ret = _mm_shuffle_epi32_default((a), (imm)); \
- break; \
- } \
- ret; \
- })
-#endif // not clang
-
-// Shuffles the lower 4 signed or unsigned 16-bit integers in a as specified
-// by imm.
-// https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/y41dkk37(v=vs.100)
-// FORCE_INLINE __m128i _mm_shufflelo_epi16_function(__m128i a,
-// __constrange(0,255) int imm)
-
-#define _mm_shufflelo_epi16_function(a, imm) \
- __extension__({ \
- int16x8_t ret = vreinterpretq_s16_m128i(a); \
- int16x4_t lowBits = vget_low_s16(ret); \
- ret = vsetq_lane_s16(vget_lane_s16(lowBits, (imm) &0x3), ret, 0); \
- ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 2) & 0x3), ret, \
- 1); \
- ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 4) & 0x3), ret, \
- 2); \
- ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 6) & 0x3), ret, \
- 3); \
- vreinterpretq_m128i_s16(ret); \
- })
-
-// FORCE_INLINE __m128i _mm_shufflelo_epi16(__m128i a, __constrange(0,255) int
-// imm)
-#if defined(__clang__)
-#define _mm_shufflelo_epi16(a, imm) \
- __extension__({ \
- int16x8_t _input = vreinterpretq_s16_m128i(a); \
- int16x8_t _shuf = \
- __builtin_shufflevector(_input, _input, \
- ((imm) & 0x3), \
- (((imm) >> 2) & 0x3), \
- (((imm) >> 4) & 0x3), \
- (((imm) >> 6) & 0x3), \
- 4, 5, 6, 7); \
- vreinterpretq_m128i_s16(_shuf); \
- })
-#else // generic
-#define _mm_shufflelo_epi16(a, imm) _mm_shufflelo_epi16_function((a), (imm))
-#endif
-
-// Shuffles the upper 4 signed or unsigned 16-bit integers in a as specified
-// by imm.
-// https://msdn.microsoft.com/en-us/library/13ywktbs(v=vs.100).aspx
-// FORCE_INLINE __m128i _mm_shufflehi_epi16_function(__m128i a,
-// __constrange(0,255) int imm)
-#define _mm_shufflehi_epi16_function(a, imm) \
- __extension__({ \
- int16x8_t ret = vreinterpretq_s16_m128i(a); \
- int16x4_t highBits = vget_high_s16(ret); \
- ret = vsetq_lane_s16(vget_lane_s16(highBits, (imm) &0x3), ret, 4); \
- ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 2) & 0x3), ret, \
- 5); \
- ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 4) & 0x3), ret, \
- 6); \
- ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 6) & 0x3), ret, \
- 7); \
- vreinterpretq_m128i_s16(ret); \
- })
-
-// FORCE_INLINE __m128i _mm_shufflehi_epi16(__m128i a, __constrange(0,255) int
-// imm)
-#if defined(__clang__)
-#define _mm_shufflehi_epi16(a, imm) \
- __extension__({ \
- int16x8_t _input = vreinterpretq_s16_m128i(a); \
- int16x8_t _shuf = \
- __builtin_shufflevector(_input, _input, \
- 0, 1, 2, 3, \
- ((imm) & 0x3) + 4, \
- (((imm) >> 2) & 0x3) + 4, \
- (((imm) >> 4) & 0x3) + 4, \
- (((imm) >> 6) & 0x3) + 4); \
- vreinterpretq_m128i_s16(_shuf); \
- })
-#else // generic
-#define _mm_shufflehi_epi16(a, imm) _mm_shufflehi_epi16_function((a), (imm))
-#endif
-
-// Blend packed 16-bit integers from a and b using control mask imm8, and store
-// the results in dst.
-//
-// FOR j := 0 to 7
-// i := j*16
-// IF imm8[j]
-// dst[i+15:i] := b[i+15:i]
-// ELSE
-// dst[i+15:i] := a[i+15:i]
-// FI
-// ENDFOR
-// FORCE_INLINE __m128i _mm_blend_epi16(__m128i a, __m128i b, __constrange(0,255)
-// int imm)
-#define _mm_blend_epi16(a, b, imm) \
- __extension__({ \
- const uint16_t _mask[8] = { \
- ((imm) & (1 << 0)) ? 0xFFFF : 0x0000, \
- ((imm) & (1 << 1)) ? 0xFFFF : 0x0000, \
- ((imm) & (1 << 2)) ? 0xFFFF : 0x0000, \
- ((imm) & (1 << 3)) ? 0xFFFF : 0x0000, \
- ((imm) & (1 << 4)) ? 0xFFFF : 0x0000, \
- ((imm) & (1 << 5)) ? 0xFFFF : 0x0000, \
- ((imm) & (1 << 6)) ? 0xFFFF : 0x0000, \
- ((imm) & (1 << 7)) ? 0xFFFF : 0x0000 \
- }; \
- uint16x8_t _mask_vec = vld1q_u16(_mask); \
- uint16x8_t _a = vreinterpretq_u16_m128i(a); \
- uint16x8_t _b = vreinterpretq_u16_m128i(b); \
- vreinterpretq_m128i_u16(vbslq_u16(_mask_vec, _b, _a)); \
- })
-
-// Blend packed 8-bit integers from a and b using mask, and store the results in dst.
-//
-// FOR j := 0 to 15
-// i := j*8
-// IF mask[i+7]
-// dst[i+7:i] := b[i+7:i]
-// ELSE
-// dst[i+7:i] := a[i+7:i]
-// FI
-// ENDFOR
-FORCE_INLINE __m128i _mm_blendv_epi8(__m128i _a, __m128i _b, __m128i _mask)
-{
- // Use a signed shift right to create a mask with the sign bit
- uint8x16_t mask = vreinterpretq_u8_s8(vshrq_n_s8(vreinterpretq_s8_m128i(_mask), 7));
- uint8x16_t a = vreinterpretq_u8_m128i(_a);
- uint8x16_t b = vreinterpretq_u8_m128i(_b);
- return vreinterpretq_m128i_u8(vbslq_u8(mask, b, a));
-}
-
-/////////////////////////////////////
-// Shifts
-/////////////////////////////////////
-
-// Shifts the 4 signed 32-bit integers in a right by count bits while shifting
-// in the sign bit.
-//
-// r0 := a0 >> count
-// r1 := a1 >> count
-// r2 := a2 >> count
-// r3 := a3 >> count immediate
-FORCE_INLINE __m128i _mm_srai_epi32(__m128i a, int count)
-{
- return (__m128i) vshlq_s32((int32x4_t) a, vdupq_n_s32(-count));
-}
-
-// Shifts the 8 signed 16-bit integers in a right by count bits while shifting
-// in the sign bit.
-//
-// r0 := a0 >> count
-// r1 := a1 >> count
-// ...
-// r7 := a7 >> count
-FORCE_INLINE __m128i _mm_srai_epi16(__m128i a, int count)
-{
- return (__m128i) vshlq_s16((int16x8_t) a, vdupq_n_s16(-count));
-}
-
-// Shifts the 8 signed or unsigned 16-bit integers in a left by count bits while
-// shifting in zeros.
-//
-// r0 := a0 << count
-// r1 := a1 << count
-// ...
-// r7 := a7 << count
-//
-// https://msdn.microsoft.com/en-us/library/es73bcsy(v=vs.90).aspx
-#define _mm_slli_epi16(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 31) { \
- ret = _mm_setzero_si128(); \
- } else { \
- ret = vreinterpretq_m128i_s16( \
- vshlq_n_s16(vreinterpretq_s16_m128i(a), (imm))); \
- } \
- ret; \
- })
-
-// Shifts the 4 signed or unsigned 32-bit integers in a left by count bits while
-// shifting in zeros. :
-// https://msdn.microsoft.com/en-us/library/z2k3bbtb%28v=vs.90%29.aspx
-// FORCE_INLINE __m128i _mm_slli_epi32(__m128i a, __constrange(0,255) int imm)
-#define _mm_slli_epi32(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 31) { \
- ret = _mm_setzero_si128(); \
- } else { \
- ret = vreinterpretq_m128i_s32( \
- vshlq_n_s32(vreinterpretq_s32_m128i(a), (imm))); \
- } \
- ret; \
- })
-
-// Shift packed 64-bit integers in a left by imm8 while shifting in zeros, and
-// store the results in dst.
-#define _mm_slli_epi64(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 63) { \
- ret = _mm_setzero_si128(); \
- } else { \
- ret = vreinterpretq_m128i_s64( \
- vshlq_n_s64(vreinterpretq_s64_m128i(a), (imm))); \
- } \
- ret; \
- })
-
-// Shifts the 8 signed or unsigned 16-bit integers in a right by count bits
-// while shifting in zeros.
-//
-// r0 := srl(a0, count)
-// r1 := srl(a1, count)
-// ...
-// r7 := srl(a7, count)
-//
-// https://msdn.microsoft.com/en-us/library/6tcwd38t(v=vs.90).aspx
-#define _mm_srli_epi16(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 31) { \
- ret = _mm_setzero_si128(); \
- } else { \
- ret = vreinterpretq_m128i_u16( \
- vshrq_n_u16(vreinterpretq_u16_m128i(a), (imm))); \
- } \
- ret; \
- })
-
-// Shifts the 4 signed or unsigned 32-bit integers in a right by count bits
-// while shifting in zeros.
-// https://msdn.microsoft.com/en-us/library/w486zcfa(v=vs.100).aspx FORCE_INLINE
-// __m128i _mm_srli_epi32(__m128i a, __constrange(0,255) int imm)
-#define _mm_srli_epi32(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 31) { \
- ret = _mm_setzero_si128(); \
- } else { \
- ret = vreinterpretq_m128i_u32( \
- vshrq_n_u32(vreinterpretq_u32_m128i(a), (imm))); \
- } \
- ret; \
- })
-
-// Shift packed 64-bit integers in a right by imm8 while shifting in zeros, and
-// store the results in dst.
-#define _mm_srli_epi64(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 63) { \
- ret = _mm_setzero_si128(); \
- } else { \
- ret = vreinterpretq_m128i_u64( \
- vshrq_n_u64(vreinterpretq_u64_m128i(a), (imm))); \
- } \
- ret; \
- })
-
-// Shifts the 4 signed 32 - bit integers in a right by count bits while shifting
-// in the sign bit.
-// https://msdn.microsoft.com/en-us/library/z1939387(v=vs.100).aspx
-// FORCE_INLINE __m128i _mm_srai_epi32(__m128i a, __constrange(0,255) int imm)
-#define _mm_srai_epi32(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 31) { \
- ret = vreinterpretq_m128i_s32( \
- vshrq_n_s32(vreinterpretq_s32_m128i(a), 16)); \
- ret = vreinterpretq_m128i_s32( \
- vshrq_n_s32(vreinterpretq_s32_m128i(ret), 16)); \
- } else { \
- ret = vreinterpretq_m128i_s32( \
- vshrq_n_s32(vreinterpretq_s32_m128i(a), (imm))); \
- } \
- ret; \
- })
-
-// Shifts the 128 - bit value in a right by imm bytes while shifting in
-// zeros.imm must be an immediate.
-//
-// r := srl(a, imm*8)
-//
-// https://msdn.microsoft.com/en-us/library/305w28yz(v=vs.100).aspx
-// FORCE_INLINE _mm_srli_si128(__m128i a, __constrange(0,255) int imm)
-#define _mm_srli_si128(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 15) { \
- ret = _mm_setzero_si128(); \
- } else { \
- ret = vreinterpretq_m128i_s8( \
- vextq_s8(vreinterpretq_s8_m128i(a), vdupq_n_s8(0), (imm))); \
- } \
- ret; \
- })
-
-// Shifts the 128-bit value in a left by imm bytes while shifting in zeros. imm
-// must be an immediate.
-//
-// r := a << (imm * 8)
-//
-// https://msdn.microsoft.com/en-us/library/34d3k2kt(v=vs.100).aspx
-// FORCE_INLINE __m128i _mm_slli_si128(__m128i a, __constrange(0,255) int imm)
-#define _mm_slli_si128(a, imm) \
- __extension__({ \
- __m128i ret; \
- if ((imm) <= 0) { \
- ret = a; \
- } else if ((imm) > 15) { \
- ret = _mm_setzero_si128(); \
- } else { \
- ret = vreinterpretq_m128i_s8(vextq_s8( \
- vdupq_n_s8(0), vreinterpretq_s8_m128i(a), 16 - (imm))); \
- } \
- ret; \
- })
-
-// Shifts the 8 signed or unsigned 16-bit integers in a left by count bits while
-// shifting in zeros.
-//
-// r0 := a0 << count
-// r1 := a1 << count
-// ...
-// r7 := a7 << count
-//
-// https://msdn.microsoft.com/en-us/library/c79w388h(v%3dvs.90).aspx
-FORCE_INLINE __m128i _mm_sll_epi16(__m128i a, __m128i count)
-{
- uint64_t c = ((SIMDVec *) &count)->m128_u64[0];
- if (c > 15)
- return _mm_setzero_si128();
-
- int16x8_t vc = vdupq_n_s16((int16_t) c);
- return vreinterpretq_m128i_s16(vshlq_s16(vreinterpretq_s16_m128i(a), vc));
-}
-
-// NEON does not provide a version of this function.
-// Creates a 16-bit mask from the most significant bits of the 16 signed or
-// unsigned 8-bit integers in a and zero extends the upper bits.
-// https://msdn.microsoft.com/en-us/library/vstudio/s090c8fk(v=vs.100).aspx
-FORCE_INLINE int _mm_movemask_epi8(__m128i a)
-{
- // Use increasingly wide shifts+adds to collect the sign bits
- // together.
- // Since the widening shifts would be rather confusing to follow in little endian, everything
- // will be illustrated in big endian order instead. This has a different result - the bits
- // would actually be reversed on a big endian machine.
-
- // Starting input (only half the elements are shown):
- // 89 ff 1d c0 00 10 99 33
- uint8x16_t input = vreinterpretq_u8_m128i(a);
-
- // Shift out everything but the sign bits with an unsigned shift right.
- //
- // Bytes of the vector::
- // 89 ff 1d c0 00 10 99 33
- // \ \ \ \ \ \ \ \ high_bits = (uint16x4_t)(input >> 7)
- // | | | | | | | |
- // 01 01 00 01 00 00 01 00
- //
- // Bits of first important lane(s):
- // 10001001 (89)
- // \______
- // |
- // 00000001 (01)
- uint16x8_t high_bits = vreinterpretq_u16_u8(vshrq_n_u8(input, 7));
-
- // Merge the even lanes together with a 16-bit unsigned shift right + add.
- // 'xx' represents garbage data which will be ignored in the final result.
- // In the important bytes, the add functions like a binary OR.
- //
- // 01 01 00 01 00 00 01 00
- // \_ | \_ | \_ | \_ | paired16 = (uint32x4_t)(input + (input >> 7))
- // \| \| \| \|
- // xx 03 xx 01 xx 00 xx 02
- //
- // 00000001 00000001 (01 01)
- // \_______ |
- // \|
- // xxxxxxxx xxxxxx11 (xx 03)
- uint32x4_t paired16 = vreinterpretq_u32_u16(vsraq_n_u16(high_bits, high_bits, 7));
-
- // Repeat with a wider 32-bit shift + add.
- // xx 03 xx 01 xx 00 xx 02
- // \____ | \____ | paired32 = (uint64x1_t)(paired16 + (paired16 >> 14))
- // \| \|
- // xx xx xx 0d xx xx xx 02
- //
- // 00000011 00000001 (03 01)
- // \\_____ ||
- // '----.\||
- // xxxxxxxx xxxx1101 (xx 0d)
- uint64x2_t paired32 = vreinterpretq_u64_u32(vsraq_n_u32(paired16, paired16, 14));
-
- // Last, an even wider 64-bit shift + add to get our result in the low 8 bit lanes.
- // xx xx xx 0d xx xx xx 02
- // \_________ | paired64 = (uint8x8_t)(paired32 + (paired32 >> 28))
- // \|
- // xx xx xx xx xx xx xx d2
- //
- // 00001101 00000010 (0d 02)
- // \ \___ | |
- // '---. \| |
- // xxxxxxxx 11010010 (xx d2)
- uint8x16_t paired64 = vreinterpretq_u8_u64(vsraq_n_u64(paired32, paired32, 28));
-
- // Extract the low 8 bits from each 64-bit lane with 2 8-bit extracts.
- // xx xx xx xx xx xx xx d2
- // || return paired64[0]
- // d2
- // Note: Little endian would return the correct value 4b (01001011) instead.
- return vgetq_lane_u8(paired64, 0) | ((int)vgetq_lane_u8(paired64, 8) << 8);
-}
-
-// NEON does not provide this method
-// Creates a 4-bit mask from the most significant bits of the four
-// single-precision, floating-point values.
-// https://msdn.microsoft.com/en-us/library/vstudio/4490ys29(v=vs.100).aspx
-FORCE_INLINE int _mm_movemask_ps(__m128 a)
-{
- // Uses the exact same method as _mm_movemask_epi8, see that for details
- uint32x4_t input = vreinterpretq_u32_m128(a);
- // Shift out everything but the sign bits with a 32-bit unsigned shift right.
- uint64x2_t high_bits = vreinterpretq_u64_u32(vshrq_n_u32(input, 31));
- // Merge the two pairs together with a 64-bit unsigned shift right + add.
- uint8x16_t paired = vreinterpretq_u8_u64(vsraq_n_u64(high_bits, high_bits, 31));
- // Extract the result.
- return vgetq_lane_u8(paired, 0) | (vgetq_lane_u8(paired, 8) << 2);
-}
-
-// Compute the bitwise AND of 128 bits (representing integer data) in a and
-// mask, and return 1 if the result is zero, otherwise return 0.
-// https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_test_all_zeros&expand=5871
-FORCE_INLINE int _mm_test_all_zeros(__m128i a, __m128i mask)
-{
- int64x2_t a_and_mask =
- vandq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(mask));
- return (vgetq_lane_s64(a_and_mask, 0) | vgetq_lane_s64(a_and_mask, 1)) ? 0
- : 1;
-}
-
-// ******************************************
-// Math operations
-// ******************************************
-
-// Subtracts the four single-precision, floating-point values of a and b.
-//
-// r0 := a0 - b0
-// r1 := a1 - b1
-// r2 := a2 - b2
-// r3 := a3 - b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/1zad2k61(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_sub_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_f32(
- vsubq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Subtract 2 packed 64-bit integers in b from 2 packed 64-bit integers in a,
-// and store the results in dst.
-// r0 := a0 - b0
-// r1 := a1 - b1
-FORCE_INLINE __m128i _mm_sub_epi64(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s64(
- vsubq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b)));
-}
-
-// Subtracts the 4 signed or unsigned 32-bit integers of b from the 4 signed or
-// unsigned 32-bit integers of a.
-//
-// r0 := a0 - b0
-// r1 := a1 - b1
-// r2 := a2 - b2
-// r3 := a3 - b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/fhh866h0(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_sub_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- vsubq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-FORCE_INLINE __m128i _mm_sub_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s16(
- vsubq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-FORCE_INLINE __m128i _mm_sub_epi8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s8(
- vsubq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b)));
-}
-
-// Subtracts the 8 unsigned 16-bit integers of bfrom the 8 unsigned 16-bit
-// integers of a and saturates..
-// https://technet.microsoft.com/en-us/subscriptions/index/f44y0s19(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_subs_epu16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u16(
- vqsubq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b)));
-}
-
-// Subtracts the 16 unsigned 8-bit integers of b from the 16 unsigned 8-bit
-// integers of a and saturates.
-//
-// r0 := UnsignedSaturate(a0 - b0)
-// r1 := UnsignedSaturate(a1 - b1)
-// ...
-// r15 := UnsignedSaturate(a15 - b15)
-//
-// https://technet.microsoft.com/en-us/subscriptions/yadkxc18(v=vs.90)
-FORCE_INLINE __m128i _mm_subs_epu8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vqsubq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b)));
-}
-
-// Subtracts the 8 signed 16-bit integers of b from the 8 signed 16-bit integers
-// of a and saturates.
-//
-// r0 := SignedSaturate(a0 - b0)
-// r1 := SignedSaturate(a1 - b1)
-// ...
-// r7 := SignedSaturate(a7 - b7)
-FORCE_INLINE __m128i _mm_subs_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s16(
- vqsubq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-FORCE_INLINE __m128i _mm_adds_epu16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u16(
- vqaddq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b)));
-}
-
-// Negate packed 8-bit integers in a when the corresponding signed
-// 8-bit integer in b is negative, and store the results in dst.
-// Element in dst are zeroed out when the corresponding element
-// in b is zero.
-//
-// for i in 0..15
-// if b[i] < 0
-// r[i] := -a[i]
-// else if b[i] == 0
-// r[i] := 0
-// else
-// r[i] := a[i]
-// fi
-// done
-FORCE_INLINE __m128i _mm_sign_epi8(__m128i _a, __m128i _b)
-{
- int8x16_t a = vreinterpretq_s8_m128i(_a);
- int8x16_t b = vreinterpretq_s8_m128i(_b);
-
- int8x16_t zero = vdupq_n_s8(0);
- // signed shift right: faster than vclt
- // (b < 0) ? 0xFF : 0
- uint8x16_t ltMask = vreinterpretq_u8_s8(vshrq_n_s8(b, 7));
- // (b == 0) ? 0xFF : 0
- int8x16_t zeroMask = vreinterpretq_s8_u8(vceqq_s8(b, zero));
- // -a
- int8x16_t neg = vnegq_s8(a);
- // bitwise select either a or neg based on ltMask
- int8x16_t masked = vbslq_s8(ltMask, a, neg);
- // res = masked & (~zeroMask)
- int8x16_t res = vbicq_s8(masked, zeroMask);
- return vreinterpretq_m128i_s8(res);
-}
-
-// Negate packed 16-bit integers in a when the corresponding signed
-// 16-bit integer in b is negative, and store the results in dst.
-// Element in dst are zeroed out when the corresponding element
-// in b is zero.
-//
-// for i in 0..7
-// if b[i] < 0
-// r[i] := -a[i]
-// else if b[i] == 0
-// r[i] := 0
-// else
-// r[i] := a[i]
-// fi
-// done
-FORCE_INLINE __m128i _mm_sign_epi16(__m128i _a, __m128i _b)
-{
- int16x8_t a = vreinterpretq_s16_m128i(_a);
- int16x8_t b = vreinterpretq_s16_m128i(_b);
-
- int16x8_t zero = vdupq_n_s16(0);
- // signed shift right: faster than vclt
- // (b < 0) ? 0xFFFF : 0
- uint16x8_t ltMask = vreinterpretq_u16_s16(vshrq_n_s16(b, 15));
- // (b == 0) ? 0xFFFF : 0
- int16x8_t zeroMask = vreinterpretq_s16_u16(vceqq_s16(b, zero));
- // -a
- int16x8_t neg = vnegq_s16(a);
- // bitwise select either a or neg based on ltMask
- int16x8_t masked = vbslq_s16(ltMask, a, neg);
- // res = masked & (~zeroMask)
- int16x8_t res = vbicq_s16(masked, zeroMask);
- return vreinterpretq_m128i_s16(res);
-}
-
-// Negate packed 32-bit integers in a when the corresponding signed
-// 32-bit integer in b is negative, and store the results in dst.
-// Element in dst are zeroed out when the corresponding element
-// in b is zero.
-//
-// for i in 0..3
-// if b[i] < 0
-// r[i] := -a[i]
-// else if b[i] == 0
-// r[i] := 0
-// else
-// r[i] := a[i]
-// fi
-// done
-FORCE_INLINE __m128i _mm_sign_epi32(__m128i _a, __m128i _b)
-{
- int32x4_t a = vreinterpretq_s32_m128i(_a);
- int32x4_t b = vreinterpretq_s32_m128i(_b);
-
- int32x4_t zero = vdupq_n_s32(0);
- // signed shift right: faster than vclt
- // (b < 0) ? 0xFFFFFFFF : 0
- uint32x4_t ltMask = vreinterpretq_u32_s32(vshrq_n_s32(b, 31));
- // (b == 0) ? 0xFFFFFFFF : 0
- int32x4_t zeroMask = vreinterpretq_s32_u32(vceqq_s32(b, zero));
- // neg = -a
- int32x4_t neg = vnegq_s32(a);
- // bitwise select either a or neg based on ltMask
- int32x4_t masked = vbslq_s32(ltMask, a, neg);
- // res = masked & (~zeroMask)
- int32x4_t res = vbicq_s32(masked, zeroMask);
- return vreinterpretq_m128i_s32(res);
-}
-
-// Computes the average of the 16 unsigned 8-bit integers in a and the 16
-// unsigned 8-bit integers in b and rounds.
-//
-// r0 := (a0 + b0) / 2
-// r1 := (a1 + b1) / 2
-// ...
-// r15 := (a15 + b15) / 2
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/8zwh554a(v%3dvs.90).aspx
-FORCE_INLINE __m128i _mm_avg_epu8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vrhaddq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b)));
-}
-
-// Computes the average of the 8 unsigned 16-bit integers in a and the 8
-// unsigned 16-bit integers in b and rounds.
-//
-// r0 := (a0 + b0) / 2
-// r1 := (a1 + b1) / 2
-// ...
-// r7 := (a7 + b7) / 2
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/y13ca3c8(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_avg_epu16(__m128i a, __m128i b)
-{
- return (__m128i) vrhaddq_u16(vreinterpretq_u16_m128i(a),
- vreinterpretq_u16_m128i(b));
-}
-
-// Adds the four single-precision, floating-point values of a and b.
-//
-// r0 := a0 + b0
-// r1 := a1 + b1
-// r2 := a2 + b2
-// r3 := a3 + b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/c9848chc(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_add_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_f32(
- vaddq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// adds the scalar single-precision floating point values of a and b.
-// https://msdn.microsoft.com/en-us/library/be94x2y6(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_add_ss(__m128 a, __m128 b)
-{
- float32_t b0 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 0);
- float32x4_t value = vsetq_lane_f32(b0, vdupq_n_f32(0), 0);
- // the upper values in the result must be the remnants of .
- return vreinterpretq_m128_f32(vaddq_f32(a, value));
-}
-
-// Adds the 4 signed or unsigned 64-bit integers in a to the 4 signed or
-// unsigned 32-bit integers in b.
-// https://msdn.microsoft.com/en-us/library/vstudio/09xs4fkk(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_add_epi64(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s64(
- vaddq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b)));
-}
-
-// Adds the 4 signed or unsigned 32-bit integers in a to the 4 signed or
-// unsigned 32-bit integers in b.
-//
-// r0 := a0 + b0
-// r1 := a1 + b1
-// r2 := a2 + b2
-// r3 := a3 + b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/09xs4fkk(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_add_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- vaddq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Adds the 8 signed or unsigned 16-bit integers in a to the 8 signed or
-// unsigned 16-bit integers in b.
-// https://msdn.microsoft.com/en-us/library/fceha5k4(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_add_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s16(
- vaddq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-// Adds the 16 signed or unsigned 8-bit integers in a to the 16 signed or
-// unsigned 8-bit integers in b.
-// https://technet.microsoft.com/en-us/subscriptions/yc7tcyzs(v=vs.90)
-FORCE_INLINE __m128i _mm_add_epi8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s8(
- vaddq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b)));
-}
-
-// Adds the 8 signed 16-bit integers in a to the 8 signed 16-bit integers in b
-// and saturates.
-//
-// r0 := SignedSaturate(a0 + b0)
-// r1 := SignedSaturate(a1 + b1)
-// ...
-// r7 := SignedSaturate(a7 + b7)
-//
-// https://msdn.microsoft.com/en-us/library/1a306ef8(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_adds_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s16(
- vqaddq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-// Adds the 16 unsigned 8-bit integers in a to the 16 unsigned 8-bit integers in
-// b and saturates..
-// https://msdn.microsoft.com/en-us/library/9hahyddy(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_adds_epu8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vqaddq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b)));
-}
-
-// Multiplies the 8 signed or unsigned 16-bit integers from a by the 8 signed or
-// unsigned 16-bit integers from b.
-//
-// r0 := (a0 * b0)[15:0]
-// r1 := (a1 * b1)[15:0]
-// ...
-// r7 := (a7 * b7)[15:0]
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/9ks1472s(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_mullo_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s16(
- vmulq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-// Multiplies the 4 signed or unsigned 32-bit integers from a by the 4 signed or
-// unsigned 32-bit integers from b.
-// https://msdn.microsoft.com/en-us/library/vstudio/bb531409(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_mullo_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- vmulq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Multiplies the four single-precision, floating-point values of a and b.
-//
-// r0 := a0 * b0
-// r1 := a1 * b1
-// r2 := a2 * b2
-// r3 := a3 * b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/22kbk6t9(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_mul_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_f32(
- vmulq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Multiply the low unsigned 32-bit integers from each packed 64-bit element in
-// a and b, and store the unsigned 64-bit results in dst.
-//
-// r0 := (a0 & 0xFFFFFFFF) * (b0 & 0xFFFFFFFF)
-// r1 := (a2 & 0xFFFFFFFF) * (b2 & 0xFFFFFFFF)
-FORCE_INLINE __m128i _mm_mul_epu32(__m128i a, __m128i b)
-{
- // vmull_u32 upcasts instead of masking, so we downcast.
- uint32x2_t a_lo = vmovn_u64(vreinterpretq_u64_m128i(a));
- uint32x2_t b_lo = vmovn_u64(vreinterpretq_u64_m128i(b));
- return vreinterpretq_m128i_u64(vmull_u32(a_lo, b_lo));
-}
-
-// Multiply the low signed 32-bit integers from each packed 64-bit element in
-// a and b, and store the signed 64-bit results in dst.
-//
-// r0 := (int64_t)(int32_t)a0 * (int64_t)(int32_t)b0
-// r1 := (int64_t)(int32_t)a2 * (int64_t)(int32_t)b2
-FORCE_INLINE __m128i _mm_mul_epi32(__m128i a, __m128i b)
-{
- // vmull_s32 upcasts instead of masking, so we downcast.
- int32x2_t a_lo = vmovn_s64(vreinterpretq_s64_m128i(a));
- int32x2_t b_lo = vmovn_s64(vreinterpretq_s64_m128i(b));
- return vreinterpretq_m128i_s64(vmull_s32(a_lo, b_lo));
-}
-
-// Multiplies the 8 signed 16-bit integers from a by the 8 signed 16-bit
-// integers from b.
-//
-// r0 := (a0 * b0) + (a1 * b1)
-// r1 := (a2 * b2) + (a3 * b3)
-// r2 := (a4 * b4) + (a5 * b5)
-// r3 := (a6 * b6) + (a7 * b7)
-// https://msdn.microsoft.com/en-us/library/yht36sa6(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_madd_epi16(__m128i a, __m128i b)
-{
- int32x4_t low = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)),
- vget_low_s16(vreinterpretq_s16_m128i(b)));
- int32x4_t high = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)),
- vget_high_s16(vreinterpretq_s16_m128i(b)));
-
- int32x2_t low_sum = vpadd_s32(vget_low_s32(low), vget_high_s32(low));
- int32x2_t high_sum = vpadd_s32(vget_low_s32(high), vget_high_s32(high));
-
- return vreinterpretq_m128i_s32(vcombine_s32(low_sum, high_sum));
-}
-
-// Multiply packed signed 16-bit integers in a and b, producing intermediate signed
-// 32-bit integers. Shift right by 15 bits while rounding up, and store the
-// packed 16-bit integers in dst.
-//
-// r0 := Round(((int32_t)a0 * (int32_t)b0) >> 15)
-// r1 := Round(((int32_t)a1 * (int32_t)b1) >> 15)
-// r2 := Round(((int32_t)a2 * (int32_t)b2) >> 15)
-// ...
-// r7 := Round(((int32_t)a7 * (int32_t)b7) >> 15)
-FORCE_INLINE __m128i _mm_mulhrs_epi16(__m128i a, __m128i b)
-{
- // Has issues due to saturation
- // return vreinterpretq_m128i_s16(vqrdmulhq_s16(a, b));
-
- // Multiply
- int32x4_t mul_lo = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)),
- vget_low_s16(vreinterpretq_s16_m128i(b)));
- int32x4_t mul_hi = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)),
- vget_high_s16(vreinterpretq_s16_m128i(b)));
-
- // Rounding narrowing shift right
- // narrow = (int16_t)((mul + 16384) >> 15);
- int16x4_t narrow_lo = vrshrn_n_s32(mul_lo, 15);
- int16x4_t narrow_hi = vrshrn_n_s32(mul_hi, 15);
-
- // Join together
- return vreinterpretq_m128i_s16(vcombine_s16(narrow_lo, narrow_hi));
-}
-
-// Vertically multiply each unsigned 8-bit integer from a with the corresponding
-// signed 8-bit integer from b, producing intermediate signed 16-bit integers.
-// Horizontally add adjacent pairs of intermediate signed 16-bit integers,
-// and pack the saturated results in dst.
-//
-// FOR j := 0 to 7
-// i := j*16
-// dst[i+15:i] := Saturate_To_Int16( a[i+15:i+8]*b[i+15:i+8] + a[i+7:i]*b[i+7:i] )
-// ENDFOR
-FORCE_INLINE __m128i _mm_maddubs_epi16(__m128i _a, __m128i _b)
-{
- // This would be much simpler if x86 would choose to zero extend OR sign extend,
- // not both.
- // This could probably be optimized better.
- uint16x8_t a = vreinterpretq_u16_m128i(_a);
- int16x8_t b = vreinterpretq_s16_m128i(_b);
-
- // Zero extend a
- int16x8_t a_odd = vreinterpretq_s16_u16(vshrq_n_u16(a, 8));
- int16x8_t a_even = vreinterpretq_s16_u16(vbicq_u16(a, vdupq_n_u16(0xff00)));
-
- // Sign extend by shifting left then shifting right.
- int16x8_t b_even = vshrq_n_s16(vshlq_n_s16(b, 8), 8);
- int16x8_t b_odd = vshrq_n_s16(b, 8);
-
- // multiply
- int16x8_t prod1 = vmulq_s16(a_even, b_even);
- int16x8_t prod2 = vmulq_s16(a_odd, b_odd);
-
- // saturated add
- return vreinterpretq_m128i_s16(vqaddq_s16(prod1, prod2));
-}
-
-// Computes the absolute difference of the 16 unsigned 8-bit integers from a
-// and the 16 unsigned 8-bit integers from b.
-//
-// Return Value
-// Sums the upper 8 differences and lower 8 differences and packs the
-// resulting 2 unsigned 16-bit integers into the upper and lower 64-bit
-// elements.
-//
-// r0 := abs(a0 - b0) + abs(a1 - b1) +...+ abs(a7 - b7)
-// r1 := 0x0
-// r2 := 0x0
-// r3 := 0x0
-// r4 := abs(a8 - b8) + abs(a9 - b9) +...+ abs(a15 - b15)
-// r5 := 0x0
-// r6 := 0x0
-// r7 := 0x0
-FORCE_INLINE __m128i _mm_sad_epu8(__m128i a, __m128i b)
-{
- uint16x8_t t = vpaddlq_u8(vabdq_u8((uint8x16_t) a, (uint8x16_t) b));
- uint16_t r0 = t[0] + t[1] + t[2] + t[3];
- uint16_t r4 = t[4] + t[5] + t[6] + t[7];
- uint16x8_t r = vsetq_lane_u16(r0, vdupq_n_u16(0), 0);
- return (__m128i) vsetq_lane_u16(r4, r, 4);
-}
-
-// Divides the four single-precision, floating-point values of a and b.
-//
-// r0 := a0 / b0
-// r1 := a1 / b1
-// r2 := a2 / b2
-// r3 := a3 / b3
-//
-// https://msdn.microsoft.com/en-us/library/edaw8147(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_div_ps(__m128 a, __m128 b)
-{
- float32x4_t recip0 = vrecpeq_f32(vreinterpretq_f32_m128(b));
- float32x4_t recip1 =
- vmulq_f32(recip0, vrecpsq_f32(recip0, vreinterpretq_f32_m128(b)));
- return vreinterpretq_m128_f32(vmulq_f32(vreinterpretq_f32_m128(a), recip1));
-}
-
-// Divides the scalar single-precision floating point value of a by b.
-// https://msdn.microsoft.com/en-us/library/4y73xa49(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_div_ss(__m128 a, __m128 b)
-{
- float32_t value =
- vgetq_lane_f32(vreinterpretq_f32_m128(_mm_div_ps(a, b)), 0);
- return vreinterpretq_m128_f32(
- vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0));
-}
-
-// This version does additional iterations to improve accuracy. Between 1 and 4
-// recommended. Computes the approximations of reciprocals of the four
-// single-precision, floating-point values of a.
-// https://msdn.microsoft.com/en-us/library/vstudio/796k1tty(v=vs.100).aspx
-FORCE_INLINE __m128 recipq_newton(__m128 in, int n)
-{
- int i;
- float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(in));
- for (i = 0; i < n; ++i) {
- recip =
- vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in)));
- }
- return vreinterpretq_m128_f32(recip);
-}
-
-// Computes the approximations of reciprocals of the four single-precision,
-// floating-point values of a.
-// https://msdn.microsoft.com/en-us/library/vstudio/796k1tty(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_rcp_ps(__m128 in)
-{
- float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(in));
- recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in)));
- return vreinterpretq_m128_f32(recip);
-}
-
-// Computes the approximations of square roots of the four single-precision,
-// floating-point values of a. First computes reciprocal square roots and then
-// reciprocals of the four values.
-//
-// r0 := sqrt(a0)
-// r1 := sqrt(a1)
-// r2 := sqrt(a2)
-// r3 := sqrt(a3)
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/8z67bwwk(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_sqrt_ps(__m128 in)
-{
- float32x4_t recipsq = vrsqrteq_f32(vreinterpretq_f32_m128(in));
- float32x4_t sq = vrecpeq_f32(recipsq);
- // ??? use step versions of both sqrt and recip for better accuracy?
- return vreinterpretq_m128_f32(sq);
-}
-
-// Computes the approximation of the square root of the scalar single-precision
-// floating point value of in.
-// https://msdn.microsoft.com/en-us/library/ahfsc22d(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_sqrt_ss(__m128 in)
-{
- float32_t value =
- vgetq_lane_f32(vreinterpretq_f32_m128(_mm_sqrt_ps(in)), 0);
- return vreinterpretq_m128_f32(
- vsetq_lane_f32(value, vreinterpretq_f32_m128(in), 0));
-}
-
-// Computes the approximations of the reciprocal square roots of the four
-// single-precision floating point values of in.
-// https://msdn.microsoft.com/en-us/library/22hfsh53(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_rsqrt_ps(__m128 in)
-{
- return vreinterpretq_m128_f32(vrsqrteq_f32(vreinterpretq_f32_m128(in)));
-}
-
-// Computes the maximums of the four single-precision, floating-point values of
-// a and b.
-// https://msdn.microsoft.com/en-us/library/vstudio/ff5d607a(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_max_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_f32(
- vmaxq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Computes the minima of the four single-precision, floating-point values of a
-// and b.
-// https://msdn.microsoft.com/en-us/library/vstudio/wh13kadz(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_min_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_f32(
- vminq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Computes the maximum of the two lower scalar single-precision floating point
-// values of a and b.
-// https://msdn.microsoft.com/en-us/library/s6db5esz(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_max_ss(__m128 a, __m128 b)
-{
- float32_t value = vgetq_lane_f32(
- vmaxq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)), 0);
- return vreinterpretq_m128_f32(
- vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0));
-}
-
-// Computes the minimum of the two lower scalar single-precision floating point
-// values of a and b.
-// https://msdn.microsoft.com/en-us/library/0a9y7xaa(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_min_ss(__m128 a, __m128 b)
-{
- float32_t value = vgetq_lane_f32(
- vminq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)), 0);
- return vreinterpretq_m128_f32(
- vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0));
-}
-
-// Computes the pairwise maxima of the 16 unsigned 8-bit integers from a and the
-// 16 unsigned 8-bit integers from b.
-// https://msdn.microsoft.com/en-us/library/st6634za(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_max_epu8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vmaxq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b)));
-}
-
-// Computes the pairwise minima of the 16 unsigned 8-bit integers from a and the
-// 16 unsigned 8-bit integers from b.
-// https://msdn.microsoft.com/ko-kr/library/17k8cf58(v=vs.100).aspxx
-FORCE_INLINE __m128i _mm_min_epu8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vminq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b)));
-}
-
-// Computes the pairwise minima of the 8 signed 16-bit integers from a and the 8
-// signed 16-bit integers from b.
-// https://msdn.microsoft.com/en-us/library/vstudio/6te997ew(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_min_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s16(
- vminq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-// Computes the pairwise maxima of the 8 signed 16-bit integers from a and the 8
-// signed 16-bit integers from b.
-// https://msdn.microsoft.com/en-us/LIBRary/3x060h7c(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_max_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s16(
- vmaxq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-// epi versions of min/max
-// Computes the pariwise maximums of the four signed 32-bit integer values of a
-// and b.
-//
-// A 128-bit parameter that can be defined with the following equations:
-// r0 := (a0 > b0) ? a0 : b0
-// r1 := (a1 > b1) ? a1 : b1
-// r2 := (a2 > b2) ? a2 : b2
-// r3 := (a3 > b3) ? a3 : b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/bb514055(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_max_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- vmaxq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Computes the pariwise minima of the four signed 32-bit integer values of a
-// and b.
-//
-// A 128-bit parameter that can be defined with the following equations:
-// r0 := (a0 < b0) ? a0 : b0
-// r1 := (a1 < b1) ? a1 : b1
-// r2 := (a2 < b2) ? a2 : b2
-// r3 := (a3 < b3) ? a3 : b3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/bb531476(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_min_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s32(
- vminq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Multiplies the 8 signed 16-bit integers from a by the 8 signed 16-bit
-// integers from b.
-//
-// r0 := (a0 * b0)[31:16]
-// r1 := (a1 * b1)[31:16]
-// ...
-// r7 := (a7 * b7)[31:16]
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/59hddw1d(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_mulhi_epi16(__m128i a, __m128i b)
-{
- /* FIXME: issue with large values because of result saturation */
- // int16x8_t ret = vqdmulhq_s16(vreinterpretq_s16_m128i(a),
- // vreinterpretq_s16_m128i(b)); /* =2*a*b */ return
- // vreinterpretq_m128i_s16(vshrq_n_s16(ret, 1));
- int16x4_t a3210 = vget_low_s16(vreinterpretq_s16_m128i(a));
- int16x4_t b3210 = vget_low_s16(vreinterpretq_s16_m128i(b));
- int32x4_t ab3210 = vmull_s16(a3210, b3210); /* 3333222211110000 */
- int16x4_t a7654 = vget_high_s16(vreinterpretq_s16_m128i(a));
- int16x4_t b7654 = vget_high_s16(vreinterpretq_s16_m128i(b));
- int32x4_t ab7654 = vmull_s16(a7654, b7654); /* 7777666655554444 */
- uint16x8x2_t r =
- vuzpq_u16(vreinterpretq_u16_s32(ab3210), vreinterpretq_u16_s32(ab7654));
- return vreinterpretq_m128i_u16(r.val[1]);
-}
-
-// Computes pairwise add of each argument as single-precision, floating-point
-// values a and b.
-// https://msdn.microsoft.com/en-us/library/yd9wecaa.aspx
-FORCE_INLINE __m128 _mm_hadd_ps(__m128 a, __m128 b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128_f32(vpaddq_f32(
- vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); // AArch64
-#else
- float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a));
- float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a));
- float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b));
- float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b));
- return vreinterpretq_m128_f32(
- vcombine_f32(vpadd_f32(a10, a32), vpadd_f32(b10, b32)));
-#endif
-}
-
-// Computes pairwise add of each argument as a 16-bit signed or unsigned integer
-// values a and b.
-FORCE_INLINE __m128i _mm_hadd_epi16(__m128i _a, __m128i _b)
-{
- int16x8_t a = vreinterpretq_s16_m128i(_a);
- int16x8_t b = vreinterpretq_s16_m128i(_b);
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s16(vpaddq_s16(a, b));
-#else
- return vreinterpretq_m128i_s16(
- vcombine_s16(
- vpadd_s16(vget_low_s16(a), vget_high_s16(a)),
- vpadd_s16(vget_low_s16(b), vget_high_s16(b))
- )
- );
-#endif
-}
-
-// Computes pairwise difference of each argument as a 16-bit signed or unsigned integer
-// values a and b.
-FORCE_INLINE __m128i _mm_hsub_epi16(__m128i _a, __m128i _b)
-{
- int32x4_t a = vreinterpretq_s32_m128i(_a);
- int32x4_t b = vreinterpretq_s32_m128i(_b);
- // Interleave using vshrn/vmovn
- // [a0|a2|a4|a6|b0|b2|b4|b6]
- // [a1|a3|a5|a7|b1|b3|b5|b7]
- int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b));
- int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16));
- // Subtract
- return vreinterpretq_m128i_s16(vsubq_s16(ab0246, ab1357));
-}
-
-// Computes saturated pairwise sub of each argument as a 16-bit signed
-// integer values a and b.
-FORCE_INLINE __m128i _mm_hadds_epi16(__m128i _a, __m128i _b)
-{
- int32x4_t a = vreinterpretq_s32_m128i(_a);
- int32x4_t b = vreinterpretq_s32_m128i(_b);
- // Interleave using vshrn/vmovn
- // [a0|a2|a4|a6|b0|b2|b4|b6]
- // [a1|a3|a5|a7|b1|b3|b5|b7]
- int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b));
- int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16));
- // Saturated add
- return vreinterpretq_m128i_s16(vqaddq_s16(ab0246, ab1357));
-}
-
-// Computes saturated pairwise difference of each argument as a 16-bit signed
-// integer values a and b.
-FORCE_INLINE __m128i _mm_hsubs_epi16(__m128i _a, __m128i _b)
-{
- int32x4_t a = vreinterpretq_s32_m128i(_a);
- int32x4_t b = vreinterpretq_s32_m128i(_b);
- // Interleave using vshrn/vmovn
- // [a0|a2|a4|a6|b0|b2|b4|b6]
- // [a1|a3|a5|a7|b1|b3|b5|b7]
- int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b));
- int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16));
- // Saturated subtract
- return vreinterpretq_m128i_s16(vqsubq_s16(ab0246, ab1357));
-}
-
-// Computes pairwise add of each argument as a 32-bit signed or unsigned integer
-// values a and b.
-FORCE_INLINE __m128i _mm_hadd_epi32(__m128i _a, __m128i _b)
-{
- int32x4_t a = vreinterpretq_s32_m128i(_a);
- int32x4_t b = vreinterpretq_s32_m128i(_b);
- return vreinterpretq_m128i_s32(
- vcombine_s32(
- vpadd_s32(vget_low_s32(a), vget_high_s32(a)),
- vpadd_s32(vget_low_s32(b), vget_high_s32(b))
- )
- );
-}
-
-// Computes pairwise difference of each argument as a 32-bit signed or unsigned integer
-// values a and b.
-FORCE_INLINE __m128i _mm_hsub_epi32(__m128i _a, __m128i _b)
-{
- int64x2_t a = vreinterpretq_s64_m128i(_a);
- int64x2_t b = vreinterpretq_s64_m128i(_b);
- // Interleave using vshrn/vmovn
- // [a0|a2|b0|b2]
- // [a1|a2|b1|b3]
- int32x4_t ab02 = vcombine_s32(vmovn_s64(a), vmovn_s64(b));
- int32x4_t ab13 = vcombine_s32(vshrn_n_s64(a, 32), vshrn_n_s64(b, 32));
- // Subtract
- return vreinterpretq_m128i_s32(vsubq_s32(ab02, ab13));
-}
-
-// ******************************************
-// Compare operations
-// ******************************************
-
-// Compares for less than
-// https://msdn.microsoft.com/en-us/library/vstudio/f330yhc8(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_cmplt_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_u32(
- vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Compares for greater than.
-//
-// r0 := (a0 > b0) ? 0xffffffff : 0x0
-// r1 := (a1 > b1) ? 0xffffffff : 0x0
-// r2 := (a2 > b2) ? 0xffffffff : 0x0
-// r3 := (a3 > b3) ? 0xffffffff : 0x0
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/11dy102s(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_cmpgt_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_u32(
- vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Compares for greater than or equal.
-// https://msdn.microsoft.com/en-us/library/vstudio/fs813y2t(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_cmpge_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_u32(
- vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Compares for less than or equal.
-//
-// r0 := (a0 <= b0) ? 0xffffffff : 0x0
-// r1 := (a1 <= b1) ? 0xffffffff : 0x0
-// r2 := (a2 <= b2) ? 0xffffffff : 0x0
-// r3 := (a3 <= b3) ? 0xffffffff : 0x0
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/1s75w83z(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_cmple_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_u32(
- vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Compares for equality.
-// https://msdn.microsoft.com/en-us/library/vstudio/36aectz5(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_cmpeq_ps(__m128 a, __m128 b)
-{
- return vreinterpretq_m128_u32(
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-}
-
-// Compares the 16 signed or unsigned 8-bit integers in a and the 16 signed or
-// unsigned 8-bit integers in b for equality.
-// https://msdn.microsoft.com/en-us/library/windows/desktop/bz5xk21a(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_cmpeq_epi8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vceqq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b)));
-}
-
-// Compares the 8 signed or unsigned 16-bit integers in a and the 8 signed or
-// unsigned 16-bit integers in b for equality.
-// https://msdn.microsoft.com/en-us/library/2ay060te(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_cmpeq_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u16(
- vceqq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-// Compare packed 32-bit integers in a and b for equality, and store the results
-// in dst
-FORCE_INLINE __m128i _mm_cmpeq_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u32(
- vceqq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Compare packed 64-bit integers in a and b for equality, and store the results
-// in dst
-FORCE_INLINE __m128i _mm_cmpeq_epi64(__m128i a, __m128i b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_u64(
- vceqq_u64(vreinterpretq_u64_m128i(a), vreinterpretq_u64_m128i(b)));
-#else
- // ARMv7 lacks vceqq_u64
- // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi)
- uint32x4_t cmp = vceqq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(b));
- uint32x4_t swapped = vrev64q_u32(cmp);
- return vreinterpretq_m128i_u32(vandq_u32(cmp, swapped));
-#endif
-}
-
-// Compares the 16 signed 8-bit integers in a and the 16 signed 8-bit integers
-// in b for lesser than.
-// https://msdn.microsoft.com/en-us/library/windows/desktop/9s46csht(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_cmplt_epi8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vcltq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b)));
-}
-
-// Compares the 16 signed 8-bit integers in a and the 16 signed 8-bit integers
-// in b for greater than.
-//
-// r0 := (a0 > b0) ? 0xff : 0x0
-// r1 := (a1 > b1) ? 0xff : 0x0
-// ...
-// r15 := (a15 > b15) ? 0xff : 0x0
-//
-// https://msdn.microsoft.com/zh-tw/library/wf45zt2b(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_cmpgt_epi8(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vcgtq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b)));
-}
-
-// Compares the 8 signed 16-bit integers in a and the 8 signed 16-bit integers
-// in b for less than.
-//
-// r0 := (a0 < b0) ? 0xffff : 0x0
-// r1 := (a1 < b1) ? 0xffff : 0x0
-// ...
-// r7 := (a7 < b7) ? 0xffff : 0x0
-//
-// https://technet.microsoft.com/en-us/library/t863edb2(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_cmplt_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u16(
- vcltq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-// Compares the 8 signed 16-bit integers in a and the 8 signed 16-bit integers
-// in b for greater than.
-//
-// r0 := (a0 > b0) ? 0xffff : 0x0
-// r1 := (a1 > b1) ? 0xffff : 0x0
-// ...
-// r7 := (a7 > b7) ? 0xffff : 0x0
-//
-// https://technet.microsoft.com/en-us/library/xd43yfsa(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_cmpgt_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u16(
- vcgtq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-}
-
-
-// Compares the 4 signed 32-bit integers in a and the 4 signed 32-bit integers
-// in b for less than.
-// https://msdn.microsoft.com/en-us/library/vstudio/4ak0bf5d(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_cmplt_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u32(
- vcltq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Compares the 4 signed 32-bit integers in a and the 4 signed 32-bit integers
-// in b for greater than.
-// https://msdn.microsoft.com/en-us/library/vstudio/1s9f2z0y(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_cmpgt_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u32(
- vcgtq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-}
-
-// Compares the 2 signed 64-bit integers in a and the 2 signed 64-bit integers
-// in b for greater than.
-FORCE_INLINE __m128i _mm_cmpgt_epi64(__m128i a, __m128i b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_u64(
- vcgtq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b)));
-#else
- // ARMv7 lacks vcgtq_s64.
- // This is based off of Clang's SSE2 polyfill:
- // (a > b) -> ((a_hi > b_hi) || (a_lo > b_lo && a_hi == b_hi))
-
- // Mask the sign bit out since we need a signed AND an unsigned comparison
- // and it is ugly to try and split them.
- int32x4_t mask = vreinterpretq_s32_s64(vdupq_n_s64(0x80000000ull));
- int32x4_t a_mask = veorq_s32(vreinterpretq_s32_m128i(a), mask);
- int32x4_t b_mask = veorq_s32(vreinterpretq_s32_m128i(b), mask);
- // Check if a > b
- int64x2_t greater = vreinterpretq_s64_u32(vcgtq_s32(a_mask, b_mask));
- // Copy upper mask to lower mask
- // a_hi > b_hi
- int64x2_t gt_hi = vshrq_n_s64(greater, 63);
- // Copy lower mask to upper mask
- // a_lo > b_lo
- int64x2_t gt_lo = vsliq_n_s64(greater, greater, 32);
- // Compare for equality
- int64x2_t equal = vreinterpretq_s64_u32(vceqq_s32(a_mask, b_mask));
- // Copy upper mask to lower mask
- // a_hi == b_hi
- int64x2_t eq_hi = vshrq_n_s64(equal, 63);
- // a_hi > b_hi || (a_lo > b_lo && a_hi == b_hi)
- int64x2_t ret = vorrq_s64(gt_hi, vandq_s64(gt_lo, eq_hi));
- return vreinterpretq_m128i_s64(ret);
-#endif
-}
-// Compares the four 32-bit floats in a and b to check if any values are NaN.
-// Ordered compare between each value returns true for "orderable" and false for
-// "not orderable" (NaN).
-// https://msdn.microsoft.com/en-us/library/vstudio/0h9w00fx(v=vs.100).aspx see
-// also:
-// http://stackoverflow.com/questions/8627331/what-does-ordered-unordered-comparison-mean
-// http://stackoverflow.com/questions/29349621/neon-isnanval-intrinsics
-FORCE_INLINE __m128 _mm_cmpord_ps(__m128 a, __m128 b)
-{
- // Note: NEON does not have ordered compare builtin
- // Need to compare a eq a and b eq b to check for NaN
- // Do AND of results to get final
- uint32x4_t ceqaa =
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a));
- uint32x4_t ceqbb =
- vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b));
- return vreinterpretq_m128_u32(vandq_u32(ceqaa, ceqbb));
-}
-
-// Compares the lower single-precision floating point scalar values of a and b
-// using a less than operation. :
-// https://msdn.microsoft.com/en-us/library/2kwe606b(v=vs.90).aspx Important
-// note!! The documentation on MSDN is incorrect! If either of the values is a
-// NAN the docs say you will get a one, but in fact, it will return a zero!!
-FORCE_INLINE int _mm_comilt_ss(__m128 a, __m128 b)
-{
- uint32x4_t a_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a));
- uint32x4_t b_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b));
- uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan);
- uint32x4_t a_lt_b =
- vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b));
- return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_lt_b), 0) != 0) ? 1 : 0;
-}
-
-// Compares the lower single-precision floating point scalar values of a and b
-// using a greater than operation. :
-// https://msdn.microsoft.com/en-us/library/b0738e0t(v=vs.100).aspx
-FORCE_INLINE int _mm_comigt_ss(__m128 a, __m128 b)
-{
- // return vgetq_lane_u32(vcgtq_f32(vreinterpretq_f32_m128(a),
- // vreinterpretq_f32_m128(b)), 0);
- uint32x4_t a_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a));
- uint32x4_t b_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b));
- uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan);
- uint32x4_t a_gt_b =
- vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b));
- return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_gt_b), 0) != 0) ? 1 : 0;
-}
-
-// Compares the lower single-precision floating point scalar values of a and b
-// using a less than or equal operation. :
-// https://msdn.microsoft.com/en-us/library/1w4t7c57(v=vs.90).aspx
-FORCE_INLINE int _mm_comile_ss(__m128 a, __m128 b)
-{
- // return vgetq_lane_u32(vcleq_f32(vreinterpretq_f32_m128(a),
- // vreinterpretq_f32_m128(b)), 0);
- uint32x4_t a_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a));
- uint32x4_t b_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b));
- uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan);
- uint32x4_t a_le_b =
- vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b));
- return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_le_b), 0) != 0) ? 1 : 0;
-}
-
-// Compares the lower single-precision floating point scalar values of a and b
-// using a greater than or equal operation. :
-// https://msdn.microsoft.com/en-us/library/8t80des6(v=vs.100).aspx
-FORCE_INLINE int _mm_comige_ss(__m128 a, __m128 b)
-{
- // return vgetq_lane_u32(vcgeq_f32(vreinterpretq_f32_m128(a),
- // vreinterpretq_f32_m128(b)), 0);
- uint32x4_t a_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a));
- uint32x4_t b_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b));
- uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan);
- uint32x4_t a_ge_b =
- vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b));
- return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_ge_b), 0) != 0) ? 1 : 0;
-}
-
-// Compares the lower single-precision floating point scalar values of a and b
-// using an equality operation. :
-// https://msdn.microsoft.com/en-us/library/93yx2h2b(v=vs.100).aspx
-FORCE_INLINE int _mm_comieq_ss(__m128 a, __m128 b)
-{
- // return vgetq_lane_u32(vceqq_f32(vreinterpretq_f32_m128(a),
- // vreinterpretq_f32_m128(b)), 0);
- uint32x4_t a_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a));
- uint32x4_t b_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b));
- uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan);
- uint32x4_t a_eq_b =
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b));
- return (vgetq_lane_u32(vandq_u32(a_and_b_not_nan, a_eq_b), 0) != 0) ? 1 : 0;
-}
-
-// Compares the lower single-precision floating point scalar values of a and b
-// using an inequality operation. :
-// https://msdn.microsoft.com/en-us/library/bafh5e0a(v=vs.90).aspx
-FORCE_INLINE int _mm_comineq_ss(__m128 a, __m128 b)
-{
- // return !vgetq_lane_u32(vceqq_f32(vreinterpretq_f32_m128(a),
- // vreinterpretq_f32_m128(b)), 0);
- uint32x4_t a_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a));
- uint32x4_t b_not_nan =
- vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b));
- uint32x4_t a_or_b_nan = vmvnq_u32(vandq_u32(a_not_nan, b_not_nan));
- uint32x4_t a_neq_b = vmvnq_u32(
- vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
- return (vgetq_lane_u32(vorrq_u32(a_or_b_nan, a_neq_b), 0) != 0) ? 1 : 0;
-}
-
-// according to the documentation, these intrinsics behave the same as the
-// non-'u' versions. We'll just alias them here.
-#define _mm_ucomilt_ss _mm_comilt_ss
-#define _mm_ucomile_ss _mm_comile_ss
-#define _mm_ucomigt_ss _mm_comigt_ss
-#define _mm_ucomige_ss _mm_comige_ss
-#define _mm_ucomieq_ss _mm_comieq_ss
-#define _mm_ucomineq_ss _mm_comineq_ss
-
-// ******************************************
-// Conversions
-// ******************************************
-
-// Converts the four single-precision, floating-point values of a to signed
-// 32-bit integer values using truncate.
-// https://msdn.microsoft.com/en-us/library/vstudio/1h005y6x(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_cvttps_epi32(__m128 a)
-{
- return vreinterpretq_m128i_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a)));
-}
-
-// Converts the four signed 32-bit integer values of a to single-precision,
-// floating-point values
-// https://msdn.microsoft.com/en-us/library/vstudio/36bwxcx5(v=vs.100).aspx
-FORCE_INLINE __m128 _mm_cvtepi32_ps(__m128i a)
-{
- return vreinterpretq_m128_f32(vcvtq_f32_s32(vreinterpretq_s32_m128i(a)));
-}
-
-// Converts the four unsigned 8-bit integers in the lower 16 bits to four
-// unsigned 32-bit integers.
-FORCE_INLINE __m128i _mm_cvtepu8_epi16(__m128i a)
-{
- uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx DCBA */
- uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0D0C 0B0A */
- return vreinterpretq_m128i_u16(u16x8);
-}
-
-// Converts the four unsigned 8-bit integers in the lower 32 bits to four
-// unsigned 32-bit integers.
-// https://msdn.microsoft.com/en-us/library/bb531467%28v=vs.100%29.aspx
-FORCE_INLINE __m128i _mm_cvtepu8_epi32(__m128i a)
-{
- uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx DCBA */
- uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0D0C 0B0A */
- uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000D 000C 000B 000A */
- return vreinterpretq_m128i_u32(u32x4);
-}
-
-// Converts the two unsigned 8-bit integers in the lower 16 bits to two
-// unsigned 64-bit integers.
-FORCE_INLINE __m128i _mm_cvtepu8_epi64(__m128i a)
-{
- uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx xxBA */
- uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0x0x 0B0A */
- uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */
- uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */
- return vreinterpretq_m128i_u64(u64x2);
-}
-
-// Converts the four unsigned 8-bit integers in the lower 16 bits to four
-// unsigned 32-bit integers.
-FORCE_INLINE __m128i _mm_cvtepi8_epi16(__m128i a)
-{
- int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */
- int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */
- return vreinterpretq_m128i_s16(s16x8);
-}
-
-// Converts the four unsigned 8-bit integers in the lower 32 bits to four
-// unsigned 32-bit integers.
-FORCE_INLINE __m128i _mm_cvtepi8_epi32(__m128i a)
-{
- int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */
- int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */
- int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000D 000C 000B 000A */
- return vreinterpretq_m128i_s32(s32x4);
-}
-
-// Converts the two signed 8-bit integers in the lower 32 bits to four
-// signed 64-bit integers.
-FORCE_INLINE __m128i _mm_cvtepi8_epi64(__m128i a)
-{
- int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx xxBA */
- int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0x0x 0B0A */
- int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */
- int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */
- return vreinterpretq_m128i_s64(s64x2);
-}
-
-// Converts the four signed 16-bit integers in the lower 64 bits to four signed
-// 32-bit integers.
-FORCE_INLINE __m128i _mm_cvtepi16_epi32(__m128i a)
-{
- return vreinterpretq_m128i_s32(
- vmovl_s16(vget_low_s16(vreinterpretq_s16_m128i(a))));
-}
-
-// Converts the two signed 16-bit integers in the lower 32 bits two signed
-// 32-bit integers.
-FORCE_INLINE __m128i _mm_cvtepi16_epi64(__m128i a)
-{
- int16x8_t s16x8 = vreinterpretq_s16_m128i(a); /* xxxx xxxx xxxx 0B0A */
- int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */
- int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */
- return vreinterpretq_m128i_s64(s64x2);
-}
-
-// Converts the four unsigned 16-bit integers in the lower 64 bits to four unsigned
-// 32-bit integers.
-FORCE_INLINE __m128i _mm_cvtepu16_epi32(__m128i a)
-{
- return vreinterpretq_m128i_u32(
- vmovl_u16(vget_low_u16(vreinterpretq_u16_m128i(a))));
-}
-
-// Converts the two unsigned 16-bit integers in the lower 32 bits to two unsigned
-// 64-bit integers.
-FORCE_INLINE __m128i _mm_cvtepu16_epi64(__m128i a)
-{
- uint16x8_t u16x8 = vreinterpretq_u16_m128i(a); /* xxxx xxxx xxxx 0B0A */
- uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */
- uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */
- return vreinterpretq_m128i_u64(u64x2);
-}
-
-// Converts the two unsigned 32-bit integers in the lower 64 bits to two unsigned
-// 64-bit integers.
-FORCE_INLINE __m128i _mm_cvtepu32_epi64(__m128i a)
-{
- return vreinterpretq_m128i_u64(
- vmovl_u32(vget_low_u32(vreinterpretq_u32_m128i(a))));
-}
-
-// Converts the two signed 32-bit integers in the lower 64 bits to two signed
-// 64-bit integers.
-FORCE_INLINE __m128i _mm_cvtepi32_epi64(__m128i a)
-{
- return vreinterpretq_m128i_s64(
- vmovl_s32(vget_low_s32(vreinterpretq_s32_m128i(a))));
-}
-
-// Converts the four single-precision, floating-point values of a to signed
-// 32-bit integer values.
-//
-// r0 := (int) a0
-// r1 := (int) a1
-// r2 := (int) a2
-// r3 := (int) a3
-//
-// https://msdn.microsoft.com/en-us/library/vstudio/xdc42k5e(v=vs.100).aspx
-// *NOTE*. The default rounding mode on SSE is 'round to even', which ArmV7-A
-// does not support! It is supported on ARMv8-A however.
-FORCE_INLINE __m128i _mm_cvtps_epi32(__m128 a)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s32(vcvtnq_s32_f32(a));
-#else
- uint32x4_t signmask = vdupq_n_u32(0x80000000);
- float32x4_t half = vbslq_f32(signmask, vreinterpretq_f32_m128(a),
- vdupq_n_f32(0.5f)); /* +/- 0.5 */
- int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32(
- vreinterpretq_f32_m128(a), half)); /* round to integer: [a + 0.5]*/
- int32x4_t r_trunc =
- vcvtq_s32_f32(vreinterpretq_f32_m128(a)); /* truncate to integer: [a] */
- int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32(
- vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31)); /* 1 or 0 */
- int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone),
- vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */
- float32x4_t delta = vsubq_f32(
- vreinterpretq_f32_m128(a),
- vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */
- uint32x4_t is_delta_half = vceqq_f32(delta, half); /* delta == +/- 0.5 */
- return vreinterpretq_m128i_s32(vbslq_s32(is_delta_half, r_even, r_normal));
-#endif
-}
-
-// Moves the least significant 32 bits of a to a 32-bit integer.
-// https://msdn.microsoft.com/en-us/library/5z7a9642%28v=vs.90%29.aspx
-FORCE_INLINE int _mm_cvtsi128_si32(__m128i a)
-{
- return vgetq_lane_s32(vreinterpretq_s32_m128i(a), 0);
-}
-
-// Extracts the low order 64-bit integer from the parameter.
-// https://msdn.microsoft.com/en-us/library/bb531384(v=vs.120).aspx
-FORCE_INLINE uint64_t _mm_cvtsi128_si64(__m128i a)
-{
- return vgetq_lane_s64(vreinterpretq_s64_m128i(a), 0);
-}
-
-// Moves 32-bit integer a to the least significant 32 bits of an __m128 object,
-// zero extending the upper bits.
-//
-// r0 := a
-// r1 := 0x0
-// r2 := 0x0
-// r3 := 0x0
-//
-// https://msdn.microsoft.com/en-us/library/ct3539ha%28v=vs.90%29.aspx
-FORCE_INLINE __m128i _mm_cvtsi32_si128(int a)
-{
- return vreinterpretq_m128i_s32(vsetq_lane_s32(a, vdupq_n_s32(0), 0));
-}
-
-// Moves 64-bit integer a to the least significant 64 bits of an __m128 object,
-// zero extending the upper bits.
-//
-// r0 := a
-// r1 := 0x0
-FORCE_INLINE __m128i _mm_cvtsi64_si128(int64_t a)
-{
- return vreinterpretq_m128i_s64(vsetq_lane_s64(a, vdupq_n_s64(0), 0));
-}
-
-// Applies a type cast to reinterpret four 32-bit floating point values passed
-// in as a 128-bit parameter as packed 32-bit integers.
-// https://msdn.microsoft.com/en-us/library/bb514099.aspx
-FORCE_INLINE __m128i _mm_castps_si128(__m128 a)
-{
- return vreinterpretq_m128i_s32(vreinterpretq_s32_m128(a));
-}
-
-// Applies a type cast to reinterpret four 32-bit integers passed in as a
-// 128-bit parameter as packed 32-bit floating point values.
-// https://msdn.microsoft.com/en-us/library/bb514029.aspx
-FORCE_INLINE __m128 _mm_castsi128_ps(__m128i a)
-{
- return vreinterpretq_m128_s32(vreinterpretq_s32_m128i(a));
-}
-
-// Loads 128-bit value. :
-// https://msdn.microsoft.com/en-us/library/atzzad1h(v=vs.80).aspx
-FORCE_INLINE __m128i _mm_load_si128(const __m128i *p)
-{
- return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *) p));
-}
-
-// Loads 128-bit value. :
-// https://msdn.microsoft.com/zh-cn/library/f4k12ae8(v=vs.90).aspx
-FORCE_INLINE __m128i _mm_loadu_si128(const __m128i *p)
-{
- return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *) p));
-}
-
-// _mm_lddqu_si128 functions the same as _mm_loadu_si128.
-#define _mm_lddqu_si128 _mm_loadu_si128
-
-// ******************************************
-// Miscellaneous Operations
-// ******************************************
-
-
-// Shifts the 8 signed 16-bit integers in a right by count bits while shifting
-// in the sign bit.
-//
-// r0 := a0 >> count
-// r1 := a1 >> count
-// ...
-// r7 := a7 >> count
-//
-// https://msdn.microsoft.com/en-us/library/3c9997dk(v%3dvs.90).aspx
-FORCE_INLINE __m128i _mm_sra_epi16(__m128i a, __m128i count)
-{
- int64_t c = (int64_t) vget_low_s64((int64x2_t) count);
- if (c > 15)
- return _mm_cmplt_epi16(a, _mm_setzero_si128());
- return vreinterpretq_m128i_s16(vshlq_s16((int16x8_t) a, vdupq_n_s16(-c)));
-}
-
-// Shifts the 4 signed 32-bit integers in a right by count bits while shifting
-// in the sign bit.
-//
-// r0 := a0 >> count
-// r1 := a1 >> count
-// r2 := a2 >> count
-// r3 := a3 >> count
-//
-// https://msdn.microsoft.com/en-us/library/ce40009e(v%3dvs.100).aspx
-FORCE_INLINE __m128i _mm_sra_epi32(__m128i a, __m128i count)
-{
- int64_t c = (int64_t) vget_low_s64((int64x2_t) count);
- if (c > 31)
- return _mm_cmplt_epi32(a, _mm_setzero_si128());
- return vreinterpretq_m128i_s32(vshlq_s32((int32x4_t) a, vdupq_n_s32(-c)));
-}
-
-// Packs the 16 signed 16-bit integers from a and b into 8-bit integers and
-// saturates.
-// https://msdn.microsoft.com/en-us/library/k4y4f7w5%28v=vs.90%29.aspx
-FORCE_INLINE __m128i _mm_packs_epi16(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s8(
- vcombine_s8(vqmovn_s16(vreinterpretq_s16_m128i(a)),
- vqmovn_s16(vreinterpretq_s16_m128i(b))));
-}
-
-// Packs the 16 signed 16 - bit integers from a and b into 8 - bit unsigned
-// integers and saturates.
-//
-// r0 := UnsignedSaturate(a0)
-// r1 := UnsignedSaturate(a1)
-// ...
-// r7 := UnsignedSaturate(a7)
-// r8 := UnsignedSaturate(b0)
-// r9 := UnsignedSaturate(b1)
-// ...
-// r15 := UnsignedSaturate(b7)
-//
-// https://msdn.microsoft.com/en-us/library/07ad1wx4(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_packus_epi16(const __m128i a, const __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vcombine_u8(vqmovun_s16(vreinterpretq_s16_m128i(a)),
- vqmovun_s16(vreinterpretq_s16_m128i(b))));
-}
-
-// Packs the 8 signed 32-bit integers from a and b into signed 16-bit integers
-// and saturates.
-//
-// r0 := SignedSaturate(a0)
-// r1 := SignedSaturate(a1)
-// r2 := SignedSaturate(a2)
-// r3 := SignedSaturate(a3)
-// r4 := SignedSaturate(b0)
-// r5 := SignedSaturate(b1)
-// r6 := SignedSaturate(b2)
-// r7 := SignedSaturate(b3)
-//
-// https://msdn.microsoft.com/en-us/library/393t56f9%28v=vs.90%29.aspx
-FORCE_INLINE __m128i _mm_packs_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_s16(
- vcombine_s16(vqmovn_s32(vreinterpretq_s32_m128i(a)),
- vqmovn_s32(vreinterpretq_s32_m128i(b))));
-}
-
-// Packs the 8 unsigned 32-bit integers from a and b into unsigned 16-bit integers
-// and saturates.
-//
-// r0 := UnsignedSaturate(a0)
-// r1 := UnsignedSaturate(a1)
-// r2 := UnsignedSaturate(a2)
-// r3 := UnsignedSaturate(a3)
-// r4 := UnsignedSaturate(b0)
-// r5 := UnsignedSaturate(b1)
-// r6 := UnsignedSaturate(b2)
-// r7 := UnsignedSaturate(b3)
-FORCE_INLINE __m128i _mm_packus_epi32(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u16(
- vcombine_u16(vqmovn_u32(vreinterpretq_u32_m128i(a)),
- vqmovn_u32(vreinterpretq_u32_m128i(b))));
-}
-
-// Interleaves the lower 8 signed or unsigned 8-bit integers in a with the lower
-// 8 signed or unsigned 8-bit integers in b.
-//
-// r0 := a0
-// r1 := b0
-// r2 := a1
-// r3 := b1
-// ...
-// r14 := a7
-// r15 := b7
-//
-// https://msdn.microsoft.com/en-us/library/xf7k860c%28v=vs.90%29.aspx
-FORCE_INLINE __m128i _mm_unpacklo_epi8(__m128i a, __m128i b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s8(vzip1q_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b)));
-#else
- int8x8_t a1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(a)));
- int8x8_t b1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(b)));
- int8x8x2_t result = vzip_s8(a1, b1);
- return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1]));
-#endif
-}
-
-// Interleaves the lower 4 signed or unsigned 16-bit integers in a with the
-// lower 4 signed or unsigned 16-bit integers in b.
-//
-// r0 := a0
-// r1 := b0
-// r2 := a1
-// r3 := b1
-// r4 := a2
-// r5 := b2
-// r6 := a3
-// r7 := b3
-//
-// https://msdn.microsoft.com/en-us/library/btxb17bw%28v=vs.90%29.aspx
-FORCE_INLINE __m128i _mm_unpacklo_epi16(__m128i a, __m128i b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s16(vzip1q_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-#else
- int16x4_t a1 = vget_low_s16(vreinterpretq_s16_m128i(a));
- int16x4_t b1 = vget_low_s16(vreinterpretq_s16_m128i(b));
- int16x4x2_t result = vzip_s16(a1, b1);
- return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1]));
-#endif
-}
-
-// Interleaves the lower 2 signed or unsigned 32 - bit integers in a with the
-// lower 2 signed or unsigned 32 - bit integers in b.
-//
-// r0 := a0
-// r1 := b0
-// r2 := a1
-// r3 := b1
-//
-// https://msdn.microsoft.com/en-us/library/x8atst9d(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_unpacklo_epi32(__m128i a, __m128i b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s32(vzip1q_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-#else
- int32x2_t a1 = vget_low_s32(vreinterpretq_s32_m128i(a));
- int32x2_t b1 = vget_low_s32(vreinterpretq_s32_m128i(b));
- int32x2x2_t result = vzip_s32(a1, b1);
- return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1]));
-#endif
-}
-
-FORCE_INLINE __m128i _mm_unpacklo_epi64(__m128i a, __m128i b)
-{
- int64x1_t a_l = vget_low_s64(vreinterpretq_s64_m128i(a));
- int64x1_t b_l = vget_low_s64(vreinterpretq_s64_m128i(b));
- return vreinterpretq_m128i_s64(vcombine_s64(a_l, b_l));
-}
-
-// Selects and interleaves the lower two single-precision, floating-point values
-// from a and b.
-//
-// r0 := a0
-// r1 := b0
-// r2 := a1
-// r3 := b1
-//
-// https://msdn.microsoft.com/en-us/library/25st103b%28v=vs.90%29.aspx
-FORCE_INLINE __m128 _mm_unpacklo_ps(__m128 a, __m128 b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128_f32(vzip1q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-#else
- float32x2_t a1 = vget_low_f32(vreinterpretq_f32_m128(a));
- float32x2_t b1 = vget_low_f32(vreinterpretq_f32_m128(b));
- float32x2x2_t result = vzip_f32(a1, b1);
- return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1]));
-#endif
-}
-
-// Selects and interleaves the upper two single-precision, floating-point values
-// from a and b.
-//
-// r0 := a2
-// r1 := b2
-// r2 := a3
-// r3 := b3
-//
-// https://msdn.microsoft.com/en-us/library/skccxx7d%28v=vs.90%29.aspx
-FORCE_INLINE __m128 _mm_unpackhi_ps(__m128 a, __m128 b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128_f32(vzip2q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)));
-#else
- float32x2_t a1 = vget_high_f32(vreinterpretq_f32_m128(a));
- float32x2_t b1 = vget_high_f32(vreinterpretq_f32_m128(b));
- float32x2x2_t result = vzip_f32(a1, b1);
- return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1]));
-#endif
-}
-
-// Interleaves the upper 8 signed or unsigned 8-bit integers in a with the upper
-// 8 signed or unsigned 8-bit integers in b.
-//
-// r0 := a8
-// r1 := b8
-// r2 := a9
-// r3 := b9
-// ...
-// r14 := a15
-// r15 := b15
-//
-// https://msdn.microsoft.com/en-us/library/t5h7783k(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_unpackhi_epi8(__m128i a, __m128i b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s8(vzip2q_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b)));
-#else
- int8x8_t a1 =
- vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(a)));
- int8x8_t b1 =
- vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(b)));
- int8x8x2_t result = vzip_s8(a1, b1);
- return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1]));
-#endif
-}
-
-// Interleaves the upper 4 signed or unsigned 16-bit integers in a with the
-// upper 4 signed or unsigned 16-bit integers in b.
-//
-// r0 := a4
-// r1 := b4
-// r2 := a5
-// r3 := b5
-// r4 := a6
-// r5 := b6
-// r6 := a7
-// r7 := b7
-//
-// https://msdn.microsoft.com/en-us/library/03196cz7(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_unpackhi_epi16(__m128i a, __m128i b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s16(vzip2q_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)));
-#else
- int16x4_t a1 = vget_high_s16(vreinterpretq_s16_m128i(a));
- int16x4_t b1 = vget_high_s16(vreinterpretq_s16_m128i(b));
- int16x4x2_t result = vzip_s16(a1, b1);
- return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1]));
-#endif
-}
-
-// Interleaves the upper 2 signed or unsigned 32-bit integers in a with the
-// upper 2 signed or unsigned 32-bit integers in b.
-// https://msdn.microsoft.com/en-us/library/65sa7cbs(v=vs.100).aspx
-FORCE_INLINE __m128i _mm_unpackhi_epi32(__m128i a, __m128i b)
-{
-#if defined(__aarch64__)
- return vreinterpretq_m128i_s32(vzip2q_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b)));
-#else
- int32x2_t a1 = vget_high_s32(vreinterpretq_s32_m128i(a));
- int32x2_t b1 = vget_high_s32(vreinterpretq_s32_m128i(b));
- int32x2x2_t result = vzip_s32(a1, b1);
- return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1]));
-#endif
-}
-
-// Interleaves the upper signed or unsigned 64-bit integer in a with the
-// upper signed or unsigned 64-bit integer in b.
-//
-// r0 := a1
-// r1 := b1
-FORCE_INLINE __m128i _mm_unpackhi_epi64(__m128i a, __m128i b)
-{
- int64x1_t a_h = vget_high_s64(vreinterpretq_s64_m128i(a));
- int64x1_t b_h = vget_high_s64(vreinterpretq_s64_m128i(b));
- return vreinterpretq_m128i_s64(vcombine_s64(a_h, b_h));
-}
-
-// shift to right
-// https://msdn.microsoft.com/en-us/library/bb514041(v=vs.120).aspx
-// http://blog.csdn.net/hemmingway/article/details/44828303
-// Clang requires a macro here, as it is extremely picky about c being a literal.
-#define _mm_alignr_epi8(a, b, c) ((__m128i) vextq_s8((int8x16_t) (b), (int8x16_t) (a), (c)))
-
-// Extracts the selected signed or unsigned 8-bit integer from a and zero
-// extends.
-// FORCE_INLINE int _mm_extract_epi8(__m128i a, __constrange(0,16) int imm)
-#define _mm_extract_epi8(a, imm) \
- vgetq_lane_u8(vreinterpretq_u8_m128i(a), (imm))
-
-// Inserts the least significant 8 bits of b into the selected 8-bit integer
-// of a.
-// FORCE_INLINE __m128i _mm_insert_epi8(__m128i a, const int b,
-// __constrange(0,16) int imm)
-#define _mm_insert_epi8(a, b, imm) \
- __extension__({ \
- vreinterpretq_m128i_s8( \
- vsetq_lane_s8((b), vreinterpretq_s8_m128i(a), (imm))); \
- })
-
-// Extracts the selected signed or unsigned 16-bit integer from a and zero
-// extends.
-// https://msdn.microsoft.com/en-us/library/6dceta0c(v=vs.100).aspx
-// FORCE_INLINE int _mm_extract_epi16(__m128i a, __constrange(0,8) int imm)
-#define _mm_extract_epi16(a, imm) \
- vgetq_lane_u16(vreinterpretq_u16_m128i(a), (imm))
-
-// Inserts the least significant 16 bits of b into the selected 16-bit integer
-// of a.
-// https://msdn.microsoft.com/en-us/library/kaze8hz1%28v=vs.100%29.aspx
-// FORCE_INLINE __m128i _mm_insert_epi16(__m128i a, const int b,
-// __constrange(0,8) int imm)
-#define _mm_insert_epi16(a, b, imm) \
- __extension__({ \
- vreinterpretq_m128i_s16( \
- vsetq_lane_s16((b), vreinterpretq_s16_m128i(a), (imm))); \
- })
-
-// Extracts the selected signed or unsigned 32-bit integer from a and zero
-// extends.
-// FORCE_INLINE int _mm_extract_epi32(__m128i a, __constrange(0,4) int imm)
-#define _mm_extract_epi32(a, imm) \
- vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm))
-
-// Inserts the least significant 32 bits of b into the selected 32-bit integer
-// of a.
-// FORCE_INLINE __m128i _mm_insert_epi32(__m128i a, const int b,
-// __constrange(0,4) int imm)
-#define _mm_insert_epi32(a, b, imm) \
- __extension__({ \
- vreinterpretq_m128i_s32( \
- vsetq_lane_s32((b), vreinterpretq_s32_m128i(a), (imm))); \
- })
-
-
-// Extracts the selected signed or unsigned 64-bit integer from a and zero
-// extends.
-// FORCE_INLINE __int64 _mm_extract_epi64(__m128i a, __constrange(0,2) int imm)
-#define _mm_extract_epi64(a, imm) \
- vgetq_lane_s64(vreinterpretq_s64_m128i(a), (imm))
-
-// Inserts the least significant 64 bits of b into the selected 64-bit integer
-// of a.
-// FORCE_INLINE __m128i _mm_insert_epi64(__m128i a, const __int64 b,
-// __constrange(0,2) int imm)
-#define _mm_insert_epi64(a, b, imm) \
- __extension__({ \
- vreinterpretq_m128i_s64( \
- vsetq_lane_s64((b), vreinterpretq_s64_m128i(a), (imm))); \
- })
-
-// ******************************************
-// Crypto Extensions
-// ******************************************
-#if defined(__ARM_FEATURE_CRYPTO)
-// Wraps vmull_p64
-FORCE_INLINE uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b)
-{
- poly64_t a = vget_lane_p64(vreinterpret_p64_u64(_a), 0);
- poly64_t b = vget_lane_p64(vreinterpret_p64_u64(_b), 0);
- return vreinterpretq_u64_p128(vmull_p64(a, b));
-}
-
-#else // ARMv7 polyfill
-// ARMv7/some A64 lacks vmull_p64, but it has vmull_p8.
-//
-// vmull_p8 calculates 8 8-bit->16-bit polynomial multiplies, but we need a
-// 64-bit->128-bit polynomial multiply.
-//
-// It needs some work and is somewhat slow, but it is still faster than all
-// known scalar methods.
-//
-// Algorithm adapted to C from https://www.workofard.com/2017/07/ghash-for-low-end-cores/,
-// which is adapted from "Fast Software Polynomial Multiplication on
-// ARM Processors Using the NEON Engine" by Danilo Camara, Conrado Gouvea,
-// Julio Lopez and Ricardo Dahab (https://hal.inria.fr/hal-01506572)
-static uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b)
-{
- poly8x8_t a = vreinterpret_p8_u64(_a);
- poly8x8_t b = vreinterpret_p8_u64(_b);
-
- // Masks
- uint8x16_t k48_32 = vcombine_u8(vcreate_u8(0x0000ffffffffffff), vcreate_u8(0x00000000ffffffff));
- uint8x16_t k16_00 = vcombine_u8(vcreate_u8(0x000000000000ffff), vcreate_u8(0x0000000000000000));
-
- // Do the multiplies, rotating with vext to get all combinations
- uint8x16_t d = vreinterpretq_u8_p16(vmull_p8(a, b)); // D = A0 * B0
- uint8x16_t e = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 1))); // E = A0 * B1
- uint8x16_t f = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 1), b)); // F = A1 * B0
- uint8x16_t g = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 2))); // G = A0 * B2
- uint8x16_t h = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 2), b)); // H = A2 * B0
- uint8x16_t i = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 3))); // I = A0 * B3
- uint8x16_t j = vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 3), b)); // J = A3 * B0
- uint8x16_t k = vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 4))); // L = A0 * B4
-
- // Add cross products
- uint8x16_t l = veorq_u8(e, f); // L = E + F
- uint8x16_t m = veorq_u8(g, h); // M = G + H
- uint8x16_t n = veorq_u8(i, j); // N = I + J
-
- // Interleave. Using vzip1 and vzip2 prevents Clang from emitting TBL instructions.
-#if defined(__aarch64__)
- uint8x16_t lm_p0 = vreinterpretq_u8_u64(vzip1q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m)));
- uint8x16_t lm_p1 = vreinterpretq_u8_u64(vzip2q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m)));
- uint8x16_t nk_p0 = vreinterpretq_u8_u64(vzip1q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k)));
- uint8x16_t nk_p1 = vreinterpretq_u8_u64(vzip2q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k)));
-#else
- uint8x16_t lm_p0 = vcombine_u8(vget_low_u8(l), vget_low_u8(m));
- uint8x16_t lm_p1 = vcombine_u8(vget_high_u8(l), vget_high_u8(m));
- uint8x16_t nk_p0 = vcombine_u8(vget_low_u8(n), vget_low_u8(k));
- uint8x16_t nk_p1 = vcombine_u8(vget_high_u8(n), vget_high_u8(k));
-#endif
- // t0 = (L) (P0 + P1) << 8
- // t1 = (M) (P2 + P3) << 16
- uint8x16_t t0t1_tmp = veorq_u8(lm_p0, lm_p1);
- uint8x16_t t0t1_h = vandq_u8(lm_p1, k48_32);
- uint8x16_t t0t1_l = veorq_u8(t0t1_tmp, t0t1_h);
-
- // t2 = (N) (P4 + P5) << 24
- // t3 = (K) (P6 + P7) << 32
- uint8x16_t t2t3_tmp = veorq_u8(nk_p0, nk_p1);
- uint8x16_t t2t3_h = vandq_u8(nk_p1, k16_00);
- uint8x16_t t2t3_l = veorq_u8(t2t3_tmp, t2t3_h);
-
- // De-interleave
-#if defined(__aarch64__)
- uint8x16_t t0 = vreinterpretq_u8_u64(vuzp1q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h)));
- uint8x16_t t1 = vreinterpretq_u8_u64(vuzp2q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h)));
- uint8x16_t t2 = vreinterpretq_u8_u64(vuzp1q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h)));
- uint8x16_t t3 = vreinterpretq_u8_u64(vuzp2q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h)));
-#else
- uint8x16_t t1 = vcombine_u8(vget_high_u8(t0t1_l), vget_high_u8(t0t1_h));
- uint8x16_t t0 = vcombine_u8(vget_low_u8(t0t1_l), vget_low_u8(t0t1_h));
- uint8x16_t t3 = vcombine_u8(vget_high_u8(t2t3_l), vget_high_u8(t2t3_h));
- uint8x16_t t2 = vcombine_u8(vget_low_u8(t2t3_l), vget_low_u8(t2t3_h));
-#endif
- // Shift the cross products
- uint8x16_t t0_shift = vextq_u8(t0, t0, 15); // t0 << 8
- uint8x16_t t1_shift = vextq_u8(t1, t1, 14); // t1 << 16
- uint8x16_t t2_shift = vextq_u8(t2, t2, 13); // t2 << 24
- uint8x16_t t3_shift = vextq_u8(t3, t3, 12); // t3 << 32
-
- // Accumulate the products
- uint8x16_t cross1 = veorq_u8(t0_shift, t1_shift);
- uint8x16_t cross2 = veorq_u8(t2_shift, t3_shift);
- uint8x16_t mix = veorq_u8(d, cross1);
- uint8x16_t r = veorq_u8(mix, cross2);
- return vreinterpretq_u64_u8(r);
-}
-
-#endif // ARMv7 polyfill
-FORCE_INLINE __m128i _mm_clmulepi64_si128(__m128i _a, __m128i _b, const int imm)
-{
- uint64x2_t a = vreinterpretq_u64_m128i(_a);
- uint64x2_t b = vreinterpretq_u64_m128i(_b);
- switch (imm & 0x11) {
- case 0x00: return vreinterpretq_m128i_u64(_sse2neon_vmull_p64(vget_low_u64(a), vget_low_u64(b)));
- case 0x01: return vreinterpretq_m128i_u64(_sse2neon_vmull_p64(vget_high_u64(a), vget_low_u64(b)));
- case 0x10: return vreinterpretq_m128i_u64(_sse2neon_vmull_p64(vget_low_u64(a), vget_high_u64(b)));
- case 0x11: return vreinterpretq_m128i_u64(_sse2neon_vmull_p64(vget_high_u64(a), vget_high_u64(b)));
- default: abort();
- }
-}
-
-#if !defined(__ARM_FEATURE_CRYPTO) && defined(__aarch64__)
-// In the absence of crypto extensions, implement aesenc using regular neon
-// intrinsics instead. See:
-// https://www.workofard.com/2017/01/accelerated-aes-for-the-arm64-linux-kernel/
-// https://www.workofard.com/2017/07/ghash-for-low-end-cores/ and
-// https://github.com/ColinIanKing/linux-next-mirror/blob/b5f466091e130caaf0735976648f72bd5e09aa84/crypto/aegis128-neon-inner.c#L52
-// for more information Reproduced with permission of the author.
-FORCE_INLINE __m128i _mm_aesenc_si128(__m128i EncBlock, __m128i RoundKey)
-{
- static const uint8_t crypto_aes_sbox[256] = {
- 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
- 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
- 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
- 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
- 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
- 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
- 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
- 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
- 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
- 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
- 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
- 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
- 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
- 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
- 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
- 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
- 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
- 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
- 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
- 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
- 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
- 0xb0, 0x54, 0xbb, 0x16};
- static const uint8_t shift_rows[] = {0x0, 0x5, 0xa, 0xf, 0x4, 0x9,
- 0xe, 0x3, 0x8, 0xd, 0x2, 0x7,
- 0xc, 0x1, 0x6, 0xb};
- static const uint8_t ror32by8[] = {0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4,
- 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc};
-
- uint8x16_t v;
- uint8x16_t w = vreinterpretq_u8_m128i(EncBlock);
-
- // shift rows
- w = vqtbl1q_u8(w, vld1q_u8(shift_rows));
-
- // sub bytes
- v = vqtbl4q_u8(vld1q_u8_x4(crypto_aes_sbox), w);
- v = vqtbx4q_u8(v, vld1q_u8_x4(crypto_aes_sbox + 0x40), w - 0x40);
- v = vqtbx4q_u8(v, vld1q_u8_x4(crypto_aes_sbox + 0x80), w - 0x80);
- v = vqtbx4q_u8(v, vld1q_u8_x4(crypto_aes_sbox + 0xc0), w - 0xc0);
-
- // mix columns
- w = (v << 1) ^ (uint8x16_t)(((int8x16_t) v >> 7) & 0x1b);
- w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v);
- w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8));
-
- // add round key
- return vreinterpretq_m128i_u8(w) ^ RoundKey;
-}
-#elif defined(__ARM_FEATURE_CRYPTO)
-// Implements equivalent of 'aesenc' by combining AESE (with an empty key) and
-// AESMC and then manually applying the real key as an xor operation This
-// unfortunately means an additional xor op; the compiler should be able to
-// optimise this away for repeated calls however See
-// https://blog.michaelbrase.com/2018/05/08/emulating-x86-aes-intrinsics-on-armv8-a
-// for more details.
-inline __m128i _mm_aesenc_si128(__m128i a, __m128i b)
-{
- return vreinterpretq_m128i_u8(
- vaesmcq_u8(vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0))) ^
- vreinterpretq_u8_m128i(b));
-}
-#endif
-
-// ******************************************
-// Streaming Extensions
-// ******************************************
-
-// Guarantees that every preceding store is globally visible before any
-// subsequent store.
-// https://msdn.microsoft.com/en-us/library/5h2w73d1%28v=vs.90%29.aspx
-FORCE_INLINE void _mm_sfence(void)
-{
- __sync_synchronize();
-}
-
-// Stores the data in a to the address p without polluting the caches. If the
-// cache line containing address p is already in the cache, the cache will be
-// updated.Address p must be 16 - byte aligned.
-// https://msdn.microsoft.com/en-us/library/ba08y07y%28v=vs.90%29.aspx
-FORCE_INLINE void _mm_stream_si128(__m128i *p, __m128i a)
-{
- vst1q_s64((int64_t *) p, vreinterpretq_s64_m128i(a));
-}
-
-// Cache line containing p is flushed and invalidated from all caches in the
-// coherency domain. :
-// https://msdn.microsoft.com/en-us/library/ba08y07y(v=vs.100).aspx
-FORCE_INLINE void _mm_clflush(void const *p)
-{
- (void)p;
- // no corollary for Neon?
-}
-
-// Allocate aligned blocks of memory.
-// https://software.intel.com/en-us/
-// cpp-compiler-developer-guide-and-reference-allocating-and-freeing-aligned-memory-blocks
-FORCE_INLINE void *_mm_malloc(size_t size, size_t align)
-{
- void *ptr;
- if (align == 1)
- return malloc(size);
- if (align == 2 || (sizeof(void *) == 8 && align == 4))
- align = sizeof(void *);
- if (!posix_memalign(&ptr, align, size))
- return ptr;
- return NULL;
-}
-
-FORCE_INLINE void _mm_free(void *addr)
-{
- free(addr);
-}
-
-#if defined(__GNUC__) || defined(__clang__)
-#pragma pop_macro("ALIGN_STRUCT")
-#pragma pop_macro("FORCE_INLINE")
-#endif
-
-#endif
diff --git a/venv/Include/site/python3.9/pygame/mask.h b/venv/Include/site/python3.9/pygame/mask.h
deleted file mode 100644
index 45ad8c5..0000000
--- a/venv/Include/site/python3.9/pygame/mask.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef PGMASK_INTERNAL_H
-#define PGMASK_INTERNAL_H
-
-#include "include/pygame_mask.h"
-#define PYGAMEAPI_MASK_NUMSLOTS 1
-
-#endif /* ~PGMASK_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/mixer.h b/venv/Include/site/python3.9/pygame/mixer.h
deleted file mode 100644
index 3650612..0000000
--- a/venv/Include/site/python3.9/pygame/mixer.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef MIXER_INTERNAL_H
-#define MIXER_INTERNAL_H
-
-#include
-
-/* test mixer initializations */
-#define MIXER_INIT_CHECK() \
- if(!SDL_WasInit(SDL_INIT_AUDIO)) \
- return RAISE(pgExc_SDLError, "mixer not initialized")
-
-#define PYGAMEAPI_MIXER_NUMSLOTS 7
-#include "include/pygame_mixer.h"
-
-#endif /* ~MIXER_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/palette.h b/venv/Include/site/python3.9/pygame/palette.h
deleted file mode 100644
index 1ae4cf6..0000000
--- a/venv/Include/site/python3.9/pygame/palette.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-#ifndef PALETTE_H
-#define PALETTE_H
-
-#include
-
-/* SDL 2 does not assign a default palette color scheme to a new 8 bit
- * surface. Instead, the palette is set all white. This defines the SDL 1.2
- * default palette.
- */
-static const SDL_Color default_palette_colors[] = {
- {0, 0, 0, 255}, {0, 0, 85, 255}, {0, 0, 170, 255},
- {0, 0, 255, 255}, {0, 36, 0, 255}, {0, 36, 85, 255},
- {0, 36, 170, 255}, {0, 36, 255, 255}, {0, 73, 0, 255},
- {0, 73, 85, 255}, {0, 73, 170, 255}, {0, 73, 255, 255},
- {0, 109, 0, 255}, {0, 109, 85, 255}, {0, 109, 170, 255},
- {0, 109, 255, 255}, {0, 146, 0, 255}, {0, 146, 85, 255},
- {0, 146, 170, 255}, {0, 146, 255, 255}, {0, 182, 0, 255},
- {0, 182, 85, 255}, {0, 182, 170, 255}, {0, 182, 255, 255},
- {0, 219, 0, 255}, {0, 219, 85, 255}, {0, 219, 170, 255},
- {0, 219, 255, 255}, {0, 255, 0, 255}, {0, 255, 85, 255},
- {0, 255, 170, 255}, {0, 255, 255, 255}, {85, 0, 0, 255},
- {85, 0, 85, 255}, {85, 0, 170, 255}, {85, 0, 255, 255},
- {85, 36, 0, 255}, {85, 36, 85, 255}, {85, 36, 170, 255},
- {85, 36, 255, 255}, {85, 73, 0, 255}, {85, 73, 85, 255},
- {85, 73, 170, 255}, {85, 73, 255, 255}, {85, 109, 0, 255},
- {85, 109, 85, 255}, {85, 109, 170, 255}, {85, 109, 255, 255},
- {85, 146, 0, 255}, {85, 146, 85, 255}, {85, 146, 170, 255},
- {85, 146, 255, 255}, {85, 182, 0, 255}, {85, 182, 85, 255},
- {85, 182, 170, 255}, {85, 182, 255, 255}, {85, 219, 0, 255},
- {85, 219, 85, 255}, {85, 219, 170, 255}, {85, 219, 255, 255},
- {85, 255, 0, 255}, {85, 255, 85, 255}, {85, 255, 170, 255},
- {85, 255, 255, 255}, {170, 0, 0, 255}, {170, 0, 85, 255},
- {170, 0, 170, 255}, {170, 0, 255, 255}, {170, 36, 0, 255},
- {170, 36, 85, 255}, {170, 36, 170, 255}, {170, 36, 255, 255},
- {170, 73, 0, 255}, {170, 73, 85, 255}, {170, 73, 170, 255},
- {170, 73, 255, 255}, {170, 109, 0, 255}, {170, 109, 85, 255},
- {170, 109, 170, 255}, {170, 109, 255, 255}, {170, 146, 0, 255},
- {170, 146, 85, 255}, {170, 146, 170, 255}, {170, 146, 255, 255},
- {170, 182, 0, 255}, {170, 182, 85, 255}, {170, 182, 170, 255},
- {170, 182, 255, 255}, {170, 219, 0, 255}, {170, 219, 85, 255},
- {170, 219, 170, 255}, {170, 219, 255, 255}, {170, 255, 0, 255},
- {170, 255, 85, 255}, {170, 255, 170, 255}, {170, 255, 255, 255},
- {255, 0, 0, 255}, {255, 0, 85, 255}, {255, 0, 170, 255},
- {255, 0, 255, 255}, {255, 36, 0, 255}, {255, 36, 85, 255},
- {255, 36, 170, 255}, {255, 36, 255, 255}, {255, 73, 0, 255},
- {255, 73, 85, 255}, {255, 73, 170, 255}, {255, 73, 255, 255},
- {255, 109, 0, 255}, {255, 109, 85, 255}, {255, 109, 170, 255},
- {255, 109, 255, 255}, {255, 146, 0, 255}, {255, 146, 85, 255},
- {255, 146, 170, 255}, {255, 146, 255, 255}, {255, 182, 0, 255},
- {255, 182, 85, 255}, {255, 182, 170, 255}, {255, 182, 255, 255},
- {255, 219, 0, 255}, {255, 219, 85, 255}, {255, 219, 170, 255},
- {255, 219, 255, 255}, {255, 255, 0, 255}, {255, 255, 85, 255},
- {255, 255, 170, 255}, {255, 255, 255, 255}, {0, 0, 0, 255},
- {0, 0, 85, 255}, {0, 0, 170, 255}, {0, 0, 255, 255},
- {0, 36, 0, 255}, {0, 36, 85, 255}, {0, 36, 170, 255},
- {0, 36, 255, 255}, {0, 73, 0, 255}, {0, 73, 85, 255},
- {0, 73, 170, 255}, {0, 73, 255, 255}, {0, 109, 0, 255},
- {0, 109, 85, 255}, {0, 109, 170, 255}, {0, 109, 255, 255},
- {0, 146, 0, 255}, {0, 146, 85, 255}, {0, 146, 170, 255},
- {0, 146, 255, 255}, {0, 182, 0, 255}, {0, 182, 85, 255},
- {0, 182, 170, 255}, {0, 182, 255, 255}, {0, 219, 0, 255},
- {0, 219, 85, 255}, {0, 219, 170, 255}, {0, 219, 255, 255},
- {0, 255, 0, 255}, {0, 255, 85, 255}, {0, 255, 170, 255},
- {0, 255, 255, 255}, {85, 0, 0, 255}, {85, 0, 85, 255},
- {85, 0, 170, 255}, {85, 0, 255, 255}, {85, 36, 0, 255},
- {85, 36, 85, 255}, {85, 36, 170, 255}, {85, 36, 255, 255},
- {85, 73, 0, 255}, {85, 73, 85, 255}, {85, 73, 170, 255},
- {85, 73, 255, 255}, {85, 109, 0, 255}, {85, 109, 85, 255},
- {85, 109, 170, 255}, {85, 109, 255, 255}, {85, 146, 0, 255},
- {85, 146, 85, 255}, {85, 146, 170, 255}, {85, 146, 255, 255},
- {85, 182, 0, 255}, {85, 182, 85, 255}, {85, 182, 170, 255},
- {85, 182, 255, 255}, {85, 219, 0, 255}, {85, 219, 85, 255},
- {85, 219, 170, 255}, {85, 219, 255, 255}, {85, 255, 0, 255},
- {85, 255, 85, 255}, {85, 255, 170, 255}, {85, 255, 255, 255},
- {170, 0, 0, 255}, {170, 0, 85, 255}, {170, 0, 170, 255},
- {170, 0, 255, 255}, {170, 36, 0, 255}, {170, 36, 85, 255},
- {170, 36, 170, 255}, {170, 36, 255, 255}, {170, 73, 0, 255},
- {170, 73, 85, 255}, {170, 73, 170, 255}, {170, 73, 255, 255},
- {170, 109, 0, 255}, {170, 109, 85, 255}, {170, 109, 170, 255},
- {170, 109, 255, 255}, {170, 146, 0, 255}, {170, 146, 85, 255},
- {170, 146, 170, 255}, {170, 146, 255, 255}, {170, 182, 0, 255},
- {170, 182, 85, 255}, {170, 182, 170, 255}, {170, 182, 255, 255},
- {170, 219, 0, 255}, {170, 219, 85, 255}, {170, 219, 170, 255},
- {170, 219, 255, 255}, {170, 255, 0, 255}, {170, 255, 85, 255},
- {170, 255, 170, 255}, {170, 255, 255, 255}, {255, 0, 0, 255},
- {255, 0, 85, 255}, {255, 0, 170, 255}, {255, 0, 255, 255},
- {255, 36, 0, 255}, {255, 36, 85, 255}, {255, 36, 170, 255},
- {255, 36, 255, 255}, {255, 73, 0, 255}, {255, 73, 85, 255},
- {255, 73, 170, 255}, {255, 73, 255, 255}, {255, 109, 0, 255},
- {255, 109, 85, 255}, {255, 109, 170, 255}, {255, 109, 255, 255},
- {255, 146, 0, 255}, {255, 146, 85, 255}, {255, 146, 170, 255},
- {255, 146, 255, 255}, {255, 182, 0, 255}, {255, 182, 85, 255},
- {255, 182, 170, 255}, {255, 182, 255, 255}, {255, 219, 0, 255},
- {255, 219, 85, 255}, {255, 219, 170, 255}, {255, 219, 255, 255},
- {255, 255, 0, 255}, {255, 255, 85, 255}, {255, 255, 170, 255},
- {255, 255, 255, 255}};
-
-static const int default_palette_size =
- (int)(sizeof(default_palette_colors) / sizeof(SDL_Color));
-
-#endif
diff --git a/venv/Include/site/python3.9/pygame/pgarrinter.h b/venv/Include/site/python3.9/pygame/pgarrinter.h
deleted file mode 100644
index 5ba096b..0000000
--- a/venv/Include/site/python3.9/pygame/pgarrinter.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* array structure interface version 3 declarations */
-
-#if !defined(PG_ARRAYINTER_HEADER)
-#define PG_ARRAYINTER_HEADER
-
-static const int PAI_CONTIGUOUS = 0x01;
-static const int PAI_FORTRAN = 0x02;
-static const int PAI_ALIGNED = 0x100;
-static const int PAI_NOTSWAPPED = 0x200;
-static const int PAI_WRITEABLE = 0x400;
-static const int PAI_ARR_HAS_DESCR = 0x800;
-
-typedef struct {
- int two; /* contains the integer 2 -- simple sanity check */
- int nd; /* number of dimensions */
- char typekind; /* kind in array -- character code of typestr */
- int itemsize; /* size of each element */
- int flags; /* flags indicating how the data should be */
- /* interpreted */
- Py_intptr_t *shape; /* A length-nd array of shape information */
- Py_intptr_t *strides; /* A length-nd array of stride information */
- void *data; /* A pointer to the first element of the array */
- PyObject *descr; /* NULL or a data-description */
-} PyArrayInterface;
-
-#endif
diff --git a/venv/Include/site/python3.9/pygame/pgbufferproxy.h b/venv/Include/site/python3.9/pygame/pgbufferproxy.h
deleted file mode 100644
index 1507608..0000000
--- a/venv/Include/site/python3.9/pygame/pgbufferproxy.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef PG_BUFPROXY_INTERNAL_H
-#define PG_BUFPROXY_INTERNAL_H
-
-#include "include/pygame_bufferproxy.h"
-#define PYGAMEAPI_BUFPROXY_NUMSLOTS 4
-
-#endif /* ~PG_BUFPROXY_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/pgcompat.h b/venv/Include/site/python3.9/pygame/pgcompat.h
deleted file mode 100644
index 74139b9..0000000
--- a/venv/Include/site/python3.9/pygame/pgcompat.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Python 2.x/3.x compatibility tools (internal)
- */
-#ifndef PGCOMPAT_INTERNAL_H
-#define PGCOMPAT_INTERNAL_H
-
-#include "include/pgcompat.h"
-
-#if PY_MAJOR_VERSION >= 3
-
-#define PY3 1
-
-/* Define some aliases for the removed PyInt_* functions */
-#define PyInt_Check(op) PyLong_Check(op)
-#define PyInt_FromString PyLong_FromString
-#define PyInt_FromLong PyLong_FromLong
-#define PyInt_FromSize_t PyLong_FromSize_t
-#define PyInt_FromSsize_t PyLong_FromSsize_t
-#define PyInt_AsLong PyLong_AsLong
-#define PyInt_AsSsize_t PyLong_AsSsize_t
-#define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
-#define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
-#define PyInt_AS_LONG PyLong_AS_LONG
-#define PyNumber_Int PyNumber_Long
-/* Int and Long are identical in Py3 so only check one */
-#define INT_CHECK(op) PyLong_Check(op)
-
-/* Weakrefs flags changed in 3.x */
-#define Py_TPFLAGS_HAVE_WEAKREFS 0
-
-/* Module init function returns new module instance. */
-#define MODINIT_RETURN(x) return x
-#define MODINIT_DEFINE(mod_name) PyMODINIT_FUNC PyInit_##mod_name (void)
-#define DECREF_MOD(mod) Py_DECREF (mod)
-
-/* Text interface. Use unicode strings. */
-#define Text_Type PyUnicode_Type
-#define Text_Check PyUnicode_Check
-
-#ifndef PYPY_VERSION
-#define Text_FromLocale(s) PyUnicode_DecodeLocale((s), "strict")
-#else /* PYPY_VERSION */
-/* workaround: missing function for pypy */
-#define Text_FromLocale PyUnicode_FromString
-#endif /* PYPY_VERSION */
-
-#define Text_FromUTF8 PyUnicode_FromString
-#define Text_FromUTF8AndSize PyUnicode_FromStringAndSize
-#define Text_FromFormat PyUnicode_FromFormat
-#define Text_GetSize PyUnicode_GetSize
-#define Text_GET_SIZE PyUnicode_GET_SIZE
-
-/* Binary interface. Use bytes. */
-#define Bytes_Type PyBytes_Type
-#define Bytes_Check PyBytes_Check
-#define Bytes_Size PyBytes_Size
-#define Bytes_AsString PyBytes_AsString
-#define Bytes_AsStringAndSize PyBytes_AsStringAndSize
-#define Bytes_FromStringAndSize PyBytes_FromStringAndSize
-#define Bytes_FromFormat PyBytes_FromFormat
-#define Bytes_AS_STRING PyBytes_AS_STRING
-#define Bytes_GET_SIZE PyBytes_GET_SIZE
-#define Bytes_AsDecodeObject PyBytes_AsDecodedObject
-
-#define Object_Unicode PyObject_Str
-
-#define IsTextObj(x) (PyUnicode_Check(x) || PyBytes_Check(x))
-
-/* Renamed builtins */
-#define BUILTINS_MODULE "builtins"
-#define BUILTINS_UNICODE "str"
-#define BUILTINS_UNICHR "chr"
-
-/* Defaults for unicode file path encoding */
-#define UNICODE_DEF_FS_CODEC Py_FileSystemDefaultEncoding
-#if defined(MS_WIN32)
-#define UNICODE_DEF_FS_ERROR "replace"
-#else
-#define UNICODE_DEF_FS_ERROR "surrogateescape"
-#endif
-
-#else /* #if PY_MAJOR_VERSION >= 3 */
-
-#define PY3 0
-
-/* Check both Int and Long in PY2 */
-#define INT_CHECK(op) (PyInt_Check(op) || PyLong_Check(op))
-
-/* Module init function returns nothing. */
-#define MODINIT_RETURN(x) return
-#define MODINIT_DEFINE(mod_name) PyMODINIT_FUNC init##mod_name (void)
-#define DECREF_MOD(mod)
-
-/* Text interface. Use ascii strings. */
-#define Text_Type PyString_Type
-#define Text_Check PyString_Check
-#define Text_FromLocale PyString_FromString
-#define Text_FromUTF8 PyString_FromString
-#define Text_FromUTF8AndSize PyString_FromStringAndSize
-#define Text_FromFormat PyString_FromFormat
-#define Text_GetSize PyString_GetSize
-#define Text_GET_SIZE PyString_GET_SIZE
-
-/* Binary interface. Use ascii strings. */
-#define Bytes_Type PyString_Type
-#define Bytes_Check PyString_Check
-#define Bytes_Size PyString_Size
-#define Bytes_AsString PyString_AsString
-#define Bytes_AsStringAndSize PyString_AsStringAndSize
-#define Bytes_FromStringAndSize PyString_FromStringAndSize
-#define Bytes_FromFormat PyString_FromFormat
-#define Bytes_AS_STRING PyString_AS_STRING
-#define Bytes_GET_SIZE PyString_GET_SIZE
-#define Bytes_AsDecodedObject PyString_AsDecodedObject
-
-#define Object_Unicode PyObject_Unicode
-
-/* Renamed builtins */
-#define BUILTINS_MODULE "__builtin__"
-#define BUILTINS_UNICODE "unicode"
-#define BUILTINS_UNICHR "unichr"
-
-/* Defaults for unicode file path encoding */
-#define UNICODE_DEF_FS_CODEC Py_FileSystemDefaultEncoding
-#define UNICODE_DEF_FS_ERROR "strict"
-
-#endif /* #if PY_MAJOR_VERSION >= 3 */
-
-#define PY2 (!PY3)
-
-#define MODINIT_ERROR MODINIT_RETURN (NULL)
-
-/* Module state. These macros are used to define per-module macros.
- * v - global state variable (Python 2.x)
- * s - global state structure (Python 3.x)
- */
-#define PY2_GETSTATE(v) (&(v))
-#define PY3_GETSTATE(s, m) ((struct s *) PyModule_GetState (m))
-
-/* Pep 3123: Making PyObject_HEAD conform to standard C */
-#if !defined(Py_TYPE)
-#define Py_TYPE(o) (((PyObject *)(o))->ob_type)
-#define Py_REFCNT(o) (((PyObject *)(o))->ob_refcnt)
-#define Py_SIZE(o) (((PyVarObject *)(o))->ob_size)
-#endif
-
-/* Encode a unicode file path */
-#define Unicode_AsEncodedPath(u) \
- PyUnicode_AsEncodedString ((u), UNICODE_DEF_FS_CODEC, UNICODE_DEF_FS_ERROR)
-
-#define RELATIVE_MODULE(m) ("." m)
-
-#define HAVE_OLD_BUFPROTO PY2
-
-#if !defined(PG_ENABLE_OLDBUF) /* allow for command line override */
-#if HAVE_OLD_BUFPROTO
-#define PG_ENABLE_OLDBUF 1
-#else
-#define PG_ENABLE_OLDBUF 0
-#endif
-#endif
-
-#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
-#define Py_TPFLAGS_HAVE_NEWBUFFER 0
-#endif
-
-#ifndef Py_TPFLAGS_HAVE_CLASS
-#define Py_TPFLAGS_HAVE_CLASS 0
-#endif
-
-#ifndef Py_TPFLAGS_CHECKTYPES
-#define Py_TPFLAGS_CHECKTYPES 0
-#endif
-
-#if PY_VERSION_HEX >= 0x03020000
-#define Slice_GET_INDICES_EX(slice, length, start, stop, step, slicelength) \
- PySlice_GetIndicesEx(slice, length, start, stop, step, slicelength)
-#else
-#define Slice_GET_INDICES_EX(slice, length, start, stop, step, slicelength) \
- PySlice_GetIndicesEx((PySliceObject *)(slice), length, \
- start, stop, step, slicelength)
-#endif
-
-#if defined(SDL_VERSION_ATLEAST)
-#if (SDL_VERSION_ATLEAST(2, 0, 0)) && !(SDL_VERSION_ATLEAST(2, 0, 5))
-/* These functions require SDL 2.0.5 or greater.
-
- https://wiki.libsdl.org/SDL_SetWindowResizable
-*/
-void SDL_SetWindowResizable(SDL_Window *window, SDL_bool resizable);
-int SDL_GetWindowOpacity(SDL_Window *window, float *opacity);
-int SDL_SetWindowOpacity(SDL_Window *window, float opacity);
-int SDL_SetWindowModalFor(SDL_Window *modal_window, SDL_Window *parent_window);
-int SDL_SetWindowInputFocus(SDL_Window *window);
-SDL_Surface * SDL_CreateRGBSurfaceWithFormat(Uint32 flags, int width, int height, int depth,
- Uint32 format);
-#endif
-#endif /* defined(SDL_VERSION_ATLEAST) */
-
-// Currently needed to build scrap.c, event.c, display.c
-// with Windows SDK 10.0.18362.0 and SDL1 build
-#ifdef _MSC_VER
- #ifndef WINDOWS_IGNORE_PACKING_MISMATCH
- #define WINDOWS_IGNORE_PACKING_MISMATCH
- #endif
-#endif
-
-#endif /* ~PGCOMPAT_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/pgimport.h b/venv/Include/site/python3.9/pygame/pgimport.h
deleted file mode 100644
index 34654c9..0000000
--- a/venv/Include/site/python3.9/pygame/pgimport.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef PGIMPORT_INTERNAL_H
-#define PGIMPORT_INTERNAL_H
-
-#include "include/pgimport.h"
-
-#if PG_HAVE_CAPSULE
-#define encapsulate_api(ptr, module) \
- PyCapsule_New(ptr, PG_CAPSULE_NAME(module), NULL)
-#else /* ~PG_HAVE_CAPSULE */
-#define encapsulate_api(ptr, module) PyCObject_FromVoidPtr(ptr, NULL)
-#endif /* ~PG_HAVE_CAPSULE */
-
-#endif /* PGIMPORT_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/pgopengl.h b/venv/Include/site/python3.9/pygame/pgopengl.h
deleted file mode 100644
index 6440f32..0000000
--- a/venv/Include/site/python3.9/pygame/pgopengl.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#if !defined(PGOPENGL_H)
-#define PGOPENGL_H
-
-/** This header includes definitions of Opengl functions as pointer types for
- ** use with the SDL function SDL_GL_GetProcAddress.
- **/
-
-#if defined(_WIN32)
-#define GL_APIENTRY __stdcall
-#else
-#define GL_APIENTRY
-#endif
-
-typedef void (GL_APIENTRY *GL_glReadPixels_Func)(int, int, int, int, unsigned int, unsigned int, void*);
-
-typedef void (GL_APIENTRY *GL_glViewport_Func)(int, int, unsigned int, unsigned int);
-#endif
-
diff --git a/venv/Include/site/python3.9/pygame/pgplatform.h b/venv/Include/site/python3.9/pygame/pgplatform.h
deleted file mode 100644
index 2d5ed86..0000000
--- a/venv/Include/site/python3.9/pygame/pgplatform.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* platform/compiler adjustments (internal) */
-#ifndef PG_PLATFORM_INTERNAL_H
-#define PG_PLATFORM_INTERNAL_H
-
-/* This must be before all else */
-#if defined(__SYMBIAN32__) && defined(OPENC)
-#include
-#if defined(__WINS__)
-void *
-_alloca(size_t size);
-#define alloca _alloca
-#endif /* __WINS__ */
-#endif /* defined(__SYMBIAN32__) && defined(OPENC) */
-
-#include "include/pgplatform.h"
-
-#ifndef MIN
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-#ifndef MAX
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#endif
-#ifndef ABS
-#define ABS(a) (((a) < 0) ? -(a) : (a))
-#endif
-
-#if defined(macintosh) && defined(__MWERKS__) || defined(__SYMBIAN32__)
-#define PYGAME_EXPORT __declspec(export)
-#else
-#define PYGAME_EXPORT
-#endif
-
-/* warnings */
-#define PG_STRINGIZE_HELPER(x) #x
-#define PG_STRINGIZE(x) PG_STRINGIZE_HELPER(x)
-#define PG_WARN(desc) message(__FILE__ "(" PG_STRINGIZE(__LINE__) "): WARNING: " #desc)
-
-#endif /* ~PG_PLATFORM_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/pygame.h b/venv/Include/site/python3.9/pygame/pygame.h
deleted file mode 100644
index d7eaf73..0000000
--- a/venv/Include/site/python3.9/pygame/pygame.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-/* This will use PYGAMEAPI_DEFINE_SLOTS instead
- * of PYGAMEAPI_EXTERN_SLOTS for base modules.
- */
-#ifndef PYGAME_INTERNAL_H
-#define PYGAME_INTERNAL_H
-
-#define PYGAME_H
-#include "_pygame.h"
-
-#endif /* ~PYGAME_INTERNAL_H */
diff --git a/venv/Include/site/python3.9/pygame/scrap.h b/venv/Include/site/python3.9/pygame/scrap.h
deleted file mode 100644
index 725f22f..0000000
--- a/venv/Include/site/python3.9/pygame/scrap.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2006, 2007 Rene Dudfield, Marcus von Appen
-
- Originally put in the public domain by Sam Lantinga.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#ifndef SCRAP_H
-#define SCRAP_H
-
-/* This is unconditionally defined in Python.h */
-#if defined(_POSIX_C_SOURCE)
-#undef _POSIX_C_SOURCE
-#endif
-
-#include
-
-/* Handle clipboard text and data in arbitrary formats */
-
-/**
- * Predefined supported pygame scrap types.
- */
-#define PYGAME_SCRAP_TEXT "text/plain"
-#define PYGAME_SCRAP_BMP "image/bmp"
-#define PYGAME_SCRAP_PPM "image/ppm"
-#define PYGAME_SCRAP_PBM "image/pbm"
-
-/**
- * The supported scrap clipboard types.
- *
- * This is only relevant in a X11 environment, which supports mouse
- * selections as well. For Win32 and MacOS environments the default
- * clipboard is used, no matter what value is passed.
- */
-typedef enum
-{
- SCRAP_CLIPBOARD,
- SCRAP_SELECTION /* only supported in X11 environments. */
-} ScrapClipType;
-
-/**
- * Macro for initialization checks.
- */
-#define PYGAME_SCRAP_INIT_CHECK() \
- if(!pygame_scrap_initialized()) \
- return (PyErr_SetString (pgExc_SDLError, \
- "scrap system not initialized."), NULL)
-
-/**
- * \brief Checks, whether the pygame scrap module was initialized.
- *
- * \return 1 if the modules was initialized, 0 otherwise.
- */
-extern int
-pygame_scrap_initialized (void);
-
-/**
- * \brief Initializes the pygame scrap module internals. Call this before any
- * other method.
- *
- * \return 1 on successful initialization, 0 otherwise.
- */
-extern int
-pygame_scrap_init (void);
-
-/**
- * \brief Checks, whether the pygame window lost the clipboard focus or not.
- *
- * \return 1 if the window lost the focus, 0 otherwise.
- */
-extern int
-pygame_scrap_lost (void);
-
-/**
- * \brief Places content of a specific type into the clipboard.
- *
- * \note For X11 the following notes are important: The following types
- * are reserved for internal usage and thus will throw an error on
- * setting them: "TIMESTAMP", "TARGETS", "SDL_SELECTION".
- * Setting PYGAME_SCRAP_TEXT ("text/plain") will also automatically
- * set the X11 types "STRING" (XA_STRING), "TEXT" and "UTF8_STRING".
- *
- * For Win32 the following notes are important: Setting
- * PYGAME_SCRAP_TEXT ("text/plain") will also automatically set
- * the Win32 type "TEXT" (CF_TEXT).
- *
- * For QNX the following notes are important: Setting
- * PYGAME_SCRAP_TEXT ("text/plain") will also automatically set
- * the QNX type "TEXT" (Ph_CL_TEXT).
- *
- * \param type The type of the content.
- * \param srclen The length of the content.
- * \param src The NULL terminated content.
- * \return 1, if the content could be successfully pasted into the clipboard,
- * 0 otherwise.
- */
-extern int
-pygame_scrap_put (char *type, int srclen, char *src);
-
-/**
- * \brief Gets the current content from the clipboard.
- *
- * \note The received content does not need to be the content previously
- * placed in the clipboard using pygame_put_scrap(). See the
- * pygame_put_scrap() notes for more details.
- *
- * \param type The type of the content to receive.
- * \param count The size of the returned content.
- * \return The content or NULL in case of an error or if no content of the
- * specified type was available.
- */
-extern char*
-pygame_scrap_get (char *type, unsigned long *count);
-
-/**
- * \brief Gets the currently available content types from the clipboard.
- *
- * \return The different available content types or NULL in case of an
- * error or if no content type is available.
- */
-extern char**
-pygame_scrap_get_types (void);
-
-/**
- * \brief Checks whether content for the specified scrap type is currently
- * available in the clipboard.
- *
- * \param type The type to check for.
- * \return 1, if there is content and 0 otherwise.
- */
-extern int
-pygame_scrap_contains (char *type);
-
-#endif /* SCRAP_H */
diff --git a/venv/Include/site/python3.9/pygame/surface.h b/venv/Include/site/python3.9/pygame/surface.h
deleted file mode 100644
index bbd7f28..0000000
--- a/venv/Include/site/python3.9/pygame/surface.h
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- pygame - Python Game Library
- Copyright (C) 2000-2001 Pete Shinners
- Copyright (C) 2007 Marcus von Appen
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Pete Shinners
- pete@shinners.org
-*/
-
-#ifndef SURFACE_H
-#define SURFACE_H
-
-/* This is defined in SDL.h */
-#if defined(_POSIX_C_SOURCE)
-#undef _POSIX_C_SOURCE
-#endif
-
-#include
-#include "pygame.h"
-
-/* Blend modes */
-#define PYGAME_BLEND_ADD 0x1
-#define PYGAME_BLEND_SUB 0x2
-#define PYGAME_BLEND_MULT 0x3
-#define PYGAME_BLEND_MIN 0x4
-#define PYGAME_BLEND_MAX 0x5
-
-#define PYGAME_BLEND_RGB_ADD 0x1
-#define PYGAME_BLEND_RGB_SUB 0x2
-#define PYGAME_BLEND_RGB_MULT 0x3
-#define PYGAME_BLEND_RGB_MIN 0x4
-#define PYGAME_BLEND_RGB_MAX 0x5
-
-#define PYGAME_BLEND_RGBA_ADD 0x6
-#define PYGAME_BLEND_RGBA_SUB 0x7
-#define PYGAME_BLEND_RGBA_MULT 0x8
-#define PYGAME_BLEND_RGBA_MIN 0x9
-#define PYGAME_BLEND_RGBA_MAX 0x10
-#define PYGAME_BLEND_PREMULTIPLIED 0x11
-#define PYGAME_BLEND_ALPHA_SDL2 0x12
-
-
-
-
-
-#if SDL_BYTEORDER == SDL_LIL_ENDIAN
-#define GET_PIXEL_24(b) (b[0] + (b[1] << 8) + (b[2] << 16))
-#else
-#define GET_PIXEL_24(b) (b[2] + (b[1] << 8) + (b[0] << 16))
-#endif
-
-#define GET_PIXEL(pxl, bpp, source) \
- switch (bpp) \
- { \
- case 2: \
- pxl = *((Uint16 *) (source)); \
- break; \
- case 4: \
- pxl = *((Uint32 *) (source)); \
- break; \
- default: \
- { \
- Uint8 *b = (Uint8 *) source; \
- pxl = GET_PIXEL_24(b); \
- } \
- break; \
- }
-
-#if IS_SDLv1
-#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa) \
- _sR = ((px & fmt->Rmask) >> fmt->Rshift); \
- _sR = (_sR << fmt->Rloss) + (_sR >> (8 - (fmt->Rloss << 1))); \
- _sG = ((px & fmt->Gmask) >> fmt->Gshift); \
- _sG = (_sG << fmt->Gloss) + (_sG >> (8 - (fmt->Gloss << 1))); \
- _sB = ((px & fmt->Bmask) >> fmt->Bshift); \
- _sB = (_sB << fmt->Bloss) + (_sB >> (8 - (fmt->Bloss << 1))); \
- if (ppa) \
- { \
- _sA = ((px & fmt->Amask) >> fmt->Ashift); \
- _sA = (_sA << fmt->Aloss) + (_sA >> (8 - (fmt->Aloss << 1))); \
- } \
- else \
- { \
- _sA = 255; \
- }
-
-#define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _fmt) \
- sr = _fmt->palette->colors[*((Uint8 *) (_src))].r; \
- sg = _fmt->palette->colors[*((Uint8 *) (_src))].g; \
- sb = _fmt->palette->colors[*((Uint8 *) (_src))].b; \
- sa = 255;
-
-/* For 1 byte palette pixels */
-#define SET_PIXELVAL(px, fmt, _dR, _dG, _dB, _dA) \
- *(px) = (Uint8) SDL_MapRGB(fmt, _dR, _dG, _dB)
-#else /* IS_SDLv2 */
-#define GET_PIXELVALS(_sR, _sG, _sB, _sA, px, fmt, ppa) \
- SDL_GetRGBA(px, fmt, &(_sR), &(_sG), &(_sB), &(_sA)); \
- if (!ppa) { \
- _sA = 255; \
- }
-
-#define GET_PIXELVALS_1(sr, sg, sb, sa, _src, _fmt) \
- sr = _fmt->palette->colors[*((Uint8 *) (_src))].r; \
- sg = _fmt->palette->colors[*((Uint8 *) (_src))].g; \
- sb = _fmt->palette->colors[*((Uint8 *) (_src))].b; \
- sa = 255;
-
-/* For 1 byte palette pixels */
-#define SET_PIXELVAL(px, fmt, _dR, _dG, _dB, _dA) \
- *(px) = (Uint8) SDL_MapRGBA(fmt, _dR, _dG, _dB, _dA)
-#endif /* IS_SDLv2 */
-
-
-
-
-
-
-
-
-#if SDL_BYTEORDER == SDL_LIL_ENDIAN
-#define SET_OFFSETS_24(or, og, ob, fmt) \
- { \
- or = (fmt->Rshift == 0 ? 0 : \
- fmt->Rshift == 8 ? 1 : \
- 2 ); \
- og = (fmt->Gshift == 0 ? 0 : \
- fmt->Gshift == 8 ? 1 : \
- 2 ); \
- ob = (fmt->Bshift == 0 ? 0 : \
- fmt->Bshift == 8 ? 1 : \
- 2 ); \
- }
-
-#define SET_OFFSETS_32(or, og, ob, fmt) \
- { \
- or = (fmt->Rshift == 0 ? 0 : \
- fmt->Rshift == 8 ? 1 : \
- fmt->Rshift == 16 ? 2 : \
- 3 ); \
- og = (fmt->Gshift == 0 ? 0 : \
- fmt->Gshift == 8 ? 1 : \
- fmt->Gshift == 16 ? 2 : \
- 3 ); \
- ob = (fmt->Bshift == 0 ? 0 : \
- fmt->Bshift == 8 ? 1 : \
- fmt->Bshift == 16 ? 2 : \
- 3 ); \
- }
-#else
-#define SET_OFFSETS_24(or, og, ob, fmt) \
- { \
- or = (fmt->Rshift == 0 ? 2 : \
- fmt->Rshift == 8 ? 1 : \
- 0 ); \
- og = (fmt->Gshift == 0 ? 2 : \
- fmt->Gshift == 8 ? 1 : \
- 0 ); \
- ob = (fmt->Bshift == 0 ? 2 : \
- fmt->Bshift == 8 ? 1 : \
- 0 ); \
- }
-
-#define SET_OFFSETS_32(or, og, ob, fmt) \
- { \
- or = (fmt->Rshift == 0 ? 3 : \
- fmt->Rshift == 8 ? 2 : \
- fmt->Rshift == 16 ? 1 : \
- 0 ); \
- og = (fmt->Gshift == 0 ? 3 : \
- fmt->Gshift == 8 ? 2 : \
- fmt->Gshift == 16 ? 1 : \
- 0 ); \
- ob = (fmt->Bshift == 0 ? 3 : \
- fmt->Bshift == 8 ? 2 : \
- fmt->Bshift == 16 ? 1 : \
- 0 ); \
- }
-#endif
-
-
-#define CREATE_PIXEL(buf, r, g, b, a, bp, ft) \
- switch (bp) \
- { \
- case 2: \
- *((Uint16 *) (buf)) = \
- ((r >> ft->Rloss) << ft->Rshift) | \
- ((g >> ft->Gloss) << ft->Gshift) | \
- ((b >> ft->Bloss) << ft->Bshift) | \
- ((a >> ft->Aloss) << ft->Ashift); \
- break; \
- case 4: \
- *((Uint32 *) (buf)) = \
- ((r >> ft->Rloss) << ft->Rshift) | \
- ((g >> ft->Gloss) << ft->Gshift) | \
- ((b >> ft->Bloss) << ft->Bshift) | \
- ((a >> ft->Aloss) << ft->Ashift); \
- break; \
- }
-
-/* Pretty good idea from Tom Duff :-). */
-#define LOOP_UNROLLED4(code, n, width) \
- n = (width + 3) / 4; \
- switch (width & 3) \
- { \
- case 0: do { code; \
- case 3: code; \
- case 2: code; \
- case 1: code; \
- } while (--n > 0); \
- }
-
-/* Used in the srcbpp == dstbpp == 1 blend functions */
-#define REPEAT_3(code) \
- code; \
- code; \
- code;
-
-#define REPEAT_4(code) \
- code; \
- code; \
- code; \
- code;
-
-
-#define BLEND_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \
- tmp = dR + sR; dR = (tmp <= 255 ? tmp : 255); \
- tmp = dG + sG; dG = (tmp <= 255 ? tmp : 255); \
- tmp = dB + sB; dB = (tmp <= 255 ? tmp : 255);
-
-#define BLEND_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \
- tmp = dR - sR; dR = (tmp >= 0 ? tmp : 0); \
- tmp = dG - sG; dG = (tmp >= 0 ? tmp : 0); \
- tmp = dB - sB; dB = (tmp >= 0 ? tmp : 0);
-
-#define BLEND_MULT(sR, sG, sB, sA, dR, dG, dB, dA) \
- dR = (dR && sR) ? (dR * sR) >> 8 : 0; \
- dG = (dG && sG) ? (dG * sG) >> 8 : 0; \
- dB = (dB && sB) ? (dB * sB) >> 8 : 0;
-
-#define BLEND_MIN(sR, sG, sB, sA, dR, dG, dB, dA) \
- if(sR < dR) { dR = sR; } \
- if(sG < dG) { dG = sG; } \
- if(sB < dB) { dB = sB; }
-
-#define BLEND_MAX(sR, sG, sB, sA, dR, dG, dB, dA) \
- if(sR > dR) { dR = sR; } \
- if(sG > dG) { dG = sG; } \
- if(sB > dB) { dB = sB; }
-
-
-
-
-
-
-#define BLEND_RGBA_ADD(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \
- tmp = dR + sR; dR = (tmp <= 255 ? tmp : 255); \
- tmp = dG + sG; dG = (tmp <= 255 ? tmp : 255); \
- tmp = dB + sB; dB = (tmp <= 255 ? tmp : 255); \
- tmp = dA + sA; dA = (tmp <= 255 ? tmp : 255);
-
-#define BLEND_RGBA_SUB(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \
- tmp = dR - sR; dR = (tmp >= 0 ? tmp : 0); \
- tmp = dG - sG; dG = (tmp >= 0 ? tmp : 0); \
- tmp = dB - sB; dB = (tmp >= 0 ? tmp : 0); \
- tmp = dA - sA; dA = (tmp >= 0 ? tmp : 0);
-
-#define BLEND_RGBA_MULT(sR, sG, sB, sA, dR, dG, dB, dA) \
- dR = (dR && sR) ? (dR * sR) >> 8 : 0; \
- dG = (dG && sG) ? (dG * sG) >> 8 : 0; \
- dB = (dB && sB) ? (dB * sB) >> 8 : 0; \
- dA = (dA && sA) ? (dA * sA) >> 8 : 0;
-
-#define BLEND_RGBA_MIN(sR, sG, sB, sA, dR, dG, dB, dA) \
- if(sR < dR) { dR = sR; } \
- if(sG < dG) { dG = sG; } \
- if(sB < dB) { dB = sB; } \
- if(sA < dA) { dA = sA; }
-
-#define BLEND_RGBA_MAX(sR, sG, sB, sA, dR, dG, dB, dA) \
- if(sR > dR) { dR = sR; } \
- if(sG > dG) { dG = sG; } \
- if(sB > dB) { dB = sB; } \
- if(sA > dA) { dA = sA; }
-
-
-
-
-
-
-
-
-
-
-
-#if 1
-/* Choose an alpha blend equation. If the sign is preserved on a right shift
- * then use a specialized, faster, equation. Otherwise a more general form,
- * where all additions are done before the shift, is needed.
-*/
-#if (-1 >> 1) < 0
-#define ALPHA_BLEND_COMP(sC, dC, sA) ((((sC - dC) * sA + sC) >> 8) + dC)
-#else
-#define ALPHA_BLEND_COMP(sC, dC, sA) (((dC << 8) + (sC - dC) * sA + sC) >> 8)
-#endif
-
-#define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \
- do { \
- if (dA) \
- { \
- dR = ALPHA_BLEND_COMP(sR, dR, sA); \
- dG = ALPHA_BLEND_COMP(sG, dG, sA); \
- dB = ALPHA_BLEND_COMP(sB, dB, sA); \
- dA = sA + dA - ((sA * dA) / 255); \
- } \
- else \
- { \
- dR = sR; \
- dG = sG; \
- dB = sB; \
- dA = sA; \
- } \
- } while(0)
-
-#define ALPHA_BLEND_PREMULTIPLIED_COMP(sC, dC, sA) (sC + dC - ((dC + 1) * sA >> 8))
-
-#define ALPHA_BLEND_PREMULTIPLIED(tmp, sR, sG, sB, sA, dR, dG, dB, dA) \
- do { \
- dR = ALPHA_BLEND_PREMULTIPLIED_COMP(sR, dR, sA); \
- dG = ALPHA_BLEND_PREMULTIPLIED_COMP(sG, dG, sA); \
- dB = ALPHA_BLEND_PREMULTIPLIED_COMP(sB, dB, sA); \
- dA = ALPHA_BLEND_PREMULTIPLIED_COMP(sA, dA, sA); \
- } while(0)
-#elif 0
-
-#define ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB, dA) \
- do { \
- if(sA){ \
- if(dA && sA < 255){ \
- int dContrib = dA*(255 - sA)/255; \
- dA = sA+dA - ((sA*dA)/255); \
- dR = (dR*dContrib + sR*sA)/dA; \
- dG = (dG*dContrib + sG*sA)/dA; \
- dB = (dB*dContrib + sB*sA)/dA; \
- }else{ \
- dR = sR; \
- dG = sG; \
- dB = sB; \
- dA = sA; \
- } \
- } \
- } while(0)
-#endif
-
-int
-surface_fill_blend (SDL_Surface *surface, SDL_Rect *rect, Uint32 color,
- int blendargs);
-
-void
-surface_respect_clip_rect (SDL_Surface *surface, SDL_Rect *rect);
-
-int
-pygame_AlphaBlit (SDL_Surface * src, SDL_Rect * srcrect,
- SDL_Surface * dst, SDL_Rect * dstrect, int the_args);
-
-int
-pygame_Blit (SDL_Surface * src, SDL_Rect * srcrect,
- SDL_Surface * dst, SDL_Rect * dstrect, int the_args);
-
-#endif /* SURFACE_H */
diff --git a/venv/Lib/site-packages/_distutils_hack/__init__.py b/venv/Lib/site-packages/_distutils_hack/__init__.py
deleted file mode 100644
index 5f40996..0000000
--- a/venv/Lib/site-packages/_distutils_hack/__init__.py
+++ /dev/null
@@ -1,128 +0,0 @@
-import sys
-import os
-import re
-import importlib
-import warnings
-
-
-is_pypy = '__pypy__' in sys.builtin_module_names
-
-
-warnings.filterwarnings('ignore',
- r'.+ distutils\b.+ deprecated',
- DeprecationWarning)
-
-
-def warn_distutils_present():
- if 'distutils' not in sys.modules:
- return
- if is_pypy and sys.version_info < (3, 7):
- # PyPy for 3.6 unconditionally imports distutils, so bypass the warning
- # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
- return
- warnings.warn(
- "Distutils was imported before Setuptools, but importing Setuptools "
- "also replaces the `distutils` module in `sys.modules`. This may lead "
- "to undesirable behaviors or errors. To avoid these issues, avoid "
- "using distutils directly, ensure that setuptools is installed in the "
- "traditional way (e.g. not an editable install), and/or make sure "
- "that setuptools is always imported before distutils.")
-
-
-def clear_distutils():
- if 'distutils' not in sys.modules:
- return
- warnings.warn("Setuptools is replacing distutils.")
- mods = [name for name in sys.modules if re.match(r'distutils\b', name)]
- for name in mods:
- del sys.modules[name]
-
-
-def enabled():
- """
- Allow selection of distutils by environment variable.
- """
- which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib')
- return which == 'local'
-
-
-def ensure_local_distutils():
- clear_distutils()
- distutils = importlib.import_module('setuptools._distutils')
- distutils.__name__ = 'distutils'
- sys.modules['distutils'] = distutils
-
- # sanity check that submodules load as expected
- core = importlib.import_module('distutils.core')
- assert '_distutils' in core.__file__, core.__file__
-
-
-def do_override():
- """
- Ensure that the local copy of distutils is preferred over stdlib.
-
- See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
- for more motivation.
- """
- if enabled():
- warn_distutils_present()
- ensure_local_distutils()
-
-
-class DistutilsMetaFinder:
- def find_spec(self, fullname, path, target=None):
- if path is not None:
- return
-
- method_name = 'spec_for_{fullname}'.format(**locals())
- method = getattr(self, method_name, lambda: None)
- return method()
-
- def spec_for_distutils(self):
- import importlib.abc
- import importlib.util
-
- class DistutilsLoader(importlib.abc.Loader):
-
- def create_module(self, spec):
- return importlib.import_module('setuptools._distutils')
-
- def exec_module(self, module):
- pass
-
- return importlib.util.spec_from_loader('distutils', DistutilsLoader())
-
- def spec_for_pip(self):
- """
- Ensure stdlib distutils when running under pip.
- See pypa/pip#8761 for rationale.
- """
- if self.pip_imported_during_build():
- return
- clear_distutils()
- self.spec_for_distutils = lambda: None
-
- @staticmethod
- def pip_imported_during_build():
- """
- Detect if pip is being imported in a build script. Ref #2355.
- """
- import traceback
- return any(
- frame.f_globals['__file__'].endswith('setup.py')
- for frame, line in traceback.walk_stack(None)
- )
-
-
-DISTUTILS_FINDER = DistutilsMetaFinder()
-
-
-def add_shim():
- sys.meta_path.insert(0, DISTUTILS_FINDER)
-
-
-def remove_shim():
- try:
- sys.meta_path.remove(DISTUTILS_FINDER)
- except ValueError:
- pass
diff --git a/venv/Lib/site-packages/_distutils_hack/override.py b/venv/Lib/site-packages/_distutils_hack/override.py
deleted file mode 100644
index 2cc433a..0000000
--- a/venv/Lib/site-packages/_distutils_hack/override.py
+++ /dev/null
@@ -1 +0,0 @@
-__import__('_distutils_hack').do_override()
diff --git a/venv/Lib/site-packages/distutils-precedence.pth b/venv/Lib/site-packages/distutils-precedence.pth
deleted file mode 100644
index 6de4198..0000000
--- a/venv/Lib/site-packages/distutils-precedence.pth
+++ /dev/null
@@ -1 +0,0 @@
-import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'stdlib') == 'local'; enabled and __import__('_distutils_hack').add_shim();
diff --git a/venv/Lib/site-packages/pip/__init__.py b/venv/Lib/site-packages/pip/__init__.py
deleted file mode 100644
index 82f53c3..0000000
--- a/venv/Lib/site-packages/pip/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from typing import List, Optional
-
-__version__ = "21.1.2"
-
-
-def main(args=None):
- # type: (Optional[List[str]]) -> int
- """This is an internal API only meant for use by pip's own console scripts.
-
- For additional details, see https://github.com/pypa/pip/issues/7498.
- """
- from pip._internal.utils.entrypoints import _wrapper
-
- return _wrapper(args)
diff --git a/venv/Lib/site-packages/pip/__main__.py b/venv/Lib/site-packages/pip/__main__.py
deleted file mode 100644
index fe34a7b..0000000
--- a/venv/Lib/site-packages/pip/__main__.py
+++ /dev/null
@@ -1,31 +0,0 @@
-import os
-import sys
-import warnings
-
-# Remove '' and current working directory from the first entry
-# of sys.path, if present to avoid using current directory
-# in pip commands check, freeze, install, list and show,
-# when invoked as python -m pip
-if sys.path[0] in ("", os.getcwd()):
- sys.path.pop(0)
-
-# If we are running from a wheel, add the wheel to sys.path
-# This allows the usage python pip-*.whl/pip install pip-*.whl
-if __package__ == "":
- # __file__ is pip-*.whl/pip/__main__.py
- # first dirname call strips of '/__main__.py', second strips off '/pip'
- # Resulting path is the name of the wheel itself
- # Add that to sys.path so we can import pip
- path = os.path.dirname(os.path.dirname(__file__))
- sys.path.insert(0, path)
-
-if __name__ == "__main__":
- # Work around the error reported in #9540, pending a proper fix.
- # Note: It is essential the warning filter is set *before* importing
- # pip, as the deprecation happens at import time, not runtime.
- warnings.filterwarnings(
- "ignore", category=DeprecationWarning, module=".*packaging\\.version"
- )
- from pip._internal.cli.main import main as _main
-
- sys.exit(_main())
diff --git a/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index bdb7d49..0000000
Binary files a/venv/Lib/site-packages/pip/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/__init__.py b/venv/Lib/site-packages/pip/_internal/__init__.py
deleted file mode 100644
index 41071cd..0000000
--- a/venv/Lib/site-packages/pip/_internal/__init__.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from typing import List, Optional
-
-import pip._internal.utils.inject_securetransport # noqa
-
-
-def main(args=None):
- # type: (Optional[List[str]]) -> int
- """This is preserved for old console scripts that may still be referencing
- it.
-
- For additional details, see https://github.com/pypa/pip/issues/7498.
- """
- from pip._internal.utils.entrypoints import _wrapper
-
- return _wrapper(args)
diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 9484376..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc
deleted file mode 100644
index 5a25146..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-39.pyc
deleted file mode 100644
index 522d8e7..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-39.pyc
deleted file mode 100644
index 5237c11..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-39.pyc
deleted file mode 100644
index f4690bb..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc
deleted file mode 100644
index 59fa185..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-39.pyc
deleted file mode 100644
index 3a85fc4..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-39.pyc
deleted file mode 100644
index 1502d0d..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/build_env.py b/venv/Lib/site-packages/pip/_internal/build_env.py
deleted file mode 100644
index cc15250..0000000
--- a/venv/Lib/site-packages/pip/_internal/build_env.py
+++ /dev/null
@@ -1,286 +0,0 @@
-"""Build Environment used for isolation during sdist building
-"""
-
-import contextlib
-import logging
-import os
-import pathlib
-import sys
-import textwrap
-import zipfile
-from collections import OrderedDict
-from sysconfig import get_paths
-from types import TracebackType
-from typing import TYPE_CHECKING, Iterable, Iterator, List, Optional, Set, Tuple, Type
-
-from pip._vendor.certifi import where
-from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet
-
-from pip import __file__ as pip_location
-from pip._internal.cli.spinners import open_spinner
-from pip._internal.locations import get_platlib, get_prefixed_libs, get_purelib
-from pip._internal.utils.subprocess import call_subprocess
-from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
-
-if TYPE_CHECKING:
- from pip._internal.index.package_finder import PackageFinder
-
-logger = logging.getLogger(__name__)
-
-
-class _Prefix:
-
- def __init__(self, path):
- # type: (str) -> None
- self.path = path
- self.setup = False
- self.bin_dir = get_paths(
- 'nt' if os.name == 'nt' else 'posix_prefix',
- vars={'base': path, 'platbase': path}
- )['scripts']
- self.lib_dirs = get_prefixed_libs(path)
-
-
-@contextlib.contextmanager
-def _create_standalone_pip() -> Iterator[str]:
- """Create a "standalone pip" zip file.
-
- The zip file's content is identical to the currently-running pip.
- It will be used to install requirements into the build environment.
- """
- source = pathlib.Path(pip_location).resolve().parent
-
- # Return the current instance if `source` is not a directory. We can't build
- # a zip from this, and it likely means the instance is already standalone.
- if not source.is_dir():
- yield str(source)
- return
-
- with TempDirectory(kind="standalone-pip") as tmp_dir:
- pip_zip = os.path.join(tmp_dir.path, "__env_pip__.zip")
- kwargs = {}
- if sys.version_info >= (3, 8):
- kwargs["strict_timestamps"] = False
- with zipfile.ZipFile(pip_zip, "w", **kwargs) as zf:
- for child in source.rglob("*"):
- zf.write(child, child.relative_to(source.parent).as_posix())
- yield os.path.join(pip_zip, "pip")
-
-
-class BuildEnvironment:
- """Creates and manages an isolated environment to install build deps
- """
-
- def __init__(self):
- # type: () -> None
- temp_dir = TempDirectory(
- kind=tempdir_kinds.BUILD_ENV, globally_managed=True
- )
-
- self._prefixes = OrderedDict(
- (name, _Prefix(os.path.join(temp_dir.path, name)))
- for name in ('normal', 'overlay')
- )
-
- self._bin_dirs = [] # type: List[str]
- self._lib_dirs = [] # type: List[str]
- for prefix in reversed(list(self._prefixes.values())):
- self._bin_dirs.append(prefix.bin_dir)
- self._lib_dirs.extend(prefix.lib_dirs)
-
- # Customize site to:
- # - ensure .pth files are honored
- # - prevent access to system site packages
- system_sites = {
- os.path.normcase(site) for site in (get_purelib(), get_platlib())
- }
- self._site_dir = os.path.join(temp_dir.path, 'site')
- if not os.path.exists(self._site_dir):
- os.mkdir(self._site_dir)
- with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp:
- fp.write(textwrap.dedent(
- '''
- import os, site, sys
-
- # First, drop system-sites related paths.
- original_sys_path = sys.path[:]
- known_paths = set()
- for path in {system_sites!r}:
- site.addsitedir(path, known_paths=known_paths)
- system_paths = set(
- os.path.normcase(path)
- for path in sys.path[len(original_sys_path):]
- )
- original_sys_path = [
- path for path in original_sys_path
- if os.path.normcase(path) not in system_paths
- ]
- sys.path = original_sys_path
-
- # Second, add lib directories.
- # ensuring .pth file are processed.
- for path in {lib_dirs!r}:
- assert not path in sys.path
- site.addsitedir(path)
- '''
- ).format(system_sites=system_sites, lib_dirs=self._lib_dirs))
-
- def __enter__(self):
- # type: () -> None
- self._save_env = {
- name: os.environ.get(name, None)
- for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH')
- }
-
- path = self._bin_dirs[:]
- old_path = self._save_env['PATH']
- if old_path:
- path.extend(old_path.split(os.pathsep))
-
- pythonpath = [self._site_dir]
-
- os.environ.update({
- 'PATH': os.pathsep.join(path),
- 'PYTHONNOUSERSITE': '1',
- 'PYTHONPATH': os.pathsep.join(pythonpath),
- })
-
- def __exit__(
- self,
- exc_type, # type: Optional[Type[BaseException]]
- exc_val, # type: Optional[BaseException]
- exc_tb # type: Optional[TracebackType]
- ):
- # type: (...) -> None
- for varname, old_value in self._save_env.items():
- if old_value is None:
- os.environ.pop(varname, None)
- else:
- os.environ[varname] = old_value
-
- def check_requirements(self, reqs):
- # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]]
- """Return 2 sets:
- - conflicting requirements: set of (installed, wanted) reqs tuples
- - missing requirements: set of reqs
- """
- missing = set()
- conflicting = set()
- if reqs:
- ws = WorkingSet(self._lib_dirs)
- for req in reqs:
- try:
- if ws.find(Requirement.parse(req)) is None:
- missing.add(req)
- except VersionConflict as e:
- conflicting.add((str(e.args[0].as_requirement()),
- str(e.args[1])))
- return conflicting, missing
-
- def install_requirements(
- self,
- finder, # type: PackageFinder
- requirements, # type: Iterable[str]
- prefix_as_string, # type: str
- message # type: str
- ):
- # type: (...) -> None
- prefix = self._prefixes[prefix_as_string]
- assert not prefix.setup
- prefix.setup = True
- if not requirements:
- return
- with contextlib.ExitStack() as ctx:
- # TODO: Remove this block when dropping 3.6 support. Python 3.6
- # lacks importlib.resources and pep517 has issues loading files in
- # a zip, so we fallback to the "old" method by adding the current
- # pip directory to the child process's sys.path.
- if sys.version_info < (3, 7):
- pip_runnable = os.path.dirname(pip_location)
- else:
- pip_runnable = ctx.enter_context(_create_standalone_pip())
- self._install_requirements(
- pip_runnable,
- finder,
- requirements,
- prefix,
- message,
- )
-
- @staticmethod
- def _install_requirements(
- pip_runnable: str,
- finder: "PackageFinder",
- requirements: Iterable[str],
- prefix: _Prefix,
- message: str,
- ) -> None:
- args = [
- sys.executable, pip_runnable, 'install',
- '--ignore-installed', '--no-user', '--prefix', prefix.path,
- '--no-warn-script-location',
- ] # type: List[str]
- if logger.getEffectiveLevel() <= logging.DEBUG:
- args.append('-v')
- for format_control in ('no_binary', 'only_binary'):
- formats = getattr(finder.format_control, format_control)
- args.extend(('--' + format_control.replace('_', '-'),
- ','.join(sorted(formats or {':none:'}))))
-
- index_urls = finder.index_urls
- if index_urls:
- args.extend(['-i', index_urls[0]])
- for extra_index in index_urls[1:]:
- args.extend(['--extra-index-url', extra_index])
- else:
- args.append('--no-index')
- for link in finder.find_links:
- args.extend(['--find-links', link])
-
- for host in finder.trusted_hosts:
- args.extend(['--trusted-host', host])
- if finder.allow_all_prereleases:
- args.append('--pre')
- if finder.prefer_binary:
- args.append('--prefer-binary')
- args.append('--')
- args.extend(requirements)
- extra_environ = {"_PIP_STANDALONE_CERT": where()}
- with open_spinner(message) as spinner:
- call_subprocess(args, spinner=spinner, extra_environ=extra_environ)
-
-
-class NoOpBuildEnvironment(BuildEnvironment):
- """A no-op drop-in replacement for BuildEnvironment
- """
-
- def __init__(self):
- # type: () -> None
- pass
-
- def __enter__(self):
- # type: () -> None
- pass
-
- def __exit__(
- self,
- exc_type, # type: Optional[Type[BaseException]]
- exc_val, # type: Optional[BaseException]
- exc_tb # type: Optional[TracebackType]
- ):
- # type: (...) -> None
- pass
-
- def cleanup(self):
- # type: () -> None
- pass
-
- def install_requirements(
- self,
- finder, # type: PackageFinder
- requirements, # type: Iterable[str]
- prefix_as_string, # type: str
- message # type: str
- ):
- # type: (...) -> None
- raise NotImplementedError()
diff --git a/venv/Lib/site-packages/pip/_internal/cache.py b/venv/Lib/site-packages/pip/_internal/cache.py
deleted file mode 100644
index 7ef51b9..0000000
--- a/venv/Lib/site-packages/pip/_internal/cache.py
+++ /dev/null
@@ -1,287 +0,0 @@
-"""Cache Management
-"""
-
-import hashlib
-import json
-import logging
-import os
-from typing import Any, Dict, List, Optional, Set
-
-from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.exceptions import InvalidWheelFilename
-from pip._internal.models.format_control import FormatControl
-from pip._internal.models.link import Link
-from pip._internal.models.wheel import Wheel
-from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
-from pip._internal.utils.urls import path_to_url
-
-logger = logging.getLogger(__name__)
-
-
-def _hash_dict(d):
- # type: (Dict[str, str]) -> str
- """Return a stable sha224 of a dictionary."""
- s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
- return hashlib.sha224(s.encode("ascii")).hexdigest()
-
-
-class Cache:
- """An abstract class - provides cache directories for data from links
-
-
- :param cache_dir: The root of the cache.
- :param format_control: An object of FormatControl class to limit
- binaries being read from the cache.
- :param allowed_formats: which formats of files the cache should store.
- ('binary' and 'source' are the only allowed values)
- """
-
- def __init__(self, cache_dir, format_control, allowed_formats):
- # type: (str, FormatControl, Set[str]) -> None
- super().__init__()
- assert not cache_dir or os.path.isabs(cache_dir)
- self.cache_dir = cache_dir or None
- self.format_control = format_control
- self.allowed_formats = allowed_formats
-
- _valid_formats = {"source", "binary"}
- assert self.allowed_formats.union(_valid_formats) == _valid_formats
-
- def _get_cache_path_parts(self, link):
- # type: (Link) -> List[str]
- """Get parts of part that must be os.path.joined with cache_dir
- """
-
- # We want to generate an url to use as our cache key, we don't want to
- # just re-use the URL because it might have other items in the fragment
- # and we don't care about those.
- key_parts = {"url": link.url_without_fragment}
- if link.hash_name is not None and link.hash is not None:
- key_parts[link.hash_name] = link.hash
- if link.subdirectory_fragment:
- key_parts["subdirectory"] = link.subdirectory_fragment
-
- # Include interpreter name, major and minor version in cache key
- # to cope with ill-behaved sdists that build a different wheel
- # depending on the python version their setup.py is being run on,
- # and don't encode the difference in compatibility tags.
- # https://github.com/pypa/pip/issues/7296
- key_parts["interpreter_name"] = interpreter_name()
- key_parts["interpreter_version"] = interpreter_version()
-
- # Encode our key url with sha224, we'll use this because it has similar
- # security properties to sha256, but with a shorter total output (and
- # thus less secure). However the differences don't make a lot of
- # difference for our use case here.
- hashed = _hash_dict(key_parts)
-
- # We want to nest the directories some to prevent having a ton of top
- # level directories where we might run out of sub directories on some
- # FS.
- parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
-
- return parts
-
- def _get_candidates(self, link, canonical_package_name):
- # type: (Link, str) -> List[Any]
- can_not_cache = (
- not self.cache_dir or
- not canonical_package_name or
- not link
- )
- if can_not_cache:
- return []
-
- formats = self.format_control.get_allowed_formats(
- canonical_package_name
- )
- if not self.allowed_formats.intersection(formats):
- return []
-
- candidates = []
- path = self.get_path_for_link(link)
- if os.path.isdir(path):
- for candidate in os.listdir(path):
- candidates.append((candidate, path))
- return candidates
-
- def get_path_for_link(self, link):
- # type: (Link) -> str
- """Return a directory to store cached items in for link.
- """
- raise NotImplementedError()
-
- def get(
- self,
- link, # type: Link
- package_name, # type: Optional[str]
- supported_tags, # type: List[Tag]
- ):
- # type: (...) -> Link
- """Returns a link to a cached item if it exists, otherwise returns the
- passed link.
- """
- raise NotImplementedError()
-
-
-class SimpleWheelCache(Cache):
- """A cache of wheels for future installs.
- """
-
- def __init__(self, cache_dir, format_control):
- # type: (str, FormatControl) -> None
- super().__init__(cache_dir, format_control, {"binary"})
-
- def get_path_for_link(self, link):
- # type: (Link) -> str
- """Return a directory to store cached wheels for link
-
- Because there are M wheels for any one sdist, we provide a directory
- to cache them in, and then consult that directory when looking up
- cache hits.
-
- We only insert things into the cache if they have plausible version
- numbers, so that we don't contaminate the cache with things that were
- not unique. E.g. ./package might have dozens of installs done for it
- and build a version of 0.0...and if we built and cached a wheel, we'd
- end up using the same wheel even if the source has been edited.
-
- :param link: The link of the sdist for which this will cache wheels.
- """
- parts = self._get_cache_path_parts(link)
- assert self.cache_dir
- # Store wheels within the root cache_dir
- return os.path.join(self.cache_dir, "wheels", *parts)
-
- def get(
- self,
- link, # type: Link
- package_name, # type: Optional[str]
- supported_tags, # type: List[Tag]
- ):
- # type: (...) -> Link
- candidates = []
-
- if not package_name:
- return link
-
- canonical_package_name = canonicalize_name(package_name)
- for wheel_name, wheel_dir in self._get_candidates(
- link, canonical_package_name
- ):
- try:
- wheel = Wheel(wheel_name)
- except InvalidWheelFilename:
- continue
- if canonicalize_name(wheel.name) != canonical_package_name:
- logger.debug(
- "Ignoring cached wheel %s for %s as it "
- "does not match the expected distribution name %s.",
- wheel_name, link, package_name,
- )
- continue
- if not wheel.supported(supported_tags):
- # Built for a different python/arch/etc
- continue
- candidates.append(
- (
- wheel.support_index_min(supported_tags),
- wheel_name,
- wheel_dir,
- )
- )
-
- if not candidates:
- return link
-
- _, wheel_name, wheel_dir = min(candidates)
- return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
-
-
-class EphemWheelCache(SimpleWheelCache):
- """A SimpleWheelCache that creates it's own temporary cache directory
- """
-
- def __init__(self, format_control):
- # type: (FormatControl) -> None
- self._temp_dir = TempDirectory(
- kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
- globally_managed=True,
- )
-
- super().__init__(self._temp_dir.path, format_control)
-
-
-class CacheEntry:
- def __init__(
- self,
- link, # type: Link
- persistent, # type: bool
- ):
- self.link = link
- self.persistent = persistent
-
-
-class WheelCache(Cache):
- """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
-
- This Cache allows for gracefully degradation, using the ephem wheel cache
- when a certain link is not found in the simple wheel cache first.
- """
-
- def __init__(self, cache_dir, format_control):
- # type: (str, FormatControl) -> None
- super().__init__(cache_dir, format_control, {'binary'})
- self._wheel_cache = SimpleWheelCache(cache_dir, format_control)
- self._ephem_cache = EphemWheelCache(format_control)
-
- def get_path_for_link(self, link):
- # type: (Link) -> str
- return self._wheel_cache.get_path_for_link(link)
-
- def get_ephem_path_for_link(self, link):
- # type: (Link) -> str
- return self._ephem_cache.get_path_for_link(link)
-
- def get(
- self,
- link, # type: Link
- package_name, # type: Optional[str]
- supported_tags, # type: List[Tag]
- ):
- # type: (...) -> Link
- cache_entry = self.get_cache_entry(link, package_name, supported_tags)
- if cache_entry is None:
- return link
- return cache_entry.link
-
- def get_cache_entry(
- self,
- link, # type: Link
- package_name, # type: Optional[str]
- supported_tags, # type: List[Tag]
- ):
- # type: (...) -> Optional[CacheEntry]
- """Returns a CacheEntry with a link to a cached item if it exists or
- None. The cache entry indicates if the item was found in the persistent
- or ephemeral cache.
- """
- retval = self._wheel_cache.get(
- link=link,
- package_name=package_name,
- supported_tags=supported_tags,
- )
- if retval is not link:
- return CacheEntry(retval, persistent=True)
-
- retval = self._ephem_cache.get(
- link=link,
- package_name=package_name,
- supported_tags=supported_tags,
- )
- if retval is not link:
- return CacheEntry(retval, persistent=False)
-
- return None
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__init__.py b/venv/Lib/site-packages/pip/_internal/cli/__init__.py
deleted file mode 100644
index e589bb9..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-"""Subpackage containing all of pip's command line interface related code
-"""
-
-# This file intentionally does not import submodules
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 253fc21..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc
deleted file mode 100644
index 37492a6..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-39.pyc
deleted file mode 100644
index fd56139..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc
deleted file mode 100644
index 85050c8..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc
deleted file mode 100644
index 810ad2f..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-39.pyc
deleted file mode 100644
index c667867..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc
deleted file mode 100644
index b12686b..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-39.pyc
deleted file mode 100644
index 63dcb5d..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc
deleted file mode 100644
index 48b0f5e..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-39.pyc
deleted file mode 100644
index 984e609..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-39.pyc
deleted file mode 100644
index 1f4bce2..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc
deleted file mode 100644
index 77057b0..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py b/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py
deleted file mode 100644
index 3b1d2ac..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py
+++ /dev/null
@@ -1,162 +0,0 @@
-"""Logic that powers autocompletion installed by ``pip completion``.
-"""
-
-import optparse
-import os
-import sys
-from itertools import chain
-from typing import Any, Iterable, List, Optional
-
-from pip._internal.cli.main_parser import create_main_parser
-from pip._internal.commands import commands_dict, create_command
-from pip._internal.utils.misc import get_installed_distributions
-
-
-def autocomplete():
- # type: () -> None
- """Entry Point for completion of main and subcommand options."""
- # Don't complete if user hasn't sourced bash_completion file.
- if "PIP_AUTO_COMPLETE" not in os.environ:
- return
- cwords = os.environ["COMP_WORDS"].split()[1:]
- cword = int(os.environ["COMP_CWORD"])
- try:
- current = cwords[cword - 1]
- except IndexError:
- current = ""
-
- parser = create_main_parser()
- subcommands = list(commands_dict)
- options = []
-
- # subcommand
- subcommand_name = None # type: Optional[str]
- for word in cwords:
- if word in subcommands:
- subcommand_name = word
- break
- # subcommand options
- if subcommand_name is not None:
- # special case: 'help' subcommand has no options
- if subcommand_name == "help":
- sys.exit(1)
- # special case: list locally installed dists for show and uninstall
- should_list_installed = not current.startswith("-") and subcommand_name in [
- "show",
- "uninstall",
- ]
- if should_list_installed:
- lc = current.lower()
- installed = [
- dist.key
- for dist in get_installed_distributions(local_only=True)
- if dist.key.startswith(lc) and dist.key not in cwords[1:]
- ]
- # if there are no dists installed, fall back to option completion
- if installed:
- for dist in installed:
- print(dist)
- sys.exit(1)
-
- subcommand = create_command(subcommand_name)
-
- for opt in subcommand.parser.option_list_all:
- if opt.help != optparse.SUPPRESS_HELP:
- for opt_str in opt._long_opts + opt._short_opts:
- options.append((opt_str, opt.nargs))
-
- # filter out previously specified options from available options
- prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
- options = [(x, v) for (x, v) in options if x not in prev_opts]
- # filter options by current input
- options = [(k, v) for k, v in options if k.startswith(current)]
- # get completion type given cwords and available subcommand options
- completion_type = get_path_completion_type(
- cwords,
- cword,
- subcommand.parser.option_list_all,
- )
- # get completion files and directories if ``completion_type`` is
- # ````, ```` or ````
- if completion_type:
- paths = auto_complete_paths(current, completion_type)
- options = [(path, 0) for path in paths]
- for option in options:
- opt_label = option[0]
- # append '=' to options which require args
- if option[1] and option[0][:2] == "--":
- opt_label += "="
- print(opt_label)
- else:
- # show main parser options only when necessary
-
- opts = [i.option_list for i in parser.option_groups]
- opts.append(parser.option_list)
- flattened_opts = chain.from_iterable(opts)
- if current.startswith("-"):
- for opt in flattened_opts:
- if opt.help != optparse.SUPPRESS_HELP:
- subcommands += opt._long_opts + opt._short_opts
- else:
- # get completion type given cwords and all available options
- completion_type = get_path_completion_type(cwords, cword, flattened_opts)
- if completion_type:
- subcommands = list(auto_complete_paths(current, completion_type))
-
- print(" ".join([x for x in subcommands if x.startswith(current)]))
- sys.exit(1)
-
-
-def get_path_completion_type(cwords, cword, opts):
- # type: (List[str], int, Iterable[Any]) -> Optional[str]
- """Get the type of path completion (``file``, ``dir``, ``path`` or None)
-
- :param cwords: same as the environmental variable ``COMP_WORDS``
- :param cword: same as the environmental variable ``COMP_CWORD``
- :param opts: The available options to check
- :return: path completion type (``file``, ``dir``, ``path`` or None)
- """
- if cword < 2 or not cwords[cword - 2].startswith("-"):
- return None
- for opt in opts:
- if opt.help == optparse.SUPPRESS_HELP:
- continue
- for o in str(opt).split("/"):
- if cwords[cword - 2].split("=")[0] == o:
- if not opt.metavar or any(
- x in ("path", "file", "dir") for x in opt.metavar.split("/")
- ):
- return opt.metavar
- return None
-
-
-def auto_complete_paths(current, completion_type):
- # type: (str, str) -> Iterable[str]
- """If ``completion_type`` is ``file`` or ``path``, list all regular files
- and directories starting with ``current``; otherwise only list directories
- starting with ``current``.
-
- :param current: The word to be completed
- :param completion_type: path completion type(`file`, `path` or `dir`)i
- :return: A generator of regular files and/or directories
- """
- directory, filename = os.path.split(current)
- current_path = os.path.abspath(directory)
- # Don't complete paths if they can't be accessed
- if not os.access(current_path, os.R_OK):
- return
- filename = os.path.normcase(filename)
- # list all files that start with ``filename``
- file_list = (
- x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
- )
- for f in file_list:
- opt = os.path.join(current_path, f)
- comp_file = os.path.normcase(os.path.join(directory, f))
- # complete regular files when there is not ```` after option
- # complete directories when there is ````, ```` or
- # ````after option
- if completion_type != "dir" and os.path.isfile(opt):
- yield comp_file
- elif os.path.isdir(opt):
- yield os.path.join(comp_file, "")
diff --git a/venv/Lib/site-packages/pip/_internal/cli/base_command.py b/venv/Lib/site-packages/pip/_internal/cli/base_command.py
deleted file mode 100644
index b59420d..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/base_command.py
+++ /dev/null
@@ -1,221 +0,0 @@
-"""Base Command class, and related routines"""
-
-import logging
-import logging.config
-import optparse
-import os
-import sys
-import traceback
-from optparse import Values
-from typing import Any, List, Optional, Tuple
-
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.command_context import CommandContextMixIn
-from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
-from pip._internal.cli.status_codes import (
- ERROR,
- PREVIOUS_BUILD_DIR_ERROR,
- UNKNOWN_ERROR,
- VIRTUALENV_NOT_FOUND,
-)
-from pip._internal.exceptions import (
- BadCommand,
- CommandError,
- InstallationError,
- NetworkConnectionError,
- PreviousBuildDirError,
- UninstallationError,
-)
-from pip._internal.utils.deprecation import deprecated
-from pip._internal.utils.filesystem import check_path_owner
-from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
-from pip._internal.utils.misc import get_prog, normalize_path
-from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry
-from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
-from pip._internal.utils.virtualenv import running_under_virtualenv
-
-__all__ = ["Command"]
-
-logger = logging.getLogger(__name__)
-
-
-class Command(CommandContextMixIn):
- usage = None # type: str
- ignore_require_venv = False # type: bool
-
- def __init__(self, name, summary, isolated=False):
- # type: (str, str, bool) -> None
- super().__init__()
-
- self.name = name
- self.summary = summary
- self.parser = ConfigOptionParser(
- usage=self.usage,
- prog=f"{get_prog()} {name}",
- formatter=UpdatingDefaultsHelpFormatter(),
- add_help_option=False,
- name=name,
- description=self.__doc__,
- isolated=isolated,
- )
-
- self.tempdir_registry = None # type: Optional[TempDirRegistry]
-
- # Commands should add options to this option group
- optgroup_name = f"{self.name.capitalize()} Options"
- self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
-
- # Add the general options
- gen_opts = cmdoptions.make_option_group(
- cmdoptions.general_group,
- self.parser,
- )
- self.parser.add_option_group(gen_opts)
-
- self.add_options()
-
- def add_options(self):
- # type: () -> None
- pass
-
- def handle_pip_version_check(self, options):
- # type: (Values) -> None
- """
- This is a no-op so that commands by default do not do the pip version
- check.
- """
- # Make sure we do the pip version check if the index_group options
- # are present.
- assert not hasattr(options, "no_index")
-
- def run(self, options, args):
- # type: (Values, List[Any]) -> int
- raise NotImplementedError
-
- def parse_args(self, args):
- # type: (List[str]) -> Tuple[Any, Any]
- # factored out for testability
- return self.parser.parse_args(args)
-
- def main(self, args):
- # type: (List[str]) -> int
- try:
- with self.main_context():
- return self._main(args)
- finally:
- logging.shutdown()
-
- def _main(self, args):
- # type: (List[str]) -> int
- # We must initialize this before the tempdir manager, otherwise the
- # configuration would not be accessible by the time we clean up the
- # tempdir manager.
- self.tempdir_registry = self.enter_context(tempdir_registry())
- # Intentionally set as early as possible so globally-managed temporary
- # directories are available to the rest of the code.
- self.enter_context(global_tempdir_manager())
-
- options, args = self.parse_args(args)
-
- # Set verbosity so that it can be used elsewhere.
- self.verbosity = options.verbose - options.quiet
-
- level_number = setup_logging(
- verbosity=self.verbosity,
- no_color=options.no_color,
- user_log_file=options.log,
- )
-
- # TODO: Try to get these passing down from the command?
- # without resorting to os.environ to hold these.
- # This also affects isolated builds and it should.
-
- if options.no_input:
- os.environ["PIP_NO_INPUT"] = "1"
-
- if options.exists_action:
- os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action)
-
- if options.require_venv and not self.ignore_require_venv:
- # If a venv is required check if it can really be found
- if not running_under_virtualenv():
- logger.critical("Could not find an activated virtualenv (required).")
- sys.exit(VIRTUALENV_NOT_FOUND)
-
- if options.cache_dir:
- options.cache_dir = normalize_path(options.cache_dir)
- if not check_path_owner(options.cache_dir):
- logger.warning(
- "The directory '%s' or its parent directory is not owned "
- "or is not writable by the current user. The cache "
- "has been disabled. Check the permissions and owner of "
- "that directory. If executing pip with sudo, you should "
- "use sudo's -H flag.",
- options.cache_dir,
- )
- options.cache_dir = None
-
- if getattr(options, "build_dir", None):
- deprecated(
- reason=(
- "The -b/--build/--build-dir/--build-directory "
- "option is deprecated and has no effect anymore."
- ),
- replacement=(
- "use the TMPDIR/TEMP/TMP environment variable, "
- "possibly combined with --no-clean"
- ),
- gone_in="21.3",
- issue=8333,
- )
-
- if "2020-resolver" in options.features_enabled:
- logger.warning(
- "--use-feature=2020-resolver no longer has any effect, "
- "since it is now the default dependency resolver in pip. "
- "This will become an error in pip 21.0."
- )
-
- try:
- status = self.run(options, args)
- assert isinstance(status, int)
- return status
- except PreviousBuildDirError as exc:
- logger.critical(str(exc))
- logger.debug("Exception information:", exc_info=True)
-
- return PREVIOUS_BUILD_DIR_ERROR
- except (
- InstallationError,
- UninstallationError,
- BadCommand,
- NetworkConnectionError,
- ) as exc:
- logger.critical(str(exc))
- logger.debug("Exception information:", exc_info=True)
-
- return ERROR
- except CommandError as exc:
- logger.critical("%s", exc)
- logger.debug("Exception information:", exc_info=True)
-
- return ERROR
- except BrokenStdoutLoggingError:
- # Bypass our logger and write any remaining messages to stderr
- # because stdout no longer works.
- print("ERROR: Pipe to stdout was broken", file=sys.stderr)
- if level_number <= logging.DEBUG:
- traceback.print_exc(file=sys.stderr)
-
- return ERROR
- except KeyboardInterrupt:
- logger.critical("Operation cancelled by user")
- logger.debug("Exception information:", exc_info=True)
-
- return ERROR
- except BaseException:
- logger.critical("Exception:", exc_info=True)
-
- return UNKNOWN_ERROR
- finally:
- self.handle_pip_version_check(options)
diff --git a/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py b/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py
deleted file mode 100644
index f71c0b0..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py
+++ /dev/null
@@ -1,1024 +0,0 @@
-"""
-shared options and groups
-
-The principle here is to define options once, but *not* instantiate them
-globally. One reason being that options with action='append' can carry state
-between parses. pip parses general options twice internally, and shouldn't
-pass on state. To be consistent, all options will follow this design.
-"""
-
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-import os
-import textwrap
-import warnings
-from functools import partial
-from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values
-from textwrap import dedent
-from typing import Any, Callable, Dict, Optional, Tuple
-
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.cli.parser import ConfigOptionParser
-from pip._internal.cli.progress_bars import BAR_TYPES
-from pip._internal.exceptions import CommandError
-from pip._internal.locations import USER_CACHE_DIR, get_src_prefix
-from pip._internal.models.format_control import FormatControl
-from pip._internal.models.index import PyPI
-from pip._internal.models.target_python import TargetPython
-from pip._internal.utils.hashes import STRONG_HASHES
-from pip._internal.utils.misc import strtobool
-
-
-def raise_option_error(parser, option, msg):
- # type: (OptionParser, Option, str) -> None
- """
- Raise an option parsing error using parser.error().
-
- Args:
- parser: an OptionParser instance.
- option: an Option instance.
- msg: the error text.
- """
- msg = f"{option} error: {msg}"
- msg = textwrap.fill(" ".join(msg.split()))
- parser.error(msg)
-
-
-def make_option_group(group, parser):
- # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup
- """
- Return an OptionGroup object
- group -- assumed to be dict with 'name' and 'options' keys
- parser -- an optparse Parser
- """
- option_group = OptionGroup(parser, group["name"])
- for option in group["options"]:
- option_group.add_option(option())
- return option_group
-
-
-def check_install_build_global(options, check_options=None):
- # type: (Values, Optional[Values]) -> None
- """Disable wheels if per-setup.py call options are set.
-
- :param options: The OptionParser options to update.
- :param check_options: The options to check, if not supplied defaults to
- options.
- """
- if check_options is None:
- check_options = options
-
- def getname(n):
- # type: (str) -> Optional[Any]
- return getattr(check_options, n, None)
-
- names = ["build_options", "global_options", "install_options"]
- if any(map(getname, names)):
- control = options.format_control
- control.disallow_binaries()
- warnings.warn(
- "Disabling all use of wheels due to the use of --build-option "
- "/ --global-option / --install-option.",
- stacklevel=2,
- )
-
-
-def check_dist_restriction(options, check_target=False):
- # type: (Values, bool) -> None
- """Function for determining if custom platform options are allowed.
-
- :param options: The OptionParser options.
- :param check_target: Whether or not to check if --target is being used.
- """
- dist_restriction_set = any(
- [
- options.python_version,
- options.platforms,
- options.abis,
- options.implementation,
- ]
- )
-
- binary_only = FormatControl(set(), {":all:"})
- sdist_dependencies_allowed = (
- options.format_control != binary_only and not options.ignore_dependencies
- )
-
- # Installations or downloads using dist restrictions must not combine
- # source distributions and dist-specific wheels, as they are not
- # guaranteed to be locally compatible.
- if dist_restriction_set and sdist_dependencies_allowed:
- raise CommandError(
- "When restricting platform and interpreter constraints using "
- "--python-version, --platform, --abi, or --implementation, "
- "either --no-deps must be set, or --only-binary=:all: must be "
- "set and --no-binary must not be set (or must be set to "
- ":none:)."
- )
-
- if check_target:
- if dist_restriction_set and not options.target_dir:
- raise CommandError(
- "Can not use any platform or abi specific options unless "
- "installing via '--target'"
- )
-
-
-def _path_option_check(option, opt, value):
- # type: (Option, str, str) -> str
- return os.path.expanduser(value)
-
-
-def _package_name_option_check(option, opt, value):
- # type: (Option, str, str) -> str
- return canonicalize_name(value)
-
-
-class PipOption(Option):
- TYPES = Option.TYPES + ("path", "package_name")
- TYPE_CHECKER = Option.TYPE_CHECKER.copy()
- TYPE_CHECKER["package_name"] = _package_name_option_check
- TYPE_CHECKER["path"] = _path_option_check
-
-
-###########
-# options #
-###########
-
-help_ = partial(
- Option,
- "-h",
- "--help",
- dest="help",
- action="help",
- help="Show help.",
-) # type: Callable[..., Option]
-
-isolated_mode = partial(
- Option,
- "--isolated",
- dest="isolated_mode",
- action="store_true",
- default=False,
- help=(
- "Run pip in an isolated mode, ignoring environment variables and user "
- "configuration."
- ),
-) # type: Callable[..., Option]
-
-require_virtualenv = partial(
- Option,
- # Run only if inside a virtualenv, bail if not.
- "--require-virtualenv",
- "--require-venv",
- dest="require_venv",
- action="store_true",
- default=False,
- help=SUPPRESS_HELP,
-) # type: Callable[..., Option]
-
-verbose = partial(
- Option,
- "-v",
- "--verbose",
- dest="verbose",
- action="count",
- default=0,
- help="Give more output. Option is additive, and can be used up to 3 times.",
-) # type: Callable[..., Option]
-
-no_color = partial(
- Option,
- "--no-color",
- dest="no_color",
- action="store_true",
- default=False,
- help="Suppress colored output.",
-) # type: Callable[..., Option]
-
-version = partial(
- Option,
- "-V",
- "--version",
- dest="version",
- action="store_true",
- help="Show version and exit.",
-) # type: Callable[..., Option]
-
-quiet = partial(
- Option,
- "-q",
- "--quiet",
- dest="quiet",
- action="count",
- default=0,
- help=(
- "Give less output. Option is additive, and can be used up to 3"
- " times (corresponding to WARNING, ERROR, and CRITICAL logging"
- " levels)."
- ),
-) # type: Callable[..., Option]
-
-progress_bar = partial(
- Option,
- "--progress-bar",
- dest="progress_bar",
- type="choice",
- choices=list(BAR_TYPES.keys()),
- default="on",
- help=(
- "Specify type of progress to be displayed ["
- + "|".join(BAR_TYPES.keys())
- + "] (default: %default)"
- ),
-) # type: Callable[..., Option]
-
-log = partial(
- PipOption,
- "--log",
- "--log-file",
- "--local-log",
- dest="log",
- metavar="path",
- type="path",
- help="Path to a verbose appending log.",
-) # type: Callable[..., Option]
-
-no_input = partial(
- Option,
- # Don't ask for input
- "--no-input",
- dest="no_input",
- action="store_true",
- default=False,
- help="Disable prompting for input.",
-) # type: Callable[..., Option]
-
-proxy = partial(
- Option,
- "--proxy",
- dest="proxy",
- type="str",
- default="",
- help="Specify a proxy in the form [user:passwd@]proxy.server:port.",
-) # type: Callable[..., Option]
-
-retries = partial(
- Option,
- "--retries",
- dest="retries",
- type="int",
- default=5,
- help="Maximum number of retries each connection should attempt "
- "(default %default times).",
-) # type: Callable[..., Option]
-
-timeout = partial(
- Option,
- "--timeout",
- "--default-timeout",
- metavar="sec",
- dest="timeout",
- type="float",
- default=15,
- help="Set the socket timeout (default %default seconds).",
-) # type: Callable[..., Option]
-
-
-def exists_action():
- # type: () -> Option
- return Option(
- # Option when path already exist
- "--exists-action",
- dest="exists_action",
- type="choice",
- choices=["s", "i", "w", "b", "a"],
- default=[],
- action="append",
- metavar="action",
- help="Default action when a path already exists: "
- "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.",
- )
-
-
-cert = partial(
- PipOption,
- "--cert",
- dest="cert",
- type="path",
- metavar="path",
- help=(
- "Path to PEM-encoded CA certificate bundle. "
- "If provided, overrides the default. "
- "See 'SSL Certificate Verification' in pip documentation "
- "for more information."
- ),
-) # type: Callable[..., Option]
-
-client_cert = partial(
- PipOption,
- "--client-cert",
- dest="client_cert",
- type="path",
- default=None,
- metavar="path",
- help="Path to SSL client certificate, a single file containing the "
- "private key and the certificate in PEM format.",
-) # type: Callable[..., Option]
-
-index_url = partial(
- Option,
- "-i",
- "--index-url",
- "--pypi-url",
- dest="index_url",
- metavar="URL",
- default=PyPI.simple_url,
- help="Base URL of the Python Package Index (default %default). "
- "This should point to a repository compliant with PEP 503 "
- "(the simple repository API) or a local directory laid out "
- "in the same format.",
-) # type: Callable[..., Option]
-
-
-def extra_index_url():
- # type: () -> Option
- return Option(
- "--extra-index-url",
- dest="extra_index_urls",
- metavar="URL",
- action="append",
- default=[],
- help="Extra URLs of package indexes to use in addition to "
- "--index-url. Should follow the same rules as "
- "--index-url.",
- )
-
-
-no_index = partial(
- Option,
- "--no-index",
- dest="no_index",
- action="store_true",
- default=False,
- help="Ignore package index (only looking at --find-links URLs instead).",
-) # type: Callable[..., Option]
-
-
-def find_links():
- # type: () -> Option
- return Option(
- "-f",
- "--find-links",
- dest="find_links",
- action="append",
- default=[],
- metavar="url",
- help="If a URL or path to an html file, then parse for links to "
- "archives such as sdist (.tar.gz) or wheel (.whl) files. "
- "If a local path or file:// URL that's a directory, "
- "then look for archives in the directory listing. "
- "Links to VCS project URLs are not supported.",
- )
-
-
-def trusted_host():
- # type: () -> Option
- return Option(
- "--trusted-host",
- dest="trusted_hosts",
- action="append",
- metavar="HOSTNAME",
- default=[],
- help="Mark this host or host:port pair as trusted, even though it "
- "does not have valid or any HTTPS.",
- )
-
-
-def constraints():
- # type: () -> Option
- return Option(
- "-c",
- "--constraint",
- dest="constraints",
- action="append",
- default=[],
- metavar="file",
- help="Constrain versions using the given constraints file. "
- "This option can be used multiple times.",
- )
-
-
-def requirements():
- # type: () -> Option
- return Option(
- "-r",
- "--requirement",
- dest="requirements",
- action="append",
- default=[],
- metavar="file",
- help="Install from the given requirements file. "
- "This option can be used multiple times.",
- )
-
-
-def editable():
- # type: () -> Option
- return Option(
- "-e",
- "--editable",
- dest="editables",
- action="append",
- default=[],
- metavar="path/url",
- help=(
- "Install a project in editable mode (i.e. setuptools "
- '"develop mode") from a local project path or a VCS url.'
- ),
- )
-
-
-def _handle_src(option, opt_str, value, parser):
- # type: (Option, str, str, OptionParser) -> None
- value = os.path.abspath(value)
- setattr(parser.values, option.dest, value)
-
-
-src = partial(
- PipOption,
- "--src",
- "--source",
- "--source-dir",
- "--source-directory",
- dest="src_dir",
- type="path",
- metavar="dir",
- default=get_src_prefix(),
- action="callback",
- callback=_handle_src,
- help="Directory to check out editable projects into. "
- 'The default in a virtualenv is "/src". '
- 'The default for global installs is "/src".',
-) # type: Callable[..., Option]
-
-
-def _get_format_control(values, option):
- # type: (Values, Option) -> Any
- """Get a format_control object."""
- return getattr(values, option.dest)
-
-
-def _handle_no_binary(option, opt_str, value, parser):
- # type: (Option, str, str, OptionParser) -> None
- existing = _get_format_control(parser.values, option)
- FormatControl.handle_mutual_excludes(
- value,
- existing.no_binary,
- existing.only_binary,
- )
-
-
-def _handle_only_binary(option, opt_str, value, parser):
- # type: (Option, str, str, OptionParser) -> None
- existing = _get_format_control(parser.values, option)
- FormatControl.handle_mutual_excludes(
- value,
- existing.only_binary,
- existing.no_binary,
- )
-
-
-def no_binary():
- # type: () -> Option
- format_control = FormatControl(set(), set())
- return Option(
- "--no-binary",
- dest="format_control",
- action="callback",
- callback=_handle_no_binary,
- type="str",
- default=format_control,
- help="Do not use binary packages. Can be supplied multiple times, and "
- 'each time adds to the existing value. Accepts either ":all:" to '
- 'disable all binary packages, ":none:" to empty the set (notice '
- "the colons), or one or more package names with commas between "
- "them (no colons). Note that some packages are tricky to compile "
- "and may fail to install when this option is used on them.",
- )
-
-
-def only_binary():
- # type: () -> Option
- format_control = FormatControl(set(), set())
- return Option(
- "--only-binary",
- dest="format_control",
- action="callback",
- callback=_handle_only_binary,
- type="str",
- default=format_control,
- help="Do not use source packages. Can be supplied multiple times, and "
- 'each time adds to the existing value. Accepts either ":all:" to '
- 'disable all source packages, ":none:" to empty the set, or one '
- "or more package names with commas between them. Packages "
- "without binary distributions will fail to install when this "
- "option is used on them.",
- )
-
-
-platforms = partial(
- Option,
- "--platform",
- dest="platforms",
- metavar="platform",
- action="append",
- default=None,
- help=(
- "Only use wheels compatible with . Defaults to the "
- "platform of the running system. Use this option multiple times to "
- "specify multiple platforms supported by the target interpreter."
- ),
-) # type: Callable[..., Option]
-
-
-# This was made a separate function for unit-testing purposes.
-def _convert_python_version(value):
- # type: (str) -> Tuple[Tuple[int, ...], Optional[str]]
- """
- Convert a version string like "3", "37", or "3.7.3" into a tuple of ints.
-
- :return: A 2-tuple (version_info, error_msg), where `error_msg` is
- non-None if and only if there was a parsing error.
- """
- if not value:
- # The empty string is the same as not providing a value.
- return (None, None)
-
- parts = value.split(".")
- if len(parts) > 3:
- return ((), "at most three version parts are allowed")
-
- if len(parts) == 1:
- # Then we are in the case of "3" or "37".
- value = parts[0]
- if len(value) > 1:
- parts = [value[0], value[1:]]
-
- try:
- version_info = tuple(int(part) for part in parts)
- except ValueError:
- return ((), "each version part must be an integer")
-
- return (version_info, None)
-
-
-def _handle_python_version(option, opt_str, value, parser):
- # type: (Option, str, str, OptionParser) -> None
- """
- Handle a provided --python-version value.
- """
- version_info, error_msg = _convert_python_version(value)
- if error_msg is not None:
- msg = "invalid --python-version value: {!r}: {}".format(
- value,
- error_msg,
- )
- raise_option_error(parser, option=option, msg=msg)
-
- parser.values.python_version = version_info
-
-
-python_version = partial(
- Option,
- "--python-version",
- dest="python_version",
- metavar="python_version",
- action="callback",
- callback=_handle_python_version,
- type="str",
- default=None,
- help=dedent(
- """\
- The Python interpreter version to use for wheel and "Requires-Python"
- compatibility checks. Defaults to a version derived from the running
- interpreter. The version can be specified using up to three dot-separated
- integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor
- version can also be given as a string without dots (e.g. "37" for 3.7.0).
- """
- ),
-) # type: Callable[..., Option]
-
-
-implementation = partial(
- Option,
- "--implementation",
- dest="implementation",
- metavar="implementation",
- default=None,
- help=(
- "Only use wheels compatible with Python "
- "implementation , e.g. 'pp', 'jy', 'cp', "
- " or 'ip'. If not specified, then the current "
- "interpreter implementation is used. Use 'py' to force "
- "implementation-agnostic wheels."
- ),
-) # type: Callable[..., Option]
-
-
-abis = partial(
- Option,
- "--abi",
- dest="abis",
- metavar="abi",
- action="append",
- default=None,
- help=(
- "Only use wheels compatible with Python abi , e.g. 'pypy_41'. "
- "If not specified, then the current interpreter abi tag is used. "
- "Use this option multiple times to specify multiple abis supported "
- "by the target interpreter. Generally you will need to specify "
- "--implementation, --platform, and --python-version when using this "
- "option."
- ),
-) # type: Callable[..., Option]
-
-
-def add_target_python_options(cmd_opts):
- # type: (OptionGroup) -> None
- cmd_opts.add_option(platforms())
- cmd_opts.add_option(python_version())
- cmd_opts.add_option(implementation())
- cmd_opts.add_option(abis())
-
-
-def make_target_python(options):
- # type: (Values) -> TargetPython
- target_python = TargetPython(
- platforms=options.platforms,
- py_version_info=options.python_version,
- abis=options.abis,
- implementation=options.implementation,
- )
-
- return target_python
-
-
-def prefer_binary():
- # type: () -> Option
- return Option(
- "--prefer-binary",
- dest="prefer_binary",
- action="store_true",
- default=False,
- help="Prefer older binary packages over newer source packages.",
- )
-
-
-cache_dir = partial(
- PipOption,
- "--cache-dir",
- dest="cache_dir",
- default=USER_CACHE_DIR,
- metavar="dir",
- type="path",
- help="Store the cache data in .",
-) # type: Callable[..., Option]
-
-
-def _handle_no_cache_dir(option, opt, value, parser):
- # type: (Option, str, str, OptionParser) -> None
- """
- Process a value provided for the --no-cache-dir option.
-
- This is an optparse.Option callback for the --no-cache-dir option.
- """
- # The value argument will be None if --no-cache-dir is passed via the
- # command-line, since the option doesn't accept arguments. However,
- # the value can be non-None if the option is triggered e.g. by an
- # environment variable, like PIP_NO_CACHE_DIR=true.
- if value is not None:
- # Then parse the string value to get argument error-checking.
- try:
- strtobool(value)
- except ValueError as exc:
- raise_option_error(parser, option=option, msg=str(exc))
-
- # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool()
- # converted to 0 (like "false" or "no") caused cache_dir to be disabled
- # rather than enabled (logic would say the latter). Thus, we disable
- # the cache directory not just on values that parse to True, but (for
- # backwards compatibility reasons) also on values that parse to False.
- # In other words, always set it to False if the option is provided in
- # some (valid) form.
- parser.values.cache_dir = False
-
-
-no_cache = partial(
- Option,
- "--no-cache-dir",
- dest="cache_dir",
- action="callback",
- callback=_handle_no_cache_dir,
- help="Disable the cache.",
-) # type: Callable[..., Option]
-
-no_deps = partial(
- Option,
- "--no-deps",
- "--no-dependencies",
- dest="ignore_dependencies",
- action="store_true",
- default=False,
- help="Don't install package dependencies.",
-) # type: Callable[..., Option]
-
-build_dir = partial(
- PipOption,
- "-b",
- "--build",
- "--build-dir",
- "--build-directory",
- dest="build_dir",
- type="path",
- metavar="dir",
- help=SUPPRESS_HELP,
-) # type: Callable[..., Option]
-
-ignore_requires_python = partial(
- Option,
- "--ignore-requires-python",
- dest="ignore_requires_python",
- action="store_true",
- help="Ignore the Requires-Python information.",
-) # type: Callable[..., Option]
-
-no_build_isolation = partial(
- Option,
- "--no-build-isolation",
- dest="build_isolation",
- action="store_false",
- default=True,
- help="Disable isolation when building a modern source distribution. "
- "Build dependencies specified by PEP 518 must be already installed "
- "if this option is used.",
-) # type: Callable[..., Option]
-
-
-def _handle_no_use_pep517(option, opt, value, parser):
- # type: (Option, str, str, OptionParser) -> None
- """
- Process a value provided for the --no-use-pep517 option.
-
- This is an optparse.Option callback for the no_use_pep517 option.
- """
- # Since --no-use-pep517 doesn't accept arguments, the value argument
- # will be None if --no-use-pep517 is passed via the command-line.
- # However, the value can be non-None if the option is triggered e.g.
- # by an environment variable, for example "PIP_NO_USE_PEP517=true".
- if value is not None:
- msg = """A value was passed for --no-use-pep517,
- probably using either the PIP_NO_USE_PEP517 environment variable
- or the "no-use-pep517" config file option. Use an appropriate value
- of the PIP_USE_PEP517 environment variable or the "use-pep517"
- config file option instead.
- """
- raise_option_error(parser, option=option, msg=msg)
-
- # Otherwise, --no-use-pep517 was passed via the command-line.
- parser.values.use_pep517 = False
-
-
-use_pep517 = partial(
- Option,
- "--use-pep517",
- dest="use_pep517",
- action="store_true",
- default=None,
- help="Use PEP 517 for building source distributions "
- "(use --no-use-pep517 to force legacy behaviour).",
-) # type: Any
-
-no_use_pep517 = partial(
- Option,
- "--no-use-pep517",
- dest="use_pep517",
- action="callback",
- callback=_handle_no_use_pep517,
- default=None,
- help=SUPPRESS_HELP,
-) # type: Any
-
-install_options = partial(
- Option,
- "--install-option",
- dest="install_options",
- action="append",
- metavar="options",
- help="Extra arguments to be supplied to the setup.py install "
- 'command (use like --install-option="--install-scripts=/usr/local/'
- 'bin"). Use multiple --install-option options to pass multiple '
- "options to setup.py install. If you are using an option with a "
- "directory path, be sure to use absolute path.",
-) # type: Callable[..., Option]
-
-build_options = partial(
- Option,
- "--build-option",
- dest="build_options",
- metavar="options",
- action="append",
- help="Extra arguments to be supplied to 'setup.py bdist_wheel'.",
-) # type: Callable[..., Option]
-
-global_options = partial(
- Option,
- "--global-option",
- dest="global_options",
- action="append",
- metavar="options",
- help="Extra global options to be supplied to the setup.py "
- "call before the install or bdist_wheel command.",
-) # type: Callable[..., Option]
-
-no_clean = partial(
- Option,
- "--no-clean",
- action="store_true",
- default=False,
- help="Don't clean up build directories.",
-) # type: Callable[..., Option]
-
-pre = partial(
- Option,
- "--pre",
- action="store_true",
- default=False,
- help="Include pre-release and development versions. By default, "
- "pip only finds stable versions.",
-) # type: Callable[..., Option]
-
-disable_pip_version_check = partial(
- Option,
- "--disable-pip-version-check",
- dest="disable_pip_version_check",
- action="store_true",
- default=False,
- help="Don't periodically check PyPI to determine whether a new version "
- "of pip is available for download. Implied with --no-index.",
-) # type: Callable[..., Option]
-
-
-def _handle_merge_hash(option, opt_str, value, parser):
- # type: (Option, str, str, OptionParser) -> None
- """Given a value spelled "algo:digest", append the digest to a list
- pointed to in a dict by the algo name."""
- if not parser.values.hashes:
- parser.values.hashes = {}
- try:
- algo, digest = value.split(":", 1)
- except ValueError:
- parser.error(
- "Arguments to {} must be a hash name " # noqa
- "followed by a value, like --hash=sha256:"
- "abcde...".format(opt_str)
- )
- if algo not in STRONG_HASHES:
- parser.error(
- "Allowed hash algorithms for {} are {}.".format( # noqa
- opt_str, ", ".join(STRONG_HASHES)
- )
- )
- parser.values.hashes.setdefault(algo, []).append(digest)
-
-
-hash = partial(
- Option,
- "--hash",
- # Hash values eventually end up in InstallRequirement.hashes due to
- # __dict__ copying in process_line().
- dest="hashes",
- action="callback",
- callback=_handle_merge_hash,
- type="string",
- help="Verify that the package's archive matches this "
- "hash before installing. Example: --hash=sha256:abcdef...",
-) # type: Callable[..., Option]
-
-
-require_hashes = partial(
- Option,
- "--require-hashes",
- dest="require_hashes",
- action="store_true",
- default=False,
- help="Require a hash to check each requirement against, for "
- "repeatable installs. This option is implied when any package in a "
- "requirements file has a --hash option.",
-) # type: Callable[..., Option]
-
-
-list_path = partial(
- PipOption,
- "--path",
- dest="path",
- type="path",
- action="append",
- help="Restrict to the specified installation path for listing "
- "packages (can be used multiple times).",
-) # type: Callable[..., Option]
-
-
-def check_list_path_option(options):
- # type: (Values) -> None
- if options.path and (options.user or options.local):
- raise CommandError("Cannot combine '--path' with '--user' or '--local'")
-
-
-list_exclude = partial(
- PipOption,
- "--exclude",
- dest="excludes",
- action="append",
- metavar="package",
- type="package_name",
- help="Exclude specified package from the output",
-) # type: Callable[..., Option]
-
-
-no_python_version_warning = partial(
- Option,
- "--no-python-version-warning",
- dest="no_python_version_warning",
- action="store_true",
- default=False,
- help="Silence deprecation warnings for upcoming unsupported Pythons.",
-) # type: Callable[..., Option]
-
-
-use_new_feature = partial(
- Option,
- "--use-feature",
- dest="features_enabled",
- metavar="feature",
- action="append",
- default=[],
- choices=["2020-resolver", "fast-deps", "in-tree-build"],
- help="Enable new functionality, that may be backward incompatible.",
-) # type: Callable[..., Option]
-
-use_deprecated_feature = partial(
- Option,
- "--use-deprecated",
- dest="deprecated_features_enabled",
- metavar="feature",
- action="append",
- default=[],
- choices=["legacy-resolver"],
- help=("Enable deprecated functionality, that will be removed in the future."),
-) # type: Callable[..., Option]
-
-
-##########
-# groups #
-##########
-
-general_group = {
- "name": "General Options",
- "options": [
- help_,
- isolated_mode,
- require_virtualenv,
- verbose,
- version,
- quiet,
- log,
- no_input,
- proxy,
- retries,
- timeout,
- exists_action,
- trusted_host,
- cert,
- client_cert,
- cache_dir,
- no_cache,
- disable_pip_version_check,
- no_color,
- no_python_version_warning,
- use_new_feature,
- use_deprecated_feature,
- ],
-} # type: Dict[str, Any]
-
-index_group = {
- "name": "Package Index Options",
- "options": [
- index_url,
- extra_index_url,
- no_index,
- find_links,
- ],
-} # type: Dict[str, Any]
diff --git a/venv/Lib/site-packages/pip/_internal/cli/command_context.py b/venv/Lib/site-packages/pip/_internal/cli/command_context.py
deleted file mode 100644
index 375a2e3..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/command_context.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from contextlib import ExitStack, contextmanager
-from typing import ContextManager, Iterator, TypeVar
-
-_T = TypeVar("_T", covariant=True)
-
-
-class CommandContextMixIn:
- def __init__(self):
- # type: () -> None
- super().__init__()
- self._in_main_context = False
- self._main_context = ExitStack()
-
- @contextmanager
- def main_context(self):
- # type: () -> Iterator[None]
- assert not self._in_main_context
-
- self._in_main_context = True
- try:
- with self._main_context:
- yield
- finally:
- self._in_main_context = False
-
- def enter_context(self, context_provider):
- # type: (ContextManager[_T]) -> _T
- assert self._in_main_context
-
- return self._main_context.enter_context(context_provider)
diff --git a/venv/Lib/site-packages/pip/_internal/cli/main.py b/venv/Lib/site-packages/pip/_internal/cli/main.py
deleted file mode 100644
index 7ae074b..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/main.py
+++ /dev/null
@@ -1,71 +0,0 @@
-"""Primary application entrypoint.
-"""
-import locale
-import logging
-import os
-import sys
-from typing import List, Optional
-
-from pip._internal.cli.autocompletion import autocomplete
-from pip._internal.cli.main_parser import parse_command
-from pip._internal.commands import create_command
-from pip._internal.exceptions import PipError
-from pip._internal.utils import deprecation
-
-logger = logging.getLogger(__name__)
-
-
-# Do not import and use main() directly! Using it directly is actively
-# discouraged by pip's maintainers. The name, location and behavior of
-# this function is subject to change, so calling it directly is not
-# portable across different pip versions.
-
-# In addition, running pip in-process is unsupported and unsafe. This is
-# elaborated in detail at
-# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program.
-# That document also provides suggestions that should work for nearly
-# all users that are considering importing and using main() directly.
-
-# However, we know that certain users will still want to invoke pip
-# in-process. If you understand and accept the implications of using pip
-# in an unsupported manner, the best approach is to use runpy to avoid
-# depending on the exact location of this entry point.
-
-# The following example shows how to use runpy to invoke pip in that
-# case:
-#
-# sys.argv = ["pip", your, args, here]
-# runpy.run_module("pip", run_name="__main__")
-#
-# Note that this will exit the process after running, unlike a direct
-# call to main. As it is not safe to do any processing after calling
-# main, this should not be an issue in practice.
-
-
-def main(args=None):
- # type: (Optional[List[str]]) -> int
- if args is None:
- args = sys.argv[1:]
-
- # Configure our deprecation warnings to be sent through loggers
- deprecation.install_warning_logger()
-
- autocomplete()
-
- try:
- cmd_name, cmd_args = parse_command(args)
- except PipError as exc:
- sys.stderr.write(f"ERROR: {exc}")
- sys.stderr.write(os.linesep)
- sys.exit(1)
-
- # Needed for locale.getpreferredencoding(False) to work
- # in pip._internal.utils.encoding.auto_decode
- try:
- locale.setlocale(locale.LC_ALL, "")
- except locale.Error as e:
- # setlocale can apparently crash if locale are uninitialized
- logger.debug("Ignoring error %s when setting locale", e)
- command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
-
- return command.main(cmd_args)
diff --git a/venv/Lib/site-packages/pip/_internal/cli/main_parser.py b/venv/Lib/site-packages/pip/_internal/cli/main_parser.py
deleted file mode 100644
index d0f58fe..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/main_parser.py
+++ /dev/null
@@ -1,89 +0,0 @@
-"""A single place for constructing and exposing the main parser
-"""
-
-import os
-import sys
-from typing import List, Tuple
-
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
-from pip._internal.commands import commands_dict, get_similar_commands
-from pip._internal.exceptions import CommandError
-from pip._internal.utils.misc import get_pip_version, get_prog
-
-__all__ = ["create_main_parser", "parse_command"]
-
-
-def create_main_parser():
- # type: () -> ConfigOptionParser
- """Creates and returns the main parser for pip's CLI"""
-
- parser = ConfigOptionParser(
- usage="\n%prog [options]",
- add_help_option=False,
- formatter=UpdatingDefaultsHelpFormatter(),
- name="global",
- prog=get_prog(),
- )
- parser.disable_interspersed_args()
-
- parser.version = get_pip_version()
-
- # add the general options
- gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
- parser.add_option_group(gen_opts)
-
- # so the help formatter knows
- parser.main = True # type: ignore
-
- # create command listing for description
- description = [""] + [
- f"{name:27} {command_info.summary}"
- for name, command_info in commands_dict.items()
- ]
- parser.description = "\n".join(description)
-
- return parser
-
-
-def parse_command(args):
- # type: (List[str]) -> Tuple[str, List[str]]
- parser = create_main_parser()
-
- # Note: parser calls disable_interspersed_args(), so the result of this
- # call is to split the initial args into the general options before the
- # subcommand and everything else.
- # For example:
- # args: ['--timeout=5', 'install', '--user', 'INITools']
- # general_options: ['--timeout==5']
- # args_else: ['install', '--user', 'INITools']
- general_options, args_else = parser.parse_args(args)
-
- # --version
- if general_options.version:
- sys.stdout.write(parser.version)
- sys.stdout.write(os.linesep)
- sys.exit()
-
- # pip || pip help -> print_help()
- if not args_else or (args_else[0] == "help" and len(args_else) == 1):
- parser.print_help()
- sys.exit()
-
- # the subcommand name
- cmd_name = args_else[0]
-
- if cmd_name not in commands_dict:
- guess = get_similar_commands(cmd_name)
-
- msg = [f'unknown command "{cmd_name}"']
- if guess:
- msg.append(f'maybe you meant "{guess}"')
-
- raise CommandError(" - ".join(msg))
-
- # all the args without the subcommand
- cmd_args = args[:]
- cmd_args.remove(cmd_name)
-
- return cmd_name, cmd_args
diff --git a/venv/Lib/site-packages/pip/_internal/cli/parser.py b/venv/Lib/site-packages/pip/_internal/cli/parser.py
deleted file mode 100644
index 16523c5..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/parser.py
+++ /dev/null
@@ -1,305 +0,0 @@
-"""Base option parser setup"""
-
-import logging
-import optparse
-import shutil
-import sys
-import textwrap
-from contextlib import suppress
-from typing import Any, Dict, Iterator, List, Tuple
-
-from pip._internal.cli.status_codes import UNKNOWN_ERROR
-from pip._internal.configuration import Configuration, ConfigurationError
-from pip._internal.utils.misc import redact_auth_from_url, strtobool
-
-logger = logging.getLogger(__name__)
-
-
-class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
- """A prettier/less verbose help formatter for optparse."""
-
- def __init__(self, *args, **kwargs):
- # type: (*Any, **Any) -> None
- # help position must be aligned with __init__.parseopts.description
- kwargs["max_help_position"] = 30
- kwargs["indent_increment"] = 1
- kwargs["width"] = shutil.get_terminal_size()[0] - 2
- super().__init__(*args, **kwargs)
-
- def format_option_strings(self, option):
- # type: (optparse.Option) -> str
- return self._format_option_strings(option)
-
- def _format_option_strings(self, option, mvarfmt=" <{}>", optsep=", "):
- # type: (optparse.Option, str, str) -> str
- """
- Return a comma-separated list of option strings and metavars.
-
- :param option: tuple of (short opt, long opt), e.g: ('-f', '--format')
- :param mvarfmt: metavar format string
- :param optsep: separator
- """
- opts = []
-
- if option._short_opts:
- opts.append(option._short_opts[0])
- if option._long_opts:
- opts.append(option._long_opts[0])
- if len(opts) > 1:
- opts.insert(1, optsep)
-
- if option.takes_value():
- assert option.dest is not None
- metavar = option.metavar or option.dest.lower()
- opts.append(mvarfmt.format(metavar.lower()))
-
- return "".join(opts)
-
- def format_heading(self, heading):
- # type: (str) -> str
- if heading == "Options":
- return ""
- return heading + ":\n"
-
- def format_usage(self, usage):
- # type: (str) -> str
- """
- Ensure there is only one newline between usage and the first heading
- if there is no description.
- """
- msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " "))
- return msg
-
- def format_description(self, description):
- # type: (str) -> str
- # leave full control over description to us
- if description:
- if hasattr(self.parser, "main"):
- label = "Commands"
- else:
- label = "Description"
- # some doc strings have initial newlines, some don't
- description = description.lstrip("\n")
- # some doc strings have final newlines and spaces, some don't
- description = description.rstrip()
- # dedent, then reindent
- description = self.indent_lines(textwrap.dedent(description), " ")
- description = f"{label}:\n{description}\n"
- return description
- else:
- return ""
-
- def format_epilog(self, epilog):
- # type: (str) -> str
- # leave full control over epilog to us
- if epilog:
- return epilog
- else:
- return ""
-
- def indent_lines(self, text, indent):
- # type: (str, str) -> str
- new_lines = [indent + line for line in text.split("\n")]
- return "\n".join(new_lines)
-
-
-class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
- """Custom help formatter for use in ConfigOptionParser.
-
- This is updates the defaults before expanding them, allowing
- them to show up correctly in the help listing.
-
- Also redact auth from url type options
- """
-
- def expand_default(self, option):
- # type: (optparse.Option) -> str
- default_values = None
- if self.parser is not None:
- assert isinstance(self.parser, ConfigOptionParser)
- self.parser._update_defaults(self.parser.defaults)
- assert option.dest is not None
- default_values = self.parser.defaults.get(option.dest)
- help_text = super().expand_default(option)
-
- if default_values and option.metavar == "URL":
- if isinstance(default_values, str):
- default_values = [default_values]
-
- # If its not a list, we should abort and just return the help text
- if not isinstance(default_values, list):
- default_values = []
-
- for val in default_values:
- help_text = help_text.replace(val, redact_auth_from_url(val))
-
- return help_text
-
-
-class CustomOptionParser(optparse.OptionParser):
- def insert_option_group(self, idx, *args, **kwargs):
- # type: (int, Any, Any) -> optparse.OptionGroup
- """Insert an OptionGroup at a given position."""
- group = self.add_option_group(*args, **kwargs)
-
- self.option_groups.pop()
- self.option_groups.insert(idx, group)
-
- return group
-
- @property
- def option_list_all(self):
- # type: () -> List[optparse.Option]
- """Get a list of all options, including those in option groups."""
- res = self.option_list[:]
- for i in self.option_groups:
- res.extend(i.option_list)
-
- return res
-
-
-class ConfigOptionParser(CustomOptionParser):
- """Custom option parser which updates its defaults by checking the
- configuration files and environmental variables"""
-
- def __init__(
- self,
- *args, # type: Any
- name, # type: str
- isolated=False, # type: bool
- **kwargs, # type: Any
- ):
- # type: (...) -> None
- self.name = name
- self.config = Configuration(isolated)
-
- assert self.name
- super().__init__(*args, **kwargs)
-
- def check_default(self, option, key, val):
- # type: (optparse.Option, str, Any) -> Any
- try:
- return option.check_value(key, val)
- except optparse.OptionValueError as exc:
- print(f"An error occurred during configuration: {exc}")
- sys.exit(3)
-
- def _get_ordered_configuration_items(self):
- # type: () -> Iterator[Tuple[str, Any]]
- # Configuration gives keys in an unordered manner. Order them.
- override_order = ["global", self.name, ":env:"]
-
- # Pool the options into different groups
- section_items = {
- name: [] for name in override_order
- } # type: Dict[str, List[Tuple[str, Any]]]
- for section_key, val in self.config.items():
- # ignore empty values
- if not val:
- logger.debug(
- "Ignoring configuration key '%s' as it's value is empty.",
- section_key,
- )
- continue
-
- section, key = section_key.split(".", 1)
- if section in override_order:
- section_items[section].append((key, val))
-
- # Yield each group in their override order
- for section in override_order:
- for key, val in section_items[section]:
- yield key, val
-
- def _update_defaults(self, defaults):
- # type: (Dict[str, Any]) -> Dict[str, Any]
- """Updates the given defaults with values from the config files and
- the environ. Does a little special handling for certain types of
- options (lists)."""
-
- # Accumulate complex default state.
- self.values = optparse.Values(self.defaults)
- late_eval = set()
- # Then set the options with those values
- for key, val in self._get_ordered_configuration_items():
- # '--' because configuration supports only long names
- option = self.get_option("--" + key)
-
- # Ignore options not present in this parser. E.g. non-globals put
- # in [global] by users that want them to apply to all applicable
- # commands.
- if option is None:
- continue
-
- assert option.dest is not None
-
- if option.action in ("store_true", "store_false"):
- try:
- val = strtobool(val)
- except ValueError:
- self.error(
- "{} is not a valid value for {} option, " # noqa
- "please specify a boolean value like yes/no, "
- "true/false or 1/0 instead.".format(val, key)
- )
- elif option.action == "count":
- with suppress(ValueError):
- val = strtobool(val)
- with suppress(ValueError):
- val = int(val)
- if not isinstance(val, int) or val < 0:
- self.error(
- "{} is not a valid value for {} option, " # noqa
- "please instead specify either a non-negative integer "
- "or a boolean value like yes/no or false/true "
- "which is equivalent to 1/0.".format(val, key)
- )
- elif option.action == "append":
- val = val.split()
- val = [self.check_default(option, key, v) for v in val]
- elif option.action == "callback":
- assert option.callback is not None
- late_eval.add(option.dest)
- opt_str = option.get_opt_string()
- val = option.convert_value(opt_str, val)
- # From take_action
- args = option.callback_args or ()
- kwargs = option.callback_kwargs or {}
- option.callback(option, opt_str, val, self, *args, **kwargs)
- else:
- val = self.check_default(option, key, val)
-
- defaults[option.dest] = val
-
- for key in late_eval:
- defaults[key] = getattr(self.values, key)
- self.values = None
- return defaults
-
- def get_default_values(self):
- # type: () -> optparse.Values
- """Overriding to make updating the defaults after instantiation of
- the option parser possible, _update_defaults() does the dirty work."""
- if not self.process_default_values:
- # Old, pre-Optik 1.5 behaviour.
- return optparse.Values(self.defaults)
-
- # Load the configuration, or error out in case of an error
- try:
- self.config.load()
- except ConfigurationError as err:
- self.exit(UNKNOWN_ERROR, str(err))
-
- defaults = self._update_defaults(self.defaults.copy()) # ours
- for option in self._get_all_options():
- assert option.dest is not None
- default = defaults.get(option.dest)
- if isinstance(default, str):
- opt_str = option.get_opt_string()
- defaults[option.dest] = option.check_value(opt_str, default)
- return optparse.Values(defaults)
-
- def error(self, msg):
- # type: (str) -> None
- self.print_usage(sys.stderr)
- self.exit(UNKNOWN_ERROR, f"{msg}\n")
diff --git a/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py b/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py
deleted file mode 100644
index 3064c85..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py
+++ /dev/null
@@ -1,261 +0,0 @@
-import itertools
-import sys
-from signal import SIGINT, default_int_handler, signal
-from typing import Any, Dict, List
-
-from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar
-from pip._vendor.progress.spinner import Spinner
-
-from pip._internal.utils.compat import WINDOWS
-from pip._internal.utils.logging import get_indentation
-from pip._internal.utils.misc import format_size
-
-try:
- from pip._vendor import colorama
-# Lots of different errors can come from this, including SystemError and
-# ImportError.
-except Exception:
- colorama = None
-
-
-def _select_progress_class(preferred, fallback):
- # type: (Bar, Bar) -> Bar
- encoding = getattr(preferred.file, "encoding", None)
-
- # If we don't know what encoding this file is in, then we'll just assume
- # that it doesn't support unicode and use the ASCII bar.
- if not encoding:
- return fallback
-
- # Collect all of the possible characters we want to use with the preferred
- # bar.
- characters = [
- getattr(preferred, "empty_fill", ""),
- getattr(preferred, "fill", ""),
- ]
- characters += list(getattr(preferred, "phases", []))
-
- # Try to decode the characters we're using for the bar using the encoding
- # of the given file, if this works then we'll assume that we can use the
- # fancier bar and if not we'll fall back to the plaintext bar.
- try:
- "".join(characters).encode(encoding)
- except UnicodeEncodeError:
- return fallback
- else:
- return preferred
-
-
-_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any
-
-
-class InterruptibleMixin:
- """
- Helper to ensure that self.finish() gets called on keyboard interrupt.
-
- This allows downloads to be interrupted without leaving temporary state
- (like hidden cursors) behind.
-
- This class is similar to the progress library's existing SigIntMixin
- helper, but as of version 1.2, that helper has the following problems:
-
- 1. It calls sys.exit().
- 2. It discards the existing SIGINT handler completely.
- 3. It leaves its own handler in place even after an uninterrupted finish,
- which will have unexpected delayed effects if the user triggers an
- unrelated keyboard interrupt some time after a progress-displaying
- download has already completed, for example.
- """
-
- def __init__(self, *args, **kwargs):
- # type: (List[Any], Dict[Any, Any]) -> None
- """
- Save the original SIGINT handler for later.
- """
- # https://github.com/python/mypy/issues/5887
- super().__init__(*args, **kwargs) # type: ignore
-
- self.original_handler = signal(SIGINT, self.handle_sigint)
-
- # If signal() returns None, the previous handler was not installed from
- # Python, and we cannot restore it. This probably should not happen,
- # but if it does, we must restore something sensible instead, at least.
- # The least bad option should be Python's default SIGINT handler, which
- # just raises KeyboardInterrupt.
- if self.original_handler is None:
- self.original_handler = default_int_handler
-
- def finish(self):
- # type: () -> None
- """
- Restore the original SIGINT handler after finishing.
-
- This should happen regardless of whether the progress display finishes
- normally, or gets interrupted.
- """
- super().finish() # type: ignore
- signal(SIGINT, self.original_handler)
-
- def handle_sigint(self, signum, frame): # type: ignore
- """
- Call self.finish() before delegating to the original SIGINT handler.
-
- This handler should only be in place while the progress display is
- active.
- """
- self.finish()
- self.original_handler(signum, frame)
-
-
-class SilentBar(Bar):
- def update(self):
- # type: () -> None
- pass
-
-
-class BlueEmojiBar(IncrementalBar):
-
- suffix = "%(percent)d%%"
- bar_prefix = " "
- bar_suffix = " "
- phases = ("\U0001F539", "\U0001F537", "\U0001F535")
-
-
-class DownloadProgressMixin:
- def __init__(self, *args, **kwargs):
- # type: (List[Any], Dict[Any, Any]) -> None
- # https://github.com/python/mypy/issues/5887
- super().__init__(*args, **kwargs) # type: ignore
- self.message = (" " * (get_indentation() + 2)) + self.message # type: str
-
- @property
- def downloaded(self):
- # type: () -> str
- return format_size(self.index) # type: ignore
-
- @property
- def download_speed(self):
- # type: () -> str
- # Avoid zero division errors...
- if self.avg == 0.0: # type: ignore
- return "..."
- return format_size(1 / self.avg) + "/s" # type: ignore
-
- @property
- def pretty_eta(self):
- # type: () -> str
- if self.eta: # type: ignore
- return f"eta {self.eta_td}" # type: ignore
- return ""
-
- def iter(self, it): # type: ignore
- for x in it:
- yield x
- # B305 is incorrectly raised here
- # https://github.com/PyCQA/flake8-bugbear/issues/59
- self.next(len(x)) # noqa: B305
- self.finish()
-
-
-class WindowsMixin:
- def __init__(self, *args, **kwargs):
- # type: (List[Any], Dict[Any, Any]) -> None
- # The Windows terminal does not support the hide/show cursor ANSI codes
- # even with colorama. So we'll ensure that hide_cursor is False on
- # Windows.
- # This call needs to go before the super() call, so that hide_cursor
- # is set in time. The base progress bar class writes the "hide cursor"
- # code to the terminal in its init, so if we don't set this soon
- # enough, we get a "hide" with no corresponding "show"...
- if WINDOWS and self.hide_cursor: # type: ignore
- self.hide_cursor = False
-
- # https://github.com/python/mypy/issues/5887
- super().__init__(*args, **kwargs) # type: ignore
-
- # Check if we are running on Windows and we have the colorama module,
- # if we do then wrap our file with it.
- if WINDOWS and colorama:
- self.file = colorama.AnsiToWin32(self.file) # type: ignore
- # The progress code expects to be able to call self.file.isatty()
- # but the colorama.AnsiToWin32() object doesn't have that, so we'll
- # add it.
- self.file.isatty = lambda: self.file.wrapped.isatty()
- # The progress code expects to be able to call self.file.flush()
- # but the colorama.AnsiToWin32() object doesn't have that, so we'll
- # add it.
- self.file.flush = lambda: self.file.wrapped.flush()
-
-
-class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, DownloadProgressMixin):
-
- file = sys.stdout
- message = "%(percent)d%%"
- suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s"
-
-
-class DefaultDownloadProgressBar(BaseDownloadProgressBar, _BaseBar):
- pass
-
-
-class DownloadSilentBar(BaseDownloadProgressBar, SilentBar):
- pass
-
-
-class DownloadBar(BaseDownloadProgressBar, Bar):
- pass
-
-
-class DownloadFillingCirclesBar(BaseDownloadProgressBar, FillingCirclesBar):
- pass
-
-
-class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, BlueEmojiBar):
- pass
-
-
-class DownloadProgressSpinner(
- WindowsMixin, InterruptibleMixin, DownloadProgressMixin, Spinner
-):
-
- file = sys.stdout
- suffix = "%(downloaded)s %(download_speed)s"
-
- def next_phase(self):
- # type: () -> str
- if not hasattr(self, "_phaser"):
- self._phaser = itertools.cycle(self.phases)
- return next(self._phaser)
-
- def update(self):
- # type: () -> None
- message = self.message % self
- phase = self.next_phase()
- suffix = self.suffix % self
- line = "".join(
- [
- message,
- " " if message else "",
- phase,
- " " if suffix else "",
- suffix,
- ]
- )
-
- self.writeln(line)
-
-
-BAR_TYPES = {
- "off": (DownloadSilentBar, DownloadSilentBar),
- "on": (DefaultDownloadProgressBar, DownloadProgressSpinner),
- "ascii": (DownloadBar, DownloadProgressSpinner),
- "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner),
- "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner),
-}
-
-
-def DownloadProgressProvider(progress_bar, max=None): # type: ignore
- if max is None or max == 0:
- return BAR_TYPES[progress_bar][1]().iter
- else:
- return BAR_TYPES[progress_bar][0](max=max).iter
diff --git a/venv/Lib/site-packages/pip/_internal/cli/req_command.py b/venv/Lib/site-packages/pip/_internal/cli/req_command.py
deleted file mode 100644
index 3fc00d4..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/req_command.py
+++ /dev/null
@@ -1,461 +0,0 @@
-"""Contains the Command base classes that depend on PipSession.
-
-The classes in this module are in a separate module so the commands not
-needing download / PackageFinder capability don't unnecessarily import the
-PackageFinder machinery and all its vendored dependencies, etc.
-"""
-
-import logging
-import os
-import sys
-from functools import partial
-from optparse import Values
-from typing import Any, List, Optional, Tuple
-
-from pip._internal.cache import WheelCache
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.command_context import CommandContextMixIn
-from pip._internal.exceptions import CommandError, PreviousBuildDirError
-from pip._internal.index.collector import LinkCollector
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.models.selection_prefs import SelectionPreferences
-from pip._internal.models.target_python import TargetPython
-from pip._internal.network.session import PipSession
-from pip._internal.operations.prepare import RequirementPreparer
-from pip._internal.req.constructors import (
- install_req_from_editable,
- install_req_from_line,
- install_req_from_parsed_requirement,
- install_req_from_req_string,
-)
-from pip._internal.req.req_file import parse_requirements
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.req.req_tracker import RequirementTracker
-from pip._internal.resolution.base import BaseResolver
-from pip._internal.self_outdated_check import pip_self_version_check
-from pip._internal.utils.temp_dir import (
- TempDirectory,
- TempDirectoryTypeRegistry,
- tempdir_kinds,
-)
-from pip._internal.utils.virtualenv import running_under_virtualenv
-
-logger = logging.getLogger(__name__)
-
-
-class SessionCommandMixin(CommandContextMixIn):
-
- """
- A class mixin for command classes needing _build_session().
- """
-
- def __init__(self):
- # type: () -> None
- super().__init__()
- self._session = None # Optional[PipSession]
-
- @classmethod
- def _get_index_urls(cls, options):
- # type: (Values) -> Optional[List[str]]
- """Return a list of index urls from user-provided options."""
- index_urls = []
- if not getattr(options, "no_index", False):
- url = getattr(options, "index_url", None)
- if url:
- index_urls.append(url)
- urls = getattr(options, "extra_index_urls", None)
- if urls:
- index_urls.extend(urls)
- # Return None rather than an empty list
- return index_urls or None
-
- def get_default_session(self, options):
- # type: (Values) -> PipSession
- """Get a default-managed session."""
- if self._session is None:
- self._session = self.enter_context(self._build_session(options))
- # there's no type annotation on requests.Session, so it's
- # automatically ContextManager[Any] and self._session becomes Any,
- # then https://github.com/python/mypy/issues/7696 kicks in
- assert self._session is not None
- return self._session
-
- def _build_session(self, options, retries=None, timeout=None):
- # type: (Values, Optional[int], Optional[int]) -> PipSession
- assert not options.cache_dir or os.path.isabs(options.cache_dir)
- session = PipSession(
- cache=(
- os.path.join(options.cache_dir, "http") if options.cache_dir else None
- ),
- retries=retries if retries is not None else options.retries,
- trusted_hosts=options.trusted_hosts,
- index_urls=self._get_index_urls(options),
- )
-
- # Handle custom ca-bundles from the user
- if options.cert:
- session.verify = options.cert
-
- # Handle SSL client certificate
- if options.client_cert:
- session.cert = options.client_cert
-
- # Handle timeouts
- if options.timeout or timeout:
- session.timeout = timeout if timeout is not None else options.timeout
-
- # Handle configured proxies
- if options.proxy:
- session.proxies = {
- "http": options.proxy,
- "https": options.proxy,
- }
-
- # Determine if we can prompt the user for authentication or not
- session.auth.prompting = not options.no_input
-
- return session
-
-
-class IndexGroupCommand(Command, SessionCommandMixin):
-
- """
- Abstract base class for commands with the index_group options.
-
- This also corresponds to the commands that permit the pip version check.
- """
-
- def handle_pip_version_check(self, options):
- # type: (Values) -> None
- """
- Do the pip version check if not disabled.
-
- This overrides the default behavior of not doing the check.
- """
- # Make sure the index_group options are present.
- assert hasattr(options, "no_index")
-
- if options.disable_pip_version_check or options.no_index:
- return
-
- # Otherwise, check if we're using the latest version of pip available.
- session = self._build_session(
- options, retries=0, timeout=min(5, options.timeout)
- )
- with session:
- pip_self_version_check(session, options)
-
-
-KEEPABLE_TEMPDIR_TYPES = [
- tempdir_kinds.BUILD_ENV,
- tempdir_kinds.EPHEM_WHEEL_CACHE,
- tempdir_kinds.REQ_BUILD,
-]
-
-
-def warn_if_run_as_root():
- # type: () -> None
- """Output a warning for sudo users on Unix.
-
- In a virtual environment, sudo pip still writes to virtualenv.
- On Windows, users may run pip as Administrator without issues.
- This warning only applies to Unix root users outside of virtualenv.
- """
- if running_under_virtualenv():
- return
- if not hasattr(os, "getuid"):
- return
- # On Windows, there are no "system managed" Python packages. Installing as
- # Administrator via pip is the correct way of updating system environments.
- #
- # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform
- # checks: https://mypy.readthedocs.io/en/stable/common_issues.html
- if sys.platform == "win32" or sys.platform == "cygwin":
- return
- if sys.platform == "darwin" or sys.platform == "linux":
- if os.getuid() != 0:
- return
- logger.warning(
- "Running pip as root will break packages and permissions. "
- "You should install packages reliably by using venv: "
- "https://pip.pypa.io/warnings/venv"
- )
-
-
-def with_cleanup(func):
- # type: (Any) -> Any
- """Decorator for common logic related to managing temporary
- directories.
- """
-
- def configure_tempdir_registry(registry):
- # type: (TempDirectoryTypeRegistry) -> None
- for t in KEEPABLE_TEMPDIR_TYPES:
- registry.set_delete(t, False)
-
- def wrapper(self, options, args):
- # type: (RequirementCommand, Values, List[Any]) -> Optional[int]
- assert self.tempdir_registry is not None
- if options.no_clean:
- configure_tempdir_registry(self.tempdir_registry)
-
- try:
- return func(self, options, args)
- except PreviousBuildDirError:
- # This kind of conflict can occur when the user passes an explicit
- # build directory with a pre-existing folder. In that case we do
- # not want to accidentally remove it.
- configure_tempdir_registry(self.tempdir_registry)
- raise
-
- return wrapper
-
-
-class RequirementCommand(IndexGroupCommand):
- def __init__(self, *args, **kw):
- # type: (Any, Any) -> None
- super().__init__(*args, **kw)
-
- self.cmd_opts.add_option(cmdoptions.no_clean())
-
- @staticmethod
- def determine_resolver_variant(options):
- # type: (Values) -> str
- """Determines which resolver should be used, based on the given options."""
- if "legacy-resolver" in options.deprecated_features_enabled:
- return "legacy"
-
- return "2020-resolver"
-
- @classmethod
- def make_requirement_preparer(
- cls,
- temp_build_dir, # type: TempDirectory
- options, # type: Values
- req_tracker, # type: RequirementTracker
- session, # type: PipSession
- finder, # type: PackageFinder
- use_user_site, # type: bool
- download_dir=None, # type: str
- ):
- # type: (...) -> RequirementPreparer
- """
- Create a RequirementPreparer instance for the given parameters.
- """
- temp_build_dir_path = temp_build_dir.path
- assert temp_build_dir_path is not None
-
- resolver_variant = cls.determine_resolver_variant(options)
- if resolver_variant == "2020-resolver":
- lazy_wheel = "fast-deps" in options.features_enabled
- if lazy_wheel:
- logger.warning(
- "pip is using lazily downloaded wheels using HTTP "
- "range requests to obtain dependency information. "
- "This experimental feature is enabled through "
- "--use-feature=fast-deps and it is not ready for "
- "production."
- )
- else:
- lazy_wheel = False
- if "fast-deps" in options.features_enabled:
- logger.warning(
- "fast-deps has no effect when used with the legacy resolver."
- )
-
- return RequirementPreparer(
- build_dir=temp_build_dir_path,
- src_dir=options.src_dir,
- download_dir=download_dir,
- build_isolation=options.build_isolation,
- req_tracker=req_tracker,
- session=session,
- progress_bar=options.progress_bar,
- finder=finder,
- require_hashes=options.require_hashes,
- use_user_site=use_user_site,
- lazy_wheel=lazy_wheel,
- in_tree_build="in-tree-build" in options.features_enabled,
- )
-
- @classmethod
- def make_resolver(
- cls,
- preparer, # type: RequirementPreparer
- finder, # type: PackageFinder
- options, # type: Values
- wheel_cache=None, # type: Optional[WheelCache]
- use_user_site=False, # type: bool
- ignore_installed=True, # type: bool
- ignore_requires_python=False, # type: bool
- force_reinstall=False, # type: bool
- upgrade_strategy="to-satisfy-only", # type: str
- use_pep517=None, # type: Optional[bool]
- py_version_info=None, # type: Optional[Tuple[int, ...]]
- ):
- # type: (...) -> BaseResolver
- """
- Create a Resolver instance for the given parameters.
- """
- make_install_req = partial(
- install_req_from_req_string,
- isolated=options.isolated_mode,
- use_pep517=use_pep517,
- )
- resolver_variant = cls.determine_resolver_variant(options)
- # The long import name and duplicated invocation is needed to convince
- # Mypy into correctly typechecking. Otherwise it would complain the
- # "Resolver" class being redefined.
- if resolver_variant == "2020-resolver":
- import pip._internal.resolution.resolvelib.resolver
-
- return pip._internal.resolution.resolvelib.resolver.Resolver(
- preparer=preparer,
- finder=finder,
- wheel_cache=wheel_cache,
- make_install_req=make_install_req,
- use_user_site=use_user_site,
- ignore_dependencies=options.ignore_dependencies,
- ignore_installed=ignore_installed,
- ignore_requires_python=ignore_requires_python,
- force_reinstall=force_reinstall,
- upgrade_strategy=upgrade_strategy,
- py_version_info=py_version_info,
- )
- import pip._internal.resolution.legacy.resolver
-
- return pip._internal.resolution.legacy.resolver.Resolver(
- preparer=preparer,
- finder=finder,
- wheel_cache=wheel_cache,
- make_install_req=make_install_req,
- use_user_site=use_user_site,
- ignore_dependencies=options.ignore_dependencies,
- ignore_installed=ignore_installed,
- ignore_requires_python=ignore_requires_python,
- force_reinstall=force_reinstall,
- upgrade_strategy=upgrade_strategy,
- py_version_info=py_version_info,
- )
-
- def get_requirements(
- self,
- args, # type: List[str]
- options, # type: Values
- finder, # type: PackageFinder
- session, # type: PipSession
- ):
- # type: (...) -> List[InstallRequirement]
- """
- Parse command-line arguments into the corresponding requirements.
- """
- requirements = [] # type: List[InstallRequirement]
- for filename in options.constraints:
- for parsed_req in parse_requirements(
- filename,
- constraint=True,
- finder=finder,
- options=options,
- session=session,
- ):
- req_to_add = install_req_from_parsed_requirement(
- parsed_req,
- isolated=options.isolated_mode,
- user_supplied=False,
- )
- requirements.append(req_to_add)
-
- for req in args:
- req_to_add = install_req_from_line(
- req,
- None,
- isolated=options.isolated_mode,
- use_pep517=options.use_pep517,
- user_supplied=True,
- )
- requirements.append(req_to_add)
-
- for req in options.editables:
- req_to_add = install_req_from_editable(
- req,
- user_supplied=True,
- isolated=options.isolated_mode,
- use_pep517=options.use_pep517,
- )
- requirements.append(req_to_add)
-
- # NOTE: options.require_hashes may be set if --require-hashes is True
- for filename in options.requirements:
- for parsed_req in parse_requirements(
- filename, finder=finder, options=options, session=session
- ):
- req_to_add = install_req_from_parsed_requirement(
- parsed_req,
- isolated=options.isolated_mode,
- use_pep517=options.use_pep517,
- user_supplied=True,
- )
- requirements.append(req_to_add)
-
- # If any requirement has hash options, enable hash checking.
- if any(req.has_hash_options for req in requirements):
- options.require_hashes = True
-
- if not (args or options.editables or options.requirements):
- opts = {"name": self.name}
- if options.find_links:
- raise CommandError(
- "You must give at least one requirement to {name} "
- '(maybe you meant "pip {name} {links}"?)'.format(
- **dict(opts, links=" ".join(options.find_links))
- )
- )
- else:
- raise CommandError(
- "You must give at least one requirement to {name} "
- '(see "pip help {name}")'.format(**opts)
- )
-
- return requirements
-
- @staticmethod
- def trace_basic_info(finder):
- # type: (PackageFinder) -> None
- """
- Trace basic information about the provided objects.
- """
- # Display where finder is looking for packages
- search_scope = finder.search_scope
- locations = search_scope.get_formatted_locations()
- if locations:
- logger.info(locations)
-
- def _build_package_finder(
- self,
- options, # type: Values
- session, # type: PipSession
- target_python=None, # type: Optional[TargetPython]
- ignore_requires_python=None, # type: Optional[bool]
- ):
- # type: (...) -> PackageFinder
- """
- Create a package finder appropriate to this requirement command.
-
- :param ignore_requires_python: Whether to ignore incompatible
- "Requires-Python" values in links. Defaults to False.
- """
- link_collector = LinkCollector.create(session, options=options)
- selection_prefs = SelectionPreferences(
- allow_yanked=True,
- format_control=options.format_control,
- allow_all_prereleases=options.pre,
- prefer_binary=options.prefer_binary,
- ignore_requires_python=ignore_requires_python,
- )
-
- return PackageFinder.create(
- link_collector=link_collector,
- selection_prefs=selection_prefs,
- target_python=target_python,
- )
diff --git a/venv/Lib/site-packages/pip/_internal/cli/spinners.py b/venv/Lib/site-packages/pip/_internal/cli/spinners.py
deleted file mode 100644
index 08e1566..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/spinners.py
+++ /dev/null
@@ -1,172 +0,0 @@
-import contextlib
-import itertools
-import logging
-import sys
-import time
-from typing import IO, Iterator
-
-from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR
-
-from pip._internal.utils.compat import WINDOWS
-from pip._internal.utils.logging import get_indentation
-
-logger = logging.getLogger(__name__)
-
-
-class SpinnerInterface:
- def spin(self):
- # type: () -> None
- raise NotImplementedError()
-
- def finish(self, final_status):
- # type: (str) -> None
- raise NotImplementedError()
-
-
-class InteractiveSpinner(SpinnerInterface):
- def __init__(
- self,
- message,
- file=None,
- spin_chars="-\\|/",
- # Empirically, 8 updates/second looks nice
- min_update_interval_seconds=0.125,
- ):
- # type: (str, IO[str], str, float) -> None
- self._message = message
- if file is None:
- file = sys.stdout
- self._file = file
- self._rate_limiter = RateLimiter(min_update_interval_seconds)
- self._finished = False
-
- self._spin_cycle = itertools.cycle(spin_chars)
-
- self._file.write(" " * get_indentation() + self._message + " ... ")
- self._width = 0
-
- def _write(self, status):
- # type: (str) -> None
- assert not self._finished
- # Erase what we wrote before by backspacing to the beginning, writing
- # spaces to overwrite the old text, and then backspacing again
- backup = "\b" * self._width
- self._file.write(backup + " " * self._width + backup)
- # Now we have a blank slate to add our status
- self._file.write(status)
- self._width = len(status)
- self._file.flush()
- self._rate_limiter.reset()
-
- def spin(self):
- # type: () -> None
- if self._finished:
- return
- if not self._rate_limiter.ready():
- return
- self._write(next(self._spin_cycle))
-
- def finish(self, final_status):
- # type: (str) -> None
- if self._finished:
- return
- self._write(final_status)
- self._file.write("\n")
- self._file.flush()
- self._finished = True
-
-
-# Used for dumb terminals, non-interactive installs (no tty), etc.
-# We still print updates occasionally (once every 60 seconds by default) to
-# act as a keep-alive for systems like Travis-CI that take lack-of-output as
-# an indication that a task has frozen.
-class NonInteractiveSpinner(SpinnerInterface):
- def __init__(self, message, min_update_interval_seconds=60):
- # type: (str, float) -> None
- self._message = message
- self._finished = False
- self._rate_limiter = RateLimiter(min_update_interval_seconds)
- self._update("started")
-
- def _update(self, status):
- # type: (str) -> None
- assert not self._finished
- self._rate_limiter.reset()
- logger.info("%s: %s", self._message, status)
-
- def spin(self):
- # type: () -> None
- if self._finished:
- return
- if not self._rate_limiter.ready():
- return
- self._update("still running...")
-
- def finish(self, final_status):
- # type: (str) -> None
- if self._finished:
- return
- self._update(f"finished with status '{final_status}'")
- self._finished = True
-
-
-class RateLimiter:
- def __init__(self, min_update_interval_seconds):
- # type: (float) -> None
- self._min_update_interval_seconds = min_update_interval_seconds
- self._last_update = 0 # type: float
-
- def ready(self):
- # type: () -> bool
- now = time.time()
- delta = now - self._last_update
- return delta >= self._min_update_interval_seconds
-
- def reset(self):
- # type: () -> None
- self._last_update = time.time()
-
-
-@contextlib.contextmanager
-def open_spinner(message):
- # type: (str) -> Iterator[SpinnerInterface]
- # Interactive spinner goes directly to sys.stdout rather than being routed
- # through the logging system, but it acts like it has level INFO,
- # i.e. it's only displayed if we're at level INFO or better.
- # Non-interactive spinner goes through the logging system, so it is always
- # in sync with logging configuration.
- if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO:
- spinner = InteractiveSpinner(message) # type: SpinnerInterface
- else:
- spinner = NonInteractiveSpinner(message)
- try:
- with hidden_cursor(sys.stdout):
- yield spinner
- except KeyboardInterrupt:
- spinner.finish("canceled")
- raise
- except Exception:
- spinner.finish("error")
- raise
- else:
- spinner.finish("done")
-
-
-@contextlib.contextmanager
-def hidden_cursor(file):
- # type: (IO[str]) -> Iterator[None]
- # The Windows terminal does not support the hide/show cursor ANSI codes,
- # even via colorama. So don't even try.
- if WINDOWS:
- yield
- # We don't want to clutter the output with control characters if we're
- # writing to a file, or if the user is running with --quiet.
- # See https://github.com/pypa/pip/issues/3418
- elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
- yield
- else:
- file.write(HIDE_CURSOR)
- try:
- yield
- finally:
- file.write(SHOW_CURSOR)
diff --git a/venv/Lib/site-packages/pip/_internal/cli/status_codes.py b/venv/Lib/site-packages/pip/_internal/cli/status_codes.py
deleted file mode 100644
index 5e29502..0000000
--- a/venv/Lib/site-packages/pip/_internal/cli/status_codes.py
+++ /dev/null
@@ -1,6 +0,0 @@
-SUCCESS = 0
-ERROR = 1
-UNKNOWN_ERROR = 2
-VIRTUALENV_NOT_FOUND = 3
-PREVIOUS_BUILD_DIR_ERROR = 4
-NO_MATCHES_FOUND = 23
diff --git a/venv/Lib/site-packages/pip/_internal/commands/__init__.py b/venv/Lib/site-packages/pip/_internal/commands/__init__.py
deleted file mode 100644
index 31c985f..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/__init__.py
+++ /dev/null
@@ -1,110 +0,0 @@
-"""
-Package containing all pip commands
-"""
-
-import importlib
-from collections import OrderedDict, namedtuple
-from typing import Any, Optional
-
-from pip._internal.cli.base_command import Command
-
-CommandInfo = namedtuple('CommandInfo', 'module_path, class_name, summary')
-
-# The ordering matters for help display.
-# Also, even though the module path starts with the same
-# "pip._internal.commands" prefix in each case, we include the full path
-# because it makes testing easier (specifically when modifying commands_dict
-# in test setup / teardown by adding info for a FakeCommand class defined
-# in a test-related module).
-# Finally, we need to pass an iterable of pairs here rather than a dict
-# so that the ordering won't be lost when using Python 2.7.
-commands_dict = OrderedDict([
- ('install', CommandInfo(
- 'pip._internal.commands.install', 'InstallCommand',
- 'Install packages.',
- )),
- ('download', CommandInfo(
- 'pip._internal.commands.download', 'DownloadCommand',
- 'Download packages.',
- )),
- ('uninstall', CommandInfo(
- 'pip._internal.commands.uninstall', 'UninstallCommand',
- 'Uninstall packages.',
- )),
- ('freeze', CommandInfo(
- 'pip._internal.commands.freeze', 'FreezeCommand',
- 'Output installed packages in requirements format.',
- )),
- ('list', CommandInfo(
- 'pip._internal.commands.list', 'ListCommand',
- 'List installed packages.',
- )),
- ('show', CommandInfo(
- 'pip._internal.commands.show', 'ShowCommand',
- 'Show information about installed packages.',
- )),
- ('check', CommandInfo(
- 'pip._internal.commands.check', 'CheckCommand',
- 'Verify installed packages have compatible dependencies.',
- )),
- ('config', CommandInfo(
- 'pip._internal.commands.configuration', 'ConfigurationCommand',
- 'Manage local and global configuration.',
- )),
- ('search', CommandInfo(
- 'pip._internal.commands.search', 'SearchCommand',
- 'Search PyPI for packages.',
- )),
- ('cache', CommandInfo(
- 'pip._internal.commands.cache', 'CacheCommand',
- "Inspect and manage pip's wheel cache.",
- )),
- ('wheel', CommandInfo(
- 'pip._internal.commands.wheel', 'WheelCommand',
- 'Build wheels from your requirements.',
- )),
- ('hash', CommandInfo(
- 'pip._internal.commands.hash', 'HashCommand',
- 'Compute hashes of package archives.',
- )),
- ('completion', CommandInfo(
- 'pip._internal.commands.completion', 'CompletionCommand',
- 'A helper command used for command completion.',
- )),
- ('debug', CommandInfo(
- 'pip._internal.commands.debug', 'DebugCommand',
- 'Show information useful for debugging.',
- )),
- ('help', CommandInfo(
- 'pip._internal.commands.help', 'HelpCommand',
- 'Show help for commands.',
- )),
-]) # type: OrderedDict[str, CommandInfo]
-
-
-def create_command(name, **kwargs):
- # type: (str, **Any) -> Command
- """
- Create an instance of the Command class with the given name.
- """
- module_path, class_name, summary = commands_dict[name]
- module = importlib.import_module(module_path)
- command_class = getattr(module, class_name)
- command = command_class(name=name, summary=summary, **kwargs)
-
- return command
-
-
-def get_similar_commands(name):
- # type: (str) -> Optional[str]
- """Command name auto-correct."""
- from difflib import get_close_matches
-
- name = name.lower()
-
- close_commands = get_close_matches(name, commands_dict.keys())
-
- if close_commands:
- return close_commands[0]
- else:
- return None
diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index ff55f23..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc
deleted file mode 100644
index eb247e7..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/commands/cache.py b/venv/Lib/site-packages/pip/_internal/commands/cache.py
deleted file mode 100644
index 5155a50..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/cache.py
+++ /dev/null
@@ -1,228 +0,0 @@
-import logging
-import os
-import textwrap
-from optparse import Values
-from typing import Any, List
-
-import pip._internal.utils.filesystem as filesystem
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import ERROR, SUCCESS
-from pip._internal.exceptions import CommandError, PipError
-
-logger = logging.getLogger(__name__)
-
-
-class CacheCommand(Command):
- """
- Inspect and manage pip's wheel cache.
-
- Subcommands:
-
- - dir: Show the cache directory.
- - info: Show information about the cache.
- - list: List filenames of packages stored in the cache.
- - remove: Remove one or more package from the cache.
- - purge: Remove all items from the cache.
-
- ```` can be a glob expression or a package name.
- """
-
- ignore_require_venv = True
- usage = """
- %prog dir
- %prog info
- %prog list [] [--format=[human, abspath]]
- %prog remove
- %prog purge
- """
-
- def add_options(self):
- # type: () -> None
-
- self.cmd_opts.add_option(
- '--format',
- action='store',
- dest='list_format',
- default="human",
- choices=('human', 'abspath'),
- help="Select the output format among: human (default) or abspath"
- )
-
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def run(self, options, args):
- # type: (Values, List[Any]) -> int
- handlers = {
- "dir": self.get_cache_dir,
- "info": self.get_cache_info,
- "list": self.list_cache_items,
- "remove": self.remove_cache_items,
- "purge": self.purge_cache,
- }
-
- if not options.cache_dir:
- logger.error("pip cache commands can not "
- "function since cache is disabled.")
- return ERROR
-
- # Determine action
- if not args or args[0] not in handlers:
- logger.error(
- "Need an action (%s) to perform.",
- ", ".join(sorted(handlers)),
- )
- return ERROR
-
- action = args[0]
-
- # Error handling happens here, not in the action-handlers.
- try:
- handlers[action](options, args[1:])
- except PipError as e:
- logger.error(e.args[0])
- return ERROR
-
- return SUCCESS
-
- def get_cache_dir(self, options, args):
- # type: (Values, List[Any]) -> None
- if args:
- raise CommandError('Too many arguments')
-
- logger.info(options.cache_dir)
-
- def get_cache_info(self, options, args):
- # type: (Values, List[Any]) -> None
- if args:
- raise CommandError('Too many arguments')
-
- num_http_files = len(self._find_http_files(options))
- num_packages = len(self._find_wheels(options, '*'))
-
- http_cache_location = self._cache_dir(options, 'http')
- wheels_cache_location = self._cache_dir(options, 'wheels')
- http_cache_size = filesystem.format_directory_size(http_cache_location)
- wheels_cache_size = filesystem.format_directory_size(
- wheels_cache_location
- )
-
- message = textwrap.dedent("""
- Package index page cache location: {http_cache_location}
- Package index page cache size: {http_cache_size}
- Number of HTTP files: {num_http_files}
- Wheels location: {wheels_cache_location}
- Wheels size: {wheels_cache_size}
- Number of wheels: {package_count}
- """).format(
- http_cache_location=http_cache_location,
- http_cache_size=http_cache_size,
- num_http_files=num_http_files,
- wheels_cache_location=wheels_cache_location,
- package_count=num_packages,
- wheels_cache_size=wheels_cache_size,
- ).strip()
-
- logger.info(message)
-
- def list_cache_items(self, options, args):
- # type: (Values, List[Any]) -> None
- if len(args) > 1:
- raise CommandError('Too many arguments')
-
- if args:
- pattern = args[0]
- else:
- pattern = '*'
-
- files = self._find_wheels(options, pattern)
- if options.list_format == 'human':
- self.format_for_human(files)
- else:
- self.format_for_abspath(files)
-
- def format_for_human(self, files):
- # type: (List[str]) -> None
- if not files:
- logger.info('Nothing cached.')
- return
-
- results = []
- for filename in files:
- wheel = os.path.basename(filename)
- size = filesystem.format_file_size(filename)
- results.append(f' - {wheel} ({size})')
- logger.info('Cache contents:\n')
- logger.info('\n'.join(sorted(results)))
-
- def format_for_abspath(self, files):
- # type: (List[str]) -> None
- if not files:
- return
-
- results = []
- for filename in files:
- results.append(filename)
-
- logger.info('\n'.join(sorted(results)))
-
- def remove_cache_items(self, options, args):
- # type: (Values, List[Any]) -> None
- if len(args) > 1:
- raise CommandError('Too many arguments')
-
- if not args:
- raise CommandError('Please provide a pattern')
-
- files = self._find_wheels(options, args[0])
-
- # Only fetch http files if no specific pattern given
- if args[0] == '*':
- files += self._find_http_files(options)
-
- if not files:
- raise CommandError('No matching packages')
-
- for filename in files:
- os.unlink(filename)
- logger.debug('Removed %s', filename)
- logger.info('Files removed: %s', len(files))
-
- def purge_cache(self, options, args):
- # type: (Values, List[Any]) -> None
- if args:
- raise CommandError('Too many arguments')
-
- return self.remove_cache_items(options, ['*'])
-
- def _cache_dir(self, options, subdir):
- # type: (Values, str) -> str
- return os.path.join(options.cache_dir, subdir)
-
- def _find_http_files(self, options):
- # type: (Values) -> List[str]
- http_dir = self._cache_dir(options, 'http')
- return filesystem.find_files(http_dir, '*')
-
- def _find_wheels(self, options, pattern):
- # type: (Values, str) -> List[str]
- wheel_dir = self._cache_dir(options, 'wheels')
-
- # The wheel filename format, as specified in PEP 427, is:
- # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl
- #
- # Additionally, non-alphanumeric values in the distribution are
- # normalized to underscores (_), meaning hyphens can never occur
- # before `-{version}`.
- #
- # Given that information:
- # - If the pattern we're given contains a hyphen (-), the user is
- # providing at least the version. Thus, we can just append `*.whl`
- # to match the rest of it.
- # - If the pattern we're given doesn't contain a hyphen (-), the
- # user is only providing the name. Thus, we append `-*.whl` to
- # match the hyphen before the version, followed by anything else.
- #
- # PEP 427: https://www.python.org/dev/peps/pep-0427/
- pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl")
-
- return filesystem.find_files(wheel_dir, pattern)
diff --git a/venv/Lib/site-packages/pip/_internal/commands/check.py b/venv/Lib/site-packages/pip/_internal/commands/check.py
deleted file mode 100644
index 70aa5af..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/check.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import logging
-from optparse import Values
-from typing import Any, List
-
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import ERROR, SUCCESS
-from pip._internal.operations.check import (
- check_package_set,
- create_package_set_from_installed,
-)
-from pip._internal.utils.misc import write_output
-
-logger = logging.getLogger(__name__)
-
-
-class CheckCommand(Command):
- """Verify installed packages have compatible dependencies."""
-
- usage = """
- %prog [options]"""
-
- def run(self, options, args):
- # type: (Values, List[Any]) -> int
-
- package_set, parsing_probs = create_package_set_from_installed()
- missing, conflicting = check_package_set(package_set)
-
- for project_name in missing:
- version = package_set[project_name].version
- for dependency in missing[project_name]:
- write_output(
- "%s %s requires %s, which is not installed.",
- project_name, version, dependency[0],
- )
-
- for project_name in conflicting:
- version = package_set[project_name].version
- for dep_name, dep_version, req in conflicting[project_name]:
- write_output(
- "%s %s has requirement %s, but you have %s %s.",
- project_name, version, req, dep_name, dep_version,
- )
-
- if missing or conflicting or parsing_probs:
- return ERROR
- else:
- write_output("No broken requirements found.")
- return SUCCESS
diff --git a/venv/Lib/site-packages/pip/_internal/commands/completion.py b/venv/Lib/site-packages/pip/_internal/commands/completion.py
deleted file mode 100644
index 92cb788..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/completion.py
+++ /dev/null
@@ -1,93 +0,0 @@
-import sys
-import textwrap
-from optparse import Values
-from typing import List
-
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import SUCCESS
-from pip._internal.utils.misc import get_prog
-
-BASE_COMPLETION = """
-# pip {shell} completion start{script}# pip {shell} completion end
-"""
-
-COMPLETION_SCRIPTS = {
- 'bash': """
- _pip_completion()
- {{
- COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\
- COMP_CWORD=$COMP_CWORD \\
- PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) )
- }}
- complete -o default -F _pip_completion {prog}
- """,
- 'zsh': """
- function _pip_completion {{
- local words cword
- read -Ac words
- read -cn cword
- reply=( $( COMP_WORDS="$words[*]" \\
- COMP_CWORD=$(( cword-1 )) \\
- PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ))
- }}
- compctl -K _pip_completion {prog}
- """,
- 'fish': """
- function __fish_complete_pip
- set -lx COMP_WORDS (commandline -o) ""
- set -lx COMP_CWORD ( \\
- math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\
- )
- set -lx PIP_AUTO_COMPLETE 1
- string split \\ -- (eval $COMP_WORDS[1])
- end
- complete -fa "(__fish_complete_pip)" -c {prog}
- """,
-}
-
-
-class CompletionCommand(Command):
- """A helper command to be used for command completion."""
-
- ignore_require_venv = True
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(
- '--bash', '-b',
- action='store_const',
- const='bash',
- dest='shell',
- help='Emit completion code for bash')
- self.cmd_opts.add_option(
- '--zsh', '-z',
- action='store_const',
- const='zsh',
- dest='shell',
- help='Emit completion code for zsh')
- self.cmd_opts.add_option(
- '--fish', '-f',
- action='store_const',
- const='fish',
- dest='shell',
- help='Emit completion code for fish')
-
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- """Prints the completion code of the given shell"""
- shells = COMPLETION_SCRIPTS.keys()
- shell_options = ['--' + shell for shell in sorted(shells)]
- if options.shell in shells:
- script = textwrap.dedent(
- COMPLETION_SCRIPTS.get(options.shell, '').format(
- prog=get_prog())
- )
- print(BASE_COMPLETION.format(script=script, shell=options.shell))
- return SUCCESS
- else:
- sys.stderr.write(
- 'ERROR: You must pass {}\n' .format(' or '.join(shell_options))
- )
- return SUCCESS
diff --git a/venv/Lib/site-packages/pip/_internal/commands/configuration.py b/venv/Lib/site-packages/pip/_internal/commands/configuration.py
deleted file mode 100644
index e13f714..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/configuration.py
+++ /dev/null
@@ -1,280 +0,0 @@
-import logging
-import os
-import subprocess
-from optparse import Values
-from typing import Any, List, Optional
-
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import ERROR, SUCCESS
-from pip._internal.configuration import (
- Configuration,
- Kind,
- get_configuration_files,
- kinds,
-)
-from pip._internal.exceptions import PipError
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import get_prog, write_output
-
-logger = logging.getLogger(__name__)
-
-
-class ConfigurationCommand(Command):
- """
- Manage local and global configuration.
-
- Subcommands:
-
- - list: List the active configuration (or from the file specified)
- - edit: Edit the configuration file in an editor
- - get: Get the value associated with name
- - set: Set the name=value
- - unset: Unset the value associated with name
- - debug: List the configuration files and values defined under them
-
- If none of --user, --global and --site are passed, a virtual
- environment configuration file is used if one is active and the file
- exists. Otherwise, all modifications happen on the to the user file by
- default.
- """
-
- ignore_require_venv = True
- usage = """
- %prog [] list
- %prog [] [--editor ] edit
-
- %prog [] get name
- %prog [] set name value
- %prog [] unset name
- %prog [] debug
- """
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(
- '--editor',
- dest='editor',
- action='store',
- default=None,
- help=(
- 'Editor to use to edit the file. Uses VISUAL or EDITOR '
- 'environment variables if not provided.'
- )
- )
-
- self.cmd_opts.add_option(
- '--global',
- dest='global_file',
- action='store_true',
- default=False,
- help='Use the system-wide configuration file only'
- )
-
- self.cmd_opts.add_option(
- '--user',
- dest='user_file',
- action='store_true',
- default=False,
- help='Use the user configuration file only'
- )
-
- self.cmd_opts.add_option(
- '--site',
- dest='site_file',
- action='store_true',
- default=False,
- help='Use the current environment configuration file only'
- )
-
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- handlers = {
- "list": self.list_values,
- "edit": self.open_in_editor,
- "get": self.get_name,
- "set": self.set_name_value,
- "unset": self.unset_name,
- "debug": self.list_config_values,
- }
-
- # Determine action
- if not args or args[0] not in handlers:
- logger.error(
- "Need an action (%s) to perform.",
- ", ".join(sorted(handlers)),
- )
- return ERROR
-
- action = args[0]
-
- # Determine which configuration files are to be loaded
- # Depends on whether the command is modifying.
- try:
- load_only = self._determine_file(
- options, need_value=(action in ["get", "set", "unset", "edit"])
- )
- except PipError as e:
- logger.error(e.args[0])
- return ERROR
-
- # Load a new configuration
- self.configuration = Configuration(
- isolated=options.isolated_mode, load_only=load_only
- )
- self.configuration.load()
-
- # Error handling happens here, not in the action-handlers.
- try:
- handlers[action](options, args[1:])
- except PipError as e:
- logger.error(e.args[0])
- return ERROR
-
- return SUCCESS
-
- def _determine_file(self, options, need_value):
- # type: (Values, bool) -> Optional[Kind]
- file_options = [key for key, value in (
- (kinds.USER, options.user_file),
- (kinds.GLOBAL, options.global_file),
- (kinds.SITE, options.site_file),
- ) if value]
-
- if not file_options:
- if not need_value:
- return None
- # Default to user, unless there's a site file.
- elif any(
- os.path.exists(site_config_file)
- for site_config_file in get_configuration_files()[kinds.SITE]
- ):
- return kinds.SITE
- else:
- return kinds.USER
- elif len(file_options) == 1:
- return file_options[0]
-
- raise PipError(
- "Need exactly one file to operate upon "
- "(--user, --site, --global) to perform."
- )
-
- def list_values(self, options, args):
- # type: (Values, List[str]) -> None
- self._get_n_args(args, "list", n=0)
-
- for key, value in sorted(self.configuration.items()):
- write_output("%s=%r", key, value)
-
- def get_name(self, options, args):
- # type: (Values, List[str]) -> None
- key = self._get_n_args(args, "get [name]", n=1)
- value = self.configuration.get_value(key)
-
- write_output("%s", value)
-
- def set_name_value(self, options, args):
- # type: (Values, List[str]) -> None
- key, value = self._get_n_args(args, "set [name] [value]", n=2)
- self.configuration.set_value(key, value)
-
- self._save_configuration()
-
- def unset_name(self, options, args):
- # type: (Values, List[str]) -> None
- key = self._get_n_args(args, "unset [name]", n=1)
- self.configuration.unset_value(key)
-
- self._save_configuration()
-
- def list_config_values(self, options, args):
- # type: (Values, List[str]) -> None
- """List config key-value pairs across different config files"""
- self._get_n_args(args, "debug", n=0)
-
- self.print_env_var_values()
- # Iterate over config files and print if they exist, and the
- # key-value pairs present in them if they do
- for variant, files in sorted(self.configuration.iter_config_files()):
- write_output("%s:", variant)
- for fname in files:
- with indent_log():
- file_exists = os.path.exists(fname)
- write_output("%s, exists: %r",
- fname, file_exists)
- if file_exists:
- self.print_config_file_values(variant)
-
- def print_config_file_values(self, variant):
- # type: (Kind) -> None
- """Get key-value pairs from the file of a variant"""
- for name, value in self.configuration.\
- get_values_in_config(variant).items():
- with indent_log():
- write_output("%s: %s", name, value)
-
- def print_env_var_values(self):
- # type: () -> None
- """Get key-values pairs present as environment variables"""
- write_output("%s:", 'env_var')
- with indent_log():
- for key, value in sorted(self.configuration.get_environ_vars()):
- env_var = f'PIP_{key.upper()}'
- write_output("%s=%r", env_var, value)
-
- def open_in_editor(self, options, args):
- # type: (Values, List[str]) -> None
- editor = self._determine_editor(options)
-
- fname = self.configuration.get_file_to_edit()
- if fname is None:
- raise PipError("Could not determine appropriate file.")
-
- try:
- subprocess.check_call([editor, fname])
- except subprocess.CalledProcessError as e:
- raise PipError(
- "Editor Subprocess exited with exit code {}"
- .format(e.returncode)
- )
-
- def _get_n_args(self, args, example, n):
- # type: (List[str], str, int) -> Any
- """Helper to make sure the command got the right number of arguments
- """
- if len(args) != n:
- msg = (
- 'Got unexpected number of arguments, expected {}. '
- '(example: "{} config {}")'
- ).format(n, get_prog(), example)
- raise PipError(msg)
-
- if n == 1:
- return args[0]
- else:
- return args
-
- def _save_configuration(self):
- # type: () -> None
- # We successfully ran a modifying command. Need to save the
- # configuration.
- try:
- self.configuration.save()
- except Exception:
- logger.exception(
- "Unable to save configuration. Please report this as a bug."
- )
- raise PipError("Internal Error.")
-
- def _determine_editor(self, options):
- # type: (Values) -> str
- if options.editor is not None:
- return options.editor
- elif "VISUAL" in os.environ:
- return os.environ["VISUAL"]
- elif "EDITOR" in os.environ:
- return os.environ["EDITOR"]
- else:
- raise PipError("Could not determine editor to use.")
diff --git a/venv/Lib/site-packages/pip/_internal/commands/debug.py b/venv/Lib/site-packages/pip/_internal/commands/debug.py
deleted file mode 100644
index ead5119..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/debug.py
+++ /dev/null
@@ -1,215 +0,0 @@
-import locale
-import logging
-import os
-import sys
-from optparse import Values
-from types import ModuleType
-from typing import Any, Dict, List, Optional
-
-import pip._vendor
-from pip._vendor.certifi import where
-from pip._vendor.packaging.version import parse as parse_version
-
-from pip import __file__ as pip_location
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.cmdoptions import make_target_python
-from pip._internal.cli.status_codes import SUCCESS
-from pip._internal.configuration import Configuration
-from pip._internal.metadata import get_environment
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import get_pip_version
-
-logger = logging.getLogger(__name__)
-
-
-def show_value(name, value):
- # type: (str, Any) -> None
- logger.info('%s: %s', name, value)
-
-
-def show_sys_implementation():
- # type: () -> None
- logger.info('sys.implementation:')
- implementation_name = sys.implementation.name
- with indent_log():
- show_value('name', implementation_name)
-
-
-def create_vendor_txt_map():
- # type: () -> Dict[str, str]
- vendor_txt_path = os.path.join(
- os.path.dirname(pip_location),
- '_vendor',
- 'vendor.txt'
- )
-
- with open(vendor_txt_path) as f:
- # Purge non version specifying lines.
- # Also, remove any space prefix or suffixes (including comments).
- lines = [line.strip().split(' ', 1)[0]
- for line in f.readlines() if '==' in line]
-
- # Transform into "module" -> version dict.
- return dict(line.split('==', 1) for line in lines) # type: ignore
-
-
-def get_module_from_module_name(module_name):
- # type: (str) -> ModuleType
- # Module name can be uppercase in vendor.txt for some reason...
- module_name = module_name.lower()
- # PATCH: setuptools is actually only pkg_resources.
- if module_name == 'setuptools':
- module_name = 'pkg_resources'
-
- __import__(
- f'pip._vendor.{module_name}',
- globals(),
- locals(),
- level=0
- )
- return getattr(pip._vendor, module_name)
-
-
-def get_vendor_version_from_module(module_name):
- # type: (str) -> Optional[str]
- module = get_module_from_module_name(module_name)
- version = getattr(module, '__version__', None)
-
- if not version:
- # Try to find version in debundled module info.
- env = get_environment([os.path.dirname(module.__file__)])
- dist = env.get_distribution(module_name)
- if dist:
- version = str(dist.version)
-
- return version
-
-
-def show_actual_vendor_versions(vendor_txt_versions):
- # type: (Dict[str, str]) -> None
- """Log the actual version and print extra info if there is
- a conflict or if the actual version could not be imported.
- """
- for module_name, expected_version in vendor_txt_versions.items():
- extra_message = ''
- actual_version = get_vendor_version_from_module(module_name)
- if not actual_version:
- extra_message = ' (Unable to locate actual module version, using'\
- ' vendor.txt specified version)'
- actual_version = expected_version
- elif parse_version(actual_version) != parse_version(expected_version):
- extra_message = ' (CONFLICT: vendor.txt suggests version should'\
- ' be {})'.format(expected_version)
- logger.info('%s==%s%s', module_name, actual_version, extra_message)
-
-
-def show_vendor_versions():
- # type: () -> None
- logger.info('vendored library versions:')
-
- vendor_txt_versions = create_vendor_txt_map()
- with indent_log():
- show_actual_vendor_versions(vendor_txt_versions)
-
-
-def show_tags(options):
- # type: (Values) -> None
- tag_limit = 10
-
- target_python = make_target_python(options)
- tags = target_python.get_tags()
-
- # Display the target options that were explicitly provided.
- formatted_target = target_python.format_given()
- suffix = ''
- if formatted_target:
- suffix = f' (target: {formatted_target})'
-
- msg = 'Compatible tags: {}{}'.format(len(tags), suffix)
- logger.info(msg)
-
- if options.verbose < 1 and len(tags) > tag_limit:
- tags_limited = True
- tags = tags[:tag_limit]
- else:
- tags_limited = False
-
- with indent_log():
- for tag in tags:
- logger.info(str(tag))
-
- if tags_limited:
- msg = (
- '...\n'
- '[First {tag_limit} tags shown. Pass --verbose to show all.]'
- ).format(tag_limit=tag_limit)
- logger.info(msg)
-
-
-def ca_bundle_info(config):
- # type: (Configuration) -> str
- levels = set()
- for key, _ in config.items():
- levels.add(key.split('.')[0])
-
- if not levels:
- return "Not specified"
-
- levels_that_override_global = ['install', 'wheel', 'download']
- global_overriding_level = [
- level for level in levels if level in levels_that_override_global
- ]
- if not global_overriding_level:
- return 'global'
-
- if 'global' in levels:
- levels.remove('global')
- return ", ".join(levels)
-
-
-class DebugCommand(Command):
- """
- Display debug information.
- """
-
- usage = """
- %prog """
- ignore_require_venv = True
-
- def add_options(self):
- # type: () -> None
- cmdoptions.add_target_python_options(self.cmd_opts)
- self.parser.insert_option_group(0, self.cmd_opts)
- self.parser.config.load()
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- logger.warning(
- "This command is only meant for debugging. "
- "Do not use this with automation for parsing and getting these "
- "details, since the output and options of this command may "
- "change without notice."
- )
- show_value('pip version', get_pip_version())
- show_value('sys.version', sys.version)
- show_value('sys.executable', sys.executable)
- show_value('sys.getdefaultencoding', sys.getdefaultencoding())
- show_value('sys.getfilesystemencoding', sys.getfilesystemencoding())
- show_value(
- 'locale.getpreferredencoding', locale.getpreferredencoding(),
- )
- show_value('sys.platform', sys.platform)
- show_sys_implementation()
-
- show_value("'cert' config value", ca_bundle_info(self.parser.config))
- show_value("REQUESTS_CA_BUNDLE", os.environ.get('REQUESTS_CA_BUNDLE'))
- show_value("CURL_CA_BUNDLE", os.environ.get('CURL_CA_BUNDLE'))
- show_value("pip._vendor.certifi.where()", where())
- show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED)
-
- show_vendor_versions()
-
- show_tags(options)
-
- return SUCCESS
diff --git a/venv/Lib/site-packages/pip/_internal/commands/download.py b/venv/Lib/site-packages/pip/_internal/commands/download.py
deleted file mode 100644
index 19f8d6c..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/download.py
+++ /dev/null
@@ -1,141 +0,0 @@
-import logging
-import os
-from optparse import Values
-from typing import List
-
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.cmdoptions import make_target_python
-from pip._internal.cli.req_command import RequirementCommand, with_cleanup
-from pip._internal.cli.status_codes import SUCCESS
-from pip._internal.req.req_tracker import get_requirement_tracker
-from pip._internal.utils.misc import ensure_dir, normalize_path, write_output
-from pip._internal.utils.temp_dir import TempDirectory
-
-logger = logging.getLogger(__name__)
-
-
-class DownloadCommand(RequirementCommand):
- """
- Download packages from:
-
- - PyPI (and other indexes) using requirement specifiers.
- - VCS project urls.
- - Local project directories.
- - Local or remote source archives.
-
- pip also supports downloading from "requirements files", which provide
- an easy way to specify a whole environment to be downloaded.
- """
-
- usage = """
- %prog [options] [package-index-options] ...
- %prog [options] -r [package-index-options] ...
- %prog [options] ...
- %prog [options] ...
- %prog [options] ..."""
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(cmdoptions.constraints())
- self.cmd_opts.add_option(cmdoptions.requirements())
- self.cmd_opts.add_option(cmdoptions.build_dir())
- self.cmd_opts.add_option(cmdoptions.no_deps())
- self.cmd_opts.add_option(cmdoptions.global_options())
- self.cmd_opts.add_option(cmdoptions.no_binary())
- self.cmd_opts.add_option(cmdoptions.only_binary())
- self.cmd_opts.add_option(cmdoptions.prefer_binary())
- self.cmd_opts.add_option(cmdoptions.src())
- self.cmd_opts.add_option(cmdoptions.pre())
- self.cmd_opts.add_option(cmdoptions.require_hashes())
- self.cmd_opts.add_option(cmdoptions.progress_bar())
- self.cmd_opts.add_option(cmdoptions.no_build_isolation())
- self.cmd_opts.add_option(cmdoptions.use_pep517())
- self.cmd_opts.add_option(cmdoptions.no_use_pep517())
- self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
-
- self.cmd_opts.add_option(
- '-d', '--dest', '--destination-dir', '--destination-directory',
- dest='download_dir',
- metavar='dir',
- default=os.curdir,
- help=("Download packages into ."),
- )
-
- cmdoptions.add_target_python_options(self.cmd_opts)
-
- index_opts = cmdoptions.make_option_group(
- cmdoptions.index_group,
- self.parser,
- )
-
- self.parser.insert_option_group(0, index_opts)
- self.parser.insert_option_group(0, self.cmd_opts)
-
- @with_cleanup
- def run(self, options, args):
- # type: (Values, List[str]) -> int
-
- options.ignore_installed = True
- # editable doesn't really make sense for `pip download`, but the bowels
- # of the RequirementSet code require that property.
- options.editables = []
-
- cmdoptions.check_dist_restriction(options)
-
- options.download_dir = normalize_path(options.download_dir)
- ensure_dir(options.download_dir)
-
- session = self.get_default_session(options)
-
- target_python = make_target_python(options)
- finder = self._build_package_finder(
- options=options,
- session=session,
- target_python=target_python,
- ignore_requires_python=options.ignore_requires_python,
- )
-
- req_tracker = self.enter_context(get_requirement_tracker())
-
- directory = TempDirectory(
- delete=not options.no_clean,
- kind="download",
- globally_managed=True,
- )
-
- reqs = self.get_requirements(args, options, finder, session)
-
- preparer = self.make_requirement_preparer(
- temp_build_dir=directory,
- options=options,
- req_tracker=req_tracker,
- session=session,
- finder=finder,
- download_dir=options.download_dir,
- use_user_site=False,
- )
-
- resolver = self.make_resolver(
- preparer=preparer,
- finder=finder,
- options=options,
- ignore_requires_python=options.ignore_requires_python,
- py_version_info=options.python_version,
- )
-
- self.trace_basic_info(finder)
-
- requirement_set = resolver.resolve(
- reqs, check_supported_wheels=True
- )
-
- downloaded = [] # type: List[str]
- for req in requirement_set.requirements.values():
- if req.satisfied_by is None:
- assert req.name is not None
- preparer.save_linked_requirement(req)
- downloaded.append(req.name)
- if downloaded:
- write_output('Successfully downloaded %s', ' '.join(downloaded))
-
- return SUCCESS
diff --git a/venv/Lib/site-packages/pip/_internal/commands/freeze.py b/venv/Lib/site-packages/pip/_internal/commands/freeze.py
deleted file mode 100644
index 430d101..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/freeze.py
+++ /dev/null
@@ -1,104 +0,0 @@
-import sys
-from optparse import Values
-from typing import List
-
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import SUCCESS
-from pip._internal.operations.freeze import freeze
-from pip._internal.utils.compat import stdlib_pkgs
-from pip._internal.utils.deprecation import deprecated
-
-DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'}
-
-
-class FreezeCommand(Command):
- """
- Output installed packages in requirements format.
-
- packages are listed in a case-insensitive sorted order.
- """
-
- usage = """
- %prog [options]"""
- log_streams = ("ext://sys.stderr", "ext://sys.stderr")
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(
- '-r', '--requirement',
- dest='requirements',
- action='append',
- default=[],
- metavar='file',
- help="Use the order in the given requirements file and its "
- "comments when generating output. This option can be "
- "used multiple times.")
- self.cmd_opts.add_option(
- '-f', '--find-links',
- dest='find_links',
- action='append',
- default=[],
- metavar='URL',
- help='URL for finding packages, which will be added to the '
- 'output.')
- self.cmd_opts.add_option(
- '-l', '--local',
- dest='local',
- action='store_true',
- default=False,
- help='If in a virtualenv that has global access, do not output '
- 'globally-installed packages.')
- self.cmd_opts.add_option(
- '--user',
- dest='user',
- action='store_true',
- default=False,
- help='Only output packages installed in user-site.')
- self.cmd_opts.add_option(cmdoptions.list_path())
- self.cmd_opts.add_option(
- '--all',
- dest='freeze_all',
- action='store_true',
- help='Do not skip these packages in the output:'
- ' {}'.format(', '.join(DEV_PKGS)))
- self.cmd_opts.add_option(
- '--exclude-editable',
- dest='exclude_editable',
- action='store_true',
- help='Exclude editable package from output.')
- self.cmd_opts.add_option(cmdoptions.list_exclude())
-
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- skip = set(stdlib_pkgs)
- if not options.freeze_all:
- skip.update(DEV_PKGS)
-
- if options.excludes:
- skip.update(options.excludes)
-
- cmdoptions.check_list_path_option(options)
-
- if options.find_links:
- deprecated(
- "--find-links option in pip freeze is deprecated.",
- replacement=None,
- gone_in="21.2",
- issue=9069,
- )
-
- for line in freeze(
- requirement=options.requirements,
- find_links=options.find_links,
- local_only=options.local,
- user_only=options.user,
- paths=options.path,
- isolated=options.isolated_mode,
- skip=skip,
- exclude_editable=options.exclude_editable,
- ):
- sys.stdout.write(line + '\n')
- return SUCCESS
diff --git a/venv/Lib/site-packages/pip/_internal/commands/hash.py b/venv/Lib/site-packages/pip/_internal/commands/hash.py
deleted file mode 100644
index bca48dc..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/hash.py
+++ /dev/null
@@ -1,58 +0,0 @@
-import hashlib
-import logging
-import sys
-from optparse import Values
-from typing import List
-
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import ERROR, SUCCESS
-from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES
-from pip._internal.utils.misc import read_chunks, write_output
-
-logger = logging.getLogger(__name__)
-
-
-class HashCommand(Command):
- """
- Compute a hash of a local package archive.
-
- These can be used with --hash in a requirements file to do repeatable
- installs.
- """
-
- usage = '%prog [options] ...'
- ignore_require_venv = True
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(
- '-a', '--algorithm',
- dest='algorithm',
- choices=STRONG_HASHES,
- action='store',
- default=FAVORITE_HASH,
- help='The hash algorithm to use: one of {}'.format(
- ', '.join(STRONG_HASHES)))
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- if not args:
- self.parser.print_usage(sys.stderr)
- return ERROR
-
- algorithm = options.algorithm
- for path in args:
- write_output('%s:\n--hash=%s:%s',
- path, algorithm, _hash_of_file(path, algorithm))
- return SUCCESS
-
-
-def _hash_of_file(path, algorithm):
- # type: (str, str) -> str
- """Return the hash digest of a file."""
- with open(path, 'rb') as archive:
- hash = hashlib.new(algorithm)
- for chunk in read_chunks(archive):
- hash.update(chunk)
- return hash.hexdigest()
diff --git a/venv/Lib/site-packages/pip/_internal/commands/help.py b/venv/Lib/site-packages/pip/_internal/commands/help.py
deleted file mode 100644
index 79d0eb4..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/help.py
+++ /dev/null
@@ -1,42 +0,0 @@
-from optparse import Values
-from typing import List
-
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import SUCCESS
-from pip._internal.exceptions import CommandError
-
-
-class HelpCommand(Command):
- """Show help for commands"""
-
- usage = """
- %prog """
- ignore_require_venv = True
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- from pip._internal.commands import (
- commands_dict,
- create_command,
- get_similar_commands,
- )
-
- try:
- # 'pip help' with no args is handled by pip.__init__.parseopt()
- cmd_name = args[0] # the command we need help for
- except IndexError:
- return SUCCESS
-
- if cmd_name not in commands_dict:
- guess = get_similar_commands(cmd_name)
-
- msg = [f'unknown command "{cmd_name}"']
- if guess:
- msg.append(f'maybe you meant "{guess}"')
-
- raise CommandError(' - '.join(msg))
-
- command = create_command(cmd_name)
- command.parser.print_help()
-
- return SUCCESS
diff --git a/venv/Lib/site-packages/pip/_internal/commands/install.py b/venv/Lib/site-packages/pip/_internal/commands/install.py
deleted file mode 100644
index 6932f5a..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/install.py
+++ /dev/null
@@ -1,740 +0,0 @@
-import errno
-import logging
-import operator
-import os
-import shutil
-import site
-from optparse import SUPPRESS_HELP, Values
-from typing import Iterable, List, Optional
-
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.cache import WheelCache
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.cmdoptions import make_target_python
-from pip._internal.cli.req_command import (
- RequirementCommand,
- warn_if_run_as_root,
- with_cleanup,
-)
-from pip._internal.cli.status_codes import ERROR, SUCCESS
-from pip._internal.exceptions import CommandError, InstallationError
-from pip._internal.locations import get_scheme
-from pip._internal.metadata import get_environment
-from pip._internal.models.format_control import FormatControl
-from pip._internal.operations.check import ConflictDetails, check_install_conflicts
-from pip._internal.req import install_given_reqs
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.req.req_tracker import get_requirement_tracker
-from pip._internal.utils.distutils_args import parse_distutils_args
-from pip._internal.utils.filesystem import test_writable_dir
-from pip._internal.utils.misc import (
- ensure_dir,
- get_pip_version,
- protect_pip_from_modification_on_windows,
- write_output,
-)
-from pip._internal.utils.temp_dir import TempDirectory
-from pip._internal.utils.virtualenv import (
- running_under_virtualenv,
- virtualenv_no_global,
-)
-from pip._internal.wheel_builder import (
- BinaryAllowedPredicate,
- build,
- should_build_for_install_command,
-)
-
-logger = logging.getLogger(__name__)
-
-
-def get_check_binary_allowed(format_control):
- # type: (FormatControl) -> BinaryAllowedPredicate
- def check_binary_allowed(req):
- # type: (InstallRequirement) -> bool
- canonical_name = canonicalize_name(req.name or "")
- allowed_formats = format_control.get_allowed_formats(canonical_name)
- return "binary" in allowed_formats
-
- return check_binary_allowed
-
-
-class InstallCommand(RequirementCommand):
- """
- Install packages from:
-
- - PyPI (and other indexes) using requirement specifiers.
- - VCS project urls.
- - Local project directories.
- - Local or remote source archives.
-
- pip also supports installing from "requirements files", which provide
- an easy way to specify a whole environment to be installed.
- """
-
- usage = """
- %prog [options] [package-index-options] ...
- %prog [options] -r [package-index-options] ...
- %prog [options] [-e] ...
- %prog [options] [-e] ...
- %prog [options] ..."""
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(cmdoptions.requirements())
- self.cmd_opts.add_option(cmdoptions.constraints())
- self.cmd_opts.add_option(cmdoptions.no_deps())
- self.cmd_opts.add_option(cmdoptions.pre())
-
- self.cmd_opts.add_option(cmdoptions.editable())
- self.cmd_opts.add_option(
- '-t', '--target',
- dest='target_dir',
- metavar='dir',
- default=None,
- help='Install packages into . '
- 'By default this will not replace existing files/folders in '
- '. Use --upgrade to replace existing packages in '
- 'with new versions.'
- )
- cmdoptions.add_target_python_options(self.cmd_opts)
-
- self.cmd_opts.add_option(
- '--user',
- dest='use_user_site',
- action='store_true',
- help="Install to the Python user install directory for your "
- "platform. Typically ~/.local/, or %APPDATA%\\Python on "
- "Windows. (See the Python documentation for site.USER_BASE "
- "for full details.)")
- self.cmd_opts.add_option(
- '--no-user',
- dest='use_user_site',
- action='store_false',
- help=SUPPRESS_HELP)
- self.cmd_opts.add_option(
- '--root',
- dest='root_path',
- metavar='dir',
- default=None,
- help="Install everything relative to this alternate root "
- "directory.")
- self.cmd_opts.add_option(
- '--prefix',
- dest='prefix_path',
- metavar='dir',
- default=None,
- help="Installation prefix where lib, bin and other top-level "
- "folders are placed")
-
- self.cmd_opts.add_option(cmdoptions.build_dir())
-
- self.cmd_opts.add_option(cmdoptions.src())
-
- self.cmd_opts.add_option(
- '-U', '--upgrade',
- dest='upgrade',
- action='store_true',
- help='Upgrade all specified packages to the newest available '
- 'version. The handling of dependencies depends on the '
- 'upgrade-strategy used.'
- )
-
- self.cmd_opts.add_option(
- '--upgrade-strategy',
- dest='upgrade_strategy',
- default='only-if-needed',
- choices=['only-if-needed', 'eager'],
- help='Determines how dependency upgrading should be handled '
- '[default: %default]. '
- '"eager" - dependencies are upgraded regardless of '
- 'whether the currently installed version satisfies the '
- 'requirements of the upgraded package(s). '
- '"only-if-needed" - are upgraded only when they do not '
- 'satisfy the requirements of the upgraded package(s).'
- )
-
- self.cmd_opts.add_option(
- '--force-reinstall',
- dest='force_reinstall',
- action='store_true',
- help='Reinstall all packages even if they are already '
- 'up-to-date.')
-
- self.cmd_opts.add_option(
- '-I', '--ignore-installed',
- dest='ignore_installed',
- action='store_true',
- help='Ignore the installed packages, overwriting them. '
- 'This can break your system if the existing package '
- 'is of a different version or was installed '
- 'with a different package manager!'
- )
-
- self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
- self.cmd_opts.add_option(cmdoptions.no_build_isolation())
- self.cmd_opts.add_option(cmdoptions.use_pep517())
- self.cmd_opts.add_option(cmdoptions.no_use_pep517())
-
- self.cmd_opts.add_option(cmdoptions.install_options())
- self.cmd_opts.add_option(cmdoptions.global_options())
-
- self.cmd_opts.add_option(
- "--compile",
- action="store_true",
- dest="compile",
- default=True,
- help="Compile Python source files to bytecode",
- )
-
- self.cmd_opts.add_option(
- "--no-compile",
- action="store_false",
- dest="compile",
- help="Do not compile Python source files to bytecode",
- )
-
- self.cmd_opts.add_option(
- "--no-warn-script-location",
- action="store_false",
- dest="warn_script_location",
- default=True,
- help="Do not warn when installing scripts outside PATH",
- )
- self.cmd_opts.add_option(
- "--no-warn-conflicts",
- action="store_false",
- dest="warn_about_conflicts",
- default=True,
- help="Do not warn about broken dependencies",
- )
-
- self.cmd_opts.add_option(cmdoptions.no_binary())
- self.cmd_opts.add_option(cmdoptions.only_binary())
- self.cmd_opts.add_option(cmdoptions.prefer_binary())
- self.cmd_opts.add_option(cmdoptions.require_hashes())
- self.cmd_opts.add_option(cmdoptions.progress_bar())
-
- index_opts = cmdoptions.make_option_group(
- cmdoptions.index_group,
- self.parser,
- )
-
- self.parser.insert_option_group(0, index_opts)
- self.parser.insert_option_group(0, self.cmd_opts)
-
- @with_cleanup
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- if options.use_user_site and options.target_dir is not None:
- raise CommandError("Can not combine '--user' and '--target'")
-
- cmdoptions.check_install_build_global(options)
- upgrade_strategy = "to-satisfy-only"
- if options.upgrade:
- upgrade_strategy = options.upgrade_strategy
-
- cmdoptions.check_dist_restriction(options, check_target=True)
-
- install_options = options.install_options or []
-
- logger.debug("Using %s", get_pip_version())
- options.use_user_site = decide_user_install(
- options.use_user_site,
- prefix_path=options.prefix_path,
- target_dir=options.target_dir,
- root_path=options.root_path,
- isolated_mode=options.isolated_mode,
- )
-
- target_temp_dir = None # type: Optional[TempDirectory]
- target_temp_dir_path = None # type: Optional[str]
- if options.target_dir:
- options.ignore_installed = True
- options.target_dir = os.path.abspath(options.target_dir)
- if (os.path.exists(options.target_dir) and not
- os.path.isdir(options.target_dir)):
- raise CommandError(
- "Target path exists but is not a directory, will not "
- "continue."
- )
-
- # Create a target directory for using with the target option
- target_temp_dir = TempDirectory(kind="target")
- target_temp_dir_path = target_temp_dir.path
- self.enter_context(target_temp_dir)
-
- global_options = options.global_options or []
-
- session = self.get_default_session(options)
-
- target_python = make_target_python(options)
- finder = self._build_package_finder(
- options=options,
- session=session,
- target_python=target_python,
- ignore_requires_python=options.ignore_requires_python,
- )
- wheel_cache = WheelCache(options.cache_dir, options.format_control)
-
- req_tracker = self.enter_context(get_requirement_tracker())
-
- directory = TempDirectory(
- delete=not options.no_clean,
- kind="install",
- globally_managed=True,
- )
-
- try:
- reqs = self.get_requirements(args, options, finder, session)
-
- reject_location_related_install_options(
- reqs, options.install_options
- )
-
- preparer = self.make_requirement_preparer(
- temp_build_dir=directory,
- options=options,
- req_tracker=req_tracker,
- session=session,
- finder=finder,
- use_user_site=options.use_user_site,
- )
- resolver = self.make_resolver(
- preparer=preparer,
- finder=finder,
- options=options,
- wheel_cache=wheel_cache,
- use_user_site=options.use_user_site,
- ignore_installed=options.ignore_installed,
- ignore_requires_python=options.ignore_requires_python,
- force_reinstall=options.force_reinstall,
- upgrade_strategy=upgrade_strategy,
- use_pep517=options.use_pep517,
- )
-
- self.trace_basic_info(finder)
-
- requirement_set = resolver.resolve(
- reqs, check_supported_wheels=not options.target_dir
- )
-
- try:
- pip_req = requirement_set.get_requirement("pip")
- except KeyError:
- modifying_pip = False
- else:
- # If we're not replacing an already installed pip,
- # we're not modifying it.
- modifying_pip = pip_req.satisfied_by is None
- protect_pip_from_modification_on_windows(
- modifying_pip=modifying_pip
- )
-
- check_binary_allowed = get_check_binary_allowed(
- finder.format_control
- )
-
- reqs_to_build = [
- r for r in requirement_set.requirements.values()
- if should_build_for_install_command(
- r, check_binary_allowed
- )
- ]
-
- _, build_failures = build(
- reqs_to_build,
- wheel_cache=wheel_cache,
- verify=True,
- build_options=[],
- global_options=[],
- )
-
- # If we're using PEP 517, we cannot do a direct install
- # so we fail here.
- pep517_build_failure_names = [
- r.name # type: ignore
- for r in build_failures if r.use_pep517
- ] # type: List[str]
- if pep517_build_failure_names:
- raise InstallationError(
- "Could not build wheels for {} which use"
- " PEP 517 and cannot be installed directly".format(
- ", ".join(pep517_build_failure_names)
- )
- )
-
- # For now, we just warn about failures building legacy
- # requirements, as we'll fall through to a direct
- # install for those.
- for r in build_failures:
- if not r.use_pep517:
- r.legacy_install_reason = 8368
-
- to_install = resolver.get_installation_order(
- requirement_set
- )
-
- # Check for conflicts in the package set we're installing.
- conflicts = None # type: Optional[ConflictDetails]
- should_warn_about_conflicts = (
- not options.ignore_dependencies and
- options.warn_about_conflicts
- )
- if should_warn_about_conflicts:
- conflicts = self._determine_conflicts(to_install)
-
- # Don't warn about script install locations if
- # --target has been specified
- warn_script_location = options.warn_script_location
- if options.target_dir:
- warn_script_location = False
-
- installed = install_given_reqs(
- to_install,
- install_options,
- global_options,
- root=options.root_path,
- home=target_temp_dir_path,
- prefix=options.prefix_path,
- warn_script_location=warn_script_location,
- use_user_site=options.use_user_site,
- pycompile=options.compile,
- )
-
- lib_locations = get_lib_location_guesses(
- user=options.use_user_site,
- home=target_temp_dir_path,
- root=options.root_path,
- prefix=options.prefix_path,
- isolated=options.isolated_mode,
- )
- env = get_environment(lib_locations)
-
- installed.sort(key=operator.attrgetter('name'))
- items = []
- for result in installed:
- item = result.name
- try:
- installed_dist = env.get_distribution(item)
- if installed_dist is not None:
- item = f"{item}-{installed_dist.version}"
- except Exception:
- pass
- items.append(item)
-
- if conflicts is not None:
- self._warn_about_conflicts(
- conflicts,
- resolver_variant=self.determine_resolver_variant(options),
- )
-
- installed_desc = ' '.join(items)
- if installed_desc:
- write_output(
- 'Successfully installed %s', installed_desc,
- )
- except OSError as error:
- show_traceback = (self.verbosity >= 1)
-
- message = create_os_error_message(
- error, show_traceback, options.use_user_site,
- )
- logger.error(message, exc_info=show_traceback) # noqa
-
- return ERROR
-
- if options.target_dir:
- assert target_temp_dir
- self._handle_target_dir(
- options.target_dir, target_temp_dir, options.upgrade
- )
-
- warn_if_run_as_root()
- return SUCCESS
-
- def _handle_target_dir(self, target_dir, target_temp_dir, upgrade):
- # type: (str, TempDirectory, bool) -> None
- ensure_dir(target_dir)
-
- # Checking both purelib and platlib directories for installed
- # packages to be moved to target directory
- lib_dir_list = []
-
- # Checking both purelib and platlib directories for installed
- # packages to be moved to target directory
- scheme = get_scheme('', home=target_temp_dir.path)
- purelib_dir = scheme.purelib
- platlib_dir = scheme.platlib
- data_dir = scheme.data
-
- if os.path.exists(purelib_dir):
- lib_dir_list.append(purelib_dir)
- if os.path.exists(platlib_dir) and platlib_dir != purelib_dir:
- lib_dir_list.append(platlib_dir)
- if os.path.exists(data_dir):
- lib_dir_list.append(data_dir)
-
- for lib_dir in lib_dir_list:
- for item in os.listdir(lib_dir):
- if lib_dir == data_dir:
- ddir = os.path.join(data_dir, item)
- if any(s.startswith(ddir) for s in lib_dir_list[:-1]):
- continue
- target_item_dir = os.path.join(target_dir, item)
- if os.path.exists(target_item_dir):
- if not upgrade:
- logger.warning(
- 'Target directory %s already exists. Specify '
- '--upgrade to force replacement.',
- target_item_dir
- )
- continue
- if os.path.islink(target_item_dir):
- logger.warning(
- 'Target directory %s already exists and is '
- 'a link. pip will not automatically replace '
- 'links, please remove if replacement is '
- 'desired.',
- target_item_dir
- )
- continue
- if os.path.isdir(target_item_dir):
- shutil.rmtree(target_item_dir)
- else:
- os.remove(target_item_dir)
-
- shutil.move(
- os.path.join(lib_dir, item),
- target_item_dir
- )
-
- def _determine_conflicts(self, to_install):
- # type: (List[InstallRequirement]) -> Optional[ConflictDetails]
- try:
- return check_install_conflicts(to_install)
- except Exception:
- logger.exception(
- "Error while checking for conflicts. Please file an issue on "
- "pip's issue tracker: https://github.com/pypa/pip/issues/new"
- )
- return None
-
- def _warn_about_conflicts(self, conflict_details, resolver_variant):
- # type: (ConflictDetails, str) -> None
- package_set, (missing, conflicting) = conflict_details
- if not missing and not conflicting:
- return
-
- parts = [] # type: List[str]
- if resolver_variant == "legacy":
- parts.append(
- "pip's legacy dependency resolver does not consider dependency "
- "conflicts when selecting packages. This behaviour is the "
- "source of the following dependency conflicts."
- )
- else:
- assert resolver_variant == "2020-resolver"
- parts.append(
- "pip's dependency resolver does not currently take into account "
- "all the packages that are installed. This behaviour is the "
- "source of the following dependency conflicts."
- )
-
- # NOTE: There is some duplication here, with commands/check.py
- for project_name in missing:
- version = package_set[project_name][0]
- for dependency in missing[project_name]:
- message = (
- "{name} {version} requires {requirement}, "
- "which is not installed."
- ).format(
- name=project_name,
- version=version,
- requirement=dependency[1],
- )
- parts.append(message)
-
- for project_name in conflicting:
- version = package_set[project_name][0]
- for dep_name, dep_version, req in conflicting[project_name]:
- message = (
- "{name} {version} requires {requirement}, but {you} have "
- "{dep_name} {dep_version} which is incompatible."
- ).format(
- name=project_name,
- version=version,
- requirement=req,
- dep_name=dep_name,
- dep_version=dep_version,
- you=("you" if resolver_variant == "2020-resolver" else "you'll")
- )
- parts.append(message)
-
- logger.critical("\n".join(parts))
-
-
-def get_lib_location_guesses(
- user=False, # type: bool
- home=None, # type: Optional[str]
- root=None, # type: Optional[str]
- isolated=False, # type: bool
- prefix=None # type: Optional[str]
-):
- # type:(...) -> List[str]
- scheme = get_scheme(
- '',
- user=user,
- home=home,
- root=root,
- isolated=isolated,
- prefix=prefix,
- )
- return [scheme.purelib, scheme.platlib]
-
-
-def site_packages_writable(root, isolated):
- # type: (Optional[str], bool) -> bool
- return all(
- test_writable_dir(d) for d in set(
- get_lib_location_guesses(root=root, isolated=isolated))
- )
-
-
-def decide_user_install(
- use_user_site, # type: Optional[bool]
- prefix_path=None, # type: Optional[str]
- target_dir=None, # type: Optional[str]
- root_path=None, # type: Optional[str]
- isolated_mode=False, # type: bool
-):
- # type: (...) -> bool
- """Determine whether to do a user install based on the input options.
-
- If use_user_site is False, no additional checks are done.
- If use_user_site is True, it is checked for compatibility with other
- options.
- If use_user_site is None, the default behaviour depends on the environment,
- which is provided by the other arguments.
- """
- # In some cases (config from tox), use_user_site can be set to an integer
- # rather than a bool, which 'use_user_site is False' wouldn't catch.
- if (use_user_site is not None) and (not use_user_site):
- logger.debug("Non-user install by explicit request")
- return False
-
- if use_user_site:
- if prefix_path:
- raise CommandError(
- "Can not combine '--user' and '--prefix' as they imply "
- "different installation locations"
- )
- if virtualenv_no_global():
- raise InstallationError(
- "Can not perform a '--user' install. User site-packages "
- "are not visible in this virtualenv."
- )
- logger.debug("User install by explicit request")
- return True
-
- # If we are here, user installs have not been explicitly requested/avoided
- assert use_user_site is None
-
- # user install incompatible with --prefix/--target
- if prefix_path or target_dir:
- logger.debug("Non-user install due to --prefix or --target option")
- return False
-
- # If user installs are not enabled, choose a non-user install
- if not site.ENABLE_USER_SITE:
- logger.debug("Non-user install because user site-packages disabled")
- return False
-
- # If we have permission for a non-user install, do that,
- # otherwise do a user install.
- if site_packages_writable(root=root_path, isolated=isolated_mode):
- logger.debug("Non-user install because site-packages writeable")
- return False
-
- logger.info("Defaulting to user installation because normal site-packages "
- "is not writeable")
- return True
-
-
-def reject_location_related_install_options(requirements, options):
- # type: (List[InstallRequirement], Optional[List[str]]) -> None
- """If any location-changing --install-option arguments were passed for
- requirements or on the command-line, then show a deprecation warning.
- """
- def format_options(option_names):
- # type: (Iterable[str]) -> List[str]
- return ["--{}".format(name.replace("_", "-")) for name in option_names]
-
- offenders = []
-
- for requirement in requirements:
- install_options = requirement.install_options
- location_options = parse_distutils_args(install_options)
- if location_options:
- offenders.append(
- "{!r} from {}".format(
- format_options(location_options.keys()), requirement
- )
- )
-
- if options:
- location_options = parse_distutils_args(options)
- if location_options:
- offenders.append(
- "{!r} from command line".format(
- format_options(location_options.keys())
- )
- )
-
- if not offenders:
- return
-
- raise CommandError(
- "Location-changing options found in --install-option: {}."
- " This is unsupported, use pip-level options like --user,"
- " --prefix, --root, and --target instead.".format(
- "; ".join(offenders)
- )
- )
-
-
-def create_os_error_message(error, show_traceback, using_user_site):
- # type: (OSError, bool, bool) -> str
- """Format an error message for an OSError
-
- It may occur anytime during the execution of the install command.
- """
- parts = []
-
- # Mention the error if we are not going to show a traceback
- parts.append("Could not install packages due to an OSError")
- if not show_traceback:
- parts.append(": ")
- parts.append(str(error))
- else:
- parts.append(".")
-
- # Spilt the error indication from a helper message (if any)
- parts[-1] += "\n"
-
- # Suggest useful actions to the user:
- # (1) using user site-packages or (2) verifying the permissions
- if error.errno == errno.EACCES:
- user_option_part = "Consider using the `--user` option"
- permissions_part = "Check the permissions"
-
- if not running_under_virtualenv() and not using_user_site:
- parts.extend([
- user_option_part, " or ",
- permissions_part.lower(),
- ])
- else:
- parts.append(permissions_part)
- parts.append(".\n")
-
- return "".join(parts).strip() + "\n"
diff --git a/venv/Lib/site-packages/pip/_internal/commands/list.py b/venv/Lib/site-packages/pip/_internal/commands/list.py
deleted file mode 100644
index dcf9432..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/list.py
+++ /dev/null
@@ -1,319 +0,0 @@
-import json
-import logging
-from optparse import Values
-from typing import Iterator, List, Set, Tuple
-
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.req_command import IndexGroupCommand
-from pip._internal.cli.status_codes import SUCCESS
-from pip._internal.exceptions import CommandError
-from pip._internal.index.collector import LinkCollector
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.models.selection_prefs import SelectionPreferences
-from pip._internal.network.session import PipSession
-from pip._internal.utils.compat import stdlib_pkgs
-from pip._internal.utils.misc import (
- dist_is_editable,
- get_installed_distributions,
- tabulate,
- write_output,
-)
-from pip._internal.utils.packaging import get_installer
-from pip._internal.utils.parallel import map_multithread
-
-logger = logging.getLogger(__name__)
-
-
-class ListCommand(IndexGroupCommand):
- """
- List installed packages, including editables.
-
- Packages are listed in a case-insensitive sorted order.
- """
-
- ignore_require_venv = True
- usage = """
- %prog [options]"""
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(
- '-o', '--outdated',
- action='store_true',
- default=False,
- help='List outdated packages')
- self.cmd_opts.add_option(
- '-u', '--uptodate',
- action='store_true',
- default=False,
- help='List uptodate packages')
- self.cmd_opts.add_option(
- '-e', '--editable',
- action='store_true',
- default=False,
- help='List editable projects.')
- self.cmd_opts.add_option(
- '-l', '--local',
- action='store_true',
- default=False,
- help=('If in a virtualenv that has global access, do not list '
- 'globally-installed packages.'),
- )
- self.cmd_opts.add_option(
- '--user',
- dest='user',
- action='store_true',
- default=False,
- help='Only output packages installed in user-site.')
- self.cmd_opts.add_option(cmdoptions.list_path())
- self.cmd_opts.add_option(
- '--pre',
- action='store_true',
- default=False,
- help=("Include pre-release and development versions. By default, "
- "pip only finds stable versions."),
- )
-
- self.cmd_opts.add_option(
- '--format',
- action='store',
- dest='list_format',
- default="columns",
- choices=('columns', 'freeze', 'json'),
- help="Select the output format among: columns (default), freeze, "
- "or json",
- )
-
- self.cmd_opts.add_option(
- '--not-required',
- action='store_true',
- dest='not_required',
- help="List packages that are not dependencies of "
- "installed packages.",
- )
-
- self.cmd_opts.add_option(
- '--exclude-editable',
- action='store_false',
- dest='include_editable',
- help='Exclude editable package from output.',
- )
- self.cmd_opts.add_option(
- '--include-editable',
- action='store_true',
- dest='include_editable',
- help='Include editable package from output.',
- default=True,
- )
- self.cmd_opts.add_option(cmdoptions.list_exclude())
- index_opts = cmdoptions.make_option_group(
- cmdoptions.index_group, self.parser
- )
-
- self.parser.insert_option_group(0, index_opts)
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def _build_package_finder(self, options, session):
- # type: (Values, PipSession) -> PackageFinder
- """
- Create a package finder appropriate to this list command.
- """
- link_collector = LinkCollector.create(session, options=options)
-
- # Pass allow_yanked=False to ignore yanked versions.
- selection_prefs = SelectionPreferences(
- allow_yanked=False,
- allow_all_prereleases=options.pre,
- )
-
- return PackageFinder.create(
- link_collector=link_collector,
- selection_prefs=selection_prefs,
- )
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- if options.outdated and options.uptodate:
- raise CommandError(
- "Options --outdated and --uptodate cannot be combined.")
-
- cmdoptions.check_list_path_option(options)
-
- skip = set(stdlib_pkgs)
- if options.excludes:
- skip.update(options.excludes)
-
- packages = get_installed_distributions(
- local_only=options.local,
- user_only=options.user,
- editables_only=options.editable,
- include_editables=options.include_editable,
- paths=options.path,
- skip=skip,
- )
-
- # get_not_required must be called firstly in order to find and
- # filter out all dependencies correctly. Otherwise a package
- # can't be identified as requirement because some parent packages
- # could be filtered out before.
- if options.not_required:
- packages = self.get_not_required(packages, options)
-
- if options.outdated:
- packages = self.get_outdated(packages, options)
- elif options.uptodate:
- packages = self.get_uptodate(packages, options)
-
- self.output_package_listing(packages, options)
- return SUCCESS
-
- def get_outdated(self, packages, options):
- # type: (List[Distribution], Values) -> List[Distribution]
- return [
- dist for dist in self.iter_packages_latest_infos(packages, options)
- if dist.latest_version > dist.parsed_version
- ]
-
- def get_uptodate(self, packages, options):
- # type: (List[Distribution], Values) -> List[Distribution]
- return [
- dist for dist in self.iter_packages_latest_infos(packages, options)
- if dist.latest_version == dist.parsed_version
- ]
-
- def get_not_required(self, packages, options):
- # type: (List[Distribution], Values) -> List[Distribution]
- dep_keys = set() # type: Set[Distribution]
- for dist in packages:
- dep_keys.update(requirement.key for requirement in dist.requires())
-
- # Create a set to remove duplicate packages, and cast it to a list
- # to keep the return type consistent with get_outdated and
- # get_uptodate
- return list({pkg for pkg in packages if pkg.key not in dep_keys})
-
- def iter_packages_latest_infos(self, packages, options):
- # type: (List[Distribution], Values) -> Iterator[Distribution]
- with self._build_session(options) as session:
- finder = self._build_package_finder(options, session)
-
- def latest_info(dist):
- # type: (Distribution) -> Distribution
- all_candidates = finder.find_all_candidates(dist.key)
- if not options.pre:
- # Remove prereleases
- all_candidates = [candidate for candidate in all_candidates
- if not candidate.version.is_prerelease]
-
- evaluator = finder.make_candidate_evaluator(
- project_name=dist.project_name,
- )
- best_candidate = evaluator.sort_best_candidate(all_candidates)
- if best_candidate is None:
- return None
-
- remote_version = best_candidate.version
- if best_candidate.link.is_wheel:
- typ = 'wheel'
- else:
- typ = 'sdist'
- # This is dirty but makes the rest of the code much cleaner
- dist.latest_version = remote_version
- dist.latest_filetype = typ
- return dist
-
- for dist in map_multithread(latest_info, packages):
- if dist is not None:
- yield dist
-
- def output_package_listing(self, packages, options):
- # type: (List[Distribution], Values) -> None
- packages = sorted(
- packages,
- key=lambda dist: dist.project_name.lower(),
- )
- if options.list_format == 'columns' and packages:
- data, header = format_for_columns(packages, options)
- self.output_package_listing_columns(data, header)
- elif options.list_format == 'freeze':
- for dist in packages:
- if options.verbose >= 1:
- write_output("%s==%s (%s)", dist.project_name,
- dist.version, dist.location)
- else:
- write_output("%s==%s", dist.project_name, dist.version)
- elif options.list_format == 'json':
- write_output(format_for_json(packages, options))
-
- def output_package_listing_columns(self, data, header):
- # type: (List[List[str]], List[str]) -> None
- # insert the header first: we need to know the size of column names
- if len(data) > 0:
- data.insert(0, header)
-
- pkg_strings, sizes = tabulate(data)
-
- # Create and add a separator.
- if len(data) > 0:
- pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes)))
-
- for val in pkg_strings:
- write_output(val)
-
-
-def format_for_columns(pkgs, options):
- # type: (List[Distribution], Values) -> Tuple[List[List[str]], List[str]]
- """
- Convert the package data into something usable
- by output_package_listing_columns.
- """
- running_outdated = options.outdated
- # Adjust the header for the `pip list --outdated` case.
- if running_outdated:
- header = ["Package", "Version", "Latest", "Type"]
- else:
- header = ["Package", "Version"]
-
- data = []
- if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs):
- header.append("Location")
- if options.verbose >= 1:
- header.append("Installer")
-
- for proj in pkgs:
- # if we're working on the 'outdated' list, separate out the
- # latest_version and type
- row = [proj.project_name, proj.version]
-
- if running_outdated:
- row.append(proj.latest_version)
- row.append(proj.latest_filetype)
-
- if options.verbose >= 1 or dist_is_editable(proj):
- row.append(proj.location)
- if options.verbose >= 1:
- row.append(get_installer(proj))
-
- data.append(row)
-
- return data, header
-
-
-def format_for_json(packages, options):
- # type: (List[Distribution], Values) -> str
- data = []
- for dist in packages:
- info = {
- 'name': dist.project_name,
- 'version': str(dist.version),
- }
- if options.verbose >= 1:
- info['location'] = dist.location
- info['installer'] = get_installer(dist)
- if options.outdated:
- info['latest_version'] = str(dist.latest_version)
- info['latest_filetype'] = dist.latest_filetype
- data.append(info)
- return json.dumps(data)
diff --git a/venv/Lib/site-packages/pip/_internal/commands/search.py b/venv/Lib/site-packages/pip/_internal/commands/search.py
deleted file mode 100644
index d66e823..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/search.py
+++ /dev/null
@@ -1,162 +0,0 @@
-import logging
-import shutil
-import sys
-import textwrap
-import xmlrpc.client
-from collections import OrderedDict
-from optparse import Values
-from typing import TYPE_CHECKING, Dict, List, Optional
-
-from pip._vendor.packaging.version import parse as parse_version
-
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.req_command import SessionCommandMixin
-from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS
-from pip._internal.exceptions import CommandError
-from pip._internal.metadata import get_default_environment
-from pip._internal.models.index import PyPI
-from pip._internal.network.xmlrpc import PipXmlrpcTransport
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import write_output
-
-if TYPE_CHECKING:
- from typing import TypedDict
-
- class TransformedHit(TypedDict):
- name: str
- summary: str
- versions: List[str]
-
-logger = logging.getLogger(__name__)
-
-
-class SearchCommand(Command, SessionCommandMixin):
- """Search for PyPI packages whose name or summary contains ."""
-
- usage = """
- %prog [options] """
- ignore_require_venv = True
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(
- '-i', '--index',
- dest='index',
- metavar='URL',
- default=PyPI.pypi_url,
- help='Base URL of Python Package Index (default %default)')
-
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- if not args:
- raise CommandError('Missing required argument (search query).')
- query = args
- pypi_hits = self.search(query, options)
- hits = transform_hits(pypi_hits)
-
- terminal_width = None
- if sys.stdout.isatty():
- terminal_width = shutil.get_terminal_size()[0]
-
- print_results(hits, terminal_width=terminal_width)
- if pypi_hits:
- return SUCCESS
- return NO_MATCHES_FOUND
-
- def search(self, query, options):
- # type: (List[str], Values) -> List[Dict[str, str]]
- index_url = options.index
-
- session = self.get_default_session(options)
-
- transport = PipXmlrpcTransport(index_url, session)
- pypi = xmlrpc.client.ServerProxy(index_url, transport)
- try:
- hits = pypi.search({'name': query, 'summary': query}, 'or')
- except xmlrpc.client.Fault as fault:
- message = "XMLRPC request failed [code: {code}]\n{string}".format(
- code=fault.faultCode,
- string=fault.faultString,
- )
- raise CommandError(message)
- assert isinstance(hits, list)
- return hits
-
-
-def transform_hits(hits):
- # type: (List[Dict[str, str]]) -> List[TransformedHit]
- """
- The list from pypi is really a list of versions. We want a list of
- packages with the list of versions stored inline. This converts the
- list from pypi into one we can use.
- """
- packages = OrderedDict() # type: OrderedDict[str, TransformedHit]
- for hit in hits:
- name = hit['name']
- summary = hit['summary']
- version = hit['version']
-
- if name not in packages.keys():
- packages[name] = {
- 'name': name,
- 'summary': summary,
- 'versions': [version],
- }
- else:
- packages[name]['versions'].append(version)
-
- # if this is the highest version, replace summary and score
- if version == highest_version(packages[name]['versions']):
- packages[name]['summary'] = summary
-
- return list(packages.values())
-
-
-def print_results(hits, name_column_width=None, terminal_width=None):
- # type: (List[TransformedHit], Optional[int], Optional[int]) -> None
- if not hits:
- return
- if name_column_width is None:
- name_column_width = max([
- len(hit['name']) + len(highest_version(hit.get('versions', ['-'])))
- for hit in hits
- ]) + 4
-
- env = get_default_environment()
- for hit in hits:
- name = hit['name']
- summary = hit['summary'] or ''
- latest = highest_version(hit.get('versions', ['-']))
- if terminal_width is not None:
- target_width = terminal_width - name_column_width - 5
- if target_width > 10:
- # wrap and indent summary to fit terminal
- summary_lines = textwrap.wrap(summary, target_width)
- summary = ('\n' + ' ' * (name_column_width + 3)).join(
- summary_lines)
-
- name_latest = f'{name} ({latest})'
- line = f'{name_latest:{name_column_width}} - {summary}'
- try:
- write_output(line)
- dist = env.get_distribution(name)
- if dist is not None:
- with indent_log():
- if dist.version == latest:
- write_output('INSTALLED: %s (latest)', dist.version)
- else:
- write_output('INSTALLED: %s', dist.version)
- if parse_version(latest).pre:
- write_output('LATEST: %s (pre-release; install'
- ' with "pip install --pre")', latest)
- else:
- write_output('LATEST: %s', latest)
- except UnicodeEncodeError:
- pass
-
-
-def highest_version(versions):
- # type: (List[str]) -> str
- return max(versions, key=parse_version)
diff --git a/venv/Lib/site-packages/pip/_internal/commands/show.py b/venv/Lib/site-packages/pip/_internal/commands/show.py
deleted file mode 100644
index 24e855a..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/show.py
+++ /dev/null
@@ -1,181 +0,0 @@
-import logging
-import os
-from email.parser import FeedParser
-from optparse import Values
-from typing import Dict, Iterator, List
-
-from pip._vendor import pkg_resources
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import ERROR, SUCCESS
-from pip._internal.utils.misc import write_output
-
-logger = logging.getLogger(__name__)
-
-
-class ShowCommand(Command):
- """
- Show information about one or more installed packages.
-
- The output is in RFC-compliant mail header format.
- """
-
- usage = """
- %prog [options] ..."""
- ignore_require_venv = True
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(
- '-f', '--files',
- dest='files',
- action='store_true',
- default=False,
- help='Show the full list of installed files for each package.')
-
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- if not args:
- logger.warning('ERROR: Please provide a package name or names.')
- return ERROR
- query = args
-
- results = search_packages_info(query)
- if not print_results(
- results, list_files=options.files, verbose=options.verbose):
- return ERROR
- return SUCCESS
-
-
-def search_packages_info(query):
- # type: (List[str]) -> Iterator[Dict[str, str]]
- """
- Gather details from installed distributions. Print distribution name,
- version, location, and installed files. Installed files requires a
- pip generated 'installed-files.txt' in the distributions '.egg-info'
- directory.
- """
- installed = {}
- for p in pkg_resources.working_set:
- installed[canonicalize_name(p.project_name)] = p
-
- query_names = [canonicalize_name(name) for name in query]
- missing = sorted(
- [name for name, pkg in zip(query, query_names) if pkg not in installed]
- )
- if missing:
- logger.warning('Package(s) not found: %s', ', '.join(missing))
-
- def get_requiring_packages(package_name):
- # type: (str) -> List[str]
- canonical_name = canonicalize_name(package_name)
- return [
- pkg.project_name for pkg in pkg_resources.working_set
- if canonical_name in
- [canonicalize_name(required.name) for required in
- pkg.requires()]
- ]
-
- for dist in [installed[pkg] for pkg in query_names if pkg in installed]:
- package = {
- 'name': dist.project_name,
- 'version': dist.version,
- 'location': dist.location,
- 'requires': [dep.project_name for dep in dist.requires()],
- 'required_by': get_requiring_packages(dist.project_name)
- }
- file_list = None
- metadata = ''
- if isinstance(dist, pkg_resources.DistInfoDistribution):
- # RECORDs should be part of .dist-info metadatas
- if dist.has_metadata('RECORD'):
- lines = dist.get_metadata_lines('RECORD')
- paths = [line.split(',')[0] for line in lines]
- paths = [os.path.join(dist.location, p) for p in paths]
- file_list = [os.path.relpath(p, dist.location) for p in paths]
-
- if dist.has_metadata('METADATA'):
- metadata = dist.get_metadata('METADATA')
- else:
- # Otherwise use pip's log for .egg-info's
- if dist.has_metadata('installed-files.txt'):
- paths = dist.get_metadata_lines('installed-files.txt')
- paths = [os.path.join(dist.egg_info, p) for p in paths]
- file_list = [os.path.relpath(p, dist.location) for p in paths]
-
- if dist.has_metadata('PKG-INFO'):
- metadata = dist.get_metadata('PKG-INFO')
-
- if dist.has_metadata('entry_points.txt'):
- entry_points = dist.get_metadata_lines('entry_points.txt')
- package['entry_points'] = entry_points
-
- if dist.has_metadata('INSTALLER'):
- for line in dist.get_metadata_lines('INSTALLER'):
- if line.strip():
- package['installer'] = line.strip()
- break
-
- # @todo: Should pkg_resources.Distribution have a
- # `get_pkg_info` method?
- feed_parser = FeedParser()
- feed_parser.feed(metadata)
- pkg_info_dict = feed_parser.close()
- for key in ('metadata-version', 'summary',
- 'home-page', 'author', 'author-email', 'license'):
- package[key] = pkg_info_dict.get(key)
-
- # It looks like FeedParser cannot deal with repeated headers
- classifiers = []
- for line in metadata.splitlines():
- if line.startswith('Classifier: '):
- classifiers.append(line[len('Classifier: '):])
- package['classifiers'] = classifiers
-
- if file_list:
- package['files'] = sorted(file_list)
- yield package
-
-
-def print_results(distributions, list_files=False, verbose=False):
- # type: (Iterator[Dict[str, str]], bool, bool) -> bool
- """
- Print the information from installed distributions found.
- """
- results_printed = False
- for i, dist in enumerate(distributions):
- results_printed = True
- if i > 0:
- write_output("---")
-
- write_output("Name: %s", dist.get('name', ''))
- write_output("Version: %s", dist.get('version', ''))
- write_output("Summary: %s", dist.get('summary', ''))
- write_output("Home-page: %s", dist.get('home-page', ''))
- write_output("Author: %s", dist.get('author', ''))
- write_output("Author-email: %s", dist.get('author-email', ''))
- write_output("License: %s", dist.get('license', ''))
- write_output("Location: %s", dist.get('location', ''))
- write_output("Requires: %s", ', '.join(dist.get('requires', [])))
- write_output("Required-by: %s", ', '.join(dist.get('required_by', [])))
-
- if verbose:
- write_output("Metadata-Version: %s",
- dist.get('metadata-version', ''))
- write_output("Installer: %s", dist.get('installer', ''))
- write_output("Classifiers:")
- for classifier in dist.get('classifiers', []):
- write_output(" %s", classifier)
- write_output("Entry-points:")
- for entry in dist.get('entry_points', []):
- write_output(" %s", entry.strip())
- if list_files:
- write_output("Files:")
- for line in dist.get('files', []):
- write_output(" %s", line.strip())
- if "files" not in dist:
- write_output("Cannot locate installed-files.txt")
- return results_printed
diff --git a/venv/Lib/site-packages/pip/_internal/commands/uninstall.py b/venv/Lib/site-packages/pip/_internal/commands/uninstall.py
deleted file mode 100644
index 9a3c9f8..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/uninstall.py
+++ /dev/null
@@ -1,92 +0,0 @@
-from optparse import Values
-from typing import List
-
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root
-from pip._internal.cli.status_codes import SUCCESS
-from pip._internal.exceptions import InstallationError
-from pip._internal.req import parse_requirements
-from pip._internal.req.constructors import (
- install_req_from_line,
- install_req_from_parsed_requirement,
-)
-from pip._internal.utils.misc import protect_pip_from_modification_on_windows
-
-
-class UninstallCommand(Command, SessionCommandMixin):
- """
- Uninstall packages.
-
- pip is able to uninstall most installed packages. Known exceptions are:
-
- - Pure distutils packages installed with ``python setup.py install``, which
- leave behind no metadata to determine what files were installed.
- - Script wrappers installed by ``python setup.py develop``.
- """
-
- usage = """
- %prog [options] ...
- %prog [options] -r ..."""
-
- def add_options(self):
- # type: () -> None
- self.cmd_opts.add_option(
- '-r', '--requirement',
- dest='requirements',
- action='append',
- default=[],
- metavar='file',
- help='Uninstall all the packages listed in the given requirements '
- 'file. This option can be used multiple times.',
- )
- self.cmd_opts.add_option(
- '-y', '--yes',
- dest='yes',
- action='store_true',
- help="Don't ask for confirmation of uninstall deletions.")
-
- self.parser.insert_option_group(0, self.cmd_opts)
-
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- session = self.get_default_session(options)
-
- reqs_to_uninstall = {}
- for name in args:
- req = install_req_from_line(
- name, isolated=options.isolated_mode,
- )
- if req.name:
- reqs_to_uninstall[canonicalize_name(req.name)] = req
- for filename in options.requirements:
- for parsed_req in parse_requirements(
- filename,
- options=options,
- session=session):
- req = install_req_from_parsed_requirement(
- parsed_req,
- isolated=options.isolated_mode
- )
- if req.name:
- reqs_to_uninstall[canonicalize_name(req.name)] = req
- if not reqs_to_uninstall:
- raise InstallationError(
- f'You must give at least one requirement to {self.name} (see '
- f'"pip help {self.name}")'
- )
-
- protect_pip_from_modification_on_windows(
- modifying_pip="pip" in reqs_to_uninstall
- )
-
- for req in reqs_to_uninstall.values():
- uninstall_pathset = req.uninstall(
- auto_confirm=options.yes, verbose=self.verbosity > 0,
- )
- if uninstall_pathset:
- uninstall_pathset.commit()
-
- warn_if_run_as_root()
- return SUCCESS
diff --git a/venv/Lib/site-packages/pip/_internal/commands/wheel.py b/venv/Lib/site-packages/pip/_internal/commands/wheel.py
deleted file mode 100644
index ff47dba..0000000
--- a/venv/Lib/site-packages/pip/_internal/commands/wheel.py
+++ /dev/null
@@ -1,178 +0,0 @@
-import logging
-import os
-import shutil
-from optparse import Values
-from typing import List
-
-from pip._internal.cache import WheelCache
-from pip._internal.cli import cmdoptions
-from pip._internal.cli.req_command import RequirementCommand, with_cleanup
-from pip._internal.cli.status_codes import SUCCESS
-from pip._internal.exceptions import CommandError
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.req.req_tracker import get_requirement_tracker
-from pip._internal.utils.misc import ensure_dir, normalize_path
-from pip._internal.utils.temp_dir import TempDirectory
-from pip._internal.wheel_builder import build, should_build_for_wheel_command
-
-logger = logging.getLogger(__name__)
-
-
-class WheelCommand(RequirementCommand):
- """
- Build Wheel archives for your requirements and dependencies.
-
- Wheel is a built-package format, and offers the advantage of not
- recompiling your software during every install. For more details, see the
- wheel docs: https://wheel.readthedocs.io/en/latest/
-
- Requirements: setuptools>=0.8, and wheel.
-
- 'pip wheel' uses the bdist_wheel setuptools extension from the wheel
- package to build individual wheels.
-
- """
-
- usage = """
- %prog [options] ...
- %prog [options] -r ...
- %prog [options] [-e] ...
- %prog [options] [-e] ...
- %prog [options] ..."""
-
- def add_options(self):
- # type: () -> None
-
- self.cmd_opts.add_option(
- '-w', '--wheel-dir',
- dest='wheel_dir',
- metavar='dir',
- default=os.curdir,
- help=("Build wheels into , where the default is the "
- "current working directory."),
- )
- self.cmd_opts.add_option(cmdoptions.no_binary())
- self.cmd_opts.add_option(cmdoptions.only_binary())
- self.cmd_opts.add_option(cmdoptions.prefer_binary())
- self.cmd_opts.add_option(cmdoptions.no_build_isolation())
- self.cmd_opts.add_option(cmdoptions.use_pep517())
- self.cmd_opts.add_option(cmdoptions.no_use_pep517())
- self.cmd_opts.add_option(cmdoptions.constraints())
- self.cmd_opts.add_option(cmdoptions.editable())
- self.cmd_opts.add_option(cmdoptions.requirements())
- self.cmd_opts.add_option(cmdoptions.src())
- self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
- self.cmd_opts.add_option(cmdoptions.no_deps())
- self.cmd_opts.add_option(cmdoptions.build_dir())
- self.cmd_opts.add_option(cmdoptions.progress_bar())
-
- self.cmd_opts.add_option(
- '--no-verify',
- dest='no_verify',
- action='store_true',
- default=False,
- help="Don't verify if built wheel is valid.",
- )
-
- self.cmd_opts.add_option(cmdoptions.build_options())
- self.cmd_opts.add_option(cmdoptions.global_options())
-
- self.cmd_opts.add_option(
- '--pre',
- action='store_true',
- default=False,
- help=("Include pre-release and development versions. By default, "
- "pip only finds stable versions."),
- )
-
- self.cmd_opts.add_option(cmdoptions.require_hashes())
-
- index_opts = cmdoptions.make_option_group(
- cmdoptions.index_group,
- self.parser,
- )
-
- self.parser.insert_option_group(0, index_opts)
- self.parser.insert_option_group(0, self.cmd_opts)
-
- @with_cleanup
- def run(self, options, args):
- # type: (Values, List[str]) -> int
- cmdoptions.check_install_build_global(options)
-
- session = self.get_default_session(options)
-
- finder = self._build_package_finder(options, session)
- wheel_cache = WheelCache(options.cache_dir, options.format_control)
-
- options.wheel_dir = normalize_path(options.wheel_dir)
- ensure_dir(options.wheel_dir)
-
- req_tracker = self.enter_context(get_requirement_tracker())
-
- directory = TempDirectory(
- delete=not options.no_clean,
- kind="wheel",
- globally_managed=True,
- )
-
- reqs = self.get_requirements(args, options, finder, session)
-
- preparer = self.make_requirement_preparer(
- temp_build_dir=directory,
- options=options,
- req_tracker=req_tracker,
- session=session,
- finder=finder,
- download_dir=options.wheel_dir,
- use_user_site=False,
- )
-
- resolver = self.make_resolver(
- preparer=preparer,
- finder=finder,
- options=options,
- wheel_cache=wheel_cache,
- ignore_requires_python=options.ignore_requires_python,
- use_pep517=options.use_pep517,
- )
-
- self.trace_basic_info(finder)
-
- requirement_set = resolver.resolve(
- reqs, check_supported_wheels=True
- )
-
- reqs_to_build = [] # type: List[InstallRequirement]
- for req in requirement_set.requirements.values():
- if req.is_wheel:
- preparer.save_linked_requirement(req)
- elif should_build_for_wheel_command(req):
- reqs_to_build.append(req)
-
- # build wheels
- build_successes, build_failures = build(
- reqs_to_build,
- wheel_cache=wheel_cache,
- verify=(not options.no_verify),
- build_options=options.build_options or [],
- global_options=options.global_options or [],
- )
- for req in build_successes:
- assert req.link and req.link.is_wheel
- assert req.local_file_path
- # copy from cache to target directory
- try:
- shutil.copy(req.local_file_path, options.wheel_dir)
- except OSError as e:
- logger.warning(
- "Building wheel for %s failed: %s",
- req.name, e,
- )
- build_failures.append(req)
- if len(build_failures) != 0:
- raise CommandError(
- "Failed to build one or more wheels"
- )
-
- return SUCCESS
diff --git a/venv/Lib/site-packages/pip/_internal/configuration.py b/venv/Lib/site-packages/pip/_internal/configuration.py
deleted file mode 100644
index a4698ec..0000000
--- a/venv/Lib/site-packages/pip/_internal/configuration.py
+++ /dev/null
@@ -1,403 +0,0 @@
-"""Configuration management setup
-
-Some terminology:
-- name
- As written in config files.
-- value
- Value associated with a name
-- key
- Name combined with it's section (section.name)
-- variant
- A single word describing where the configuration key-value pair came from
-"""
-
-import configparser
-import locale
-import logging
-import os
-import sys
-from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple
-
-from pip._internal.exceptions import (
- ConfigurationError,
- ConfigurationFileCouldNotBeLoaded,
-)
-from pip._internal.utils import appdirs
-from pip._internal.utils.compat import WINDOWS
-from pip._internal.utils.misc import ensure_dir, enum
-
-RawConfigParser = configparser.RawConfigParser # Shorthand
-Kind = NewType("Kind", str)
-
-CONFIG_BASENAME = 'pip.ini' if WINDOWS else 'pip.conf'
-ENV_NAMES_IGNORED = "version", "help"
-
-# The kinds of configurations there are.
-kinds = enum(
- USER="user", # User Specific
- GLOBAL="global", # System Wide
- SITE="site", # [Virtual] Environment Specific
- ENV="env", # from PIP_CONFIG_FILE
- ENV_VAR="env-var", # from Environment Variables
-)
-OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR
-VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE
-
-logger = logging.getLogger(__name__)
-
-
-# NOTE: Maybe use the optionx attribute to normalize keynames.
-def _normalize_name(name):
- # type: (str) -> str
- """Make a name consistent regardless of source (environment or file)
- """
- name = name.lower().replace('_', '-')
- if name.startswith('--'):
- name = name[2:] # only prefer long opts
- return name
-
-
-def _disassemble_key(name):
- # type: (str) -> List[str]
- if "." not in name:
- error_message = (
- "Key does not contain dot separated section and key. "
- "Perhaps you wanted to use 'global.{}' instead?"
- ).format(name)
- raise ConfigurationError(error_message)
- return name.split(".", 1)
-
-
-def get_configuration_files():
- # type: () -> Dict[Kind, List[str]]
- global_config_files = [
- os.path.join(path, CONFIG_BASENAME)
- for path in appdirs.site_config_dirs('pip')
- ]
-
- site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME)
- legacy_config_file = os.path.join(
- os.path.expanduser('~'),
- 'pip' if WINDOWS else '.pip',
- CONFIG_BASENAME,
- )
- new_config_file = os.path.join(
- appdirs.user_config_dir("pip"), CONFIG_BASENAME
- )
- return {
- kinds.GLOBAL: global_config_files,
- kinds.SITE: [site_config_file],
- kinds.USER: [legacy_config_file, new_config_file],
- }
-
-
-class Configuration:
- """Handles management of configuration.
-
- Provides an interface to accessing and managing configuration files.
-
- This class converts provides an API that takes "section.key-name" style
- keys and stores the value associated with it as "key-name" under the
- section "section".
-
- This allows for a clean interface wherein the both the section and the
- key-name are preserved in an easy to manage form in the configuration files
- and the data stored is also nice.
- """
-
- def __init__(self, isolated, load_only=None):
- # type: (bool, Optional[Kind]) -> None
- super().__init__()
-
- if load_only is not None and load_only not in VALID_LOAD_ONLY:
- raise ConfigurationError(
- "Got invalid value for load_only - should be one of {}".format(
- ", ".join(map(repr, VALID_LOAD_ONLY))
- )
- )
- self.isolated = isolated
- self.load_only = load_only
-
- # Because we keep track of where we got the data from
- self._parsers = {
- variant: [] for variant in OVERRIDE_ORDER
- } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]]
- self._config = {
- variant: {} for variant in OVERRIDE_ORDER
- } # type: Dict[Kind, Dict[str, Any]]
- self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]]
-
- def load(self):
- # type: () -> None
- """Loads configuration from configuration files and environment
- """
- self._load_config_files()
- if not self.isolated:
- self._load_environment_vars()
-
- def get_file_to_edit(self):
- # type: () -> Optional[str]
- """Returns the file with highest priority in configuration
- """
- assert self.load_only is not None, \
- "Need to be specified a file to be editing"
-
- try:
- return self._get_parser_to_modify()[0]
- except IndexError:
- return None
-
- def items(self):
- # type: () -> Iterable[Tuple[str, Any]]
- """Returns key-value pairs like dict.items() representing the loaded
- configuration
- """
- return self._dictionary.items()
-
- def get_value(self, key):
- # type: (str) -> Any
- """Get a value from the configuration.
- """
- try:
- return self._dictionary[key]
- except KeyError:
- raise ConfigurationError(f"No such key - {key}")
-
- def set_value(self, key, value):
- # type: (str, Any) -> None
- """Modify a value in the configuration.
- """
- self._ensure_have_load_only()
-
- assert self.load_only
- fname, parser = self._get_parser_to_modify()
-
- if parser is not None:
- section, name = _disassemble_key(key)
-
- # Modify the parser and the configuration
- if not parser.has_section(section):
- parser.add_section(section)
- parser.set(section, name, value)
-
- self._config[self.load_only][key] = value
- self._mark_as_modified(fname, parser)
-
- def unset_value(self, key):
- # type: (str) -> None
- """Unset a value in the configuration."""
- self._ensure_have_load_only()
-
- assert self.load_only
- if key not in self._config[self.load_only]:
- raise ConfigurationError(f"No such key - {key}")
-
- fname, parser = self._get_parser_to_modify()
-
- if parser is not None:
- section, name = _disassemble_key(key)
- if not (parser.has_section(section)
- and parser.remove_option(section, name)):
- # The option was not removed.
- raise ConfigurationError(
- "Fatal Internal error [id=1]. Please report as a bug."
- )
-
- # The section may be empty after the option was removed.
- if not parser.items(section):
- parser.remove_section(section)
- self._mark_as_modified(fname, parser)
-
- del self._config[self.load_only][key]
-
- def save(self):
- # type: () -> None
- """Save the current in-memory state.
- """
- self._ensure_have_load_only()
-
- for fname, parser in self._modified_parsers:
- logger.info("Writing to %s", fname)
-
- # Ensure directory exists.
- ensure_dir(os.path.dirname(fname))
-
- with open(fname, "w") as f:
- parser.write(f)
-
- #
- # Private routines
- #
-
- def _ensure_have_load_only(self):
- # type: () -> None
- if self.load_only is None:
- raise ConfigurationError("Needed a specific file to be modifying.")
- logger.debug("Will be working with %s variant only", self.load_only)
-
- @property
- def _dictionary(self):
- # type: () -> Dict[str, Any]
- """A dictionary representing the loaded configuration.
- """
- # NOTE: Dictionaries are not populated if not loaded. So, conditionals
- # are not needed here.
- retval = {}
-
- for variant in OVERRIDE_ORDER:
- retval.update(self._config[variant])
-
- return retval
-
- def _load_config_files(self):
- # type: () -> None
- """Loads configuration from configuration files
- """
- config_files = dict(self.iter_config_files())
- if config_files[kinds.ENV][0:1] == [os.devnull]:
- logger.debug(
- "Skipping loading configuration files due to "
- "environment's PIP_CONFIG_FILE being os.devnull"
- )
- return
-
- for variant, files in config_files.items():
- for fname in files:
- # If there's specific variant set in `load_only`, load only
- # that variant, not the others.
- if self.load_only is not None and variant != self.load_only:
- logger.debug(
- "Skipping file '%s' (variant: %s)", fname, variant
- )
- continue
-
- parser = self._load_file(variant, fname)
-
- # Keeping track of the parsers used
- self._parsers[variant].append((fname, parser))
-
- def _load_file(self, variant, fname):
- # type: (Kind, str) -> RawConfigParser
- logger.debug("For variant '%s', will try loading '%s'", variant, fname)
- parser = self._construct_parser(fname)
-
- for section in parser.sections():
- items = parser.items(section)
- self._config[variant].update(self._normalized_keys(section, items))
-
- return parser
-
- def _construct_parser(self, fname):
- # type: (str) -> RawConfigParser
- parser = configparser.RawConfigParser()
- # If there is no such file, don't bother reading it but create the
- # parser anyway, to hold the data.
- # Doing this is useful when modifying and saving files, where we don't
- # need to construct a parser.
- if os.path.exists(fname):
- try:
- parser.read(fname)
- except UnicodeDecodeError:
- # See https://github.com/pypa/pip/issues/4963
- raise ConfigurationFileCouldNotBeLoaded(
- reason="contains invalid {} characters".format(
- locale.getpreferredencoding(False)
- ),
- fname=fname,
- )
- except configparser.Error as error:
- # See https://github.com/pypa/pip/issues/4893
- raise ConfigurationFileCouldNotBeLoaded(error=error)
- return parser
-
- def _load_environment_vars(self):
- # type: () -> None
- """Loads configuration from environment variables
- """
- self._config[kinds.ENV_VAR].update(
- self._normalized_keys(":env:", self.get_environ_vars())
- )
-
- def _normalized_keys(self, section, items):
- # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any]
- """Normalizes items to construct a dictionary with normalized keys.
-
- This routine is where the names become keys and are made the same
- regardless of source - configuration files or environment.
- """
- normalized = {}
- for name, val in items:
- key = section + "." + _normalize_name(name)
- normalized[key] = val
- return normalized
-
- def get_environ_vars(self):
- # type: () -> Iterable[Tuple[str, str]]
- """Returns a generator with all environmental vars with prefix PIP_"""
- for key, val in os.environ.items():
- if key.startswith("PIP_"):
- name = key[4:].lower()
- if name not in ENV_NAMES_IGNORED:
- yield name, val
-
- # XXX: This is patched in the tests.
- def iter_config_files(self):
- # type: () -> Iterable[Tuple[Kind, List[str]]]
- """Yields variant and configuration files associated with it.
-
- This should be treated like items of a dictionary.
- """
- # SMELL: Move the conditions out of this function
-
- # environment variables have the lowest priority
- config_file = os.environ.get('PIP_CONFIG_FILE', None)
- if config_file is not None:
- yield kinds.ENV, [config_file]
- else:
- yield kinds.ENV, []
-
- config_files = get_configuration_files()
-
- # at the base we have any global configuration
- yield kinds.GLOBAL, config_files[kinds.GLOBAL]
-
- # per-user configuration next
- should_load_user_config = not self.isolated and not (
- config_file and os.path.exists(config_file)
- )
- if should_load_user_config:
- # The legacy config file is overridden by the new config file
- yield kinds.USER, config_files[kinds.USER]
-
- # finally virtualenv configuration first trumping others
- yield kinds.SITE, config_files[kinds.SITE]
-
- def get_values_in_config(self, variant):
- # type: (Kind) -> Dict[str, Any]
- """Get values present in a config file"""
- return self._config[variant]
-
- def _get_parser_to_modify(self):
- # type: () -> Tuple[str, RawConfigParser]
- # Determine which parser to modify
- assert self.load_only
- parsers = self._parsers[self.load_only]
- if not parsers:
- # This should not happen if everything works correctly.
- raise ConfigurationError(
- "Fatal Internal error [id=2]. Please report as a bug."
- )
-
- # Use the highest priority parser.
- return parsers[-1]
-
- # XXX: This is patched in the tests.
- def _mark_as_modified(self, fname, parser):
- # type: (str, RawConfigParser) -> None
- file_parser_tuple = (fname, parser)
- if file_parser_tuple not in self._modified_parsers:
- self._modified_parsers.append(file_parser_tuple)
-
- def __repr__(self):
- # type: () -> str
- return f"{self.__class__.__name__}({self._dictionary!r})"
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__init__.py b/venv/Lib/site-packages/pip/_internal/distributions/__init__.py
deleted file mode 100644
index a222f24..0000000
--- a/venv/Lib/site-packages/pip/_internal/distributions/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from pip._internal.distributions.base import AbstractDistribution
-from pip._internal.distributions.sdist import SourceDistribution
-from pip._internal.distributions.wheel import WheelDistribution
-from pip._internal.req.req_install import InstallRequirement
-
-
-def make_distribution_for_install_requirement(install_req):
- # type: (InstallRequirement) -> AbstractDistribution
- """Returns a Distribution for the given InstallRequirement"""
- # Editable requirements will always be source distributions. They use the
- # legacy logic until we create a modern standard for them.
- if install_req.editable:
- return SourceDistribution(install_req)
-
- # If it's a wheel, it's a WheelDistribution
- if install_req.is_wheel:
- return WheelDistribution(install_req)
-
- # Otherwise, a SourceDistribution
- return SourceDistribution(install_req)
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index de1a2e0..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc
deleted file mode 100644
index db401db..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-39.pyc
deleted file mode 100644
index 20542f0..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc
deleted file mode 100644
index bc2433a..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc
deleted file mode 100644
index d684c2c..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/base.py b/venv/Lib/site-packages/pip/_internal/distributions/base.py
deleted file mode 100644
index 78ee91e..0000000
--- a/venv/Lib/site-packages/pip/_internal/distributions/base.py
+++ /dev/null
@@ -1,39 +0,0 @@
-import abc
-from typing import Optional
-
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.req import InstallRequirement
-
-
-class AbstractDistribution(metaclass=abc.ABCMeta):
- """A base class for handling installable artifacts.
-
- The requirements for anything installable are as follows:
-
- - we must be able to determine the requirement name
- (or we can't correctly handle the non-upgrade case).
-
- - for packages with setup requirements, we must also be able
- to determine their requirements without installing additional
- packages (for the same reason as run-time dependencies)
-
- - we must be able to create a Distribution object exposing the
- above metadata.
- """
-
- def __init__(self, req):
- # type: (InstallRequirement) -> None
- super().__init__()
- self.req = req
-
- @abc.abstractmethod
- def get_pkg_resources_distribution(self):
- # type: () -> Optional[Distribution]
- raise NotImplementedError()
-
- @abc.abstractmethod
- def prepare_distribution_metadata(self, finder, build_isolation):
- # type: (PackageFinder, bool) -> None
- raise NotImplementedError()
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/installed.py b/venv/Lib/site-packages/pip/_internal/distributions/installed.py
deleted file mode 100644
index b19dfac..0000000
--- a/venv/Lib/site-packages/pip/_internal/distributions/installed.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from typing import Optional
-
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.distributions.base import AbstractDistribution
-from pip._internal.index.package_finder import PackageFinder
-
-
-class InstalledDistribution(AbstractDistribution):
- """Represents an installed package.
-
- This does not need any preparation as the required information has already
- been computed.
- """
-
- def get_pkg_resources_distribution(self):
- # type: () -> Optional[Distribution]
- return self.req.satisfied_by
-
- def prepare_distribution_metadata(self, finder, build_isolation):
- # type: (PackageFinder, bool) -> None
- pass
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/sdist.py b/venv/Lib/site-packages/pip/_internal/distributions/sdist.py
deleted file mode 100644
index c873a9f..0000000
--- a/venv/Lib/site-packages/pip/_internal/distributions/sdist.py
+++ /dev/null
@@ -1,95 +0,0 @@
-import logging
-from typing import Set, Tuple
-
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.build_env import BuildEnvironment
-from pip._internal.distributions.base import AbstractDistribution
-from pip._internal.exceptions import InstallationError
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.utils.subprocess import runner_with_spinner_message
-
-logger = logging.getLogger(__name__)
-
-
-class SourceDistribution(AbstractDistribution):
- """Represents a source distribution.
-
- The preparation step for these needs metadata for the packages to be
- generated, either using PEP 517 or using the legacy `setup.py egg_info`.
- """
-
- def get_pkg_resources_distribution(self):
- # type: () -> Distribution
- return self.req.get_dist()
-
- def prepare_distribution_metadata(self, finder, build_isolation):
- # type: (PackageFinder, bool) -> None
- # Load pyproject.toml, to determine whether PEP 517 is to be used
- self.req.load_pyproject_toml()
-
- # Set up the build isolation, if this requirement should be isolated
- should_isolate = self.req.use_pep517 and build_isolation
- if should_isolate:
- self._setup_isolation(finder)
-
- self.req.prepare_metadata()
-
- def _setup_isolation(self, finder):
- # type: (PackageFinder) -> None
- def _raise_conflicts(conflicting_with, conflicting_reqs):
- # type: (str, Set[Tuple[str, str]]) -> None
- format_string = (
- "Some build dependencies for {requirement} "
- "conflict with {conflicting_with}: {description}."
- )
- error_message = format_string.format(
- requirement=self.req,
- conflicting_with=conflicting_with,
- description=", ".join(
- f"{installed} is incompatible with {wanted}"
- for installed, wanted in sorted(conflicting)
- ),
- )
- raise InstallationError(error_message)
-
- # Isolate in a BuildEnvironment and install the build-time
- # requirements.
- pyproject_requires = self.req.pyproject_requires
- assert pyproject_requires is not None
-
- self.req.build_env = BuildEnvironment()
- self.req.build_env.install_requirements(
- finder, pyproject_requires, "overlay", "Installing build dependencies"
- )
- conflicting, missing = self.req.build_env.check_requirements(
- self.req.requirements_to_check
- )
- if conflicting:
- _raise_conflicts("PEP 517/518 supported requirements", conflicting)
- if missing:
- logger.warning(
- "Missing build requirements in pyproject.toml for %s.",
- self.req,
- )
- logger.warning(
- "The project does not specify a build backend, and "
- "pip cannot fall back to setuptools without %s.",
- " and ".join(map(repr, sorted(missing))),
- )
- # Install any extra build dependencies that the backend requests.
- # This must be done in a second pass, as the pyproject.toml
- # dependencies must be installed before we can call the backend.
- with self.req.build_env:
- runner = runner_with_spinner_message("Getting requirements to build wheel")
- backend = self.req.pep517_backend
- assert backend is not None
- with backend.subprocess_runner(runner):
- reqs = backend.get_requires_for_build_wheel()
-
- conflicting, missing = self.req.build_env.check_requirements(reqs)
- if conflicting:
- _raise_conflicts("the backend dependencies", conflicting)
- self.req.build_env.install_requirements(
- finder, missing, "normal", "Installing backend dependencies"
- )
diff --git a/venv/Lib/site-packages/pip/_internal/distributions/wheel.py b/venv/Lib/site-packages/pip/_internal/distributions/wheel.py
deleted file mode 100644
index d038479..0000000
--- a/venv/Lib/site-packages/pip/_internal/distributions/wheel.py
+++ /dev/null
@@ -1,34 +0,0 @@
-from zipfile import ZipFile
-
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.distributions.base import AbstractDistribution
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel
-
-
-class WheelDistribution(AbstractDistribution):
- """Represents a wheel distribution.
-
- This does not need any preparation as wheels can be directly unpacked.
- """
-
- def get_pkg_resources_distribution(self):
- # type: () -> Distribution
- """Loads the metadata from the wheel file into memory and returns a
- Distribution that uses it, not relying on the wheel file or
- requirement.
- """
- # Set as part of preparation during download.
- assert self.req.local_file_path
- # Wheels are never unnamed.
- assert self.req.name
-
- with ZipFile(self.req.local_file_path, allowZip64=True) as z:
- return pkg_resources_distribution_for_wheel(
- z, self.req.name, self.req.local_file_path
- )
-
- def prepare_distribution_metadata(self, finder, build_isolation):
- # type: (PackageFinder, bool) -> None
- pass
diff --git a/venv/Lib/site-packages/pip/_internal/exceptions.py b/venv/Lib/site-packages/pip/_internal/exceptions.py
deleted file mode 100644
index 8aacf81..0000000
--- a/venv/Lib/site-packages/pip/_internal/exceptions.py
+++ /dev/null
@@ -1,397 +0,0 @@
-"""Exceptions used throughout package"""
-
-import configparser
-from itertools import chain, groupby, repeat
-from typing import TYPE_CHECKING, Dict, List, Optional
-
-from pip._vendor.pkg_resources import Distribution
-from pip._vendor.requests.models import Request, Response
-
-if TYPE_CHECKING:
- from hashlib import _Hash
-
- from pip._internal.req.req_install import InstallRequirement
-
-
-class PipError(Exception):
- """Base pip exception"""
-
-
-class ConfigurationError(PipError):
- """General exception in configuration"""
-
-
-class InstallationError(PipError):
- """General exception during installation"""
-
-
-class UninstallationError(PipError):
- """General exception during uninstallation"""
-
-
-class NoneMetadataError(PipError):
- """
- Raised when accessing "METADATA" or "PKG-INFO" metadata for a
- pip._vendor.pkg_resources.Distribution object and
- `dist.has_metadata('METADATA')` returns True but
- `dist.get_metadata('METADATA')` returns None (and similarly for
- "PKG-INFO").
- """
-
- def __init__(self, dist, metadata_name):
- # type: (Distribution, str) -> None
- """
- :param dist: A Distribution object.
- :param metadata_name: The name of the metadata being accessed
- (can be "METADATA" or "PKG-INFO").
- """
- self.dist = dist
- self.metadata_name = metadata_name
-
- def __str__(self):
- # type: () -> str
- # Use `dist` in the error message because its stringification
- # includes more information, like the version and location.
- return (
- 'None {} metadata found for distribution: {}'.format(
- self.metadata_name, self.dist,
- )
- )
-
-
-class UserInstallationInvalid(InstallationError):
- """A --user install is requested on an environment without user site."""
-
- def __str__(self):
- # type: () -> str
- return "User base directory is not specified"
-
-
-class InvalidSchemeCombination(InstallationError):
- def __str__(self):
- # type: () -> str
- before = ", ".join(str(a) for a in self.args[:-1])
- return f"Cannot set {before} and {self.args[-1]} together"
-
-
-class DistributionNotFound(InstallationError):
- """Raised when a distribution cannot be found to satisfy a requirement"""
-
-
-class RequirementsFileParseError(InstallationError):
- """Raised when a general error occurs parsing a requirements file line."""
-
-
-class BestVersionAlreadyInstalled(PipError):
- """Raised when the most up-to-date version of a package is already
- installed."""
-
-
-class BadCommand(PipError):
- """Raised when virtualenv or a command is not found"""
-
-
-class CommandError(PipError):
- """Raised when there is an error in command-line arguments"""
-
-
-class PreviousBuildDirError(PipError):
- """Raised when there's a previous conflicting build directory"""
-
-
-class NetworkConnectionError(PipError):
- """HTTP connection error"""
-
- def __init__(self, error_msg, response=None, request=None):
- # type: (str, Response, Request) -> None
- """
- Initialize NetworkConnectionError with `request` and `response`
- objects.
- """
- self.response = response
- self.request = request
- self.error_msg = error_msg
- if (self.response is not None and not self.request and
- hasattr(response, 'request')):
- self.request = self.response.request
- super().__init__(error_msg, response, request)
-
- def __str__(self):
- # type: () -> str
- return str(self.error_msg)
-
-
-class InvalidWheelFilename(InstallationError):
- """Invalid wheel filename."""
-
-
-class UnsupportedWheel(InstallationError):
- """Unsupported wheel."""
-
-
-class MetadataInconsistent(InstallationError):
- """Built metadata contains inconsistent information.
-
- This is raised when the metadata contains values (e.g. name and version)
- that do not match the information previously obtained from sdist filename
- or user-supplied ``#egg=`` value.
- """
- def __init__(self, ireq, field, f_val, m_val):
- # type: (InstallRequirement, str, str, str) -> None
- self.ireq = ireq
- self.field = field
- self.f_val = f_val
- self.m_val = m_val
-
- def __str__(self):
- # type: () -> str
- template = (
- "Requested {} has inconsistent {}: "
- "filename has {!r}, but metadata has {!r}"
- )
- return template.format(self.ireq, self.field, self.f_val, self.m_val)
-
-
-class InstallationSubprocessError(InstallationError):
- """A subprocess call failed during installation."""
- def __init__(self, returncode, description):
- # type: (int, str) -> None
- self.returncode = returncode
- self.description = description
-
- def __str__(self):
- # type: () -> str
- return (
- "Command errored out with exit status {}: {} "
- "Check the logs for full command output."
- ).format(self.returncode, self.description)
-
-
-class HashErrors(InstallationError):
- """Multiple HashError instances rolled into one for reporting"""
-
- def __init__(self):
- # type: () -> None
- self.errors = [] # type: List[HashError]
-
- def append(self, error):
- # type: (HashError) -> None
- self.errors.append(error)
-
- def __str__(self):
- # type: () -> str
- lines = []
- self.errors.sort(key=lambda e: e.order)
- for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__):
- lines.append(cls.head)
- lines.extend(e.body() for e in errors_of_cls)
- if lines:
- return '\n'.join(lines)
- return ''
-
- def __nonzero__(self):
- # type: () -> bool
- return bool(self.errors)
-
- def __bool__(self):
- # type: () -> bool
- return self.__nonzero__()
-
-
-class HashError(InstallationError):
- """
- A failure to verify a package against known-good hashes
-
- :cvar order: An int sorting hash exception classes by difficulty of
- recovery (lower being harder), so the user doesn't bother fretting
- about unpinned packages when he has deeper issues, like VCS
- dependencies, to deal with. Also keeps error reports in a
- deterministic order.
- :cvar head: A section heading for display above potentially many
- exceptions of this kind
- :ivar req: The InstallRequirement that triggered this error. This is
- pasted on after the exception is instantiated, because it's not
- typically available earlier.
-
- """
- req = None # type: Optional[InstallRequirement]
- head = ''
- order = -1 # type: int
-
- def body(self):
- # type: () -> str
- """Return a summary of me for display under the heading.
-
- This default implementation simply prints a description of the
- triggering requirement.
-
- :param req: The InstallRequirement that provoked this error, with
- its link already populated by the resolver's _populate_link().
-
- """
- return f' {self._requirement_name()}'
-
- def __str__(self):
- # type: () -> str
- return f'{self.head}\n{self.body()}'
-
- def _requirement_name(self):
- # type: () -> str
- """Return a description of the requirement that triggered me.
-
- This default implementation returns long description of the req, with
- line numbers
-
- """
- return str(self.req) if self.req else 'unknown package'
-
-
-class VcsHashUnsupported(HashError):
- """A hash was provided for a version-control-system-based requirement, but
- we don't have a method for hashing those."""
-
- order = 0
- head = ("Can't verify hashes for these requirements because we don't "
- "have a way to hash version control repositories:")
-
-
-class DirectoryUrlHashUnsupported(HashError):
- """A hash was provided for a version-control-system-based requirement, but
- we don't have a method for hashing those."""
-
- order = 1
- head = ("Can't verify hashes for these file:// requirements because they "
- "point to directories:")
-
-
-class HashMissing(HashError):
- """A hash was needed for a requirement but is absent."""
-
- order = 2
- head = ('Hashes are required in --require-hashes mode, but they are '
- 'missing from some requirements. Here is a list of those '
- 'requirements along with the hashes their downloaded archives '
- 'actually had. Add lines like these to your requirements files to '
- 'prevent tampering. (If you did not enable --require-hashes '
- 'manually, note that it turns on automatically when any package '
- 'has a hash.)')
-
- def __init__(self, gotten_hash):
- # type: (str) -> None
- """
- :param gotten_hash: The hash of the (possibly malicious) archive we
- just downloaded
- """
- self.gotten_hash = gotten_hash
-
- def body(self):
- # type: () -> str
- # Dodge circular import.
- from pip._internal.utils.hashes import FAVORITE_HASH
-
- package = None
- if self.req:
- # In the case of URL-based requirements, display the original URL
- # seen in the requirements file rather than the package name,
- # so the output can be directly copied into the requirements file.
- package = (self.req.original_link if self.req.original_link
- # In case someone feeds something downright stupid
- # to InstallRequirement's constructor.
- else getattr(self.req, 'req', None))
- return ' {} --hash={}:{}'.format(package or 'unknown package',
- FAVORITE_HASH,
- self.gotten_hash)
-
-
-class HashUnpinned(HashError):
- """A requirement had a hash specified but was not pinned to a specific
- version."""
-
- order = 3
- head = ('In --require-hashes mode, all requirements must have their '
- 'versions pinned with ==. These do not:')
-
-
-class HashMismatch(HashError):
- """
- Distribution file hash values don't match.
-
- :ivar package_name: The name of the package that triggered the hash
- mismatch. Feel free to write to this after the exception is raise to
- improve its error message.
-
- """
- order = 4
- head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS '
- 'FILE. If you have updated the package versions, please update '
- 'the hashes. Otherwise, examine the package contents carefully; '
- 'someone may have tampered with them.')
-
- def __init__(self, allowed, gots):
- # type: (Dict[str, List[str]], Dict[str, _Hash]) -> None
- """
- :param allowed: A dict of algorithm names pointing to lists of allowed
- hex digests
- :param gots: A dict of algorithm names pointing to hashes we
- actually got from the files under suspicion
- """
- self.allowed = allowed
- self.gots = gots
-
- def body(self):
- # type: () -> str
- return ' {}:\n{}'.format(self._requirement_name(),
- self._hash_comparison())
-
- def _hash_comparison(self):
- # type: () -> str
- """
- Return a comparison of actual and expected hash values.
-
- Example::
-
- Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde
- or 123451234512345123451234512345123451234512345
- Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef
-
- """
- def hash_then_or(hash_name):
- # type: (str) -> chain[str]
- # For now, all the decent hashes have 6-char names, so we can get
- # away with hard-coding space literals.
- return chain([hash_name], repeat(' or'))
-
- lines = [] # type: List[str]
- for hash_name, expecteds in self.allowed.items():
- prefix = hash_then_or(hash_name)
- lines.extend((' Expected {} {}'.format(next(prefix), e))
- for e in expecteds)
- lines.append(' Got {}\n'.format(
- self.gots[hash_name].hexdigest()))
- return '\n'.join(lines)
-
-
-class UnsupportedPythonVersion(InstallationError):
- """Unsupported python version according to Requires-Python package
- metadata."""
-
-
-class ConfigurationFileCouldNotBeLoaded(ConfigurationError):
- """When there are errors while loading a configuration file
- """
-
- def __init__(self, reason="could not be loaded", fname=None, error=None):
- # type: (str, Optional[str], Optional[configparser.Error]) -> None
- super().__init__(error)
- self.reason = reason
- self.fname = fname
- self.error = error
-
- def __str__(self):
- # type: () -> str
- if self.fname is not None:
- message_part = f" in {self.fname}."
- else:
- assert self.error is not None
- message_part = f".\n{self.error}\n"
- return f"Configuration file {self.reason}{message_part}"
diff --git a/venv/Lib/site-packages/pip/_internal/index/__init__.py b/venv/Lib/site-packages/pip/_internal/index/__init__.py
deleted file mode 100644
index 7a17b7b..0000000
--- a/venv/Lib/site-packages/pip/_internal/index/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-"""Index interaction code
-"""
diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 8a6e2c6..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-39.pyc
deleted file mode 100644
index 1fa4503..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc
deleted file mode 100644
index 0fecf89..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc
deleted file mode 100644
index 5dee4e2..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/index/collector.py b/venv/Lib/site-packages/pip/_internal/index/collector.py
deleted file mode 100644
index 0721e36..0000000
--- a/venv/Lib/site-packages/pip/_internal/index/collector.py
+++ /dev/null
@@ -1,556 +0,0 @@
-"""
-The main purpose of this module is to expose LinkCollector.collect_sources().
-"""
-
-import cgi
-import collections
-import functools
-import html
-import itertools
-import logging
-import os
-import re
-import urllib.parse
-import urllib.request
-import xml.etree.ElementTree
-from optparse import Values
-from typing import (
- Callable,
- Iterable,
- List,
- MutableMapping,
- NamedTuple,
- Optional,
- Sequence,
- Union,
-)
-
-from pip._vendor import html5lib, requests
-from pip._vendor.requests import Response
-from pip._vendor.requests.exceptions import RetryError, SSLError
-
-from pip._internal.exceptions import NetworkConnectionError
-from pip._internal.models.link import Link
-from pip._internal.models.search_scope import SearchScope
-from pip._internal.network.session import PipSession
-from pip._internal.network.utils import raise_for_status
-from pip._internal.utils.filetypes import is_archive_file
-from pip._internal.utils.misc import pairwise, redact_auth_from_url
-from pip._internal.vcs import vcs
-
-from .sources import CandidatesFromPage, LinkSource, build_source
-
-logger = logging.getLogger(__name__)
-
-HTMLElement = xml.etree.ElementTree.Element
-ResponseHeaders = MutableMapping[str, str]
-
-
-def _match_vcs_scheme(url):
- # type: (str) -> Optional[str]
- """Look for VCS schemes in the URL.
-
- Returns the matched VCS scheme, or None if there's no match.
- """
- for scheme in vcs.schemes:
- if url.lower().startswith(scheme) and url[len(scheme)] in '+:':
- return scheme
- return None
-
-
-class _NotHTML(Exception):
- def __init__(self, content_type, request_desc):
- # type: (str, str) -> None
- super().__init__(content_type, request_desc)
- self.content_type = content_type
- self.request_desc = request_desc
-
-
-def _ensure_html_header(response):
- # type: (Response) -> None
- """Check the Content-Type header to ensure the response contains HTML.
-
- Raises `_NotHTML` if the content type is not text/html.
- """
- content_type = response.headers.get("Content-Type", "")
- if not content_type.lower().startswith("text/html"):
- raise _NotHTML(content_type, response.request.method)
-
-
-class _NotHTTP(Exception):
- pass
-
-
-def _ensure_html_response(url, session):
- # type: (str, PipSession) -> None
- """Send a HEAD request to the URL, and ensure the response contains HTML.
-
- Raises `_NotHTTP` if the URL is not available for a HEAD request, or
- `_NotHTML` if the content type is not text/html.
- """
- scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url)
- if scheme not in {'http', 'https'}:
- raise _NotHTTP()
-
- resp = session.head(url, allow_redirects=True)
- raise_for_status(resp)
-
- _ensure_html_header(resp)
-
-
-def _get_html_response(url, session):
- # type: (str, PipSession) -> Response
- """Access an HTML page with GET, and return the response.
-
- This consists of three parts:
-
- 1. If the URL looks suspiciously like an archive, send a HEAD first to
- check the Content-Type is HTML, to avoid downloading a large file.
- Raise `_NotHTTP` if the content type cannot be determined, or
- `_NotHTML` if it is not HTML.
- 2. Actually perform the request. Raise HTTP exceptions on network failures.
- 3. Check the Content-Type header to make sure we got HTML, and raise
- `_NotHTML` otherwise.
- """
- if is_archive_file(Link(url).filename):
- _ensure_html_response(url, session=session)
-
- logger.debug('Getting page %s', redact_auth_from_url(url))
-
- resp = session.get(
- url,
- headers={
- "Accept": "text/html",
- # We don't want to blindly returned cached data for
- # /simple/, because authors generally expecting that
- # twine upload && pip install will function, but if
- # they've done a pip install in the last ~10 minutes
- # it won't. Thus by setting this to zero we will not
- # blindly use any cached data, however the benefit of
- # using max-age=0 instead of no-cache, is that we will
- # still support conditional requests, so we will still
- # minimize traffic sent in cases where the page hasn't
- # changed at all, we will just always incur the round
- # trip for the conditional GET now instead of only
- # once per 10 minutes.
- # For more information, please see pypa/pip#5670.
- "Cache-Control": "max-age=0",
- },
- )
- raise_for_status(resp)
-
- # The check for archives above only works if the url ends with
- # something that looks like an archive. However that is not a
- # requirement of an url. Unless we issue a HEAD request on every
- # url we cannot know ahead of time for sure if something is HTML
- # or not. However we can check after we've downloaded it.
- _ensure_html_header(resp)
-
- return resp
-
-
-def _get_encoding_from_headers(headers):
- # type: (ResponseHeaders) -> Optional[str]
- """Determine if we have any encoding information in our headers.
- """
- if headers and "Content-Type" in headers:
- content_type, params = cgi.parse_header(headers["Content-Type"])
- if "charset" in params:
- return params['charset']
- return None
-
-
-def _determine_base_url(document, page_url):
- # type: (HTMLElement, str) -> str
- """Determine the HTML document's base URL.
-
- This looks for a `` `` tag in the HTML document. If present, its href
- attribute denotes the base URL of anchor tags in the document. If there is
- no such tag (or if it does not have a valid href attribute), the HTML
- file's URL is used as the base URL.
-
- :param document: An HTML document representation. The current
- implementation expects the result of ``html5lib.parse()``.
- :param page_url: The URL of the HTML document.
- """
- for base in document.findall(".//base"):
- href = base.get("href")
- if href is not None:
- return href
- return page_url
-
-
-def _clean_url_path_part(part):
- # type: (str) -> str
- """
- Clean a "part" of a URL path (i.e. after splitting on "@" characters).
- """
- # We unquote prior to quoting to make sure nothing is double quoted.
- return urllib.parse.quote(urllib.parse.unquote(part))
-
-
-def _clean_file_url_path(part):
- # type: (str) -> str
- """
- Clean the first part of a URL path that corresponds to a local
- filesystem path (i.e. the first part after splitting on "@" characters).
- """
- # We unquote prior to quoting to make sure nothing is double quoted.
- # Also, on Windows the path part might contain a drive letter which
- # should not be quoted. On Linux where drive letters do not
- # exist, the colon should be quoted. We rely on urllib.request
- # to do the right thing here.
- return urllib.request.pathname2url(urllib.request.url2pathname(part))
-
-
-# percent-encoded: /
-_reserved_chars_re = re.compile('(@|%2F)', re.IGNORECASE)
-
-
-def _clean_url_path(path, is_local_path):
- # type: (str, bool) -> str
- """
- Clean the path portion of a URL.
- """
- if is_local_path:
- clean_func = _clean_file_url_path
- else:
- clean_func = _clean_url_path_part
-
- # Split on the reserved characters prior to cleaning so that
- # revision strings in VCS URLs are properly preserved.
- parts = _reserved_chars_re.split(path)
-
- cleaned_parts = []
- for to_clean, reserved in pairwise(itertools.chain(parts, [''])):
- cleaned_parts.append(clean_func(to_clean))
- # Normalize %xx escapes (e.g. %2f -> %2F)
- cleaned_parts.append(reserved.upper())
-
- return ''.join(cleaned_parts)
-
-
-def _clean_link(url):
- # type: (str) -> str
- """
- Make sure a link is fully quoted.
- For example, if ' ' occurs in the URL, it will be replaced with "%20",
- and without double-quoting other characters.
- """
- # Split the URL into parts according to the general structure
- # `scheme://netloc/path;parameters?query#fragment`.
- result = urllib.parse.urlparse(url)
- # If the netloc is empty, then the URL refers to a local filesystem path.
- is_local_path = not result.netloc
- path = _clean_url_path(result.path, is_local_path=is_local_path)
- return urllib.parse.urlunparse(result._replace(path=path))
-
-
-def _create_link_from_element(
- anchor, # type: HTMLElement
- page_url, # type: str
- base_url, # type: str
-):
- # type: (...) -> Optional[Link]
- """
- Convert an anchor element in a simple repository page to a Link.
- """
- href = anchor.get("href")
- if not href:
- return None
-
- url = _clean_link(urllib.parse.urljoin(base_url, href))
- pyrequire = anchor.get('data-requires-python')
- pyrequire = html.unescape(pyrequire) if pyrequire else None
-
- yanked_reason = anchor.get('data-yanked')
- if yanked_reason:
- yanked_reason = html.unescape(yanked_reason)
-
- link = Link(
- url,
- comes_from=page_url,
- requires_python=pyrequire,
- yanked_reason=yanked_reason,
- )
-
- return link
-
-
-class CacheablePageContent:
- def __init__(self, page):
- # type: (HTMLPage) -> None
- assert page.cache_link_parsing
- self.page = page
-
- def __eq__(self, other):
- # type: (object) -> bool
- return (isinstance(other, type(self)) and
- self.page.url == other.page.url)
-
- def __hash__(self):
- # type: () -> int
- return hash(self.page.url)
-
-
-def with_cached_html_pages(
- fn, # type: Callable[[HTMLPage], Iterable[Link]]
-):
- # type: (...) -> Callable[[HTMLPage], List[Link]]
- """
- Given a function that parses an Iterable[Link] from an HTMLPage, cache the
- function's result (keyed by CacheablePageContent), unless the HTMLPage
- `page` has `page.cache_link_parsing == False`.
- """
-
- @functools.lru_cache(maxsize=None)
- def wrapper(cacheable_page):
- # type: (CacheablePageContent) -> List[Link]
- return list(fn(cacheable_page.page))
-
- @functools.wraps(fn)
- def wrapper_wrapper(page):
- # type: (HTMLPage) -> List[Link]
- if page.cache_link_parsing:
- return wrapper(CacheablePageContent(page))
- return list(fn(page))
-
- return wrapper_wrapper
-
-
-@with_cached_html_pages
-def parse_links(page):
- # type: (HTMLPage) -> Iterable[Link]
- """
- Parse an HTML document, and yield its anchor elements as Link objects.
- """
- document = html5lib.parse(
- page.content,
- transport_encoding=page.encoding,
- namespaceHTMLElements=False,
- )
-
- url = page.url
- base_url = _determine_base_url(document, url)
- for anchor in document.findall(".//a"):
- link = _create_link_from_element(
- anchor,
- page_url=url,
- base_url=base_url,
- )
- if link is None:
- continue
- yield link
-
-
-class HTMLPage:
- """Represents one page, along with its URL"""
-
- def __init__(
- self,
- content, # type: bytes
- encoding, # type: Optional[str]
- url, # type: str
- cache_link_parsing=True, # type: bool
- ):
- # type: (...) -> None
- """
- :param encoding: the encoding to decode the given content.
- :param url: the URL from which the HTML was downloaded.
- :param cache_link_parsing: whether links parsed from this page's url
- should be cached. PyPI index urls should
- have this set to False, for example.
- """
- self.content = content
- self.encoding = encoding
- self.url = url
- self.cache_link_parsing = cache_link_parsing
-
- def __str__(self):
- # type: () -> str
- return redact_auth_from_url(self.url)
-
-
-def _handle_get_page_fail(
- link, # type: Link
- reason, # type: Union[str, Exception]
- meth=None # type: Optional[Callable[..., None]]
-):
- # type: (...) -> None
- if meth is None:
- meth = logger.debug
- meth("Could not fetch URL %s: %s - skipping", link, reason)
-
-
-def _make_html_page(response, cache_link_parsing=True):
- # type: (Response, bool) -> HTMLPage
- encoding = _get_encoding_from_headers(response.headers)
- return HTMLPage(
- response.content,
- encoding=encoding,
- url=response.url,
- cache_link_parsing=cache_link_parsing)
-
-
-def _get_html_page(link, session=None):
- # type: (Link, Optional[PipSession]) -> Optional[HTMLPage]
- if session is None:
- raise TypeError(
- "_get_html_page() missing 1 required keyword argument: 'session'"
- )
-
- url = link.url.split('#', 1)[0]
-
- # Check for VCS schemes that do not support lookup as web pages.
- vcs_scheme = _match_vcs_scheme(url)
- if vcs_scheme:
- logger.warning('Cannot look at %s URL %s because it does not support '
- 'lookup as web pages.', vcs_scheme, link)
- return None
-
- # Tack index.html onto file:// URLs that point to directories
- scheme, _, path, _, _, _ = urllib.parse.urlparse(url)
- if (scheme == 'file' and os.path.isdir(urllib.request.url2pathname(path))):
- # add trailing slash if not present so urljoin doesn't trim
- # final segment
- if not url.endswith('/'):
- url += '/'
- url = urllib.parse.urljoin(url, 'index.html')
- logger.debug(' file: URL is directory, getting %s', url)
-
- try:
- resp = _get_html_response(url, session=session)
- except _NotHTTP:
- logger.warning(
- 'Skipping page %s because it looks like an archive, and cannot '
- 'be checked by a HTTP HEAD request.', link,
- )
- except _NotHTML as exc:
- logger.warning(
- 'Skipping page %s because the %s request got Content-Type: %s.'
- 'The only supported Content-Type is text/html',
- link, exc.request_desc, exc.content_type,
- )
- except NetworkConnectionError as exc:
- _handle_get_page_fail(link, exc)
- except RetryError as exc:
- _handle_get_page_fail(link, exc)
- except SSLError as exc:
- reason = "There was a problem confirming the ssl certificate: "
- reason += str(exc)
- _handle_get_page_fail(link, reason, meth=logger.info)
- except requests.ConnectionError as exc:
- _handle_get_page_fail(link, f"connection error: {exc}")
- except requests.Timeout:
- _handle_get_page_fail(link, "timed out")
- else:
- return _make_html_page(resp,
- cache_link_parsing=link.cache_link_parsing)
- return None
-
-
-class CollectedSources(NamedTuple):
- find_links: Sequence[Optional[LinkSource]]
- index_urls: Sequence[Optional[LinkSource]]
-
-
-class LinkCollector:
-
- """
- Responsible for collecting Link objects from all configured locations,
- making network requests as needed.
-
- The class's main method is its collect_sources() method.
- """
-
- def __init__(
- self,
- session, # type: PipSession
- search_scope, # type: SearchScope
- ):
- # type: (...) -> None
- self.search_scope = search_scope
- self.session = session
-
- @classmethod
- def create(cls, session, options, suppress_no_index=False):
- # type: (PipSession, Values, bool) -> LinkCollector
- """
- :param session: The Session to use to make requests.
- :param suppress_no_index: Whether to ignore the --no-index option
- when constructing the SearchScope object.
- """
- index_urls = [options.index_url] + options.extra_index_urls
- if options.no_index and not suppress_no_index:
- logger.debug(
- 'Ignoring indexes: %s',
- ','.join(redact_auth_from_url(url) for url in index_urls),
- )
- index_urls = []
-
- # Make sure find_links is a list before passing to create().
- find_links = options.find_links or []
-
- search_scope = SearchScope.create(
- find_links=find_links, index_urls=index_urls,
- )
- link_collector = LinkCollector(
- session=session, search_scope=search_scope,
- )
- return link_collector
-
- @property
- def find_links(self):
- # type: () -> List[str]
- return self.search_scope.find_links
-
- def fetch_page(self, location):
- # type: (Link) -> Optional[HTMLPage]
- """
- Fetch an HTML page containing package links.
- """
- return _get_html_page(location, session=self.session)
-
- def collect_sources(
- self,
- project_name: str,
- candidates_from_page: CandidatesFromPage,
- ) -> CollectedSources:
- # The OrderedDict calls deduplicate sources by URL.
- index_url_sources = collections.OrderedDict(
- build_source(
- loc,
- candidates_from_page=candidates_from_page,
- page_validator=self.session.is_secure_origin,
- expand_dir=False,
- cache_link_parsing=False,
- )
- for loc in self.search_scope.get_index_urls_locations(project_name)
- ).values()
- find_links_sources = collections.OrderedDict(
- build_source(
- loc,
- candidates_from_page=candidates_from_page,
- page_validator=self.session.is_secure_origin,
- expand_dir=True,
- cache_link_parsing=True,
- )
- for loc in self.find_links
- ).values()
-
- if logger.isEnabledFor(logging.DEBUG):
- lines = [
- f"* {s.link}"
- for s in itertools.chain(find_links_sources, index_url_sources)
- if s is not None and s.link is not None
- ]
- lines = [
- f"{len(lines)} location(s) to search "
- f"for versions of {project_name}:"
- ] + lines
- logger.debug("\n".join(lines))
-
- return CollectedSources(
- find_links=list(find_links_sources),
- index_urls=list(index_url_sources),
- )
diff --git a/venv/Lib/site-packages/pip/_internal/index/package_finder.py b/venv/Lib/site-packages/pip/_internal/index/package_finder.py
deleted file mode 100644
index 7f2e04e..0000000
--- a/venv/Lib/site-packages/pip/_internal/index/package_finder.py
+++ /dev/null
@@ -1,1012 +0,0 @@
-"""Routines related to PyPI, indexes"""
-
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-import functools
-import itertools
-import logging
-import re
-from typing import FrozenSet, Iterable, List, Optional, Set, Tuple, Union
-
-from pip._vendor.packaging import specifiers
-from pip._vendor.packaging.tags import Tag
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import _BaseVersion
-from pip._vendor.packaging.version import parse as parse_version
-
-from pip._internal.exceptions import (
- BestVersionAlreadyInstalled,
- DistributionNotFound,
- InvalidWheelFilename,
- UnsupportedWheel,
-)
-from pip._internal.index.collector import LinkCollector, parse_links
-from pip._internal.models.candidate import InstallationCandidate
-from pip._internal.models.format_control import FormatControl
-from pip._internal.models.link import Link
-from pip._internal.models.search_scope import SearchScope
-from pip._internal.models.selection_prefs import SelectionPreferences
-from pip._internal.models.target_python import TargetPython
-from pip._internal.models.wheel import Wheel
-from pip._internal.req import InstallRequirement
-from pip._internal.utils.filetypes import WHEEL_EXTENSION
-from pip._internal.utils.hashes import Hashes
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import build_netloc
-from pip._internal.utils.packaging import check_requires_python
-from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS
-from pip._internal.utils.urls import url_to_path
-
-__all__ = ['FormatControl', 'BestCandidateResult', 'PackageFinder']
-
-
-logger = logging.getLogger(__name__)
-
-BuildTag = Union[Tuple[()], Tuple[int, str]]
-CandidateSortingKey = (
- Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag]
-)
-
-
-def _check_link_requires_python(
- link, # type: Link
- version_info, # type: Tuple[int, int, int]
- ignore_requires_python=False, # type: bool
-):
- # type: (...) -> bool
- """
- Return whether the given Python version is compatible with a link's
- "Requires-Python" value.
-
- :param version_info: A 3-tuple of ints representing the Python
- major-minor-micro version to check.
- :param ignore_requires_python: Whether to ignore the "Requires-Python"
- value if the given Python version isn't compatible.
- """
- try:
- is_compatible = check_requires_python(
- link.requires_python, version_info=version_info,
- )
- except specifiers.InvalidSpecifier:
- logger.debug(
- "Ignoring invalid Requires-Python (%r) for link: %s",
- link.requires_python, link,
- )
- else:
- if not is_compatible:
- version = '.'.join(map(str, version_info))
- if not ignore_requires_python:
- logger.debug(
- 'Link requires a different Python (%s not in: %r): %s',
- version, link.requires_python, link,
- )
- return False
-
- logger.debug(
- 'Ignoring failed Requires-Python check (%s not in: %r) '
- 'for link: %s',
- version, link.requires_python, link,
- )
-
- return True
-
-
-class LinkEvaluator:
-
- """
- Responsible for evaluating links for a particular project.
- """
-
- _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$')
-
- # Don't include an allow_yanked default value to make sure each call
- # site considers whether yanked releases are allowed. This also causes
- # that decision to be made explicit in the calling code, which helps
- # people when reading the code.
- def __init__(
- self,
- project_name, # type: str
- canonical_name, # type: str
- formats, # type: FrozenSet[str]
- target_python, # type: TargetPython
- allow_yanked, # type: bool
- ignore_requires_python=None, # type: Optional[bool]
- ):
- # type: (...) -> None
- """
- :param project_name: The user supplied package name.
- :param canonical_name: The canonical package name.
- :param formats: The formats allowed for this package. Should be a set
- with 'binary' or 'source' or both in it.
- :param target_python: The target Python interpreter to use when
- evaluating link compatibility. This is used, for example, to
- check wheel compatibility, as well as when checking the Python
- version, e.g. the Python version embedded in a link filename
- (or egg fragment) and against an HTML link's optional PEP 503
- "data-requires-python" attribute.
- :param allow_yanked: Whether files marked as yanked (in the sense
- of PEP 592) are permitted to be candidates for install.
- :param ignore_requires_python: Whether to ignore incompatible
- PEP 503 "data-requires-python" values in HTML links. Defaults
- to False.
- """
- if ignore_requires_python is None:
- ignore_requires_python = False
-
- self._allow_yanked = allow_yanked
- self._canonical_name = canonical_name
- self._ignore_requires_python = ignore_requires_python
- self._formats = formats
- self._target_python = target_python
-
- self.project_name = project_name
-
- def evaluate_link(self, link):
- # type: (Link) -> Tuple[bool, Optional[str]]
- """
- Determine whether a link is a candidate for installation.
-
- :return: A tuple (is_candidate, result), where `result` is (1) a
- version string if `is_candidate` is True, and (2) if
- `is_candidate` is False, an optional string to log the reason
- the link fails to qualify.
- """
- version = None
- if link.is_yanked and not self._allow_yanked:
- reason = link.yanked_reason or ''
- return (False, f'yanked for reason: {reason}')
-
- if link.egg_fragment:
- egg_info = link.egg_fragment
- ext = link.ext
- else:
- egg_info, ext = link.splitext()
- if not ext:
- return (False, 'not a file')
- if ext not in SUPPORTED_EXTENSIONS:
- return (False, f'unsupported archive format: {ext}')
- if "binary" not in self._formats and ext == WHEEL_EXTENSION:
- reason = 'No binaries permitted for {}'.format(
- self.project_name)
- return (False, reason)
- if "macosx10" in link.path and ext == '.zip':
- return (False, 'macosx10 one')
- if ext == WHEEL_EXTENSION:
- try:
- wheel = Wheel(link.filename)
- except InvalidWheelFilename:
- return (False, 'invalid wheel filename')
- if canonicalize_name(wheel.name) != self._canonical_name:
- reason = 'wrong project name (not {})'.format(
- self.project_name)
- return (False, reason)
-
- supported_tags = self._target_python.get_tags()
- if not wheel.supported(supported_tags):
- # Include the wheel's tags in the reason string to
- # simplify troubleshooting compatibility issues.
- file_tags = wheel.get_formatted_file_tags()
- reason = (
- "none of the wheel's tags ({}) are compatible "
- "(run pip debug --verbose to show compatible tags)".format(
- ', '.join(file_tags)
- )
- )
- return (False, reason)
-
- version = wheel.version
-
- # This should be up by the self.ok_binary check, but see issue 2700.
- if "source" not in self._formats and ext != WHEEL_EXTENSION:
- reason = f'No sources permitted for {self.project_name}'
- return (False, reason)
-
- if not version:
- version = _extract_version_from_fragment(
- egg_info, self._canonical_name,
- )
- if not version:
- reason = f'Missing project version for {self.project_name}'
- return (False, reason)
-
- match = self._py_version_re.search(version)
- if match:
- version = version[:match.start()]
- py_version = match.group(1)
- if py_version != self._target_python.py_version:
- return (False, 'Python version is incorrect')
-
- supports_python = _check_link_requires_python(
- link, version_info=self._target_python.py_version_info,
- ignore_requires_python=self._ignore_requires_python,
- )
- if not supports_python:
- # Return None for the reason text to suppress calling
- # _log_skipped_link().
- return (False, None)
-
- logger.debug('Found link %s, version: %s', link, version)
-
- return (True, version)
-
-
-def filter_unallowed_hashes(
- candidates, # type: List[InstallationCandidate]
- hashes, # type: Hashes
- project_name, # type: str
-):
- # type: (...) -> List[InstallationCandidate]
- """
- Filter out candidates whose hashes aren't allowed, and return a new
- list of candidates.
-
- If at least one candidate has an allowed hash, then all candidates with
- either an allowed hash or no hash specified are returned. Otherwise,
- the given candidates are returned.
-
- Including the candidates with no hash specified when there is a match
- allows a warning to be logged if there is a more preferred candidate
- with no hash specified. Returning all candidates in the case of no
- matches lets pip report the hash of the candidate that would otherwise
- have been installed (e.g. permitting the user to more easily update
- their requirements file with the desired hash).
- """
- if not hashes:
- logger.debug(
- 'Given no hashes to check %s links for project %r: '
- 'discarding no candidates',
- len(candidates),
- project_name,
- )
- # Make sure we're not returning back the given value.
- return list(candidates)
-
- matches_or_no_digest = []
- # Collect the non-matches for logging purposes.
- non_matches = []
- match_count = 0
- for candidate in candidates:
- link = candidate.link
- if not link.has_hash:
- pass
- elif link.is_hash_allowed(hashes=hashes):
- match_count += 1
- else:
- non_matches.append(candidate)
- continue
-
- matches_or_no_digest.append(candidate)
-
- if match_count:
- filtered = matches_or_no_digest
- else:
- # Make sure we're not returning back the given value.
- filtered = list(candidates)
-
- if len(filtered) == len(candidates):
- discard_message = 'discarding no candidates'
- else:
- discard_message = 'discarding {} non-matches:\n {}'.format(
- len(non_matches),
- '\n '.join(str(candidate.link) for candidate in non_matches)
- )
-
- logger.debug(
- 'Checked %s links for project %r against %s hashes '
- '(%s matches, %s no digest): %s',
- len(candidates),
- project_name,
- hashes.digest_count,
- match_count,
- len(matches_or_no_digest) - match_count,
- discard_message
- )
-
- return filtered
-
-
-class CandidatePreferences:
-
- """
- Encapsulates some of the preferences for filtering and sorting
- InstallationCandidate objects.
- """
-
- def __init__(
- self,
- prefer_binary=False, # type: bool
- allow_all_prereleases=False, # type: bool
- ):
- # type: (...) -> None
- """
- :param allow_all_prereleases: Whether to allow all pre-releases.
- """
- self.allow_all_prereleases = allow_all_prereleases
- self.prefer_binary = prefer_binary
-
-
-class BestCandidateResult:
- """A collection of candidates, returned by `PackageFinder.find_best_candidate`.
-
- This class is only intended to be instantiated by CandidateEvaluator's
- `compute_best_candidate()` method.
- """
-
- def __init__(
- self,
- candidates, # type: List[InstallationCandidate]
- applicable_candidates, # type: List[InstallationCandidate]
- best_candidate, # type: Optional[InstallationCandidate]
- ):
- # type: (...) -> None
- """
- :param candidates: A sequence of all available candidates found.
- :param applicable_candidates: The applicable candidates.
- :param best_candidate: The most preferred candidate found, or None
- if no applicable candidates were found.
- """
- assert set(applicable_candidates) <= set(candidates)
-
- if best_candidate is None:
- assert not applicable_candidates
- else:
- assert best_candidate in applicable_candidates
-
- self._applicable_candidates = applicable_candidates
- self._candidates = candidates
-
- self.best_candidate = best_candidate
-
- def iter_all(self):
- # type: () -> Iterable[InstallationCandidate]
- """Iterate through all candidates.
- """
- return iter(self._candidates)
-
- def iter_applicable(self):
- # type: () -> Iterable[InstallationCandidate]
- """Iterate through the applicable candidates.
- """
- return iter(self._applicable_candidates)
-
-
-class CandidateEvaluator:
-
- """
- Responsible for filtering and sorting candidates for installation based
- on what tags are valid.
- """
-
- @classmethod
- def create(
- cls,
- project_name, # type: str
- target_python=None, # type: Optional[TargetPython]
- prefer_binary=False, # type: bool
- allow_all_prereleases=False, # type: bool
- specifier=None, # type: Optional[specifiers.BaseSpecifier]
- hashes=None, # type: Optional[Hashes]
- ):
- # type: (...) -> CandidateEvaluator
- """Create a CandidateEvaluator object.
-
- :param target_python: The target Python interpreter to use when
- checking compatibility. If None (the default), a TargetPython
- object will be constructed from the running Python.
- :param specifier: An optional object implementing `filter`
- (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable
- versions.
- :param hashes: An optional collection of allowed hashes.
- """
- if target_python is None:
- target_python = TargetPython()
- if specifier is None:
- specifier = specifiers.SpecifierSet()
-
- supported_tags = target_python.get_tags()
-
- return cls(
- project_name=project_name,
- supported_tags=supported_tags,
- specifier=specifier,
- prefer_binary=prefer_binary,
- allow_all_prereleases=allow_all_prereleases,
- hashes=hashes,
- )
-
- def __init__(
- self,
- project_name, # type: str
- supported_tags, # type: List[Tag]
- specifier, # type: specifiers.BaseSpecifier
- prefer_binary=False, # type: bool
- allow_all_prereleases=False, # type: bool
- hashes=None, # type: Optional[Hashes]
- ):
- # type: (...) -> None
- """
- :param supported_tags: The PEP 425 tags supported by the target
- Python in order of preference (most preferred first).
- """
- self._allow_all_prereleases = allow_all_prereleases
- self._hashes = hashes
- self._prefer_binary = prefer_binary
- self._project_name = project_name
- self._specifier = specifier
- self._supported_tags = supported_tags
- # Since the index of the tag in the _supported_tags list is used
- # as a priority, precompute a map from tag to index/priority to be
- # used in wheel.find_most_preferred_tag.
- self._wheel_tag_preferences = {
- tag: idx for idx, tag in enumerate(supported_tags)
- }
-
- def get_applicable_candidates(
- self,
- candidates, # type: List[InstallationCandidate]
- ):
- # type: (...) -> List[InstallationCandidate]
- """
- Return the applicable candidates from a list of candidates.
- """
- # Using None infers from the specifier instead.
- allow_prereleases = self._allow_all_prereleases or None
- specifier = self._specifier
- versions = {
- str(v) for v in specifier.filter(
- # We turn the version object into a str here because otherwise
- # when we're debundled but setuptools isn't, Python will see
- # packaging.version.Version and
- # pkg_resources._vendor.packaging.version.Version as different
- # types. This way we'll use a str as a common data interchange
- # format. If we stop using the pkg_resources provided specifier
- # and start using our own, we can drop the cast to str().
- (str(c.version) for c in candidates),
- prereleases=allow_prereleases,
- )
- }
-
- # Again, converting version to str to deal with debundling.
- applicable_candidates = [
- c for c in candidates if str(c.version) in versions
- ]
-
- filtered_applicable_candidates = filter_unallowed_hashes(
- candidates=applicable_candidates,
- hashes=self._hashes,
- project_name=self._project_name,
- )
-
- return sorted(filtered_applicable_candidates, key=self._sort_key)
-
- def _sort_key(self, candidate):
- # type: (InstallationCandidate) -> CandidateSortingKey
- """
- Function to pass as the `key` argument to a call to sorted() to sort
- InstallationCandidates by preference.
-
- Returns a tuple such that tuples sorting as greater using Python's
- default comparison operator are more preferred.
-
- The preference is as follows:
-
- First and foremost, candidates with allowed (matching) hashes are
- always preferred over candidates without matching hashes. This is
- because e.g. if the only candidate with an allowed hash is yanked,
- we still want to use that candidate.
-
- Second, excepting hash considerations, candidates that have been
- yanked (in the sense of PEP 592) are always less preferred than
- candidates that haven't been yanked. Then:
-
- If not finding wheels, they are sorted by version only.
- If finding wheels, then the sort order is by version, then:
- 1. existing installs
- 2. wheels ordered via Wheel.support_index_min(self._supported_tags)
- 3. source archives
- If prefer_binary was set, then all wheels are sorted above sources.
-
- Note: it was considered to embed this logic into the Link
- comparison operators, but then different sdist links
- with the same version, would have to be considered equal
- """
- valid_tags = self._supported_tags
- support_num = len(valid_tags)
- build_tag = () # type: BuildTag
- binary_preference = 0
- link = candidate.link
- if link.is_wheel:
- # can raise InvalidWheelFilename
- wheel = Wheel(link.filename)
- try:
- pri = -(wheel.find_most_preferred_tag(
- valid_tags, self._wheel_tag_preferences
- ))
- except ValueError:
- raise UnsupportedWheel(
- "{} is not a supported wheel for this platform. It "
- "can't be sorted.".format(wheel.filename)
- )
- if self._prefer_binary:
- binary_preference = 1
- if wheel.build_tag is not None:
- match = re.match(r'^(\d+)(.*)$', wheel.build_tag)
- build_tag_groups = match.groups()
- build_tag = (int(build_tag_groups[0]), build_tag_groups[1])
- else: # sdist
- pri = -(support_num)
- has_allowed_hash = int(link.is_hash_allowed(self._hashes))
- yank_value = -1 * int(link.is_yanked) # -1 for yanked.
- return (
- has_allowed_hash, yank_value, binary_preference, candidate.version,
- pri, build_tag,
- )
-
- def sort_best_candidate(
- self,
- candidates, # type: List[InstallationCandidate]
- ):
- # type: (...) -> Optional[InstallationCandidate]
- """
- Return the best candidate per the instance's sort order, or None if
- no candidate is acceptable.
- """
- if not candidates:
- return None
- best_candidate = max(candidates, key=self._sort_key)
- return best_candidate
-
- def compute_best_candidate(
- self,
- candidates, # type: List[InstallationCandidate]
- ):
- # type: (...) -> BestCandidateResult
- """
- Compute and return a `BestCandidateResult` instance.
- """
- applicable_candidates = self.get_applicable_candidates(candidates)
-
- best_candidate = self.sort_best_candidate(applicable_candidates)
-
- return BestCandidateResult(
- candidates,
- applicable_candidates=applicable_candidates,
- best_candidate=best_candidate,
- )
-
-
-class PackageFinder:
- """This finds packages.
-
- This is meant to match easy_install's technique for looking for
- packages, by reading pages and looking for appropriate links.
- """
-
- def __init__(
- self,
- link_collector, # type: LinkCollector
- target_python, # type: TargetPython
- allow_yanked, # type: bool
- format_control=None, # type: Optional[FormatControl]
- candidate_prefs=None, # type: CandidatePreferences
- ignore_requires_python=None, # type: Optional[bool]
- ):
- # type: (...) -> None
- """
- This constructor is primarily meant to be used by the create() class
- method and from tests.
-
- :param format_control: A FormatControl object, used to control
- the selection of source packages / binary packages when consulting
- the index and links.
- :param candidate_prefs: Options to use when creating a
- CandidateEvaluator object.
- """
- if candidate_prefs is None:
- candidate_prefs = CandidatePreferences()
-
- format_control = format_control or FormatControl(set(), set())
-
- self._allow_yanked = allow_yanked
- self._candidate_prefs = candidate_prefs
- self._ignore_requires_python = ignore_requires_python
- self._link_collector = link_collector
- self._target_python = target_python
-
- self.format_control = format_control
-
- # These are boring links that have already been logged somehow.
- self._logged_links = set() # type: Set[Link]
-
- # Don't include an allow_yanked default value to make sure each call
- # site considers whether yanked releases are allowed. This also causes
- # that decision to be made explicit in the calling code, which helps
- # people when reading the code.
- @classmethod
- def create(
- cls,
- link_collector, # type: LinkCollector
- selection_prefs, # type: SelectionPreferences
- target_python=None, # type: Optional[TargetPython]
- ):
- # type: (...) -> PackageFinder
- """Create a PackageFinder.
-
- :param selection_prefs: The candidate selection preferences, as a
- SelectionPreferences object.
- :param target_python: The target Python interpreter to use when
- checking compatibility. If None (the default), a TargetPython
- object will be constructed from the running Python.
- """
- if target_python is None:
- target_python = TargetPython()
-
- candidate_prefs = CandidatePreferences(
- prefer_binary=selection_prefs.prefer_binary,
- allow_all_prereleases=selection_prefs.allow_all_prereleases,
- )
-
- return cls(
- candidate_prefs=candidate_prefs,
- link_collector=link_collector,
- target_python=target_python,
- allow_yanked=selection_prefs.allow_yanked,
- format_control=selection_prefs.format_control,
- ignore_requires_python=selection_prefs.ignore_requires_python,
- )
-
- @property
- def target_python(self):
- # type: () -> TargetPython
- return self._target_python
-
- @property
- def search_scope(self):
- # type: () -> SearchScope
- return self._link_collector.search_scope
-
- @search_scope.setter
- def search_scope(self, search_scope):
- # type: (SearchScope) -> None
- self._link_collector.search_scope = search_scope
-
- @property
- def find_links(self):
- # type: () -> List[str]
- return self._link_collector.find_links
-
- @property
- def index_urls(self):
- # type: () -> List[str]
- return self.search_scope.index_urls
-
- @property
- def trusted_hosts(self):
- # type: () -> Iterable[str]
- for host_port in self._link_collector.session.pip_trusted_origins:
- yield build_netloc(*host_port)
-
- @property
- def allow_all_prereleases(self):
- # type: () -> bool
- return self._candidate_prefs.allow_all_prereleases
-
- def set_allow_all_prereleases(self):
- # type: () -> None
- self._candidate_prefs.allow_all_prereleases = True
-
- @property
- def prefer_binary(self):
- # type: () -> bool
- return self._candidate_prefs.prefer_binary
-
- def set_prefer_binary(self):
- # type: () -> None
- self._candidate_prefs.prefer_binary = True
-
- def make_link_evaluator(self, project_name):
- # type: (str) -> LinkEvaluator
- canonical_name = canonicalize_name(project_name)
- formats = self.format_control.get_allowed_formats(canonical_name)
-
- return LinkEvaluator(
- project_name=project_name,
- canonical_name=canonical_name,
- formats=formats,
- target_python=self._target_python,
- allow_yanked=self._allow_yanked,
- ignore_requires_python=self._ignore_requires_python,
- )
-
- def _sort_links(self, links):
- # type: (Iterable[Link]) -> List[Link]
- """
- Returns elements of links in order, non-egg links first, egg links
- second, while eliminating duplicates
- """
- eggs, no_eggs = [], []
- seen = set() # type: Set[Link]
- for link in links:
- if link not in seen:
- seen.add(link)
- if link.egg_fragment:
- eggs.append(link)
- else:
- no_eggs.append(link)
- return no_eggs + eggs
-
- def _log_skipped_link(self, link, reason):
- # type: (Link, str) -> None
- if link not in self._logged_links:
- # Put the link at the end so the reason is more visible and because
- # the link string is usually very long.
- logger.debug('Skipping link: %s: %s', reason, link)
- self._logged_links.add(link)
-
- def get_install_candidate(self, link_evaluator, link):
- # type: (LinkEvaluator, Link) -> Optional[InstallationCandidate]
- """
- If the link is a candidate for install, convert it to an
- InstallationCandidate and return it. Otherwise, return None.
- """
- is_candidate, result = link_evaluator.evaluate_link(link)
- if not is_candidate:
- if result:
- self._log_skipped_link(link, reason=result)
- return None
-
- return InstallationCandidate(
- name=link_evaluator.project_name,
- link=link,
- version=result,
- )
-
- def evaluate_links(self, link_evaluator, links):
- # type: (LinkEvaluator, Iterable[Link]) -> List[InstallationCandidate]
- """
- Convert links that are candidates to InstallationCandidate objects.
- """
- candidates = []
- for link in self._sort_links(links):
- candidate = self.get_install_candidate(link_evaluator, link)
- if candidate is not None:
- candidates.append(candidate)
-
- return candidates
-
- def process_project_url(self, project_url, link_evaluator):
- # type: (Link, LinkEvaluator) -> List[InstallationCandidate]
- logger.debug(
- 'Fetching project page and analyzing links: %s', project_url,
- )
- html_page = self._link_collector.fetch_page(project_url)
- if html_page is None:
- return []
-
- page_links = list(parse_links(html_page))
-
- with indent_log():
- package_links = self.evaluate_links(
- link_evaluator,
- links=page_links,
- )
-
- return package_links
-
- @functools.lru_cache(maxsize=None)
- def find_all_candidates(self, project_name):
- # type: (str) -> List[InstallationCandidate]
- """Find all available InstallationCandidate for project_name
-
- This checks index_urls and find_links.
- All versions found are returned as an InstallationCandidate list.
-
- See LinkEvaluator.evaluate_link() for details on which files
- are accepted.
- """
- link_evaluator = self.make_link_evaluator(project_name)
-
- collected_sources = self._link_collector.collect_sources(
- project_name=project_name,
- candidates_from_page=functools.partial(
- self.process_project_url,
- link_evaluator=link_evaluator,
- ),
- )
-
- page_candidates_it = itertools.chain.from_iterable(
- source.page_candidates()
- for sources in collected_sources
- for source in sources
- if source is not None
- )
- page_candidates = list(page_candidates_it)
-
- file_links_it = itertools.chain.from_iterable(
- source.file_links()
- for sources in collected_sources
- for source in sources
- if source is not None
- )
- file_candidates = self.evaluate_links(
- link_evaluator,
- sorted(file_links_it, reverse=True),
- )
-
- if logger.isEnabledFor(logging.DEBUG) and file_candidates:
- paths = [url_to_path(c.link.url) for c in file_candidates]
- logger.debug("Local files found: %s", ", ".join(paths))
-
- # This is an intentional priority ordering
- return file_candidates + page_candidates
-
- def make_candidate_evaluator(
- self,
- project_name, # type: str
- specifier=None, # type: Optional[specifiers.BaseSpecifier]
- hashes=None, # type: Optional[Hashes]
- ):
- # type: (...) -> CandidateEvaluator
- """Create a CandidateEvaluator object to use.
- """
- candidate_prefs = self._candidate_prefs
- return CandidateEvaluator.create(
- project_name=project_name,
- target_python=self._target_python,
- prefer_binary=candidate_prefs.prefer_binary,
- allow_all_prereleases=candidate_prefs.allow_all_prereleases,
- specifier=specifier,
- hashes=hashes,
- )
-
- @functools.lru_cache(maxsize=None)
- def find_best_candidate(
- self,
- project_name, # type: str
- specifier=None, # type: Optional[specifiers.BaseSpecifier]
- hashes=None, # type: Optional[Hashes]
- ):
- # type: (...) -> BestCandidateResult
- """Find matches for the given project and specifier.
-
- :param specifier: An optional object implementing `filter`
- (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable
- versions.
-
- :return: A `BestCandidateResult` instance.
- """
- candidates = self.find_all_candidates(project_name)
- candidate_evaluator = self.make_candidate_evaluator(
- project_name=project_name,
- specifier=specifier,
- hashes=hashes,
- )
- return candidate_evaluator.compute_best_candidate(candidates)
-
- def find_requirement(self, req, upgrade):
- # type: (InstallRequirement, bool) -> Optional[InstallationCandidate]
- """Try to find a Link matching req
-
- Expects req, an InstallRequirement and upgrade, a boolean
- Returns a InstallationCandidate if found,
- Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise
- """
- hashes = req.hashes(trust_internet=False)
- best_candidate_result = self.find_best_candidate(
- req.name, specifier=req.specifier, hashes=hashes,
- )
- best_candidate = best_candidate_result.best_candidate
-
- installed_version = None # type: Optional[_BaseVersion]
- if req.satisfied_by is not None:
- installed_version = parse_version(req.satisfied_by.version)
-
- def _format_versions(cand_iter):
- # type: (Iterable[InstallationCandidate]) -> str
- # This repeated parse_version and str() conversion is needed to
- # handle different vendoring sources from pip and pkg_resources.
- # If we stop using the pkg_resources provided specifier and start
- # using our own, we can drop the cast to str().
- return ", ".join(sorted(
- {str(c.version) for c in cand_iter},
- key=parse_version,
- )) or "none"
-
- if installed_version is None and best_candidate is None:
- logger.critical(
- 'Could not find a version that satisfies the requirement %s '
- '(from versions: %s)',
- req,
- _format_versions(best_candidate_result.iter_all()),
- )
-
- raise DistributionNotFound(
- 'No matching distribution found for {}'.format(
- req)
- )
-
- best_installed = False
- if installed_version and (
- best_candidate is None or
- best_candidate.version <= installed_version):
- best_installed = True
-
- if not upgrade and installed_version is not None:
- if best_installed:
- logger.debug(
- 'Existing installed version (%s) is most up-to-date and '
- 'satisfies requirement',
- installed_version,
- )
- else:
- logger.debug(
- 'Existing installed version (%s) satisfies requirement '
- '(most up-to-date version is %s)',
- installed_version,
- best_candidate.version,
- )
- return None
-
- if best_installed:
- # We have an existing version, and its the best version
- logger.debug(
- 'Installed version (%s) is most up-to-date (past versions: '
- '%s)',
- installed_version,
- _format_versions(best_candidate_result.iter_applicable()),
- )
- raise BestVersionAlreadyInstalled
-
- logger.debug(
- 'Using version %s (newest of versions: %s)',
- best_candidate.version,
- _format_versions(best_candidate_result.iter_applicable()),
- )
- return best_candidate
-
-
-def _find_name_version_sep(fragment, canonical_name):
- # type: (str, str) -> int
- """Find the separator's index based on the package's canonical name.
-
- :param fragment: A + filename "fragment" (stem) or
- egg fragment.
- :param canonical_name: The package's canonical name.
-
- This function is needed since the canonicalized name does not necessarily
- have the same length as the egg info's name part. An example::
-
- >>> fragment = 'foo__bar-1.0'
- >>> canonical_name = 'foo-bar'
- >>> _find_name_version_sep(fragment, canonical_name)
- 8
- """
- # Project name and version must be separated by one single dash. Find all
- # occurrences of dashes; if the string in front of it matches the canonical
- # name, this is the one separating the name and version parts.
- for i, c in enumerate(fragment):
- if c != "-":
- continue
- if canonicalize_name(fragment[:i]) == canonical_name:
- return i
- raise ValueError(f"{fragment} does not match {canonical_name}")
-
-
-def _extract_version_from_fragment(fragment, canonical_name):
- # type: (str, str) -> Optional[str]
- """Parse the version string from a + filename
- "fragment" (stem) or egg fragment.
-
- :param fragment: The string to parse. E.g. foo-2.1
- :param canonical_name: The canonicalized name of the package this
- belongs to.
- """
- try:
- version_start = _find_name_version_sep(fragment, canonical_name) + 1
- except ValueError:
- return None
- version = fragment[version_start:]
- if not version:
- return None
- return version
diff --git a/venv/Lib/site-packages/pip/_internal/index/sources.py b/venv/Lib/site-packages/pip/_internal/index/sources.py
deleted file mode 100644
index eec3f12..0000000
--- a/venv/Lib/site-packages/pip/_internal/index/sources.py
+++ /dev/null
@@ -1,224 +0,0 @@
-import logging
-import mimetypes
-import os
-import pathlib
-from typing import Callable, Iterable, Optional, Tuple
-
-from pip._internal.models.candidate import InstallationCandidate
-from pip._internal.models.link import Link
-from pip._internal.utils.urls import path_to_url, url_to_path
-from pip._internal.vcs import is_url
-
-logger = logging.getLogger(__name__)
-
-FoundCandidates = Iterable[InstallationCandidate]
-FoundLinks = Iterable[Link]
-CandidatesFromPage = Callable[[Link], Iterable[InstallationCandidate]]
-PageValidator = Callable[[Link], bool]
-
-
-class LinkSource:
- @property
- def link(self) -> Optional[Link]:
- """Returns the underlying link, if there's one."""
- raise NotImplementedError()
-
- def page_candidates(self) -> FoundCandidates:
- """Candidates found by parsing an archive listing HTML file."""
- raise NotImplementedError()
-
- def file_links(self) -> FoundLinks:
- """Links found by specifying archives directly."""
- raise NotImplementedError()
-
-
-def _is_html_file(file_url: str) -> bool:
- return mimetypes.guess_type(file_url, strict=False)[0] == "text/html"
-
-
-class _FlatDirectorySource(LinkSource):
- """Link source specified by ``--find-links=``.
-
- This looks the content of the directory, and returns:
-
- * ``page_candidates``: Links listed on each HTML file in the directory.
- * ``file_candidates``: Archives in the directory.
- """
-
- def __init__(
- self,
- candidates_from_page: CandidatesFromPage,
- path: str,
- ) -> None:
- self._candidates_from_page = candidates_from_page
- self._path = pathlib.Path(os.path.realpath(path))
-
- @property
- def link(self) -> Optional[Link]:
- return None
-
- def page_candidates(self) -> FoundCandidates:
- for path in self._path.iterdir():
- url = path_to_url(str(path))
- if not _is_html_file(url):
- continue
- yield from self._candidates_from_page(Link(url))
-
- def file_links(self) -> FoundLinks:
- for path in self._path.iterdir():
- url = path_to_url(str(path))
- if _is_html_file(url):
- continue
- yield Link(url)
-
-
-class _LocalFileSource(LinkSource):
- """``--find-links=`` or ``--[extra-]index-url=``.
-
- If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to
- the option, it is converted to a URL first. This returns:
-
- * ``page_candidates``: Links listed on an HTML file.
- * ``file_candidates``: The non-HTML file.
- """
-
- def __init__(
- self,
- candidates_from_page: CandidatesFromPage,
- link: Link,
- ) -> None:
- self._candidates_from_page = candidates_from_page
- self._link = link
-
- @property
- def link(self) -> Optional[Link]:
- return self._link
-
- def page_candidates(self) -> FoundCandidates:
- if not _is_html_file(self._link.url):
- return
- yield from self._candidates_from_page(self._link)
-
- def file_links(self) -> FoundLinks:
- if _is_html_file(self._link.url):
- return
- yield self._link
-
-
-class _RemoteFileSource(LinkSource):
- """``--find-links=`` or ``--[extra-]index-url=``.
-
- This returns:
-
- * ``page_candidates``: Links listed on an HTML file.
- * ``file_candidates``: The non-HTML file.
- """
-
- def __init__(
- self,
- candidates_from_page: CandidatesFromPage,
- page_validator: PageValidator,
- link: Link,
- ) -> None:
- self._candidates_from_page = candidates_from_page
- self._page_validator = page_validator
- self._link = link
-
- @property
- def link(self) -> Optional[Link]:
- return self._link
-
- def page_candidates(self) -> FoundCandidates:
- if not self._page_validator(self._link):
- return
- yield from self._candidates_from_page(self._link)
-
- def file_links(self) -> FoundLinks:
- yield self._link
-
-
-class _IndexDirectorySource(LinkSource):
- """``--[extra-]index-url=``.
-
- This is treated like a remote URL; ``candidates_from_page`` contains logic
- for this by appending ``index.html`` to the link.
- """
-
- def __init__(
- self,
- candidates_from_page: CandidatesFromPage,
- link: Link,
- ) -> None:
- self._candidates_from_page = candidates_from_page
- self._link = link
-
- @property
- def link(self) -> Optional[Link]:
- return self._link
-
- def page_candidates(self) -> FoundCandidates:
- yield from self._candidates_from_page(self._link)
-
- def file_links(self) -> FoundLinks:
- return ()
-
-
-def build_source(
- location: str,
- *,
- candidates_from_page: CandidatesFromPage,
- page_validator: PageValidator,
- expand_dir: bool,
- cache_link_parsing: bool,
-) -> Tuple[Optional[str], Optional[LinkSource]]:
-
- path: Optional[str] = None
- url: Optional[str] = None
- if os.path.exists(location): # Is a local path.
- url = path_to_url(location)
- path = location
- elif location.startswith("file:"): # A file: URL.
- url = location
- path = url_to_path(location)
- elif is_url(location):
- url = location
-
- if url is None:
- msg = (
- "Location '%s' is ignored: "
- "it is either a non-existing path or lacks a specific scheme."
- )
- logger.warning(msg, location)
- return (None, None)
-
- if path is None:
- source: LinkSource = _RemoteFileSource(
- candidates_from_page=candidates_from_page,
- page_validator=page_validator,
- link=Link(url, cache_link_parsing=cache_link_parsing),
- )
- return (url, source)
-
- if os.path.isdir(path):
- if expand_dir:
- source = _FlatDirectorySource(
- candidates_from_page=candidates_from_page,
- path=path,
- )
- else:
- source = _IndexDirectorySource(
- candidates_from_page=candidates_from_page,
- link=Link(url, cache_link_parsing=cache_link_parsing),
- )
- return (url, source)
- elif os.path.isfile(path):
- source = _LocalFileSource(
- candidates_from_page=candidates_from_page,
- link=Link(url, cache_link_parsing=cache_link_parsing),
- )
- return (url, source)
- logger.warning(
- "Location '%s' is ignored: it is neither a file nor a directory.",
- location,
- )
- return (url, None)
diff --git a/venv/Lib/site-packages/pip/_internal/locations/__init__.py b/venv/Lib/site-packages/pip/_internal/locations/__init__.py
deleted file mode 100644
index 3acb51b..0000000
--- a/venv/Lib/site-packages/pip/_internal/locations/__init__.py
+++ /dev/null
@@ -1,184 +0,0 @@
-import logging
-import pathlib
-import sys
-import sysconfig
-from typing import List, Optional
-
-from pip._internal.models.scheme import SCHEME_KEYS, Scheme
-
-from . import _distutils, _sysconfig
-from .base import (
- USER_CACHE_DIR,
- get_major_minor_version,
- get_src_prefix,
- site_packages,
- user_site,
-)
-
-__all__ = [
- "USER_CACHE_DIR",
- "get_bin_prefix",
- "get_bin_user",
- "get_major_minor_version",
- "get_platlib",
- "get_prefixed_libs",
- "get_purelib",
- "get_scheme",
- "get_src_prefix",
- "site_packages",
- "user_site",
-]
-
-
-logger = logging.getLogger(__name__)
-
-
-def _default_base(*, user: bool) -> str:
- if user:
- base = sysconfig.get_config_var("userbase")
- else:
- base = sysconfig.get_config_var("base")
- assert base is not None
- return base
-
-
-def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool:
- if old == new:
- return False
- issue_url = "https://github.com/pypa/pip/issues/9617"
- message = (
- "Value for %s does not match. Please report this to <%s>"
- "\ndistutils: %s"
- "\nsysconfig: %s"
- )
- logger.debug(message, key, issue_url, old, new)
- return True
-
-
-def _log_context(
- *,
- user: bool = False,
- home: Optional[str] = None,
- root: Optional[str] = None,
- prefix: Optional[str] = None,
-) -> None:
- message = (
- "Additional context:" "\nuser = %r" "\nhome = %r" "\nroot = %r" "\nprefix = %r"
- )
- logger.debug(message, user, home, root, prefix)
-
-
-def get_scheme(
- dist_name, # type: str
- user=False, # type: bool
- home=None, # type: Optional[str]
- root=None, # type: Optional[str]
- isolated=False, # type: bool
- prefix=None, # type: Optional[str]
-):
- # type: (...) -> Scheme
- old = _distutils.get_scheme(
- dist_name,
- user=user,
- home=home,
- root=root,
- isolated=isolated,
- prefix=prefix,
- )
- new = _sysconfig.get_scheme(
- dist_name,
- user=user,
- home=home,
- root=root,
- isolated=isolated,
- prefix=prefix,
- )
-
- base = prefix or home or _default_base(user=user)
- warned = []
- for k in SCHEME_KEYS:
- # Extra join because distutils can return relative paths.
- old_v = pathlib.Path(base, getattr(old, k))
- new_v = pathlib.Path(getattr(new, k))
-
- # distutils incorrectly put PyPy packages under ``site-packages/python``
- # in the ``posix_home`` scheme, but PyPy devs said they expect the
- # directory name to be ``pypy`` instead. So we treat this as a bug fix
- # and not warn about it. See bpo-43307 and python/cpython#24628.
- skip_pypy_special_case = (
- sys.implementation.name == "pypy"
- and home is not None
- and k in ("platlib", "purelib")
- and old_v.parent == new_v.parent
- and old_v.name == "python"
- and new_v.name == "pypy"
- )
- if skip_pypy_special_case:
- continue
-
- warned.append(_warn_if_mismatch(old_v, new_v, key=f"scheme.{k}"))
-
- if any(warned):
- _log_context(user=user, home=home, root=root, prefix=prefix)
-
- return old
-
-
-def get_bin_prefix():
- # type: () -> str
- old = _distutils.get_bin_prefix()
- new = _sysconfig.get_bin_prefix()
- if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="bin_prefix"):
- _log_context()
- return old
-
-
-def get_bin_user():
- # type: () -> str
- return _sysconfig.get_scheme("", user=True).scripts
-
-
-def get_purelib():
- # type: () -> str
- """Return the default pure-Python lib location."""
- old = _distutils.get_purelib()
- new = _sysconfig.get_purelib()
- if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="purelib"):
- _log_context()
- return old
-
-
-def get_platlib():
- # type: () -> str
- """Return the default platform-shared lib location."""
- old = _distutils.get_platlib()
- new = _sysconfig.get_platlib()
- if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"):
- _log_context()
- return old
-
-
-def get_prefixed_libs(prefix):
- # type: (str) -> List[str]
- """Return the lib locations under ``prefix``."""
- old_pure, old_plat = _distutils.get_prefixed_libs(prefix)
- new_pure, new_plat = _sysconfig.get_prefixed_libs(prefix)
-
- warned = [
- _warn_if_mismatch(
- pathlib.Path(old_pure),
- pathlib.Path(new_pure),
- key="prefixed-purelib",
- ),
- _warn_if_mismatch(
- pathlib.Path(old_plat),
- pathlib.Path(new_plat),
- key="prefixed-platlib",
- ),
- ]
- if any(warned):
- _log_context(prefix=prefix)
-
- if old_pure == old_plat:
- return [old_pure]
- return [old_pure, old_plat]
diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 63c62e7..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc
deleted file mode 100644
index e38fcaf..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc
deleted file mode 100644
index f9f4b40..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-39.pyc
deleted file mode 100644
index 18c8daa..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/locations/_distutils.py b/venv/Lib/site-packages/pip/_internal/locations/_distutils.py
deleted file mode 100644
index 2d7ab73..0000000
--- a/venv/Lib/site-packages/pip/_internal/locations/_distutils.py
+++ /dev/null
@@ -1,150 +0,0 @@
-"""Locations where we look for configs, install stuff, etc"""
-
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-import os
-import sys
-from distutils.cmd import Command as DistutilsCommand
-from distutils.command.install import SCHEME_KEYS
-from distutils.command.install import install as distutils_install_command
-from distutils.sysconfig import get_python_lib
-from typing import Dict, List, Optional, Tuple, Union, cast
-
-from pip._internal.models.scheme import Scheme
-from pip._internal.utils.compat import WINDOWS
-from pip._internal.utils.virtualenv import running_under_virtualenv
-
-from .base import get_major_minor_version
-
-
-def _distutils_scheme(
- dist_name, user=False, home=None, root=None, isolated=False, prefix=None
-):
- # type:(str, bool, str, str, bool, str) -> Dict[str, str]
- """
- Return a distutils install scheme
- """
- from distutils.dist import Distribution
-
- dist_args = {"name": dist_name} # type: Dict[str, Union[str, List[str]]]
- if isolated:
- dist_args["script_args"] = ["--no-user-cfg"]
-
- d = Distribution(dist_args)
- d.parse_config_files()
- obj = None # type: Optional[DistutilsCommand]
- obj = d.get_command_obj("install", create=True)
- assert obj is not None
- i = cast(distutils_install_command, obj)
- # NOTE: setting user or home has the side-effect of creating the home dir
- # or user base for installations during finalize_options()
- # ideally, we'd prefer a scheme class that has no side-effects.
- assert not (user and prefix), f"user={user} prefix={prefix}"
- assert not (home and prefix), f"home={home} prefix={prefix}"
- i.user = user or i.user
- if user or home:
- i.prefix = ""
- i.prefix = prefix or i.prefix
- i.home = home or i.home
- i.root = root or i.root
- i.finalize_options()
-
- scheme = {}
- for key in SCHEME_KEYS:
- scheme[key] = getattr(i, "install_" + key)
-
- # install_lib specified in setup.cfg should install *everything*
- # into there (i.e. it takes precedence over both purelib and
- # platlib). Note, i.install_lib is *always* set after
- # finalize_options(); we only want to override here if the user
- # has explicitly requested it hence going back to the config
- if "install_lib" in d.get_option_dict("install"):
- scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib))
-
- if running_under_virtualenv():
- scheme["headers"] = os.path.join(
- i.prefix,
- "include",
- "site",
- f"python{get_major_minor_version()}",
- dist_name,
- )
-
- if root is not None:
- path_no_drive = os.path.splitdrive(os.path.abspath(scheme["headers"]))[1]
- scheme["headers"] = os.path.join(
- root,
- path_no_drive[1:],
- )
-
- return scheme
-
-
-def get_scheme(
- dist_name, # type: str
- user=False, # type: bool
- home=None, # type: Optional[str]
- root=None, # type: Optional[str]
- isolated=False, # type: bool
- prefix=None, # type: Optional[str]
-):
- # type: (...) -> Scheme
- """
- Get the "scheme" corresponding to the input parameters. The distutils
- documentation provides the context for the available schemes:
- https://docs.python.org/3/install/index.html#alternate-installation
-
- :param dist_name: the name of the package to retrieve the scheme for, used
- in the headers scheme path
- :param user: indicates to use the "user" scheme
- :param home: indicates to use the "home" scheme and provides the base
- directory for the same
- :param root: root under which other directories are re-based
- :param isolated: equivalent to --no-user-cfg, i.e. do not consider
- ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for
- scheme paths
- :param prefix: indicates to use the "prefix" scheme and provides the
- base directory for the same
- """
- scheme = _distutils_scheme(dist_name, user, home, root, isolated, prefix)
- return Scheme(
- platlib=scheme["platlib"],
- purelib=scheme["purelib"],
- headers=scheme["headers"],
- scripts=scheme["scripts"],
- data=scheme["data"],
- )
-
-
-def get_bin_prefix():
- # type: () -> str
- if WINDOWS:
- bin_py = os.path.join(sys.prefix, "Scripts")
- # buildout uses 'bin' on Windows too?
- if not os.path.exists(bin_py):
- bin_py = os.path.join(sys.prefix, "bin")
- return bin_py
- # Forcing to use /usr/local/bin for standard macOS framework installs
- # Also log to ~/Library/Logs/ for use with the Console.app log viewer
- if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/":
- return "/usr/local/bin"
- return os.path.join(sys.prefix, "bin")
-
-
-def get_purelib():
- # type: () -> str
- return get_python_lib(plat_specific=False)
-
-
-def get_platlib():
- # type: () -> str
- return get_python_lib(plat_specific=True)
-
-
-def get_prefixed_libs(prefix):
- # type: (str) -> Tuple[str, str]
- return (
- get_python_lib(plat_specific=False, prefix=prefix),
- get_python_lib(plat_specific=True, prefix=prefix),
- )
diff --git a/venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py b/venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py
deleted file mode 100644
index 03366ce..0000000
--- a/venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py
+++ /dev/null
@@ -1,180 +0,0 @@
-import distutils.util # FIXME: For change_root.
-import logging
-import os
-import sys
-import sysconfig
-import typing
-
-from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid
-from pip._internal.models.scheme import SCHEME_KEYS, Scheme
-from pip._internal.utils.virtualenv import running_under_virtualenv
-
-from .base import get_major_minor_version
-
-logger = logging.getLogger(__name__)
-
-
-# Notes on _infer_* functions.
-# Unfortunately ``_get_default_scheme()`` is private, so there's no way to
-# ask things like "what is the '_prefix' scheme on this platform". These
-# functions try to answer that with some heuristics while accounting for ad-hoc
-# platforms not covered by CPython's default sysconfig implementation. If the
-# ad-hoc implementation does not fully implement sysconfig, we'll fall back to
-# a POSIX scheme.
-
-_AVAILABLE_SCHEMES = set(sysconfig.get_scheme_names())
-
-
-def _infer_prefix():
- # type: () -> str
- """Try to find a prefix scheme for the current platform.
-
- This tries:
-
- * Implementation + OS, used by PyPy on Windows (``pypy_nt``).
- * Implementation without OS, used by PyPy on POSIX (``pypy``).
- * OS + "prefix", used by CPython on POSIX (``posix_prefix``).
- * Just the OS name, used by CPython on Windows (``nt``).
-
- If none of the above works, fall back to ``posix_prefix``.
- """
- implementation_suffixed = f"{sys.implementation.name}_{os.name}"
- if implementation_suffixed in _AVAILABLE_SCHEMES:
- return implementation_suffixed
- if sys.implementation.name in _AVAILABLE_SCHEMES:
- return sys.implementation.name
- suffixed = f"{os.name}_prefix"
- if suffixed in _AVAILABLE_SCHEMES:
- return suffixed
- if os.name in _AVAILABLE_SCHEMES: # On Windows, prefx is just called "nt".
- return os.name
- return "posix_prefix"
-
-
-def _infer_user():
- # type: () -> str
- """Try to find a user scheme for the current platform."""
- suffixed = f"{os.name}_user"
- if suffixed in _AVAILABLE_SCHEMES:
- return suffixed
- if "posix_user" not in _AVAILABLE_SCHEMES: # User scheme unavailable.
- raise UserInstallationInvalid()
- return "posix_user"
-
-
-def _infer_home():
- # type: () -> str
- """Try to find a home for the current platform."""
- suffixed = f"{os.name}_home"
- if suffixed in _AVAILABLE_SCHEMES:
- return suffixed
- return "posix_home"
-
-
-# Update these keys if the user sets a custom home.
-_HOME_KEYS = [
- "installed_base",
- "base",
- "installed_platbase",
- "platbase",
- "prefix",
- "exec_prefix",
-]
-if sysconfig.get_config_var("userbase") is not None:
- _HOME_KEYS.append("userbase")
-
-
-def get_scheme(
- dist_name, # type: str
- user=False, # type: bool
- home=None, # type: typing.Optional[str]
- root=None, # type: typing.Optional[str]
- isolated=False, # type: bool
- prefix=None, # type: typing.Optional[str]
-):
- # type: (...) -> Scheme
- """
- Get the "scheme" corresponding to the input parameters.
-
- :param dist_name: the name of the package to retrieve the scheme for, used
- in the headers scheme path
- :param user: indicates to use the "user" scheme
- :param home: indicates to use the "home" scheme
- :param root: root under which other directories are re-based
- :param isolated: ignored, but kept for distutils compatibility (where
- this controls whether the user-site pydistutils.cfg is honored)
- :param prefix: indicates to use the "prefix" scheme and provides the
- base directory for the same
- """
- if user and prefix:
- raise InvalidSchemeCombination("--user", "--prefix")
- if home and prefix:
- raise InvalidSchemeCombination("--home", "--prefix")
-
- if home is not None:
- scheme_name = _infer_home()
- elif user:
- scheme_name = _infer_user()
- else:
- scheme_name = _infer_prefix()
-
- if home is not None:
- variables = {k: home for k in _HOME_KEYS}
- elif prefix is not None:
- variables = {k: prefix for k in _HOME_KEYS}
- else:
- variables = {}
-
- paths = sysconfig.get_paths(scheme=scheme_name, vars=variables)
-
- # Logic here is very arbitrary, we're doing it for compatibility, don't ask.
- # 1. Pip historically uses a special header path in virtual environments.
- # 2. If the distribution name is not known, distutils uses 'UNKNOWN'. We
- # only do the same when not running in a virtual environment because
- # pip's historical header path logic (see point 1) did not do this.
- if running_under_virtualenv():
- if user:
- base = variables.get("userbase", sys.prefix)
- else:
- base = variables.get("base", sys.prefix)
- python_xy = f"python{get_major_minor_version()}"
- paths["include"] = os.path.join(base, "include", "site", python_xy)
- elif not dist_name:
- dist_name = "UNKNOWN"
-
- scheme = Scheme(
- platlib=paths["platlib"],
- purelib=paths["purelib"],
- headers=os.path.join(paths["include"], dist_name),
- scripts=paths["scripts"],
- data=paths["data"],
- )
- if root is not None:
- for key in SCHEME_KEYS:
- value = distutils.util.change_root(root, getattr(scheme, key))
- setattr(scheme, key, value)
- return scheme
-
-
-def get_bin_prefix():
- # type: () -> str
- # Forcing to use /usr/local/bin for standard macOS framework installs.
- if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/":
- return "/usr/local/bin"
- return sysconfig.get_paths()["scripts"]
-
-
-def get_purelib():
- # type: () -> str
- return sysconfig.get_paths()["purelib"]
-
-
-def get_platlib():
- # type: () -> str
- return sysconfig.get_paths()["platlib"]
-
-
-def get_prefixed_libs(prefix):
- # type: (str) -> typing.Tuple[str, str]
- paths = sysconfig.get_paths(vars={"base": prefix, "platbase": prefix})
- return (paths["purelib"], paths["platlib"])
diff --git a/venv/Lib/site-packages/pip/_internal/locations/base.py b/venv/Lib/site-packages/pip/_internal/locations/base.py
deleted file mode 100644
index 98557ab..0000000
--- a/venv/Lib/site-packages/pip/_internal/locations/base.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import os
-import site
-import sys
-import sysconfig
-import typing
-
-from pip._internal.utils import appdirs
-from pip._internal.utils.virtualenv import running_under_virtualenv
-
-# Application Directories
-USER_CACHE_DIR = appdirs.user_cache_dir("pip")
-
-# FIXME doesn't account for venv linked to global site-packages
-site_packages = sysconfig.get_path("purelib") # type: typing.Optional[str]
-
-
-def get_major_minor_version():
- # type: () -> str
- """
- Return the major-minor version of the current Python as a string, e.g.
- "3.7" or "3.10".
- """
- return "{}.{}".format(*sys.version_info)
-
-
-def get_src_prefix():
- # type: () -> str
- if running_under_virtualenv():
- src_prefix = os.path.join(sys.prefix, "src")
- else:
- # FIXME: keep src in cwd for now (it is not a temporary folder)
- try:
- src_prefix = os.path.join(os.getcwd(), "src")
- except OSError:
- # In case the current working directory has been renamed or deleted
- sys.exit("The folder you are executing pip from can no longer be found.")
-
- # under macOS + virtualenv sys.prefix is not properly resolved
- # it is something like /path/to/python/bin/..
- return os.path.abspath(src_prefix)
-
-
-try:
- # Use getusersitepackages if this is present, as it ensures that the
- # value is initialised properly.
- user_site = site.getusersitepackages() # type: typing.Optional[str]
-except AttributeError:
- user_site = site.USER_SITE
diff --git a/venv/Lib/site-packages/pip/_internal/main.py b/venv/Lib/site-packages/pip/_internal/main.py
deleted file mode 100644
index 51eee15..0000000
--- a/venv/Lib/site-packages/pip/_internal/main.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from typing import List, Optional
-
-
-def main(args=None):
- # type: (Optional[List[str]]) -> int
- """This is preserved for old console scripts that may still be referencing
- it.
-
- For additional details, see https://github.com/pypa/pip/issues/7498.
- """
- from pip._internal.utils.entrypoints import _wrapper
-
- return _wrapper(args)
diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__init__.py b/venv/Lib/site-packages/pip/_internal/metadata/__init__.py
deleted file mode 100644
index 63335a1..0000000
--- a/venv/Lib/site-packages/pip/_internal/metadata/__init__.py
+++ /dev/null
@@ -1,43 +0,0 @@
-from typing import List, Optional
-
-from .base import BaseDistribution, BaseEnvironment
-
-
-def get_default_environment():
- # type: () -> BaseEnvironment
- """Get the default representation for the current environment.
-
- This returns an Environment instance from the chosen backend. The default
- Environment instance should be built from ``sys.path`` and may use caching
- to share instance state accorss calls.
- """
- from .pkg_resources import Environment
-
- return Environment.default()
-
-
-def get_environment(paths):
- # type: (Optional[List[str]]) -> BaseEnvironment
- """Get a representation of the environment specified by ``paths``.
-
- This returns an Environment instance from the chosen backend based on the
- given import paths. The backend must build a fresh instance representing
- the state of installed distributions when this function is called.
- """
- from .pkg_resources import Environment
-
- return Environment.from_paths(paths)
-
-
-def get_wheel_distribution(wheel_path, canonical_name):
- # type: (str, str) -> BaseDistribution
- """Get the representation of the specified wheel's distribution metadata.
-
- This returns a Distribution instance from the chosen backend based on
- the given wheel's ``.dist-info`` directory.
-
- :param canonical_name: Normalized project name of the given wheel.
- """
- from .pkg_resources import Distribution
-
- return Distribution.from_wheel(wheel_path, canonical_name)
diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index c435490..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-39.pyc
deleted file mode 100644
index e36c519..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc
deleted file mode 100644
index 1d9cb30..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/metadata/base.py b/venv/Lib/site-packages/pip/_internal/metadata/base.py
deleted file mode 100644
index 37f9a82..0000000
--- a/venv/Lib/site-packages/pip/_internal/metadata/base.py
+++ /dev/null
@@ -1,142 +0,0 @@
-import logging
-import re
-from typing import Container, Iterator, List, Optional, Union
-
-from pip._vendor.packaging.version import LegacyVersion, Version
-
-from pip._internal.utils.misc import stdlib_pkgs # TODO: Move definition here.
-
-DistributionVersion = Union[LegacyVersion, Version]
-
-logger = logging.getLogger(__name__)
-
-
-class BaseDistribution:
- @property
- def location(self):
- # type: () -> Optional[str]
- """Where the distribution is loaded from.
-
- A string value is not necessarily a filesystem path, since distributions
- can be loaded from other sources, e.g. arbitrary zip archives. ``None``
- means the distribution is created in-memory.
- """
- raise NotImplementedError()
-
- @property
- def metadata_version(self):
- # type: () -> Optional[str]
- """Value of "Metadata-Version:" in the distribution, if available."""
- raise NotImplementedError()
-
- @property
- def canonical_name(self):
- # type: () -> str
- raise NotImplementedError()
-
- @property
- def version(self):
- # type: () -> DistributionVersion
- raise NotImplementedError()
-
- @property
- def installer(self):
- # type: () -> str
- raise NotImplementedError()
-
- @property
- def editable(self):
- # type: () -> bool
- raise NotImplementedError()
-
- @property
- def local(self):
- # type: () -> bool
- raise NotImplementedError()
-
- @property
- def in_usersite(self):
- # type: () -> bool
- raise NotImplementedError()
-
-
-class BaseEnvironment:
- """An environment containing distributions to introspect."""
-
- @classmethod
- def default(cls):
- # type: () -> BaseEnvironment
- raise NotImplementedError()
-
- @classmethod
- def from_paths(cls, paths):
- # type: (Optional[List[str]]) -> BaseEnvironment
- raise NotImplementedError()
-
- def get_distribution(self, name):
- # type: (str) -> Optional[BaseDistribution]
- """Given a requirement name, return the installed distributions."""
- raise NotImplementedError()
-
- def _iter_distributions(self):
- # type: () -> Iterator[BaseDistribution]
- """Iterate through installed distributions.
-
- This function should be implemented by subclass, but never called
- directly. Use the public ``iter_distribution()`` instead, which
- implements additional logic to make sure the distributions are valid.
- """
- raise NotImplementedError()
-
- def iter_distributions(self):
- # type: () -> Iterator[BaseDistribution]
- """Iterate through installed distributions."""
- for dist in self._iter_distributions():
- # Make sure the distribution actually comes from a valid Python
- # packaging distribution. Pip's AdjacentTempDirectory leaves folders
- # e.g. ``~atplotlib.dist-info`` if cleanup was interrupted. The
- # valid project name pattern is taken from PEP 508.
- project_name_valid = re.match(
- r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$",
- dist.canonical_name,
- flags=re.IGNORECASE,
- )
- if not project_name_valid:
- logger.warning(
- "Ignoring invalid distribution %s (%s)",
- dist.canonical_name,
- dist.location,
- )
- continue
- yield dist
-
- def iter_installed_distributions(
- self,
- local_only=True, # type: bool
- skip=stdlib_pkgs, # type: Container[str]
- include_editables=True, # type: bool
- editables_only=False, # type: bool
- user_only=False, # type: bool
- ):
- # type: (...) -> Iterator[BaseDistribution]
- """Return a list of installed distributions.
-
- :param local_only: If True (default), only return installations
- local to the current virtualenv, if in a virtualenv.
- :param skip: An iterable of canonicalized project names to ignore;
- defaults to ``stdlib_pkgs``.
- :param include_editables: If False, don't report editables.
- :param editables_only: If True, only report editables.
- :param user_only: If True, only report installations in the user
- site directory.
- """
- it = self.iter_distributions()
- if local_only:
- it = (d for d in it if d.local)
- if not include_editables:
- it = (d for d in it if not d.editable)
- if editables_only:
- it = (d for d in it if d.editable)
- if user_only:
- it = (d for d in it if d.in_usersite)
- return (d for d in it if d.canonical_name not in skip)
diff --git a/venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py b/venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py
deleted file mode 100644
index f39a39e..0000000
--- a/venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py
+++ /dev/null
@@ -1,126 +0,0 @@
-import zipfile
-from typing import Iterator, List, Optional
-
-from pip._vendor import pkg_resources
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import parse as parse_version
-
-from pip._internal.utils import misc # TODO: Move definition here.
-from pip._internal.utils.packaging import get_installer
-from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel
-
-from .base import BaseDistribution, BaseEnvironment, DistributionVersion
-
-
-class Distribution(BaseDistribution):
- def __init__(self, dist):
- # type: (pkg_resources.Distribution) -> None
- self._dist = dist
-
- @classmethod
- def from_wheel(cls, path, name):
- # type: (str, str) -> Distribution
- with zipfile.ZipFile(path, allowZip64=True) as zf:
- dist = pkg_resources_distribution_for_wheel(zf, name, path)
- return cls(dist)
-
- @property
- def location(self):
- # type: () -> Optional[str]
- return self._dist.location
-
- @property
- def metadata_version(self):
- # type: () -> Optional[str]
- for line in self._dist.get_metadata_lines(self._dist.PKG_INFO):
- if line.lower().startswith("metadata-version:"):
- return line.split(":", 1)[-1].strip()
- return None
-
- @property
- def canonical_name(self):
- # type: () -> str
- return canonicalize_name(self._dist.project_name)
-
- @property
- def version(self):
- # type: () -> DistributionVersion
- return parse_version(self._dist.version)
-
- @property
- def installer(self):
- # type: () -> str
- return get_installer(self._dist)
-
- @property
- def editable(self):
- # type: () -> bool
- return misc.dist_is_editable(self._dist)
-
- @property
- def local(self):
- # type: () -> bool
- return misc.dist_is_local(self._dist)
-
- @property
- def in_usersite(self):
- # type: () -> bool
- return misc.dist_in_usersite(self._dist)
-
-
-class Environment(BaseEnvironment):
- def __init__(self, ws):
- # type: (pkg_resources.WorkingSet) -> None
- self._ws = ws
-
- @classmethod
- def default(cls):
- # type: () -> BaseEnvironment
- return cls(pkg_resources.working_set)
-
- @classmethod
- def from_paths(cls, paths):
- # type: (Optional[List[str]]) -> BaseEnvironment
- return cls(pkg_resources.WorkingSet(paths))
-
- def _search_distribution(self, name):
- # type: (str) -> Optional[BaseDistribution]
- """Find a distribution matching the ``name`` in the environment.
-
- This searches from *all* distributions available in the environment, to
- match the behavior of ``pkg_resources.get_distribution()``.
- """
- canonical_name = canonicalize_name(name)
- for dist in self.iter_distributions():
- if dist.canonical_name == canonical_name:
- return dist
- return None
-
- def get_distribution(self, name):
- # type: (str) -> Optional[BaseDistribution]
-
- # Search the distribution by looking through the working set.
- dist = self._search_distribution(name)
- if dist:
- return dist
-
- # If distribution could not be found, call working_set.require to
- # update the working set, and try to find the distribution again.
- # This might happen for e.g. when you install a package twice, once
- # using setup.py develop and again using setup.py install. Now when
- # running pip uninstall twice, the package gets removed from the
- # working set in the first uninstall, so we have to populate the
- # working set again so that pip knows about it and the packages gets
- # picked up and is successfully uninstalled the second time too.
- try:
- # We didn't pass in any version specifiers, so this can never
- # raise pkg_resources.VersionConflict.
- self._ws.require(name)
- except pkg_resources.DistributionNotFound:
- return None
- return self._search_distribution(name)
-
- def _iter_distributions(self):
- # type: () -> Iterator[BaseDistribution]
- for dist in self._ws:
- yield Distribution(dist)
diff --git a/venv/Lib/site-packages/pip/_internal/models/__init__.py b/venv/Lib/site-packages/pip/_internal/models/__init__.py
deleted file mode 100644
index 7855226..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-"""A package that contains models that represent entities.
-"""
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 1c4ba33..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-39.pyc
deleted file mode 100644
index e76f9c6..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc
deleted file mode 100644
index 2c9a16a..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc
deleted file mode 100644
index c8ea1aa..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc
deleted file mode 100644
index 2cf77ba..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc
deleted file mode 100644
index cc9e805..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-39.pyc
deleted file mode 100644
index bd39948..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-39.pyc
deleted file mode 100644
index 5cbee26..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-39.pyc
deleted file mode 100644
index a1fcab7..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-39.pyc
deleted file mode 100644
index 7b445e0..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-39.pyc
deleted file mode 100644
index b12179c..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/models/candidate.py b/venv/Lib/site-packages/pip/_internal/models/candidate.py
deleted file mode 100644
index 3b91704..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/candidate.py
+++ /dev/null
@@ -1,34 +0,0 @@
-from pip._vendor.packaging.version import parse as parse_version
-
-from pip._internal.models.link import Link
-from pip._internal.utils.models import KeyBasedCompareMixin
-
-
-class InstallationCandidate(KeyBasedCompareMixin):
- """Represents a potential "candidate" for installation.
- """
-
- __slots__ = ["name", "version", "link"]
-
- def __init__(self, name, version, link):
- # type: (str, str, Link) -> None
- self.name = name
- self.version = parse_version(version)
- self.link = link
-
- super().__init__(
- key=(self.name, self.version, self.link),
- defining_class=InstallationCandidate
- )
-
- def __repr__(self):
- # type: () -> str
- return "".format(
- self.name, self.version, self.link,
- )
-
- def __str__(self):
- # type: () -> str
- return '{!r} candidate (version {} at {})'.format(
- self.name, self.version, self.link,
- )
diff --git a/venv/Lib/site-packages/pip/_internal/models/direct_url.py b/venv/Lib/site-packages/pip/_internal/models/direct_url.py
deleted file mode 100644
index 345dbaf..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/direct_url.py
+++ /dev/null
@@ -1,233 +0,0 @@
-""" PEP 610 """
-import json
-import re
-import urllib.parse
-from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union
-
-__all__ = [
- "DirectUrl",
- "DirectUrlValidationError",
- "DirInfo",
- "ArchiveInfo",
- "VcsInfo",
-]
-
-T = TypeVar("T")
-
-DIRECT_URL_METADATA_NAME = "direct_url.json"
-ENV_VAR_RE = re.compile(r"^\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?$")
-
-
-class DirectUrlValidationError(Exception):
- pass
-
-
-def _get(d, expected_type, key, default=None):
- # type: (Dict[str, Any], Type[T], str, Optional[T]) -> Optional[T]
- """Get value from dictionary and verify expected type."""
- if key not in d:
- return default
- value = d[key]
- if not isinstance(value, expected_type):
- raise DirectUrlValidationError(
- "{!r} has unexpected type for {} (expected {})".format(
- value, key, expected_type
- )
- )
- return value
-
-
-def _get_required(d, expected_type, key, default=None):
- # type: (Dict[str, Any], Type[T], str, Optional[T]) -> T
- value = _get(d, expected_type, key, default)
- if value is None:
- raise DirectUrlValidationError(f"{key} must have a value")
- return value
-
-
-def _exactly_one_of(infos):
- # type: (Iterable[Optional[InfoType]]) -> InfoType
- infos = [info for info in infos if info is not None]
- if not infos:
- raise DirectUrlValidationError(
- "missing one of archive_info, dir_info, vcs_info"
- )
- if len(infos) > 1:
- raise DirectUrlValidationError(
- "more than one of archive_info, dir_info, vcs_info"
- )
- assert infos[0] is not None
- return infos[0]
-
-
-def _filter_none(**kwargs):
- # type: (Any) -> Dict[str, Any]
- """Make dict excluding None values."""
- return {k: v for k, v in kwargs.items() if v is not None}
-
-
-class VcsInfo:
- name = "vcs_info"
-
- def __init__(
- self,
- vcs, # type: str
- commit_id, # type: str
- requested_revision=None, # type: Optional[str]
- resolved_revision=None, # type: Optional[str]
- resolved_revision_type=None, # type: Optional[str]
- ):
- self.vcs = vcs
- self.requested_revision = requested_revision
- self.commit_id = commit_id
- self.resolved_revision = resolved_revision
- self.resolved_revision_type = resolved_revision_type
-
- @classmethod
- def _from_dict(cls, d):
- # type: (Optional[Dict[str, Any]]) -> Optional[VcsInfo]
- if d is None:
- return None
- return cls(
- vcs=_get_required(d, str, "vcs"),
- commit_id=_get_required(d, str, "commit_id"),
- requested_revision=_get(d, str, "requested_revision"),
- resolved_revision=_get(d, str, "resolved_revision"),
- resolved_revision_type=_get(d, str, "resolved_revision_type"),
- )
-
- def _to_dict(self):
- # type: () -> Dict[str, Any]
- return _filter_none(
- vcs=self.vcs,
- requested_revision=self.requested_revision,
- commit_id=self.commit_id,
- resolved_revision=self.resolved_revision,
- resolved_revision_type=self.resolved_revision_type,
- )
-
-
-class ArchiveInfo:
- name = "archive_info"
-
- def __init__(
- self,
- hash=None, # type: Optional[str]
- ):
- self.hash = hash
-
- @classmethod
- def _from_dict(cls, d):
- # type: (Optional[Dict[str, Any]]) -> Optional[ArchiveInfo]
- if d is None:
- return None
- return cls(hash=_get(d, str, "hash"))
-
- def _to_dict(self):
- # type: () -> Dict[str, Any]
- return _filter_none(hash=self.hash)
-
-
-class DirInfo:
- name = "dir_info"
-
- def __init__(
- self,
- editable=False, # type: bool
- ):
- self.editable = editable
-
- @classmethod
- def _from_dict(cls, d):
- # type: (Optional[Dict[str, Any]]) -> Optional[DirInfo]
- if d is None:
- return None
- return cls(
- editable=_get_required(d, bool, "editable", default=False)
- )
-
- def _to_dict(self):
- # type: () -> Dict[str, Any]
- return _filter_none(editable=self.editable or None)
-
-
-InfoType = Union[ArchiveInfo, DirInfo, VcsInfo]
-
-
-class DirectUrl:
-
- def __init__(
- self,
- url, # type: str
- info, # type: InfoType
- subdirectory=None, # type: Optional[str]
- ):
- self.url = url
- self.info = info
- self.subdirectory = subdirectory
-
- def _remove_auth_from_netloc(self, netloc):
- # type: (str) -> str
- if "@" not in netloc:
- return netloc
- user_pass, netloc_no_user_pass = netloc.split("@", 1)
- if (
- isinstance(self.info, VcsInfo) and
- self.info.vcs == "git" and
- user_pass == "git"
- ):
- return netloc
- if ENV_VAR_RE.match(user_pass):
- return netloc
- return netloc_no_user_pass
-
- @property
- def redacted_url(self):
- # type: () -> str
- """url with user:password part removed unless it is formed with
- environment variables as specified in PEP 610, or it is ``git``
- in the case of a git URL.
- """
- purl = urllib.parse.urlsplit(self.url)
- netloc = self._remove_auth_from_netloc(purl.netloc)
- surl = urllib.parse.urlunsplit(
- (purl.scheme, netloc, purl.path, purl.query, purl.fragment)
- )
- return surl
-
- def validate(self):
- # type: () -> None
- self.from_dict(self.to_dict())
-
- @classmethod
- def from_dict(cls, d):
- # type: (Dict[str, Any]) -> DirectUrl
- return DirectUrl(
- url=_get_required(d, str, "url"),
- subdirectory=_get(d, str, "subdirectory"),
- info=_exactly_one_of(
- [
- ArchiveInfo._from_dict(_get(d, dict, "archive_info")),
- DirInfo._from_dict(_get(d, dict, "dir_info")),
- VcsInfo._from_dict(_get(d, dict, "vcs_info")),
- ]
- ),
- )
-
- def to_dict(self):
- # type: () -> Dict[str, Any]
- res = _filter_none(
- url=self.redacted_url,
- subdirectory=self.subdirectory,
- )
- res[self.info.name] = self.info._to_dict()
- return res
-
- @classmethod
- def from_json(cls, s):
- # type: (str) -> DirectUrl
- return cls.from_dict(json.loads(s))
-
- def to_json(self):
- # type: () -> str
- return json.dumps(self.to_dict(), sort_keys=True)
diff --git a/venv/Lib/site-packages/pip/_internal/models/format_control.py b/venv/Lib/site-packages/pip/_internal/models/format_control.py
deleted file mode 100644
index cf262af..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/format_control.py
+++ /dev/null
@@ -1,86 +0,0 @@
-from typing import FrozenSet, Optional, Set
-
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.exceptions import CommandError
-
-
-class FormatControl:
- """Helper for managing formats from which a package can be installed.
- """
-
- __slots__ = ["no_binary", "only_binary"]
-
- def __init__(self, no_binary=None, only_binary=None):
- # type: (Optional[Set[str]], Optional[Set[str]]) -> None
- if no_binary is None:
- no_binary = set()
- if only_binary is None:
- only_binary = set()
-
- self.no_binary = no_binary
- self.only_binary = only_binary
-
- def __eq__(self, other):
- # type: (object) -> bool
- if not isinstance(other, self.__class__):
- return NotImplemented
-
- if self.__slots__ != other.__slots__:
- return False
-
- return all(
- getattr(self, k) == getattr(other, k)
- for k in self.__slots__
- )
-
- def __repr__(self):
- # type: () -> str
- return "{}({}, {})".format(
- self.__class__.__name__,
- self.no_binary,
- self.only_binary
- )
-
- @staticmethod
- def handle_mutual_excludes(value, target, other):
- # type: (str, Set[str], Set[str]) -> None
- if value.startswith('-'):
- raise CommandError(
- "--no-binary / --only-binary option requires 1 argument."
- )
- new = value.split(',')
- while ':all:' in new:
- other.clear()
- target.clear()
- target.add(':all:')
- del new[:new.index(':all:') + 1]
- # Without a none, we want to discard everything as :all: covers it
- if ':none:' not in new:
- return
- for name in new:
- if name == ':none:':
- target.clear()
- continue
- name = canonicalize_name(name)
- other.discard(name)
- target.add(name)
-
- def get_allowed_formats(self, canonical_name):
- # type: (str) -> FrozenSet[str]
- result = {"binary", "source"}
- if canonical_name in self.only_binary:
- result.discard('source')
- elif canonical_name in self.no_binary:
- result.discard('binary')
- elif ':all:' in self.only_binary:
- result.discard('source')
- elif ':all:' in self.no_binary:
- result.discard('binary')
- return frozenset(result)
-
- def disallow_binaries(self):
- # type: () -> None
- self.handle_mutual_excludes(
- ':all:', self.no_binary, self.only_binary,
- )
diff --git a/venv/Lib/site-packages/pip/_internal/models/index.py b/venv/Lib/site-packages/pip/_internal/models/index.py
deleted file mode 100644
index b148abb..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/index.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import urllib.parse
-
-
-class PackageIndex:
- """Represents a Package Index and provides easier access to endpoints
- """
-
- __slots__ = ['url', 'netloc', 'simple_url', 'pypi_url',
- 'file_storage_domain']
-
- def __init__(self, url, file_storage_domain):
- # type: (str, str) -> None
- super().__init__()
- self.url = url
- self.netloc = urllib.parse.urlsplit(url).netloc
- self.simple_url = self._url_for_path('simple')
- self.pypi_url = self._url_for_path('pypi')
-
- # This is part of a temporary hack used to block installs of PyPI
- # packages which depend on external urls only necessary until PyPI can
- # block such packages themselves
- self.file_storage_domain = file_storage_domain
-
- def _url_for_path(self, path):
- # type: (str) -> str
- return urllib.parse.urljoin(self.url, path)
-
-
-PyPI = PackageIndex(
- 'https://pypi.org/', file_storage_domain='files.pythonhosted.org'
-)
-TestPyPI = PackageIndex(
- 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org'
-)
diff --git a/venv/Lib/site-packages/pip/_internal/models/link.py b/venv/Lib/site-packages/pip/_internal/models/link.py
deleted file mode 100644
index 86d0be4..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/link.py
+++ /dev/null
@@ -1,248 +0,0 @@
-import os
-import posixpath
-import re
-import urllib.parse
-from typing import TYPE_CHECKING, Optional, Tuple, Union
-
-from pip._internal.utils.filetypes import WHEEL_EXTENSION
-from pip._internal.utils.hashes import Hashes
-from pip._internal.utils.misc import (
- redact_auth_from_url,
- split_auth_from_netloc,
- splitext,
-)
-from pip._internal.utils.models import KeyBasedCompareMixin
-from pip._internal.utils.urls import path_to_url, url_to_path
-
-if TYPE_CHECKING:
- from pip._internal.index.collector import HTMLPage
-
-
-class Link(KeyBasedCompareMixin):
- """Represents a parsed link from a Package Index's simple URL
- """
-
- __slots__ = [
- "_parsed_url",
- "_url",
- "comes_from",
- "requires_python",
- "yanked_reason",
- "cache_link_parsing",
- ]
-
- def __init__(
- self,
- url, # type: str
- comes_from=None, # type: Optional[Union[str, HTMLPage]]
- requires_python=None, # type: Optional[str]
- yanked_reason=None, # type: Optional[str]
- cache_link_parsing=True, # type: bool
- ):
- # type: (...) -> None
- """
- :param url: url of the resource pointed to (href of the link)
- :param comes_from: instance of HTMLPage where the link was found,
- or string.
- :param requires_python: String containing the `Requires-Python`
- metadata field, specified in PEP 345. This may be specified by
- a data-requires-python attribute in the HTML link tag, as
- described in PEP 503.
- :param yanked_reason: the reason the file has been yanked, if the
- file has been yanked, or None if the file hasn't been yanked.
- This is the value of the "data-yanked" attribute, if present, in
- a simple repository HTML link. If the file has been yanked but
- no reason was provided, this should be the empty string. See
- PEP 592 for more information and the specification.
- :param cache_link_parsing: A flag that is used elsewhere to determine
- whether resources retrieved from this link
- should be cached. PyPI index urls should
- generally have this set to False, for
- example.
- """
-
- # url can be a UNC windows share
- if url.startswith('\\\\'):
- url = path_to_url(url)
-
- self._parsed_url = urllib.parse.urlsplit(url)
- # Store the url as a private attribute to prevent accidentally
- # trying to set a new value.
- self._url = url
-
- self.comes_from = comes_from
- self.requires_python = requires_python if requires_python else None
- self.yanked_reason = yanked_reason
-
- super().__init__(key=url, defining_class=Link)
-
- self.cache_link_parsing = cache_link_parsing
-
- def __str__(self):
- # type: () -> str
- if self.requires_python:
- rp = f' (requires-python:{self.requires_python})'
- else:
- rp = ''
- if self.comes_from:
- return '{} (from {}){}'.format(
- redact_auth_from_url(self._url), self.comes_from, rp)
- else:
- return redact_auth_from_url(str(self._url))
-
- def __repr__(self):
- # type: () -> str
- return f' '
-
- @property
- def url(self):
- # type: () -> str
- return self._url
-
- @property
- def filename(self):
- # type: () -> str
- path = self.path.rstrip('/')
- name = posixpath.basename(path)
- if not name:
- # Make sure we don't leak auth information if the netloc
- # includes a username and password.
- netloc, user_pass = split_auth_from_netloc(self.netloc)
- return netloc
-
- name = urllib.parse.unquote(name)
- assert name, f'URL {self._url!r} produced no filename'
- return name
-
- @property
- def file_path(self):
- # type: () -> str
- return url_to_path(self.url)
-
- @property
- def scheme(self):
- # type: () -> str
- return self._parsed_url.scheme
-
- @property
- def netloc(self):
- # type: () -> str
- """
- This can contain auth information.
- """
- return self._parsed_url.netloc
-
- @property
- def path(self):
- # type: () -> str
- return urllib.parse.unquote(self._parsed_url.path)
-
- def splitext(self):
- # type: () -> Tuple[str, str]
- return splitext(posixpath.basename(self.path.rstrip('/')))
-
- @property
- def ext(self):
- # type: () -> str
- return self.splitext()[1]
-
- @property
- def url_without_fragment(self):
- # type: () -> str
- scheme, netloc, path, query, fragment = self._parsed_url
- return urllib.parse.urlunsplit((scheme, netloc, path, query, None))
-
- _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)')
-
- @property
- def egg_fragment(self):
- # type: () -> Optional[str]
- match = self._egg_fragment_re.search(self._url)
- if not match:
- return None
- return match.group(1)
-
- _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)')
-
- @property
- def subdirectory_fragment(self):
- # type: () -> Optional[str]
- match = self._subdirectory_fragment_re.search(self._url)
- if not match:
- return None
- return match.group(1)
-
- _hash_re = re.compile(
- r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)'
- )
-
- @property
- def hash(self):
- # type: () -> Optional[str]
- match = self._hash_re.search(self._url)
- if match:
- return match.group(2)
- return None
-
- @property
- def hash_name(self):
- # type: () -> Optional[str]
- match = self._hash_re.search(self._url)
- if match:
- return match.group(1)
- return None
-
- @property
- def show_url(self):
- # type: () -> str
- return posixpath.basename(self._url.split('#', 1)[0].split('?', 1)[0])
-
- @property
- def is_file(self):
- # type: () -> bool
- return self.scheme == 'file'
-
- def is_existing_dir(self):
- # type: () -> bool
- return self.is_file and os.path.isdir(self.file_path)
-
- @property
- def is_wheel(self):
- # type: () -> bool
- return self.ext == WHEEL_EXTENSION
-
- @property
- def is_vcs(self):
- # type: () -> bool
- from pip._internal.vcs import vcs
-
- return self.scheme in vcs.all_schemes
-
- @property
- def is_yanked(self):
- # type: () -> bool
- return self.yanked_reason is not None
-
- @property
- def has_hash(self):
- # type: () -> bool
- return self.hash_name is not None
-
- def is_hash_allowed(self, hashes):
- # type: (Optional[Hashes]) -> bool
- """
- Return True if the link has a hash and it is allowed.
- """
- if hashes is None or not self.has_hash:
- return False
- # Assert non-None so mypy knows self.hash_name and self.hash are str.
- assert self.hash_name is not None
- assert self.hash is not None
-
- return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash)
-
-
-# TODO: Relax this comparison logic to ignore, for example, fragments.
-def links_equivalent(link1, link2):
- # type: (Link, Link) -> bool
- return link1 == link2
diff --git a/venv/Lib/site-packages/pip/_internal/models/scheme.py b/venv/Lib/site-packages/pip/_internal/models/scheme.py
deleted file mode 100644
index 697cd19..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/scheme.py
+++ /dev/null
@@ -1,31 +0,0 @@
-"""
-For types associated with installation schemes.
-
-For a general overview of available schemes and their context, see
-https://docs.python.org/3/install/index.html#alternate-installation.
-"""
-
-
-SCHEME_KEYS = ['platlib', 'purelib', 'headers', 'scripts', 'data']
-
-
-class Scheme:
- """A Scheme holds paths which are used as the base directories for
- artifacts associated with a Python package.
- """
-
- __slots__ = SCHEME_KEYS
-
- def __init__(
- self,
- platlib, # type: str
- purelib, # type: str
- headers, # type: str
- scripts, # type: str
- data, # type: str
- ):
- self.platlib = platlib
- self.purelib = purelib
- self.headers = headers
- self.scripts = scripts
- self.data = data
diff --git a/venv/Lib/site-packages/pip/_internal/models/search_scope.py b/venv/Lib/site-packages/pip/_internal/models/search_scope.py
deleted file mode 100644
index a3f0a5c..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/search_scope.py
+++ /dev/null
@@ -1,131 +0,0 @@
-import itertools
-import logging
-import os
-import posixpath
-import urllib.parse
-from typing import List
-
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.models.index import PyPI
-from pip._internal.utils.compat import has_tls
-from pip._internal.utils.misc import normalize_path, redact_auth_from_url
-
-logger = logging.getLogger(__name__)
-
-
-class SearchScope:
-
- """
- Encapsulates the locations that pip is configured to search.
- """
-
- __slots__ = ["find_links", "index_urls"]
-
- @classmethod
- def create(
- cls,
- find_links, # type: List[str]
- index_urls, # type: List[str]
- ):
- # type: (...) -> SearchScope
- """
- Create a SearchScope object after normalizing the `find_links`.
- """
- # Build find_links. If an argument starts with ~, it may be
- # a local file relative to a home directory. So try normalizing
- # it and if it exists, use the normalized version.
- # This is deliberately conservative - it might be fine just to
- # blindly normalize anything starting with a ~...
- built_find_links = [] # type: List[str]
- for link in find_links:
- if link.startswith('~'):
- new_link = normalize_path(link)
- if os.path.exists(new_link):
- link = new_link
- built_find_links.append(link)
-
- # If we don't have TLS enabled, then WARN if anyplace we're looking
- # relies on TLS.
- if not has_tls():
- for link in itertools.chain(index_urls, built_find_links):
- parsed = urllib.parse.urlparse(link)
- if parsed.scheme == 'https':
- logger.warning(
- 'pip is configured with locations that require '
- 'TLS/SSL, however the ssl module in Python is not '
- 'available.'
- )
- break
-
- return cls(
- find_links=built_find_links,
- index_urls=index_urls,
- )
-
- def __init__(
- self,
- find_links, # type: List[str]
- index_urls, # type: List[str]
- ):
- # type: (...) -> None
- self.find_links = find_links
- self.index_urls = index_urls
-
- def get_formatted_locations(self):
- # type: () -> str
- lines = []
- redacted_index_urls = []
- if self.index_urls and self.index_urls != [PyPI.simple_url]:
- for url in self.index_urls:
-
- redacted_index_url = redact_auth_from_url(url)
-
- # Parse the URL
- purl = urllib.parse.urlsplit(redacted_index_url)
-
- # URL is generally invalid if scheme and netloc is missing
- # there are issues with Python and URL parsing, so this test
- # is a bit crude. See bpo-20271, bpo-23505. Python doesn't
- # always parse invalid URLs correctly - it should raise
- # exceptions for malformed URLs
- if not purl.scheme and not purl.netloc:
- logger.warning(
- 'The index url "%s" seems invalid, '
- 'please provide a scheme.', redacted_index_url)
-
- redacted_index_urls.append(redacted_index_url)
-
- lines.append('Looking in indexes: {}'.format(
- ', '.join(redacted_index_urls)))
-
- if self.find_links:
- lines.append(
- 'Looking in links: {}'.format(', '.join(
- redact_auth_from_url(url) for url in self.find_links))
- )
- return '\n'.join(lines)
-
- def get_index_urls_locations(self, project_name):
- # type: (str) -> List[str]
- """Returns the locations found via self.index_urls
-
- Checks the url_name on the main (first in the list) index and
- use this url_name to produce all locations
- """
-
- def mkurl_pypi_url(url):
- # type: (str) -> str
- loc = posixpath.join(
- url,
- urllib.parse.quote(canonicalize_name(project_name)))
- # For maximum compatibility with easy_install, ensure the path
- # ends in a trailing slash. Although this isn't in the spec
- # (and PyPI can handle it without the slash) some other index
- # implementations might break if they relied on easy_install's
- # behavior.
- if not loc.endswith('/'):
- loc = loc + '/'
- return loc
-
- return [mkurl_pypi_url(url) for url in self.index_urls]
diff --git a/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py b/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py
deleted file mode 100644
index edc1cf7..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from typing import Optional
-
-from pip._internal.models.format_control import FormatControl
-
-
-class SelectionPreferences:
- """
- Encapsulates the candidate selection preferences for downloading
- and installing files.
- """
-
- __slots__ = ['allow_yanked', 'allow_all_prereleases', 'format_control',
- 'prefer_binary', 'ignore_requires_python']
-
- # Don't include an allow_yanked default value to make sure each call
- # site considers whether yanked releases are allowed. This also causes
- # that decision to be made explicit in the calling code, which helps
- # people when reading the code.
- def __init__(
- self,
- allow_yanked, # type: bool
- allow_all_prereleases=False, # type: bool
- format_control=None, # type: Optional[FormatControl]
- prefer_binary=False, # type: bool
- ignore_requires_python=None, # type: Optional[bool]
- ):
- # type: (...) -> None
- """Create a SelectionPreferences object.
-
- :param allow_yanked: Whether files marked as yanked (in the sense
- of PEP 592) are permitted to be candidates for install.
- :param format_control: A FormatControl object or None. Used to control
- the selection of source packages / binary packages when consulting
- the index and links.
- :param prefer_binary: Whether to prefer an old, but valid, binary
- dist over a new source dist.
- :param ignore_requires_python: Whether to ignore incompatible
- "Requires-Python" values in links. Defaults to False.
- """
- if ignore_requires_python is None:
- ignore_requires_python = False
-
- self.allow_yanked = allow_yanked
- self.allow_all_prereleases = allow_all_prereleases
- self.format_control = format_control
- self.prefer_binary = prefer_binary
- self.ignore_requires_python = ignore_requires_python
diff --git a/venv/Lib/site-packages/pip/_internal/models/target_python.py b/venv/Lib/site-packages/pip/_internal/models/target_python.py
deleted file mode 100644
index b91e349..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/target_python.py
+++ /dev/null
@@ -1,114 +0,0 @@
-import sys
-from typing import List, Optional, Tuple
-
-from pip._vendor.packaging.tags import Tag
-
-from pip._internal.utils.compatibility_tags import get_supported, version_info_to_nodot
-from pip._internal.utils.misc import normalize_version_info
-
-
-class TargetPython:
-
- """
- Encapsulates the properties of a Python interpreter one is targeting
- for a package install, download, etc.
- """
-
- __slots__ = [
- "_given_py_version_info",
- "abis",
- "implementation",
- "platforms",
- "py_version",
- "py_version_info",
- "_valid_tags",
- ]
-
- def __init__(
- self,
- platforms=None, # type: Optional[List[str]]
- py_version_info=None, # type: Optional[Tuple[int, ...]]
- abis=None, # type: Optional[List[str]]
- implementation=None, # type: Optional[str]
- ):
- # type: (...) -> None
- """
- :param platforms: A list of strings or None. If None, searches for
- packages that are supported by the current system. Otherwise, will
- find packages that can be built on the platforms passed in. These
- packages will only be downloaded for distribution: they will
- not be built locally.
- :param py_version_info: An optional tuple of ints representing the
- Python version information to use (e.g. `sys.version_info[:3]`).
- This can have length 1, 2, or 3 when provided.
- :param abis: A list of strings or None. This is passed to
- compatibility_tags.py's get_supported() function as is.
- :param implementation: A string or None. This is passed to
- compatibility_tags.py's get_supported() function as is.
- """
- # Store the given py_version_info for when we call get_supported().
- self._given_py_version_info = py_version_info
-
- if py_version_info is None:
- py_version_info = sys.version_info[:3]
- else:
- py_version_info = normalize_version_info(py_version_info)
-
- py_version = '.'.join(map(str, py_version_info[:2]))
-
- self.abis = abis
- self.implementation = implementation
- self.platforms = platforms
- self.py_version = py_version
- self.py_version_info = py_version_info
-
- # This is used to cache the return value of get_tags().
- self._valid_tags = None # type: Optional[List[Tag]]
-
- def format_given(self):
- # type: () -> str
- """
- Format the given, non-None attributes for display.
- """
- display_version = None
- if self._given_py_version_info is not None:
- display_version = '.'.join(
- str(part) for part in self._given_py_version_info
- )
-
- key_values = [
- ('platforms', self.platforms),
- ('version_info', display_version),
- ('abis', self.abis),
- ('implementation', self.implementation),
- ]
- return ' '.join(
- f'{key}={value!r}' for key, value in key_values
- if value is not None
- )
-
- def get_tags(self):
- # type: () -> List[Tag]
- """
- Return the supported PEP 425 tags to check wheel candidates against.
-
- The tags are returned in order of preference (most preferred first).
- """
- if self._valid_tags is None:
- # Pass versions=None if no py_version_info was given since
- # versions=None uses special default logic.
- py_version_info = self._given_py_version_info
- if py_version_info is None:
- version = None
- else:
- version = version_info_to_nodot(py_version_info)
-
- tags = get_supported(
- version=version,
- platforms=self.platforms,
- abis=self.abis,
- impl=self.implementation,
- )
- self._valid_tags = tags
-
- return self._valid_tags
diff --git a/venv/Lib/site-packages/pip/_internal/models/wheel.py b/venv/Lib/site-packages/pip/_internal/models/wheel.py
deleted file mode 100644
index 0a582b3..0000000
--- a/venv/Lib/site-packages/pip/_internal/models/wheel.py
+++ /dev/null
@@ -1,95 +0,0 @@
-"""Represents a wheel file and provides access to the various parts of the
-name that have meaning.
-"""
-import re
-from typing import Dict, Iterable, List
-
-from pip._vendor.packaging.tags import Tag
-
-from pip._internal.exceptions import InvalidWheelFilename
-
-
-class Wheel:
- """A wheel file"""
-
- wheel_file_re = re.compile(
- r"""^(?P(?P.+?)-(?P.*?))
- ((-(?P\d[^-]*?))?-(?P.+?)-(?P.+?)-(?P.+?)
- \.whl|\.dist-info)$""",
- re.VERBOSE
- )
-
- def __init__(self, filename):
- # type: (str) -> None
- """
- :raises InvalidWheelFilename: when the filename is invalid for a wheel
- """
- wheel_info = self.wheel_file_re.match(filename)
- if not wheel_info:
- raise InvalidWheelFilename(
- f"{filename} is not a valid wheel filename."
- )
- self.filename = filename
- self.name = wheel_info.group('name').replace('_', '-')
- # we'll assume "_" means "-" due to wheel naming scheme
- # (https://github.com/pypa/pip/issues/1150)
- self.version = wheel_info.group('ver').replace('_', '-')
- self.build_tag = wheel_info.group('build')
- self.pyversions = wheel_info.group('pyver').split('.')
- self.abis = wheel_info.group('abi').split('.')
- self.plats = wheel_info.group('plat').split('.')
-
- # All the tag combinations from this file
- self.file_tags = {
- Tag(x, y, z) for x in self.pyversions
- for y in self.abis for z in self.plats
- }
-
- def get_formatted_file_tags(self):
- # type: () -> List[str]
- """Return the wheel's tags as a sorted list of strings."""
- return sorted(str(tag) for tag in self.file_tags)
-
- def support_index_min(self, tags):
- # type: (List[Tag]) -> int
- """Return the lowest index that one of the wheel's file_tag combinations
- achieves in the given list of supported tags.
-
- For example, if there are 8 supported tags and one of the file tags
- is first in the list, then return 0.
-
- :param tags: the PEP 425 tags to check the wheel against, in order
- with most preferred first.
-
- :raises ValueError: If none of the wheel's file tags match one of
- the supported tags.
- """
- return min(tags.index(tag) for tag in self.file_tags if tag in tags)
-
- def find_most_preferred_tag(self, tags, tag_to_priority):
- # type: (List[Tag], Dict[Tag, int]) -> int
- """Return the priority of the most preferred tag that one of the wheel's file
- tag combinations acheives in the given list of supported tags using the given
- tag_to_priority mapping, where lower priorities are more-preferred.
-
- This is used in place of support_index_min in some cases in order to avoid
- an expensive linear scan of a large list of tags.
-
- :param tags: the PEP 425 tags to check the wheel against.
- :param tag_to_priority: a mapping from tag to priority of that tag, where
- lower is more preferred.
-
- :raises ValueError: If none of the wheel's file tags match one of
- the supported tags.
- """
- return min(
- tag_to_priority[tag] for tag in self.file_tags if tag in tag_to_priority
- )
-
- def supported(self, tags):
- # type: (Iterable[Tag]) -> bool
- """Return whether the wheel is compatible with one of the given tags.
-
- :param tags: the PEP 425 tags to check the wheel against.
- """
- return not self.file_tags.isdisjoint(tags)
diff --git a/venv/Lib/site-packages/pip/_internal/network/__init__.py b/venv/Lib/site-packages/pip/_internal/network/__init__.py
deleted file mode 100644
index b51bde9..0000000
--- a/venv/Lib/site-packages/pip/_internal/network/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-"""Contains purely network-related utilities.
-"""
diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index b391967..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-39.pyc
deleted file mode 100644
index a50cad0..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-39.pyc
deleted file mode 100644
index ac67f4b..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-39.pyc
deleted file mode 100644
index bb2315f..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc
deleted file mode 100644
index ea497bb..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-39.pyc
deleted file mode 100644
index 232ef7a..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-39.pyc
deleted file mode 100644
index d2d7d27..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/network/auth.py b/venv/Lib/site-packages/pip/_internal/network/auth.py
deleted file mode 100644
index bd54a5c..0000000
--- a/venv/Lib/site-packages/pip/_internal/network/auth.py
+++ /dev/null
@@ -1,312 +0,0 @@
-"""Network Authentication Helpers
-
-Contains interface (MultiDomainBasicAuth) and associated glue code for
-providing credentials in the context of network requests.
-"""
-
-import logging
-import urllib.parse
-from typing import Any, Dict, List, Optional, Tuple
-
-from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
-from pip._vendor.requests.models import Request, Response
-from pip._vendor.requests.utils import get_netrc_auth
-
-from pip._internal.utils.misc import (
- ask,
- ask_input,
- ask_password,
- remove_auth_from_url,
- split_auth_netloc_from_url,
-)
-from pip._internal.vcs.versioncontrol import AuthInfo
-
-logger = logging.getLogger(__name__)
-
-Credentials = Tuple[str, str, str]
-
-try:
- import keyring
-except ImportError:
- keyring = None
-except Exception as exc:
- logger.warning(
- "Keyring is skipped due to an exception: %s", str(exc),
- )
- keyring = None
-
-
-def get_keyring_auth(url, username):
- # type: (Optional[str], Optional[str]) -> Optional[AuthInfo]
- """Return the tuple auth for a given url from keyring."""
- global keyring
- if not url or not keyring:
- return None
-
- try:
- try:
- get_credential = keyring.get_credential
- except AttributeError:
- pass
- else:
- logger.debug("Getting credentials from keyring for %s", url)
- cred = get_credential(url, username)
- if cred is not None:
- return cred.username, cred.password
- return None
-
- if username:
- logger.debug("Getting password from keyring for %s", url)
- password = keyring.get_password(url, username)
- if password:
- return username, password
-
- except Exception as exc:
- logger.warning(
- "Keyring is skipped due to an exception: %s", str(exc),
- )
- keyring = None
- return None
-
-
-class MultiDomainBasicAuth(AuthBase):
-
- def __init__(self, prompting=True, index_urls=None):
- # type: (bool, Optional[List[str]]) -> None
- self.prompting = prompting
- self.index_urls = index_urls
- self.passwords = {} # type: Dict[str, AuthInfo]
- # When the user is prompted to enter credentials and keyring is
- # available, we will offer to save them. If the user accepts,
- # this value is set to the credentials they entered. After the
- # request authenticates, the caller should call
- # ``save_credentials`` to save these.
- self._credentials_to_save = None # type: Optional[Credentials]
-
- def _get_index_url(self, url):
- # type: (str) -> Optional[str]
- """Return the original index URL matching the requested URL.
-
- Cached or dynamically generated credentials may work against
- the original index URL rather than just the netloc.
-
- The provided url should have had its username and password
- removed already. If the original index url had credentials then
- they will be included in the return value.
-
- Returns None if no matching index was found, or if --no-index
- was specified by the user.
- """
- if not url or not self.index_urls:
- return None
-
- for u in self.index_urls:
- prefix = remove_auth_from_url(u).rstrip("/") + "/"
- if url.startswith(prefix):
- return u
- return None
-
- def _get_new_credentials(self, original_url, allow_netrc=True,
- allow_keyring=False):
- # type: (str, bool, bool) -> AuthInfo
- """Find and return credentials for the specified URL."""
- # Split the credentials and netloc from the url.
- url, netloc, url_user_password = split_auth_netloc_from_url(
- original_url,
- )
-
- # Start with the credentials embedded in the url
- username, password = url_user_password
- if username is not None and password is not None:
- logger.debug("Found credentials in url for %s", netloc)
- return url_user_password
-
- # Find a matching index url for this request
- index_url = self._get_index_url(url)
- if index_url:
- # Split the credentials from the url.
- index_info = split_auth_netloc_from_url(index_url)
- if index_info:
- index_url, _, index_url_user_password = index_info
- logger.debug("Found index url %s", index_url)
-
- # If an index URL was found, try its embedded credentials
- if index_url and index_url_user_password[0] is not None:
- username, password = index_url_user_password
- if username is not None and password is not None:
- logger.debug("Found credentials in index url for %s", netloc)
- return index_url_user_password
-
- # Get creds from netrc if we still don't have them
- if allow_netrc:
- netrc_auth = get_netrc_auth(original_url)
- if netrc_auth:
- logger.debug("Found credentials in netrc for %s", netloc)
- return netrc_auth
-
- # If we don't have a password and keyring is available, use it.
- if allow_keyring:
- # The index url is more specific than the netloc, so try it first
- kr_auth = (
- get_keyring_auth(index_url, username) or
- get_keyring_auth(netloc, username)
- )
- if kr_auth:
- logger.debug("Found credentials in keyring for %s", netloc)
- return kr_auth
-
- return username, password
-
- def _get_url_and_credentials(self, original_url):
- # type: (str) -> Tuple[str, Optional[str], Optional[str]]
- """Return the credentials to use for the provided URL.
-
- If allowed, netrc and keyring may be used to obtain the
- correct credentials.
-
- Returns (url_without_credentials, username, password). Note
- that even if the original URL contains credentials, this
- function may return a different username and password.
- """
- url, netloc, _ = split_auth_netloc_from_url(original_url)
-
- # Use any stored credentials that we have for this netloc
- username, password = self.passwords.get(netloc, (None, None))
-
- if username is None and password is None:
- # No stored credentials. Acquire new credentials without prompting
- # the user. (e.g. from netrc, keyring, or the URL itself)
- username, password = self._get_new_credentials(original_url)
-
- if username is not None or password is not None:
- # Convert the username and password if they're None, so that
- # this netloc will show up as "cached" in the conditional above.
- # Further, HTTPBasicAuth doesn't accept None, so it makes sense to
- # cache the value that is going to be used.
- username = username or ""
- password = password or ""
-
- # Store any acquired credentials.
- self.passwords[netloc] = (username, password)
-
- assert (
- # Credentials were found
- (username is not None and password is not None) or
- # Credentials were not found
- (username is None and password is None)
- ), f"Could not load credentials from url: {original_url}"
-
- return url, username, password
-
- def __call__(self, req):
- # type: (Request) -> Request
- # Get credentials for this request
- url, username, password = self._get_url_and_credentials(req.url)
-
- # Set the url of the request to the url without any credentials
- req.url = url
-
- if username is not None and password is not None:
- # Send the basic auth with this request
- req = HTTPBasicAuth(username, password)(req)
-
- # Attach a hook to handle 401 responses
- req.register_hook("response", self.handle_401)
-
- return req
-
- # Factored out to allow for easy patching in tests
- def _prompt_for_password(self, netloc):
- # type: (str) -> Tuple[Optional[str], Optional[str], bool]
- username = ask_input(f"User for {netloc}: ")
- if not username:
- return None, None, False
- auth = get_keyring_auth(netloc, username)
- if auth and auth[0] is not None and auth[1] is not None:
- return auth[0], auth[1], False
- password = ask_password("Password: ")
- return username, password, True
-
- # Factored out to allow for easy patching in tests
- def _should_save_password_to_keyring(self):
- # type: () -> bool
- if not keyring:
- return False
- return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y"
-
- def handle_401(self, resp, **kwargs):
- # type: (Response, **Any) -> Response
- # We only care about 401 responses, anything else we want to just
- # pass through the actual response
- if resp.status_code != 401:
- return resp
-
- # We are not able to prompt the user so simply return the response
- if not self.prompting:
- return resp
-
- parsed = urllib.parse.urlparse(resp.url)
-
- # Query the keyring for credentials:
- username, password = self._get_new_credentials(resp.url,
- allow_netrc=False,
- allow_keyring=True)
-
- # Prompt the user for a new username and password
- save = False
- if not username and not password:
- username, password, save = self._prompt_for_password(parsed.netloc)
-
- # Store the new username and password to use for future requests
- self._credentials_to_save = None
- if username is not None and password is not None:
- self.passwords[parsed.netloc] = (username, password)
-
- # Prompt to save the password to keyring
- if save and self._should_save_password_to_keyring():
- self._credentials_to_save = (parsed.netloc, username, password)
-
- # Consume content and release the original connection to allow our new
- # request to reuse the same one.
- resp.content
- resp.raw.release_conn()
-
- # Add our new username and password to the request
- req = HTTPBasicAuth(username or "", password or "")(resp.request)
- req.register_hook("response", self.warn_on_401)
-
- # On successful request, save the credentials that were used to
- # keyring. (Note that if the user responded "no" above, this member
- # is not set and nothing will be saved.)
- if self._credentials_to_save:
- req.register_hook("response", self.save_credentials)
-
- # Send our new request
- new_resp = resp.connection.send(req, **kwargs)
- new_resp.history.append(resp)
-
- return new_resp
-
- def warn_on_401(self, resp, **kwargs):
- # type: (Response, **Any) -> None
- """Response callback to warn about incorrect credentials."""
- if resp.status_code == 401:
- logger.warning(
- '401 Error, Credentials not correct for %s', resp.request.url,
- )
-
- def save_credentials(self, resp, **kwargs):
- # type: (Response, **Any) -> None
- """Response callback to save credentials on success."""
- assert keyring is not None, "should never reach here without keyring"
- if not keyring:
- return
-
- creds = self._credentials_to_save
- self._credentials_to_save = None
- if creds and resp.status_code < 400:
- try:
- logger.info('Saving credentials to keyring')
- keyring.set_password(*creds)
- except Exception:
- logger.exception('Failed to save credentials')
diff --git a/venv/Lib/site-packages/pip/_internal/network/cache.py b/venv/Lib/site-packages/pip/_internal/network/cache.py
deleted file mode 100644
index ce08932..0000000
--- a/venv/Lib/site-packages/pip/_internal/network/cache.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""HTTP cache implementation.
-"""
-
-import os
-from contextlib import contextmanager
-from typing import Iterator, Optional
-
-from pip._vendor.cachecontrol.cache import BaseCache
-from pip._vendor.cachecontrol.caches import FileCache
-from pip._vendor.requests.models import Response
-
-from pip._internal.utils.filesystem import adjacent_tmp_file, replace
-from pip._internal.utils.misc import ensure_dir
-
-
-def is_from_cache(response):
- # type: (Response) -> bool
- return getattr(response, "from_cache", False)
-
-
-@contextmanager
-def suppressed_cache_errors():
- # type: () -> Iterator[None]
- """If we can't access the cache then we can just skip caching and process
- requests as if caching wasn't enabled.
- """
- try:
- yield
- except OSError:
- pass
-
-
-class SafeFileCache(BaseCache):
- """
- A file based cache which is safe to use even when the target directory may
- not be accessible or writable.
- """
-
- def __init__(self, directory):
- # type: (str) -> None
- assert directory is not None, "Cache directory must not be None."
- super().__init__()
- self.directory = directory
-
- def _get_cache_path(self, name):
- # type: (str) -> str
- # From cachecontrol.caches.file_cache.FileCache._fn, brought into our
- # class for backwards-compatibility and to avoid using a non-public
- # method.
- hashed = FileCache.encode(name)
- parts = list(hashed[:5]) + [hashed]
- return os.path.join(self.directory, *parts)
-
- def get(self, key):
- # type: (str) -> Optional[bytes]
- path = self._get_cache_path(key)
- with suppressed_cache_errors():
- with open(path, 'rb') as f:
- return f.read()
-
- def set(self, key, value):
- # type: (str, bytes) -> None
- path = self._get_cache_path(key)
- with suppressed_cache_errors():
- ensure_dir(os.path.dirname(path))
-
- with adjacent_tmp_file(path) as f:
- f.write(value)
-
- replace(f.name, path)
-
- def delete(self, key):
- # type: (str) -> None
- path = self._get_cache_path(key)
- with suppressed_cache_errors():
- os.remove(path)
diff --git a/venv/Lib/site-packages/pip/_internal/network/download.py b/venv/Lib/site-packages/pip/_internal/network/download.py
deleted file mode 100644
index 1897d99..0000000
--- a/venv/Lib/site-packages/pip/_internal/network/download.py
+++ /dev/null
@@ -1,196 +0,0 @@
-"""Download files with progress indicators.
-"""
-import cgi
-import logging
-import mimetypes
-import os
-from typing import Iterable, Optional, Tuple
-
-from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
-
-from pip._internal.cli.progress_bars import DownloadProgressProvider
-from pip._internal.exceptions import NetworkConnectionError
-from pip._internal.models.index import PyPI
-from pip._internal.models.link import Link
-from pip._internal.network.cache import is_from_cache
-from pip._internal.network.session import PipSession
-from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks
-from pip._internal.utils.misc import format_size, redact_auth_from_url, splitext
-
-logger = logging.getLogger(__name__)
-
-
-def _get_http_response_size(resp):
- # type: (Response) -> Optional[int]
- try:
- return int(resp.headers['content-length'])
- except (ValueError, KeyError, TypeError):
- return None
-
-
-def _prepare_download(
- resp, # type: Response
- link, # type: Link
- progress_bar # type: str
-):
- # type: (...) -> Iterable[bytes]
- total_length = _get_http_response_size(resp)
-
- if link.netloc == PyPI.file_storage_domain:
- url = link.show_url
- else:
- url = link.url_without_fragment
-
- logged_url = redact_auth_from_url(url)
-
- if total_length:
- logged_url = '{} ({})'.format(logged_url, format_size(total_length))
-
- if is_from_cache(resp):
- logger.info("Using cached %s", logged_url)
- else:
- logger.info("Downloading %s", logged_url)
-
- if logger.getEffectiveLevel() > logging.INFO:
- show_progress = False
- elif is_from_cache(resp):
- show_progress = False
- elif not total_length:
- show_progress = True
- elif total_length > (40 * 1000):
- show_progress = True
- else:
- show_progress = False
-
- chunks = response_chunks(resp, CONTENT_CHUNK_SIZE)
-
- if not show_progress:
- return chunks
-
- return DownloadProgressProvider(
- progress_bar, max=total_length
- )(chunks)
-
-
-def sanitize_content_filename(filename):
- # type: (str) -> str
- """
- Sanitize the "filename" value from a Content-Disposition header.
- """
- return os.path.basename(filename)
-
-
-def parse_content_disposition(content_disposition, default_filename):
- # type: (str, str) -> str
- """
- Parse the "filename" value from a Content-Disposition header, and
- return the default filename if the result is empty.
- """
- _type, params = cgi.parse_header(content_disposition)
- filename = params.get('filename')
- if filename:
- # We need to sanitize the filename to prevent directory traversal
- # in case the filename contains ".." path parts.
- filename = sanitize_content_filename(filename)
- return filename or default_filename
-
-
-def _get_http_response_filename(resp, link):
- # type: (Response, Link) -> str
- """Get an ideal filename from the given HTTP response, falling back to
- the link filename if not provided.
- """
- filename = link.filename # fallback
- # Have a look at the Content-Disposition header for a better guess
- content_disposition = resp.headers.get('content-disposition')
- if content_disposition:
- filename = parse_content_disposition(content_disposition, filename)
- ext = splitext(filename)[1] # type: Optional[str]
- if not ext:
- ext = mimetypes.guess_extension(
- resp.headers.get('content-type', '')
- )
- if ext:
- filename += ext
- if not ext and link.url != resp.url:
- ext = os.path.splitext(resp.url)[1]
- if ext:
- filename += ext
- return filename
-
-
-def _http_get_download(session, link):
- # type: (PipSession, Link) -> Response
- target_url = link.url.split('#', 1)[0]
- resp = session.get(target_url, headers=HEADERS, stream=True)
- raise_for_status(resp)
- return resp
-
-
-class Downloader:
- def __init__(
- self,
- session, # type: PipSession
- progress_bar, # type: str
- ):
- # type: (...) -> None
- self._session = session
- self._progress_bar = progress_bar
-
- def __call__(self, link, location):
- # type: (Link, str) -> Tuple[str, str]
- """Download the file given by link into location."""
- try:
- resp = _http_get_download(self._session, link)
- except NetworkConnectionError as e:
- assert e.response is not None
- logger.critical(
- "HTTP error %s while getting %s", e.response.status_code, link
- )
- raise
-
- filename = _get_http_response_filename(resp, link)
- filepath = os.path.join(location, filename)
-
- chunks = _prepare_download(resp, link, self._progress_bar)
- with open(filepath, 'wb') as content_file:
- for chunk in chunks:
- content_file.write(chunk)
- content_type = resp.headers.get('Content-Type', '')
- return filepath, content_type
-
-
-class BatchDownloader:
-
- def __init__(
- self,
- session, # type: PipSession
- progress_bar, # type: str
- ):
- # type: (...) -> None
- self._session = session
- self._progress_bar = progress_bar
-
- def __call__(self, links, location):
- # type: (Iterable[Link], str) -> Iterable[Tuple[Link, Tuple[str, str]]]
- """Download the files given by links into location."""
- for link in links:
- try:
- resp = _http_get_download(self._session, link)
- except NetworkConnectionError as e:
- assert e.response is not None
- logger.critical(
- "HTTP error %s while getting %s",
- e.response.status_code, link,
- )
- raise
-
- filename = _get_http_response_filename(resp, link)
- filepath = os.path.join(location, filename)
-
- chunks = _prepare_download(resp, link, self._progress_bar)
- with open(filepath, 'wb') as content_file:
- for chunk in chunks:
- content_file.write(chunk)
- content_type = resp.headers.get('Content-Type', '')
- yield link, (filepath, content_type)
diff --git a/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py b/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py
deleted file mode 100644
index b877d3b..0000000
--- a/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py
+++ /dev/null
@@ -1,224 +0,0 @@
-"""Lazy ZIP over HTTP"""
-
-__all__ = ['HTTPRangeRequestUnsupported', 'dist_from_wheel_url']
-
-from bisect import bisect_left, bisect_right
-from contextlib import contextmanager
-from tempfile import NamedTemporaryFile
-from typing import Any, Dict, Iterator, List, Optional, Tuple
-from zipfile import BadZipfile, ZipFile
-
-from pip._vendor.pkg_resources import Distribution
-from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
-
-from pip._internal.network.session import PipSession
-from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks
-from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel
-
-
-class HTTPRangeRequestUnsupported(Exception):
- pass
-
-
-def dist_from_wheel_url(name, url, session):
- # type: (str, str, PipSession) -> Distribution
- """Return a pkg_resources.Distribution from the given wheel URL.
-
- This uses HTTP range requests to only fetch the potion of the wheel
- containing metadata, just enough for the object to be constructed.
- If such requests are not supported, HTTPRangeRequestUnsupported
- is raised.
- """
- with LazyZipOverHTTP(url, session) as wheel:
- # For read-only ZIP files, ZipFile only needs methods read,
- # seek, seekable and tell, not the whole IO protocol.
- zip_file = ZipFile(wheel) # type: ignore
- # After context manager exit, wheel.name
- # is an invalid file by intention.
- return pkg_resources_distribution_for_wheel(zip_file, name, wheel.name)
-
-
-class LazyZipOverHTTP:
- """File-like object mapped to a ZIP file over HTTP.
-
- This uses HTTP range requests to lazily fetch the file's content,
- which is supposed to be fed to ZipFile. If such requests are not
- supported by the server, raise HTTPRangeRequestUnsupported
- during initialization.
- """
-
- def __init__(self, url, session, chunk_size=CONTENT_CHUNK_SIZE):
- # type: (str, PipSession, int) -> None
- head = session.head(url, headers=HEADERS)
- raise_for_status(head)
- assert head.status_code == 200
- self._session, self._url, self._chunk_size = session, url, chunk_size
- self._length = int(head.headers['Content-Length'])
- self._file = NamedTemporaryFile()
- self.truncate(self._length)
- self._left = [] # type: List[int]
- self._right = [] # type: List[int]
- if 'bytes' not in head.headers.get('Accept-Ranges', 'none'):
- raise HTTPRangeRequestUnsupported('range request is not supported')
- self._check_zip()
-
- @property
- def mode(self):
- # type: () -> str
- """Opening mode, which is always rb."""
- return 'rb'
-
- @property
- def name(self):
- # type: () -> str
- """Path to the underlying file."""
- return self._file.name
-
- def seekable(self):
- # type: () -> bool
- """Return whether random access is supported, which is True."""
- return True
-
- def close(self):
- # type: () -> None
- """Close the file."""
- self._file.close()
-
- @property
- def closed(self):
- # type: () -> bool
- """Whether the file is closed."""
- return self._file.closed
-
- def read(self, size=-1):
- # type: (int) -> bytes
- """Read up to size bytes from the object and return them.
-
- As a convenience, if size is unspecified or -1,
- all bytes until EOF are returned. Fewer than
- size bytes may be returned if EOF is reached.
- """
- download_size = max(size, self._chunk_size)
- start, length = self.tell(), self._length
- stop = length if size < 0 else min(start+download_size, length)
- start = max(0, stop-download_size)
- self._download(start, stop-1)
- return self._file.read(size)
-
- def readable(self):
- # type: () -> bool
- """Return whether the file is readable, which is True."""
- return True
-
- def seek(self, offset, whence=0):
- # type: (int, int) -> int
- """Change stream position and return the new absolute position.
-
- Seek to offset relative position indicated by whence:
- * 0: Start of stream (the default). pos should be >= 0;
- * 1: Current position - pos may be negative;
- * 2: End of stream - pos usually negative.
- """
- return self._file.seek(offset, whence)
-
- def tell(self):
- # type: () -> int
- """Return the current possition."""
- return self._file.tell()
-
- def truncate(self, size=None):
- # type: (Optional[int]) -> int
- """Resize the stream to the given size in bytes.
-
- If size is unspecified resize to the current position.
- The current stream position isn't changed.
-
- Return the new file size.
- """
- return self._file.truncate(size)
-
- def writable(self):
- # type: () -> bool
- """Return False."""
- return False
-
- def __enter__(self):
- # type: () -> LazyZipOverHTTP
- self._file.__enter__()
- return self
-
- def __exit__(self, *exc):
- # type: (*Any) -> Optional[bool]
- return self._file.__exit__(*exc)
-
- @contextmanager
- def _stay(self):
- # type: ()-> Iterator[None]
- """Return a context manager keeping the position.
-
- At the end of the block, seek back to original position.
- """
- pos = self.tell()
- try:
- yield
- finally:
- self.seek(pos)
-
- def _check_zip(self):
- # type: () -> None
- """Check and download until the file is a valid ZIP."""
- end = self._length - 1
- for start in reversed(range(0, end, self._chunk_size)):
- self._download(start, end)
- with self._stay():
- try:
- # For read-only ZIP files, ZipFile only needs
- # methods read, seek, seekable and tell.
- ZipFile(self) # type: ignore
- except BadZipfile:
- pass
- else:
- break
-
- def _stream_response(self, start, end, base_headers=HEADERS):
- # type: (int, int, Dict[str, str]) -> Response
- """Return HTTP response to a range request from start to end."""
- headers = base_headers.copy()
- headers['Range'] = f'bytes={start}-{end}'
- # TODO: Get range requests to be correctly cached
- headers['Cache-Control'] = 'no-cache'
- return self._session.get(self._url, headers=headers, stream=True)
-
- def _merge(self, start, end, left, right):
- # type: (int, int, int, int) -> Iterator[Tuple[int, int]]
- """Return an iterator of intervals to be fetched.
-
- Args:
- start (int): Start of needed interval
- end (int): End of needed interval
- left (int): Index of first overlapping downloaded data
- right (int): Index after last overlapping downloaded data
- """
- lslice, rslice = self._left[left:right], self._right[left:right]
- i = start = min([start]+lslice[:1])
- end = max([end]+rslice[-1:])
- for j, k in zip(lslice, rslice):
- if j > i:
- yield i, j-1
- i = k + 1
- if i <= end:
- yield i, end
- self._left[left:right], self._right[left:right] = [start], [end]
-
- def _download(self, start, end):
- # type: (int, int) -> None
- """Download bytes from start to end inclusively."""
- with self._stay():
- left = bisect_left(self._right, start)
- right = bisect_right(self._left, end)
- for start, end in self._merge(start, end, left, right):
- response = self._stream_response(start, end)
- response.raise_for_status()
- self.seek(start)
- for chunk in response_chunks(response, self._chunk_size):
- self._file.write(chunk)
diff --git a/venv/Lib/site-packages/pip/_internal/network/session.py b/venv/Lib/site-packages/pip/_internal/network/session.py
deleted file mode 100644
index 4af800f..0000000
--- a/venv/Lib/site-packages/pip/_internal/network/session.py
+++ /dev/null
@@ -1,449 +0,0 @@
-"""PipSession and supporting code, containing all pip-specific
-network request configuration and behavior.
-"""
-
-# When mypy runs on Windows the call to distro.linux_distribution() is skipped
-# resulting in the failure:
-#
-# error: unused 'type: ignore' comment
-#
-# If the upstream module adds typing, this comment should be removed. See
-# https://github.com/nir0s/distro/pull/269
-#
-# mypy: warn-unused-ignores=False
-
-import email.utils
-import ipaddress
-import json
-import logging
-import mimetypes
-import os
-import platform
-import sys
-import urllib.parse
-import warnings
-from typing import Any, Dict, Iterator, List, Mapping, Optional, Sequence, Tuple, Union
-
-from pip._vendor import requests, urllib3
-from pip._vendor.cachecontrol import CacheControlAdapter
-from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter
-from pip._vendor.requests.models import PreparedRequest, Response
-from pip._vendor.requests.structures import CaseInsensitiveDict
-from pip._vendor.urllib3.connectionpool import ConnectionPool
-from pip._vendor.urllib3.exceptions import InsecureRequestWarning
-
-from pip import __version__
-from pip._internal.metadata import get_default_environment
-from pip._internal.models.link import Link
-from pip._internal.network.auth import MultiDomainBasicAuth
-from pip._internal.network.cache import SafeFileCache
-
-# Import ssl from compat so the initial import occurs in only one place.
-from pip._internal.utils.compat import has_tls
-from pip._internal.utils.glibc import libc_ver
-from pip._internal.utils.misc import build_url_from_netloc, parse_netloc
-from pip._internal.utils.urls import url_to_path
-
-logger = logging.getLogger(__name__)
-
-SecureOrigin = Tuple[str, str, Optional[Union[int, str]]]
-
-
-# Ignore warning raised when using --trusted-host.
-warnings.filterwarnings("ignore", category=InsecureRequestWarning)
-
-
-SECURE_ORIGINS = [
- # protocol, hostname, port
- # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC)
- ("https", "*", "*"),
- ("*", "localhost", "*"),
- ("*", "127.0.0.0/8", "*"),
- ("*", "::1/128", "*"),
- ("file", "*", None),
- # ssh is always secure.
- ("ssh", "*", "*"),
-] # type: List[SecureOrigin]
-
-
-# These are environment variables present when running under various
-# CI systems. For each variable, some CI systems that use the variable
-# are indicated. The collection was chosen so that for each of a number
-# of popular systems, at least one of the environment variables is used.
-# This list is used to provide some indication of and lower bound for
-# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive.
-# For more background, see: https://github.com/pypa/pip/issues/5499
-CI_ENVIRONMENT_VARIABLES = (
- # Azure Pipelines
- 'BUILD_BUILDID',
- # Jenkins
- 'BUILD_ID',
- # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI
- 'CI',
- # Explicit environment variable.
- 'PIP_IS_CI',
-)
-
-
-def looks_like_ci():
- # type: () -> bool
- """
- Return whether it looks like pip is running under CI.
- """
- # We don't use the method of checking for a tty (e.g. using isatty())
- # because some CI systems mimic a tty (e.g. Travis CI). Thus that
- # method doesn't provide definitive information in either direction.
- return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES)
-
-
-def user_agent():
- # type: () -> str
- """
- Return a string representing the user agent.
- """
- data = {
- "installer": {"name": "pip", "version": __version__},
- "python": platform.python_version(),
- "implementation": {
- "name": platform.python_implementation(),
- },
- } # type: Dict[str, Any]
-
- if data["implementation"]["name"] == 'CPython':
- data["implementation"]["version"] = platform.python_version()
- elif data["implementation"]["name"] == 'PyPy':
- pypy_version_info = sys.pypy_version_info # type: ignore
- if pypy_version_info.releaselevel == 'final':
- pypy_version_info = pypy_version_info[:3]
- data["implementation"]["version"] = ".".join(
- [str(x) for x in pypy_version_info]
- )
- elif data["implementation"]["name"] == 'Jython':
- # Complete Guess
- data["implementation"]["version"] = platform.python_version()
- elif data["implementation"]["name"] == 'IronPython':
- # Complete Guess
- data["implementation"]["version"] = platform.python_version()
-
- if sys.platform.startswith("linux"):
- from pip._vendor import distro
-
- # https://github.com/nir0s/distro/pull/269
- linux_distribution = distro.linux_distribution() # type: ignore
- distro_infos = dict(filter(
- lambda x: x[1],
- zip(["name", "version", "id"], linux_distribution),
- ))
- libc = dict(filter(
- lambda x: x[1],
- zip(["lib", "version"], libc_ver()),
- ))
- if libc:
- distro_infos["libc"] = libc
- if distro_infos:
- data["distro"] = distro_infos
-
- if sys.platform.startswith("darwin") and platform.mac_ver()[0]:
- data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]}
-
- if platform.system():
- data.setdefault("system", {})["name"] = platform.system()
-
- if platform.release():
- data.setdefault("system", {})["release"] = platform.release()
-
- if platform.machine():
- data["cpu"] = platform.machine()
-
- if has_tls():
- import _ssl as ssl
- data["openssl_version"] = ssl.OPENSSL_VERSION
-
- setuptools_dist = get_default_environment().get_distribution("setuptools")
- if setuptools_dist is not None:
- data["setuptools_version"] = str(setuptools_dist.version)
-
- # Use None rather than False so as not to give the impression that
- # pip knows it is not being run under CI. Rather, it is a null or
- # inconclusive result. Also, we include some value rather than no
- # value to make it easier to know that the check has been run.
- data["ci"] = True if looks_like_ci() else None
-
- user_data = os.environ.get("PIP_USER_AGENT_USER_DATA")
- if user_data is not None:
- data["user_data"] = user_data
-
- return "{data[installer][name]}/{data[installer][version]} {json}".format(
- data=data,
- json=json.dumps(data, separators=(",", ":"), sort_keys=True),
- )
-
-
-class LocalFSAdapter(BaseAdapter):
-
- def send(
- self,
- request, # type: PreparedRequest
- stream=False, # type: bool
- timeout=None, # type: Optional[Union[float, Tuple[float, float]]]
- verify=True, # type: Union[bool, str]
- cert=None, # type: Optional[Union[str, Tuple[str, str]]]
- proxies=None, # type:Optional[Mapping[str, str]]
- ):
- # type: (...) -> Response
- pathname = url_to_path(request.url)
-
- resp = Response()
- resp.status_code = 200
- resp.url = request.url
-
- try:
- stats = os.stat(pathname)
- except OSError as exc:
- resp.status_code = 404
- resp.raw = exc
- else:
- modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
- content_type = mimetypes.guess_type(pathname)[0] or "text/plain"
- resp.headers = CaseInsensitiveDict({
- "Content-Type": content_type,
- "Content-Length": stats.st_size,
- "Last-Modified": modified,
- })
-
- resp.raw = open(pathname, "rb")
- resp.close = resp.raw.close
-
- return resp
-
- def close(self):
- # type: () -> None
- pass
-
-
-class InsecureHTTPAdapter(HTTPAdapter):
-
- def cert_verify(
- self,
- conn, # type: ConnectionPool
- url, # type: str
- verify, # type: Union[bool, str]
- cert, # type: Optional[Union[str, Tuple[str, str]]]
- ):
- # type: (...) -> None
- super().cert_verify(conn=conn, url=url, verify=False, cert=cert)
-
-
-class InsecureCacheControlAdapter(CacheControlAdapter):
-
- def cert_verify(
- self,
- conn, # type: ConnectionPool
- url, # type: str
- verify, # type: Union[bool, str]
- cert, # type: Optional[Union[str, Tuple[str, str]]]
- ):
- # type: (...) -> None
- super().cert_verify(conn=conn, url=url, verify=False, cert=cert)
-
-
-class PipSession(requests.Session):
-
- timeout = None # type: Optional[int]
-
- def __init__(
- self,
- *args, # type: Any
- retries=0, # type: int
- cache=None, # type: Optional[str]
- trusted_hosts=(), # type: Sequence[str]
- index_urls=None, # type: Optional[List[str]]
- **kwargs, # type: Any
- ):
- # type: (...) -> None
- """
- :param trusted_hosts: Domains not to emit warnings for when not using
- HTTPS.
- """
- super().__init__(*args, **kwargs)
-
- # Namespace the attribute with "pip_" just in case to prevent
- # possible conflicts with the base class.
- self.pip_trusted_origins = [] # type: List[Tuple[str, Optional[int]]]
-
- # Attach our User Agent to the request
- self.headers["User-Agent"] = user_agent()
-
- # Attach our Authentication handler to the session
- self.auth = MultiDomainBasicAuth(index_urls=index_urls)
-
- # Create our urllib3.Retry instance which will allow us to customize
- # how we handle retries.
- retries = urllib3.Retry(
- # Set the total number of retries that a particular request can
- # have.
- total=retries,
-
- # A 503 error from PyPI typically means that the Fastly -> Origin
- # connection got interrupted in some way. A 503 error in general
- # is typically considered a transient error so we'll go ahead and
- # retry it.
- # A 500 may indicate transient error in Amazon S3
- # A 520 or 527 - may indicate transient error in CloudFlare
- status_forcelist=[500, 503, 520, 527],
-
- # Add a small amount of back off between failed requests in
- # order to prevent hammering the service.
- backoff_factor=0.25,
- ) # type: ignore
-
- # Our Insecure HTTPAdapter disables HTTPS validation. It does not
- # support caching so we'll use it for all http:// URLs.
- # If caching is disabled, we will also use it for
- # https:// hosts that we've marked as ignoring
- # TLS errors for (trusted-hosts).
- insecure_adapter = InsecureHTTPAdapter(max_retries=retries)
-
- # We want to _only_ cache responses on securely fetched origins or when
- # the host is specified as trusted. We do this because
- # we can't validate the response of an insecurely/untrusted fetched
- # origin, and we don't want someone to be able to poison the cache and
- # require manual eviction from the cache to fix it.
- if cache:
- secure_adapter = CacheControlAdapter(
- cache=SafeFileCache(cache),
- max_retries=retries,
- )
- self._trusted_host_adapter = InsecureCacheControlAdapter(
- cache=SafeFileCache(cache),
- max_retries=retries,
- )
- else:
- secure_adapter = HTTPAdapter(max_retries=retries)
- self._trusted_host_adapter = insecure_adapter
-
- self.mount("https://", secure_adapter)
- self.mount("http://", insecure_adapter)
-
- # Enable file:// urls
- self.mount("file://", LocalFSAdapter())
-
- for host in trusted_hosts:
- self.add_trusted_host(host, suppress_logging=True)
-
- def update_index_urls(self, new_index_urls):
- # type: (List[str]) -> None
- """
- :param new_index_urls: New index urls to update the authentication
- handler with.
- """
- self.auth.index_urls = new_index_urls
-
- def add_trusted_host(self, host, source=None, suppress_logging=False):
- # type: (str, Optional[str], bool) -> None
- """
- :param host: It is okay to provide a host that has previously been
- added.
- :param source: An optional source string, for logging where the host
- string came from.
- """
- if not suppress_logging:
- msg = f'adding trusted host: {host!r}'
- if source is not None:
- msg += f' (from {source})'
- logger.info(msg)
-
- host_port = parse_netloc(host)
- if host_port not in self.pip_trusted_origins:
- self.pip_trusted_origins.append(host_port)
-
- self.mount(
- build_url_from_netloc(host) + '/',
- self._trusted_host_adapter
- )
- if not host_port[1]:
- # Mount wildcard ports for the same host.
- self.mount(
- build_url_from_netloc(host) + ':',
- self._trusted_host_adapter
- )
-
- def iter_secure_origins(self):
- # type: () -> Iterator[SecureOrigin]
- yield from SECURE_ORIGINS
- for host, port in self.pip_trusted_origins:
- yield ('*', host, '*' if port is None else port)
-
- def is_secure_origin(self, location):
- # type: (Link) -> bool
- # Determine if this url used a secure transport mechanism
- parsed = urllib.parse.urlparse(str(location))
- origin_protocol, origin_host, origin_port = (
- parsed.scheme, parsed.hostname, parsed.port,
- )
-
- # The protocol to use to see if the protocol matches.
- # Don't count the repository type as part of the protocol: in
- # cases such as "git+ssh", only use "ssh". (I.e., Only verify against
- # the last scheme.)
- origin_protocol = origin_protocol.rsplit('+', 1)[-1]
-
- # Determine if our origin is a secure origin by looking through our
- # hardcoded list of secure origins, as well as any additional ones
- # configured on this PackageFinder instance.
- for secure_origin in self.iter_secure_origins():
- secure_protocol, secure_host, secure_port = secure_origin
- if origin_protocol != secure_protocol and secure_protocol != "*":
- continue
-
- try:
- addr = ipaddress.ip_address(origin_host)
- network = ipaddress.ip_network(secure_host)
- except ValueError:
- # We don't have both a valid address or a valid network, so
- # we'll check this origin against hostnames.
- if (
- origin_host and
- origin_host.lower() != secure_host.lower() and
- secure_host != "*"
- ):
- continue
- else:
- # We have a valid address and network, so see if the address
- # is contained within the network.
- if addr not in network:
- continue
-
- # Check to see if the port matches.
- if (
- origin_port != secure_port and
- secure_port != "*" and
- secure_port is not None
- ):
- continue
-
- # If we've gotten here, then this origin matches the current
- # secure origin and we should return True
- return True
-
- # If we've gotten to this point, then the origin isn't secure and we
- # will not accept it as a valid location to search. We will however
- # log a warning that we are ignoring it.
- logger.warning(
- "The repository located at %s is not a trusted or secure host and "
- "is being ignored. If this repository is available via HTTPS we "
- "recommend you use HTTPS instead, otherwise you may silence "
- "this warning and allow it anyway with '--trusted-host %s'.",
- origin_host,
- origin_host,
- )
-
- return False
-
- def request(self, method, url, *args, **kwargs):
- # type: (str, str, *Any, **Any) -> Response
- # Allow setting a default timeout on a session
- kwargs.setdefault("timeout", self.timeout)
-
- # Dispatch the actual request
- return super().request(method, url, *args, **kwargs)
diff --git a/venv/Lib/site-packages/pip/_internal/network/utils.py b/venv/Lib/site-packages/pip/_internal/network/utils.py
deleted file mode 100644
index 6e5cf0d..0000000
--- a/venv/Lib/site-packages/pip/_internal/network/utils.py
+++ /dev/null
@@ -1,95 +0,0 @@
-from typing import Dict, Iterator
-
-from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
-
-from pip._internal.exceptions import NetworkConnectionError
-
-# The following comments and HTTP headers were originally added by
-# Donald Stufft in git commit 22c562429a61bb77172039e480873fb239dd8c03.
-#
-# We use Accept-Encoding: identity here because requests defaults to
-# accepting compressed responses. This breaks in a variety of ways
-# depending on how the server is configured.
-# - Some servers will notice that the file isn't a compressible file
-# and will leave the file alone and with an empty Content-Encoding
-# - Some servers will notice that the file is already compressed and
-# will leave the file alone, adding a Content-Encoding: gzip header
-# - Some servers won't notice anything at all and will take a file
-# that's already been compressed and compress it again, and set
-# the Content-Encoding: gzip header
-# By setting this to request only the identity encoding we're hoping
-# to eliminate the third case. Hopefully there does not exist a server
-# which when given a file will notice it is already compressed and that
-# you're not asking for a compressed file and will then decompress it
-# before sending because if that's the case I don't think it'll ever be
-# possible to make this work.
-HEADERS = {'Accept-Encoding': 'identity'} # type: Dict[str, str]
-
-
-def raise_for_status(resp):
- # type: (Response) -> None
- http_error_msg = ''
- if isinstance(resp.reason, bytes):
- # We attempt to decode utf-8 first because some servers
- # choose to localize their reason strings. If the string
- # isn't utf-8, we fall back to iso-8859-1 for all other
- # encodings.
- try:
- reason = resp.reason.decode('utf-8')
- except UnicodeDecodeError:
- reason = resp.reason.decode('iso-8859-1')
- else:
- reason = resp.reason
-
- if 400 <= resp.status_code < 500:
- http_error_msg = (
- f'{resp.status_code} Client Error: {reason} for url: {resp.url}')
-
- elif 500 <= resp.status_code < 600:
- http_error_msg = (
- f'{resp.status_code} Server Error: {reason} for url: {resp.url}')
-
- if http_error_msg:
- raise NetworkConnectionError(http_error_msg, response=resp)
-
-
-def response_chunks(response, chunk_size=CONTENT_CHUNK_SIZE):
- # type: (Response, int) -> Iterator[bytes]
- """Given a requests Response, provide the data chunks.
- """
- try:
- # Special case for urllib3.
- for chunk in response.raw.stream(
- chunk_size,
- # We use decode_content=False here because we don't
- # want urllib3 to mess with the raw bytes we get
- # from the server. If we decompress inside of
- # urllib3 then we cannot verify the checksum
- # because the checksum will be of the compressed
- # file. This breakage will only occur if the
- # server adds a Content-Encoding header, which
- # depends on how the server was configured:
- # - Some servers will notice that the file isn't a
- # compressible file and will leave the file alone
- # and with an empty Content-Encoding
- # - Some servers will notice that the file is
- # already compressed and will leave the file
- # alone and will add a Content-Encoding: gzip
- # header
- # - Some servers won't notice anything at all and
- # will take a file that's already been compressed
- # and compress it again and set the
- # Content-Encoding: gzip header
- #
- # By setting this not to decode automatically we
- # hope to eliminate problems with the second case.
- decode_content=False,
- ):
- yield chunk
- except AttributeError:
- # Standard file-like object.
- while True:
- chunk = response.raw.read(chunk_size)
- if not chunk:
- break
- yield chunk
diff --git a/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py b/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py
deleted file mode 100644
index b92b8d9..0000000
--- a/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py
+++ /dev/null
@@ -1,49 +0,0 @@
-"""xmlrpclib.Transport implementation
-"""
-
-import logging
-import urllib.parse
-import xmlrpc.client
-from typing import TYPE_CHECKING, Tuple
-
-from pip._internal.exceptions import NetworkConnectionError
-from pip._internal.network.session import PipSession
-from pip._internal.network.utils import raise_for_status
-
-if TYPE_CHECKING:
- from xmlrpc.client import _HostType, _Marshallable
-
-logger = logging.getLogger(__name__)
-
-
-class PipXmlrpcTransport(xmlrpc.client.Transport):
- """Provide a `xmlrpclib.Transport` implementation via a `PipSession`
- object.
- """
-
- def __init__(self, index_url, session, use_datetime=False):
- # type: (str, PipSession, bool) -> None
- super().__init__(use_datetime)
- index_parts = urllib.parse.urlparse(index_url)
- self._scheme = index_parts.scheme
- self._session = session
-
- def request(self, host, handler, request_body, verbose=False):
- # type: (_HostType, str, bytes, bool) -> Tuple[_Marshallable, ...]
- assert isinstance(host, str)
- parts = (self._scheme, host, handler, None, None, None)
- url = urllib.parse.urlunparse(parts)
- try:
- headers = {'Content-Type': 'text/xml'}
- response = self._session.post(url, data=request_body,
- headers=headers, stream=True)
- raise_for_status(response)
- self.verbose = verbose
- return self.parse_response(response.raw)
- except NetworkConnectionError as exc:
- assert exc.response
- logger.critical(
- "HTTP error %s while getting %s",
- exc.response.status_code, url,
- )
- raise
diff --git a/venv/Lib/site-packages/pip/_internal/operations/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index e4b8e26..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-39.pyc
deleted file mode 100644
index 8c1c7b5..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc
deleted file mode 100644
index 001d0df..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 56253be..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc
deleted file mode 100644
index 7c467c7..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-39.pyc
deleted file mode 100644
index 603bcde..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-39.pyc
deleted file mode 100644
index 24d515a..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-39.pyc
deleted file mode 100644
index 13dc777..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py b/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py
deleted file mode 100644
index 1c82683..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py
+++ /dev/null
@@ -1,35 +0,0 @@
-"""Metadata generation logic for source distributions.
-"""
-
-import os
-
-from pip._vendor.pep517.wrappers import Pep517HookCaller
-
-from pip._internal.build_env import BuildEnvironment
-from pip._internal.utils.subprocess import runner_with_spinner_message
-from pip._internal.utils.temp_dir import TempDirectory
-
-
-def generate_metadata(build_env, backend):
- # type: (BuildEnvironment, Pep517HookCaller) -> str
- """Generate metadata using mechanisms described in PEP 517.
-
- Returns the generated metadata directory.
- """
- metadata_tmpdir = TempDirectory(
- kind="modern-metadata", globally_managed=True
- )
-
- metadata_dir = metadata_tmpdir.path
-
- with build_env:
- # Note that Pep517HookCaller implements a fallback for
- # prepare_metadata_for_build_wheel, so we don't have to
- # consider the possibility that this hook doesn't exist.
- runner = runner_with_spinner_message("Preparing wheel metadata")
- with backend.subprocess_runner(runner):
- distinfo_dir = backend.prepare_metadata_for_build_wheel(
- metadata_dir
- )
-
- return os.path.join(metadata_dir, distinfo_dir)
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py
deleted file mode 100644
index f46538a..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py
+++ /dev/null
@@ -1,74 +0,0 @@
-"""Metadata generation logic for legacy source distributions.
-"""
-
-import logging
-import os
-
-from pip._internal.build_env import BuildEnvironment
-from pip._internal.exceptions import InstallationError
-from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args
-from pip._internal.utils.subprocess import call_subprocess
-from pip._internal.utils.temp_dir import TempDirectory
-
-logger = logging.getLogger(__name__)
-
-
-def _find_egg_info(directory):
- # type: (str) -> str
- """Find an .egg-info subdirectory in `directory`.
- """
- filenames = [
- f for f in os.listdir(directory) if f.endswith(".egg-info")
- ]
-
- if not filenames:
- raise InstallationError(
- f"No .egg-info directory found in {directory}"
- )
-
- if len(filenames) > 1:
- raise InstallationError(
- "More than one .egg-info directory found in {}".format(
- directory
- )
- )
-
- return os.path.join(directory, filenames[0])
-
-
-def generate_metadata(
- build_env, # type: BuildEnvironment
- setup_py_path, # type: str
- source_dir, # type: str
- isolated, # type: bool
- details, # type: str
-):
- # type: (...) -> str
- """Generate metadata using setup.py-based defacto mechanisms.
-
- Returns the generated metadata directory.
- """
- logger.debug(
- 'Running setup.py (path:%s) egg_info for package %s',
- setup_py_path, details,
- )
-
- egg_info_dir = TempDirectory(
- kind="pip-egg-info", globally_managed=True
- ).path
-
- args = make_setuptools_egg_info_args(
- setup_py_path,
- egg_info_dir=egg_info_dir,
- no_user_config=isolated,
- )
-
- with build_env:
- call_subprocess(
- args,
- cwd=source_dir,
- command_desc='python setup.py egg_info',
- )
-
- # Return the .egg-info directory.
- return _find_egg_info(egg_info_dir)
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py b/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py
deleted file mode 100644
index 903bd7a..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py
+++ /dev/null
@@ -1,38 +0,0 @@
-import logging
-import os
-from typing import Optional
-
-from pip._vendor.pep517.wrappers import Pep517HookCaller
-
-from pip._internal.utils.subprocess import runner_with_spinner_message
-
-logger = logging.getLogger(__name__)
-
-
-def build_wheel_pep517(
- name, # type: str
- backend, # type: Pep517HookCaller
- metadata_directory, # type: str
- tempd, # type: str
-):
- # type: (...) -> Optional[str]
- """Build one InstallRequirement using the PEP 517 build process.
-
- Returns path to wheel if successfully built. Otherwise, returns None.
- """
- assert metadata_directory is not None
- try:
- logger.debug('Destination directory: %s', tempd)
-
- runner = runner_with_spinner_message(
- f'Building wheel for {name} (PEP 517)'
- )
- with backend.subprocess_runner(runner):
- wheel_name = backend.build_wheel(
- tempd,
- metadata_directory=metadata_directory,
- )
- except Exception:
- logger.error('Failed building wheel for %s', name)
- return None
- return os.path.join(tempd, wheel_name)
diff --git a/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py
deleted file mode 100644
index 755c3bc..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py
+++ /dev/null
@@ -1,110 +0,0 @@
-import logging
-import os.path
-from typing import List, Optional
-
-from pip._internal.cli.spinners import open_spinner
-from pip._internal.utils.setuptools_build import make_setuptools_bdist_wheel_args
-from pip._internal.utils.subprocess import (
- LOG_DIVIDER,
- call_subprocess,
- format_command_args,
-)
-
-logger = logging.getLogger(__name__)
-
-
-def format_command_result(
- command_args, # type: List[str]
- command_output, # type: str
-):
- # type: (...) -> str
- """Format command information for logging."""
- command_desc = format_command_args(command_args)
- text = f'Command arguments: {command_desc}\n'
-
- if not command_output:
- text += 'Command output: None'
- elif logger.getEffectiveLevel() > logging.DEBUG:
- text += 'Command output: [use --verbose to show]'
- else:
- if not command_output.endswith('\n'):
- command_output += '\n'
- text += f'Command output:\n{command_output}{LOG_DIVIDER}'
-
- return text
-
-
-def get_legacy_build_wheel_path(
- names, # type: List[str]
- temp_dir, # type: str
- name, # type: str
- command_args, # type: List[str]
- command_output, # type: str
-):
- # type: (...) -> Optional[str]
- """Return the path to the wheel in the temporary build directory."""
- # Sort for determinism.
- names = sorted(names)
- if not names:
- msg = (
- 'Legacy build of wheel for {!r} created no files.\n'
- ).format(name)
- msg += format_command_result(command_args, command_output)
- logger.warning(msg)
- return None
-
- if len(names) > 1:
- msg = (
- 'Legacy build of wheel for {!r} created more than one file.\n'
- 'Filenames (choosing first): {}\n'
- ).format(name, names)
- msg += format_command_result(command_args, command_output)
- logger.warning(msg)
-
- return os.path.join(temp_dir, names[0])
-
-
-def build_wheel_legacy(
- name, # type: str
- setup_py_path, # type: str
- source_dir, # type: str
- global_options, # type: List[str]
- build_options, # type: List[str]
- tempd, # type: str
-):
- # type: (...) -> Optional[str]
- """Build one unpacked package using the "legacy" build process.
-
- Returns path to wheel if successfully built. Otherwise, returns None.
- """
- wheel_args = make_setuptools_bdist_wheel_args(
- setup_py_path,
- global_options=global_options,
- build_options=build_options,
- destination_dir=tempd,
- )
-
- spin_message = f'Building wheel for {name} (setup.py)'
- with open_spinner(spin_message) as spinner:
- logger.debug('Destination directory: %s', tempd)
-
- try:
- output = call_subprocess(
- wheel_args,
- cwd=source_dir,
- spinner=spinner,
- )
- except Exception:
- spinner.finish("error")
- logger.error('Failed building wheel for %s', name)
- return None
-
- names = os.listdir(tempd)
- wheel_path = get_legacy_build_wheel_path(
- names=names,
- temp_dir=tempd,
- name=name,
- command_args=wheel_args,
- command_output=output,
- )
- return wheel_path
diff --git a/venv/Lib/site-packages/pip/_internal/operations/check.py b/venv/Lib/site-packages/pip/_internal/operations/check.py
deleted file mode 100644
index 5699c0b..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/check.py
+++ /dev/null
@@ -1,153 +0,0 @@
-"""Validation of dependencies of packages
-"""
-
-import logging
-from collections import namedtuple
-from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Set, Tuple
-
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.pkg_resources import RequirementParseError
-
-from pip._internal.distributions import make_distribution_for_install_requirement
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.misc import get_installed_distributions
-
-if TYPE_CHECKING:
- from pip._vendor.packaging.utils import NormalizedName
-
-logger = logging.getLogger(__name__)
-
-# Shorthands
-PackageSet = Dict['NormalizedName', 'PackageDetails']
-Missing = Tuple[str, Any]
-Conflicting = Tuple[str, str, Any]
-
-MissingDict = Dict['NormalizedName', List[Missing]]
-ConflictingDict = Dict['NormalizedName', List[Conflicting]]
-CheckResult = Tuple[MissingDict, ConflictingDict]
-ConflictDetails = Tuple[PackageSet, CheckResult]
-
-PackageDetails = namedtuple('PackageDetails', ['version', 'requires'])
-
-
-def create_package_set_from_installed(**kwargs: Any) -> Tuple["PackageSet", bool]:
- """Converts a list of distributions into a PackageSet.
- """
- # Default to using all packages installed on the system
- if kwargs == {}:
- kwargs = {"local_only": False, "skip": ()}
-
- package_set = {}
- problems = False
- for dist in get_installed_distributions(**kwargs):
- name = canonicalize_name(dist.project_name)
- try:
- package_set[name] = PackageDetails(dist.version, dist.requires())
- except (OSError, RequirementParseError) as e:
- # Don't crash on unreadable or broken metadata
- logger.warning("Error parsing requirements for %s: %s", name, e)
- problems = True
- return package_set, problems
-
-
-def check_package_set(package_set, should_ignore=None):
- # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult
- """Check if a package set is consistent
-
- If should_ignore is passed, it should be a callable that takes a
- package name and returns a boolean.
- """
-
- missing = {}
- conflicting = {}
-
- for package_name, package_detail in package_set.items():
- # Info about dependencies of package_name
- missing_deps = set() # type: Set[Missing]
- conflicting_deps = set() # type: Set[Conflicting]
-
- if should_ignore and should_ignore(package_name):
- continue
-
- for req in package_detail.requires:
- name = canonicalize_name(req.project_name)
-
- # Check if it's missing
- if name not in package_set:
- missed = True
- if req.marker is not None:
- missed = req.marker.evaluate()
- if missed:
- missing_deps.add((name, req))
- continue
-
- # Check if there's a conflict
- version = package_set[name].version # type: str
- if not req.specifier.contains(version, prereleases=True):
- conflicting_deps.add((name, version, req))
-
- if missing_deps:
- missing[package_name] = sorted(missing_deps, key=str)
- if conflicting_deps:
- conflicting[package_name] = sorted(conflicting_deps, key=str)
-
- return missing, conflicting
-
-
-def check_install_conflicts(to_install):
- # type: (List[InstallRequirement]) -> ConflictDetails
- """For checking if the dependency graph would be consistent after \
- installing given requirements
- """
- # Start from the current state
- package_set, _ = create_package_set_from_installed()
- # Install packages
- would_be_installed = _simulate_installation_of(to_install, package_set)
-
- # Only warn about directly-dependent packages; create a whitelist of them
- whitelist = _create_whitelist(would_be_installed, package_set)
-
- return (
- package_set,
- check_package_set(
- package_set, should_ignore=lambda name: name not in whitelist
- )
- )
-
-
-def _simulate_installation_of(to_install, package_set):
- # type: (List[InstallRequirement], PackageSet) -> Set[NormalizedName]
- """Computes the version of packages after installing to_install.
- """
-
- # Keep track of packages that were installed
- installed = set()
-
- # Modify it as installing requirement_set would (assuming no errors)
- for inst_req in to_install:
- abstract_dist = make_distribution_for_install_requirement(inst_req)
- dist = abstract_dist.get_pkg_resources_distribution()
-
- assert dist is not None
- name = canonicalize_name(dist.key)
- package_set[name] = PackageDetails(dist.version, dist.requires())
-
- installed.add(name)
-
- return installed
-
-
-def _create_whitelist(would_be_installed, package_set):
- # type: (Set[NormalizedName], PackageSet) -> Set[NormalizedName]
- packages_affected = set(would_be_installed)
-
- for package_name in package_set:
- if package_name in packages_affected:
- continue
-
- for req in package_set[package_name].requires:
- if canonicalize_name(req.name) in packages_affected:
- packages_affected.add(package_name)
- break
-
- return packages_affected
diff --git a/venv/Lib/site-packages/pip/_internal/operations/freeze.py b/venv/Lib/site-packages/pip/_internal/operations/freeze.py
deleted file mode 100644
index f34a9d4..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/freeze.py
+++ /dev/null
@@ -1,264 +0,0 @@
-import collections
-import logging
-import os
-from typing import (
- Container,
- Dict,
- Iterable,
- Iterator,
- List,
- Optional,
- Set,
- Tuple,
- Union,
-)
-
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.pkg_resources import Distribution, Requirement, RequirementParseError
-
-from pip._internal.exceptions import BadCommand, InstallationError
-from pip._internal.req.constructors import (
- install_req_from_editable,
- install_req_from_line,
-)
-from pip._internal.req.req_file import COMMENT_RE
-from pip._internal.utils.direct_url_helpers import (
- direct_url_as_pep440_direct_reference,
- dist_get_direct_url,
-)
-from pip._internal.utils.misc import dist_is_editable, get_installed_distributions
-
-logger = logging.getLogger(__name__)
-
-RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]]
-
-
-def freeze(
- requirement=None, # type: Optional[List[str]]
- find_links=None, # type: Optional[List[str]]
- local_only=False, # type: bool
- user_only=False, # type: bool
- paths=None, # type: Optional[List[str]]
- isolated=False, # type: bool
- exclude_editable=False, # type: bool
- skip=() # type: Container[str]
-):
- # type: (...) -> Iterator[str]
- find_links = find_links or []
-
- for link in find_links:
- yield f'-f {link}'
- installations = {} # type: Dict[str, FrozenRequirement]
-
- for dist in get_installed_distributions(
- local_only=local_only,
- skip=(),
- user_only=user_only,
- paths=paths
- ):
- try:
- req = FrozenRequirement.from_dist(dist)
- except RequirementParseError as exc:
- # We include dist rather than dist.project_name because the
- # dist string includes more information, like the version and
- # location. We also include the exception message to aid
- # troubleshooting.
- logger.warning(
- 'Could not generate requirement for distribution %r: %s',
- dist, exc
- )
- continue
- if exclude_editable and req.editable:
- continue
- installations[req.canonical_name] = req
-
- if requirement:
- # the options that don't get turned into an InstallRequirement
- # should only be emitted once, even if the same option is in multiple
- # requirements files, so we need to keep track of what has been emitted
- # so that we don't emit it again if it's seen again
- emitted_options = set() # type: Set[str]
- # keep track of which files a requirement is in so that we can
- # give an accurate warning if a requirement appears multiple times.
- req_files = collections.defaultdict(list) # type: Dict[str, List[str]]
- for req_file_path in requirement:
- with open(req_file_path) as req_file:
- for line in req_file:
- if (not line.strip() or
- line.strip().startswith('#') or
- line.startswith((
- '-r', '--requirement',
- '-f', '--find-links',
- '-i', '--index-url',
- '--pre',
- '--trusted-host',
- '--process-dependency-links',
- '--extra-index-url',
- '--use-feature'))):
- line = line.rstrip()
- if line not in emitted_options:
- emitted_options.add(line)
- yield line
- continue
-
- if line.startswith('-e') or line.startswith('--editable'):
- if line.startswith('-e'):
- line = line[2:].strip()
- else:
- line = line[len('--editable'):].strip().lstrip('=')
- line_req = install_req_from_editable(
- line,
- isolated=isolated,
- )
- else:
- line_req = install_req_from_line(
- COMMENT_RE.sub('', line).strip(),
- isolated=isolated,
- )
-
- if not line_req.name:
- logger.info(
- "Skipping line in requirement file [%s] because "
- "it's not clear what it would install: %s",
- req_file_path, line.strip(),
- )
- logger.info(
- " (add #egg=PackageName to the URL to avoid"
- " this warning)"
- )
- else:
- line_req_canonical_name = canonicalize_name(
- line_req.name)
- if line_req_canonical_name not in installations:
- # either it's not installed, or it is installed
- # but has been processed already
- if not req_files[line_req.name]:
- logger.warning(
- "Requirement file [%s] contains %s, but "
- "package %r is not installed",
- req_file_path,
- COMMENT_RE.sub('', line).strip(),
- line_req.name
- )
- else:
- req_files[line_req.name].append(req_file_path)
- else:
- yield str(installations[
- line_req_canonical_name]).rstrip()
- del installations[line_req_canonical_name]
- req_files[line_req.name].append(req_file_path)
-
- # Warn about requirements that were included multiple times (in a
- # single requirements file or in different requirements files).
- for name, files in req_files.items():
- if len(files) > 1:
- logger.warning("Requirement %s included multiple times [%s]",
- name, ', '.join(sorted(set(files))))
-
- yield(
- '## The following requirements were added by '
- 'pip freeze:'
- )
- for installation in sorted(
- installations.values(), key=lambda x: x.name.lower()):
- if installation.canonical_name not in skip:
- yield str(installation).rstrip()
-
-
-def get_requirement_info(dist):
- # type: (Distribution) -> RequirementInfo
- """
- Compute and return values (req, editable, comments) for use in
- FrozenRequirement.from_dist().
- """
- if not dist_is_editable(dist):
- return (None, False, [])
-
- location = os.path.normcase(os.path.abspath(dist.location))
-
- from pip._internal.vcs import RemoteNotFoundError, vcs
- vcs_backend = vcs.get_backend_for_dir(location)
-
- if vcs_backend is None:
- req = dist.as_requirement()
- logger.debug(
- 'No VCS found for editable requirement "%s" in: %r', req,
- location,
- )
- comments = [
- f'# Editable install with no version control ({req})'
- ]
- return (location, True, comments)
-
- try:
- req = vcs_backend.get_src_requirement(location, dist.project_name)
- except RemoteNotFoundError:
- req = dist.as_requirement()
- comments = [
- '# Editable {} install with no remote ({})'.format(
- type(vcs_backend).__name__, req,
- )
- ]
- return (location, True, comments)
-
- except BadCommand:
- logger.warning(
- 'cannot determine version of editable source in %s '
- '(%s command not found in path)',
- location,
- vcs_backend.name,
- )
- return (None, True, [])
-
- except InstallationError as exc:
- logger.warning(
- "Error when trying to get requirement for VCS system %s, "
- "falling back to uneditable format", exc
- )
- else:
- return (req, True, [])
-
- logger.warning(
- 'Could not determine repository location of %s', location
- )
- comments = ['## !! Could not determine repository location']
-
- return (None, False, comments)
-
-
-class FrozenRequirement:
- def __init__(self, name, req, editable, comments=()):
- # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None
- self.name = name
- self.canonical_name = canonicalize_name(name)
- self.req = req
- self.editable = editable
- self.comments = comments
-
- @classmethod
- def from_dist(cls, dist):
- # type: (Distribution) -> FrozenRequirement
- # TODO `get_requirement_info` is taking care of editable requirements.
- # TODO This should be refactored when we will add detection of
- # editable that provide .dist-info metadata.
- req, editable, comments = get_requirement_info(dist)
- if req is None and not editable:
- # if PEP 610 metadata is present, attempt to use it
- direct_url = dist_get_direct_url(dist)
- if direct_url:
- req = direct_url_as_pep440_direct_reference(
- direct_url, dist.project_name
- )
- comments = []
- if req is None:
- # name==version requirement
- req = dist.as_requirement()
-
- return cls(dist.project_name, req, editable, comments=comments)
-
- def __str__(self):
- # type: () -> str
- req = self.req
- if self.editable:
- req = f'-e {req}'
- return '\n'.join(list(self.comments) + [str(req)]) + '\n'
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py
deleted file mode 100644
index 24d6a5d..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-"""For modules related to installing packages.
-"""
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 0a4818b..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc
deleted file mode 100644
index 5f2be89..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc
deleted file mode 100644
index 300e8a4..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-39.pyc
deleted file mode 100644
index 95f29b1..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py
deleted file mode 100644
index 6882c47..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py
+++ /dev/null
@@ -1,47 +0,0 @@
-"""Legacy editable installation process, i.e. `setup.py develop`.
-"""
-import logging
-from typing import List, Optional, Sequence
-
-from pip._internal.build_env import BuildEnvironment
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.setuptools_build import make_setuptools_develop_args
-from pip._internal.utils.subprocess import call_subprocess
-
-logger = logging.getLogger(__name__)
-
-
-def install_editable(
- install_options, # type: List[str]
- global_options, # type: Sequence[str]
- prefix, # type: Optional[str]
- home, # type: Optional[str]
- use_user_site, # type: bool
- name, # type: str
- setup_py_path, # type: str
- isolated, # type: bool
- build_env, # type: BuildEnvironment
- unpacked_source_directory, # type: str
-):
- # type: (...) -> None
- """Install a package in editable mode. Most arguments are pass-through
- to setuptools.
- """
- logger.info('Running setup.py develop for %s', name)
-
- args = make_setuptools_develop_args(
- setup_py_path,
- global_options=global_options,
- install_options=install_options,
- no_user_config=isolated,
- prefix=prefix,
- home=home,
- use_user_site=use_user_site,
- )
-
- with indent_log():
- with build_env:
- call_subprocess(
- args,
- cwd=unpacked_source_directory,
- )
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py b/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py
deleted file mode 100644
index 41d0c1f..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py
+++ /dev/null
@@ -1,125 +0,0 @@
-"""Legacy installation process, i.e. `setup.py install`.
-"""
-
-import logging
-import os
-import sys
-from distutils.util import change_root
-from typing import List, Optional, Sequence
-
-from pip._internal.build_env import BuildEnvironment
-from pip._internal.exceptions import InstallationError
-from pip._internal.models.scheme import Scheme
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import ensure_dir
-from pip._internal.utils.setuptools_build import make_setuptools_install_args
-from pip._internal.utils.subprocess import runner_with_spinner_message
-from pip._internal.utils.temp_dir import TempDirectory
-
-logger = logging.getLogger(__name__)
-
-
-class LegacyInstallFailure(Exception):
- def __init__(self):
- # type: () -> None
- self.parent = sys.exc_info()
-
-
-def install(
- install_options, # type: List[str]
- global_options, # type: Sequence[str]
- root, # type: Optional[str]
- home, # type: Optional[str]
- prefix, # type: Optional[str]
- use_user_site, # type: bool
- pycompile, # type: bool
- scheme, # type: Scheme
- setup_py_path, # type: str
- isolated, # type: bool
- req_name, # type: str
- build_env, # type: BuildEnvironment
- unpacked_source_directory, # type: str
- req_description, # type: str
-):
- # type: (...) -> bool
-
- header_dir = scheme.headers
-
- with TempDirectory(kind="record") as temp_dir:
- try:
- record_filename = os.path.join(temp_dir.path, 'install-record.txt')
- install_args = make_setuptools_install_args(
- setup_py_path,
- global_options=global_options,
- install_options=install_options,
- record_filename=record_filename,
- root=root,
- prefix=prefix,
- header_dir=header_dir,
- home=home,
- use_user_site=use_user_site,
- no_user_config=isolated,
- pycompile=pycompile,
- )
-
- runner = runner_with_spinner_message(
- f"Running setup.py install for {req_name}"
- )
- with indent_log(), build_env:
- runner(
- cmd=install_args,
- cwd=unpacked_source_directory,
- )
-
- if not os.path.exists(record_filename):
- logger.debug('Record file %s not found', record_filename)
- # Signal to the caller that we didn't install the new package
- return False
-
- except Exception:
- # Signal to the caller that we didn't install the new package
- raise LegacyInstallFailure
-
- # At this point, we have successfully installed the requirement.
-
- # We intentionally do not use any encoding to read the file because
- # setuptools writes the file using distutils.file_util.write_file,
- # which does not specify an encoding.
- with open(record_filename) as f:
- record_lines = f.read().splitlines()
-
- def prepend_root(path):
- # type: (str) -> str
- if root is None or not os.path.isabs(path):
- return path
- else:
- return change_root(root, path)
-
- for line in record_lines:
- directory = os.path.dirname(line)
- if directory.endswith('.egg-info'):
- egg_info_dir = prepend_root(directory)
- break
- else:
- message = (
- "{} did not indicate that it installed an "
- ".egg-info directory. Only setup.py projects "
- "generating .egg-info directories are supported."
- ).format(req_description)
- raise InstallationError(message)
-
- new_lines = []
- for line in record_lines:
- filename = line.strip()
- if os.path.isdir(filename):
- filename += os.path.sep
- new_lines.append(
- os.path.relpath(prepend_root(filename), egg_info_dir)
- )
- new_lines.sort()
- ensure_dir(egg_info_dir)
- inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt')
- with open(inst_files_path, 'w') as f:
- f.write('\n'.join(new_lines) + '\n')
-
- return True
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py b/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py
deleted file mode 100644
index 10e5b15..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py
+++ /dev/null
@@ -1,819 +0,0 @@
-"""Support for installing and building the "wheel" binary package format.
-"""
-
-import collections
-import compileall
-import contextlib
-import csv
-import importlib
-import logging
-import os.path
-import re
-import shutil
-import sys
-import warnings
-from base64 import urlsafe_b64encode
-from email.message import Message
-from itertools import chain, filterfalse, starmap
-from typing import (
- IO,
- TYPE_CHECKING,
- Any,
- BinaryIO,
- Callable,
- Dict,
- Iterable,
- Iterator,
- List,
- NewType,
- Optional,
- Sequence,
- Set,
- Tuple,
- Union,
- cast,
-)
-from zipfile import ZipFile, ZipInfo
-
-from pip._vendor import pkg_resources
-from pip._vendor.distlib.scripts import ScriptMaker
-from pip._vendor.distlib.util import get_export_entry
-from pip._vendor.pkg_resources import Distribution
-from pip._vendor.six import ensure_str, ensure_text, reraise
-
-from pip._internal.exceptions import InstallationError
-from pip._internal.locations import get_major_minor_version
-from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl
-from pip._internal.models.scheme import SCHEME_KEYS, Scheme
-from pip._internal.utils.filesystem import adjacent_tmp_file, replace
-from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file, partition
-from pip._internal.utils.unpacking import (
- current_umask,
- is_within_directory,
- set_extracted_file_to_default_mode_plus_executable,
- zip_item_is_executable,
-)
-from pip._internal.utils.wheel import parse_wheel, pkg_resources_distribution_for_wheel
-
-if TYPE_CHECKING:
- from typing import Protocol
-
- class File(Protocol):
- src_record_path = None # type: RecordPath
- dest_path = None # type: str
- changed = None # type: bool
-
- def save(self):
- # type: () -> None
- pass
-
-
-logger = logging.getLogger(__name__)
-
-RecordPath = NewType('RecordPath', str)
-InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]]
-
-
-def rehash(path, blocksize=1 << 20):
- # type: (str, int) -> Tuple[str, str]
- """Return (encoded_digest, length) for path using hashlib.sha256()"""
- h, length = hash_file(path, blocksize)
- digest = 'sha256=' + urlsafe_b64encode(
- h.digest()
- ).decode('latin1').rstrip('=')
- return (digest, str(length))
-
-
-def csv_io_kwargs(mode):
- # type: (str) -> Dict[str, Any]
- """Return keyword arguments to properly open a CSV file
- in the given mode.
- """
- return {'mode': mode, 'newline': '', 'encoding': 'utf-8'}
-
-
-def fix_script(path):
- # type: (str) -> bool
- """Replace #!python with #!/path/to/python
- Return True if file was changed.
- """
- # XXX RECORD hashes will need to be updated
- assert os.path.isfile(path)
-
- with open(path, 'rb') as script:
- firstline = script.readline()
- if not firstline.startswith(b'#!python'):
- return False
- exename = sys.executable.encode(sys.getfilesystemencoding())
- firstline = b'#!' + exename + os.linesep.encode("ascii")
- rest = script.read()
- with open(path, 'wb') as script:
- script.write(firstline)
- script.write(rest)
- return True
-
-
-def wheel_root_is_purelib(metadata):
- # type: (Message) -> bool
- return metadata.get("Root-Is-Purelib", "").lower() == "true"
-
-
-def get_entrypoints(distribution):
- # type: (Distribution) -> Tuple[Dict[str, str], Dict[str, str]]
- # get the entry points and then the script names
- try:
- console = distribution.get_entry_map('console_scripts')
- gui = distribution.get_entry_map('gui_scripts')
- except KeyError:
- # Our dict-based Distribution raises KeyError if entry_points.txt
- # doesn't exist.
- return {}, {}
-
- def _split_ep(s):
- # type: (pkg_resources.EntryPoint) -> Tuple[str, str]
- """get the string representation of EntryPoint,
- remove space and split on '='
- """
- split_parts = str(s).replace(" ", "").split("=")
- return split_parts[0], split_parts[1]
-
- # convert the EntryPoint objects into strings with module:function
- console = dict(_split_ep(v) for v in console.values())
- gui = dict(_split_ep(v) for v in gui.values())
- return console, gui
-
-
-def message_about_scripts_not_on_PATH(scripts):
- # type: (Sequence[str]) -> Optional[str]
- """Determine if any scripts are not on PATH and format a warning.
- Returns a warning message if one or more scripts are not on PATH,
- otherwise None.
- """
- if not scripts:
- return None
-
- # Group scripts by the path they were installed in
- grouped_by_dir = collections.defaultdict(set) # type: Dict[str, Set[str]]
- for destfile in scripts:
- parent_dir = os.path.dirname(destfile)
- script_name = os.path.basename(destfile)
- grouped_by_dir[parent_dir].add(script_name)
-
- # We don't want to warn for directories that are on PATH.
- not_warn_dirs = [
- os.path.normcase(i).rstrip(os.sep) for i in
- os.environ.get("PATH", "").split(os.pathsep)
- ]
- # If an executable sits with sys.executable, we don't warn for it.
- # This covers the case of venv invocations without activating the venv.
- not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable)))
- warn_for = {
- parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items()
- if os.path.normcase(parent_dir) not in not_warn_dirs
- } # type: Dict[str, Set[str]]
- if not warn_for:
- return None
-
- # Format a message
- msg_lines = []
- for parent_dir, dir_scripts in warn_for.items():
- sorted_scripts = sorted(dir_scripts) # type: List[str]
- if len(sorted_scripts) == 1:
- start_text = "script {} is".format(sorted_scripts[0])
- else:
- start_text = "scripts {} are".format(
- ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1]
- )
-
- msg_lines.append(
- "The {} installed in '{}' which is not on PATH."
- .format(start_text, parent_dir)
- )
-
- last_line_fmt = (
- "Consider adding {} to PATH or, if you prefer "
- "to suppress this warning, use --no-warn-script-location."
- )
- if len(msg_lines) == 1:
- msg_lines.append(last_line_fmt.format("this directory"))
- else:
- msg_lines.append(last_line_fmt.format("these directories"))
-
- # Add a note if any directory starts with ~
- warn_for_tilde = any(
- i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i
- )
- if warn_for_tilde:
- tilde_warning_msg = (
- "NOTE: The current PATH contains path(s) starting with `~`, "
- "which may not be expanded by all applications."
- )
- msg_lines.append(tilde_warning_msg)
-
- # Returns the formatted multiline message
- return "\n".join(msg_lines)
-
-
-def _normalized_outrows(outrows):
- # type: (Iterable[InstalledCSVRow]) -> List[Tuple[str, str, str]]
- """Normalize the given rows of a RECORD file.
-
- Items in each row are converted into str. Rows are then sorted to make
- the value more predictable for tests.
-
- Each row is a 3-tuple (path, hash, size) and corresponds to a record of
- a RECORD file (see PEP 376 and PEP 427 for details). For the rows
- passed to this function, the size can be an integer as an int or string,
- or the empty string.
- """
- # Normally, there should only be one row per path, in which case the
- # second and third elements don't come into play when sorting.
- # However, in cases in the wild where a path might happen to occur twice,
- # we don't want the sort operation to trigger an error (but still want
- # determinism). Since the third element can be an int or string, we
- # coerce each element to a string to avoid a TypeError in this case.
- # For additional background, see--
- # https://github.com/pypa/pip/issues/5868
- return sorted(
- (ensure_str(record_path, encoding='utf-8'), hash_, str(size))
- for record_path, hash_, size in outrows
- )
-
-
-def _record_to_fs_path(record_path):
- # type: (RecordPath) -> str
- return record_path
-
-
-def _fs_to_record_path(path, relative_to=None):
- # type: (str, Optional[str]) -> RecordPath
- if relative_to is not None:
- # On Windows, do not handle relative paths if they belong to different
- # logical disks
- if os.path.splitdrive(path)[0].lower() == \
- os.path.splitdrive(relative_to)[0].lower():
- path = os.path.relpath(path, relative_to)
- path = path.replace(os.path.sep, '/')
- return cast('RecordPath', path)
-
-
-def _parse_record_path(record_column):
- # type: (str) -> RecordPath
- p = ensure_text(record_column, encoding='utf-8')
- return cast('RecordPath', p)
-
-
-def get_csv_rows_for_installed(
- old_csv_rows, # type: List[List[str]]
- installed, # type: Dict[RecordPath, RecordPath]
- changed, # type: Set[RecordPath]
- generated, # type: List[str]
- lib_dir, # type: str
-):
- # type: (...) -> List[InstalledCSVRow]
- """
- :param installed: A map from archive RECORD path to installation RECORD
- path.
- """
- installed_rows = [] # type: List[InstalledCSVRow]
- for row in old_csv_rows:
- if len(row) > 3:
- logger.warning('RECORD line has more than three elements: %s', row)
- old_record_path = _parse_record_path(row[0])
- new_record_path = installed.pop(old_record_path, old_record_path)
- if new_record_path in changed:
- digest, length = rehash(_record_to_fs_path(new_record_path))
- else:
- digest = row[1] if len(row) > 1 else ''
- length = row[2] if len(row) > 2 else ''
- installed_rows.append((new_record_path, digest, length))
- for f in generated:
- path = _fs_to_record_path(f, lib_dir)
- digest, length = rehash(f)
- installed_rows.append((path, digest, length))
- for installed_record_path in installed.values():
- installed_rows.append((installed_record_path, '', ''))
- return installed_rows
-
-
-def get_console_script_specs(console):
- # type: (Dict[str, str]) -> List[str]
- """
- Given the mapping from entrypoint name to callable, return the relevant
- console script specs.
- """
- # Don't mutate caller's version
- console = console.copy()
-
- scripts_to_generate = []
-
- # Special case pip and setuptools to generate versioned wrappers
- #
- # The issue is that some projects (specifically, pip and setuptools) use
- # code in setup.py to create "versioned" entry points - pip2.7 on Python
- # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into
- # the wheel metadata at build time, and so if the wheel is installed with
- # a *different* version of Python the entry points will be wrong. The
- # correct fix for this is to enhance the metadata to be able to describe
- # such versioned entry points, but that won't happen till Metadata 2.0 is
- # available.
- # In the meantime, projects using versioned entry points will either have
- # incorrect versioned entry points, or they will not be able to distribute
- # "universal" wheels (i.e., they will need a wheel per Python version).
- #
- # Because setuptools and pip are bundled with _ensurepip and virtualenv,
- # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
- # override the versioned entry points in the wheel and generate the
- # correct ones. This code is purely a short-term measure until Metadata 2.0
- # is available.
- #
- # To add the level of hack in this section of code, in order to support
- # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment
- # variable which will control which version scripts get installed.
- #
- # ENSUREPIP_OPTIONS=altinstall
- # - Only pipX.Y and easy_install-X.Y will be generated and installed
- # ENSUREPIP_OPTIONS=install
- # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note
- # that this option is technically if ENSUREPIP_OPTIONS is set and is
- # not altinstall
- # DEFAULT
- # - The default behavior is to install pip, pipX, pipX.Y, easy_install
- # and easy_install-X.Y.
- pip_script = console.pop('pip', None)
- if pip_script:
- if "ENSUREPIP_OPTIONS" not in os.environ:
- scripts_to_generate.append('pip = ' + pip_script)
-
- if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall":
- scripts_to_generate.append(
- 'pip{} = {}'.format(sys.version_info[0], pip_script)
- )
-
- scripts_to_generate.append(
- f'pip{get_major_minor_version()} = {pip_script}'
- )
- # Delete any other versioned pip entry points
- pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)]
- for k in pip_ep:
- del console[k]
- easy_install_script = console.pop('easy_install', None)
- if easy_install_script:
- if "ENSUREPIP_OPTIONS" not in os.environ:
- scripts_to_generate.append(
- 'easy_install = ' + easy_install_script
- )
-
- scripts_to_generate.append(
- 'easy_install-{} = {}'.format(
- get_major_minor_version(), easy_install_script
- )
- )
- # Delete any other versioned easy_install entry points
- easy_install_ep = [
- k for k in console if re.match(r'easy_install(-\d\.\d)?$', k)
- ]
- for k in easy_install_ep:
- del console[k]
-
- # Generate the console entry points specified in the wheel
- scripts_to_generate.extend(starmap('{} = {}'.format, console.items()))
-
- return scripts_to_generate
-
-
-class ZipBackedFile:
- def __init__(self, src_record_path, dest_path, zip_file):
- # type: (RecordPath, str, ZipFile) -> None
- self.src_record_path = src_record_path
- self.dest_path = dest_path
- self._zip_file = zip_file
- self.changed = False
-
- def _getinfo(self):
- # type: () -> ZipInfo
- return self._zip_file.getinfo(self.src_record_path)
-
- def save(self):
- # type: () -> None
- # directory creation is lazy and after file filtering
- # to ensure we don't install empty dirs; empty dirs can't be
- # uninstalled.
- parent_dir = os.path.dirname(self.dest_path)
- ensure_dir(parent_dir)
-
- # When we open the output file below, any existing file is truncated
- # before we start writing the new contents. This is fine in most
- # cases, but can cause a segfault if pip has loaded a shared
- # object (e.g. from pyopenssl through its vendored urllib3)
- # Since the shared object is mmap'd an attempt to call a
- # symbol in it will then cause a segfault. Unlinking the file
- # allows writing of new contents while allowing the process to
- # continue to use the old copy.
- if os.path.exists(self.dest_path):
- os.unlink(self.dest_path)
-
- zipinfo = self._getinfo()
-
- with self._zip_file.open(zipinfo) as f:
- with open(self.dest_path, "wb") as dest:
- shutil.copyfileobj(f, dest)
-
- if zip_item_is_executable(zipinfo):
- set_extracted_file_to_default_mode_plus_executable(self.dest_path)
-
-
-class ScriptFile:
- def __init__(self, file):
- # type: (File) -> None
- self._file = file
- self.src_record_path = self._file.src_record_path
- self.dest_path = self._file.dest_path
- self.changed = False
-
- def save(self):
- # type: () -> None
- self._file.save()
- self.changed = fix_script(self.dest_path)
-
-
-class MissingCallableSuffix(InstallationError):
- def __init__(self, entry_point):
- # type: (str) -> None
- super().__init__(
- "Invalid script entry point: {} - A callable "
- "suffix is required. Cf https://packaging.python.org/"
- "specifications/entry-points/#use-for-scripts for more "
- "information.".format(entry_point)
- )
-
-
-def _raise_for_invalid_entrypoint(specification):
- # type: (str) -> None
- entry = get_export_entry(specification)
- if entry is not None and entry.suffix is None:
- raise MissingCallableSuffix(str(entry))
-
-
-class PipScriptMaker(ScriptMaker):
- def make(self, specification, options=None):
- # type: (str, Dict[str, Any]) -> List[str]
- _raise_for_invalid_entrypoint(specification)
- return super().make(specification, options)
-
-
-def _install_wheel(
- name, # type: str
- wheel_zip, # type: ZipFile
- wheel_path, # type: str
- scheme, # type: Scheme
- pycompile=True, # type: bool
- warn_script_location=True, # type: bool
- direct_url=None, # type: Optional[DirectUrl]
- requested=False, # type: bool
-):
- # type: (...) -> None
- """Install a wheel.
-
- :param name: Name of the project to install
- :param wheel_zip: open ZipFile for wheel being installed
- :param scheme: Distutils scheme dictating the install directories
- :param req_description: String used in place of the requirement, for
- logging
- :param pycompile: Whether to byte-compile installed Python files
- :param warn_script_location: Whether to check that scripts are installed
- into a directory on PATH
- :raises UnsupportedWheel:
- * when the directory holds an unpacked wheel with incompatible
- Wheel-Version
- * when the .dist-info dir does not match the wheel
- """
- info_dir, metadata = parse_wheel(wheel_zip, name)
-
- if wheel_root_is_purelib(metadata):
- lib_dir = scheme.purelib
- else:
- lib_dir = scheme.platlib
-
- # Record details of the files moved
- # installed = files copied from the wheel to the destination
- # changed = files changed while installing (scripts #! line typically)
- # generated = files newly generated during the install (script wrappers)
- installed = {} # type: Dict[RecordPath, RecordPath]
- changed = set() # type: Set[RecordPath]
- generated = [] # type: List[str]
-
- def record_installed(srcfile, destfile, modified=False):
- # type: (RecordPath, str, bool) -> None
- """Map archive RECORD paths to installation RECORD paths."""
- newpath = _fs_to_record_path(destfile, lib_dir)
- installed[srcfile] = newpath
- if modified:
- changed.add(_fs_to_record_path(destfile))
-
- def all_paths():
- # type: () -> Iterable[RecordPath]
- names = wheel_zip.namelist()
- # If a flag is set, names may be unicode in Python 2. We convert to
- # text explicitly so these are valid for lookup in RECORD.
- decoded_names = map(ensure_text, names)
- for name in decoded_names:
- yield cast("RecordPath", name)
-
- def is_dir_path(path):
- # type: (RecordPath) -> bool
- return path.endswith("/")
-
- def assert_no_path_traversal(dest_dir_path, target_path):
- # type: (str, str) -> None
- if not is_within_directory(dest_dir_path, target_path):
- message = (
- "The wheel {!r} has a file {!r} trying to install"
- " outside the target directory {!r}"
- )
- raise InstallationError(
- message.format(wheel_path, target_path, dest_dir_path)
- )
-
- def root_scheme_file_maker(zip_file, dest):
- # type: (ZipFile, str) -> Callable[[RecordPath], File]
- def make_root_scheme_file(record_path):
- # type: (RecordPath) -> File
- normed_path = os.path.normpath(record_path)
- dest_path = os.path.join(dest, normed_path)
- assert_no_path_traversal(dest, dest_path)
- return ZipBackedFile(record_path, dest_path, zip_file)
-
- return make_root_scheme_file
-
- def data_scheme_file_maker(zip_file, scheme):
- # type: (ZipFile, Scheme) -> Callable[[RecordPath], File]
- scheme_paths = {}
- for key in SCHEME_KEYS:
- encoded_key = ensure_text(key)
- scheme_paths[encoded_key] = ensure_text(
- getattr(scheme, key), encoding=sys.getfilesystemencoding()
- )
-
- def make_data_scheme_file(record_path):
- # type: (RecordPath) -> File
- normed_path = os.path.normpath(record_path)
- try:
- _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2)
- except ValueError:
- message = (
- "Unexpected file in {}: {!r}. .data directory contents"
- " should be named like: '/'."
- ).format(wheel_path, record_path)
- raise InstallationError(message)
-
- try:
- scheme_path = scheme_paths[scheme_key]
- except KeyError:
- valid_scheme_keys = ", ".join(sorted(scheme_paths))
- message = (
- "Unknown scheme key used in {}: {} (for file {!r}). .data"
- " directory contents should be in subdirectories named"
- " with a valid scheme key ({})"
- ).format(
- wheel_path, scheme_key, record_path, valid_scheme_keys
- )
- raise InstallationError(message)
-
- dest_path = os.path.join(scheme_path, dest_subpath)
- assert_no_path_traversal(scheme_path, dest_path)
- return ZipBackedFile(record_path, dest_path, zip_file)
-
- return make_data_scheme_file
-
- def is_data_scheme_path(path):
- # type: (RecordPath) -> bool
- return path.split("/", 1)[0].endswith(".data")
-
- paths = all_paths()
- file_paths = filterfalse(is_dir_path, paths)
- root_scheme_paths, data_scheme_paths = partition(
- is_data_scheme_path, file_paths
- )
-
- make_root_scheme_file = root_scheme_file_maker(
- wheel_zip,
- ensure_text(lib_dir, encoding=sys.getfilesystemencoding()),
- )
- files = map(make_root_scheme_file, root_scheme_paths)
-
- def is_script_scheme_path(path):
- # type: (RecordPath) -> bool
- parts = path.split("/", 2)
- return (
- len(parts) > 2 and
- parts[0].endswith(".data") and
- parts[1] == "scripts"
- )
-
- other_scheme_paths, script_scheme_paths = partition(
- is_script_scheme_path, data_scheme_paths
- )
-
- make_data_scheme_file = data_scheme_file_maker(wheel_zip, scheme)
- other_scheme_files = map(make_data_scheme_file, other_scheme_paths)
- files = chain(files, other_scheme_files)
-
- # Get the defined entry points
- distribution = pkg_resources_distribution_for_wheel(
- wheel_zip, name, wheel_path
- )
- console, gui = get_entrypoints(distribution)
-
- def is_entrypoint_wrapper(file):
- # type: (File) -> bool
- # EP, EP.exe and EP-script.py are scripts generated for
- # entry point EP by setuptools
- path = file.dest_path
- name = os.path.basename(path)
- if name.lower().endswith('.exe'):
- matchname = name[:-4]
- elif name.lower().endswith('-script.py'):
- matchname = name[:-10]
- elif name.lower().endswith(".pya"):
- matchname = name[:-4]
- else:
- matchname = name
- # Ignore setuptools-generated scripts
- return (matchname in console or matchname in gui)
-
- script_scheme_files = map(make_data_scheme_file, script_scheme_paths)
- script_scheme_files = filterfalse(
- is_entrypoint_wrapper, script_scheme_files
- )
- script_scheme_files = map(ScriptFile, script_scheme_files)
- files = chain(files, script_scheme_files)
-
- for file in files:
- file.save()
- record_installed(file.src_record_path, file.dest_path, file.changed)
-
- def pyc_source_file_paths():
- # type: () -> Iterator[str]
- # We de-duplicate installation paths, since there can be overlap (e.g.
- # file in .data maps to same location as file in wheel root).
- # Sorting installation paths makes it easier to reproduce and debug
- # issues related to permissions on existing files.
- for installed_path in sorted(set(installed.values())):
- full_installed_path = os.path.join(lib_dir, installed_path)
- if not os.path.isfile(full_installed_path):
- continue
- if not full_installed_path.endswith('.py'):
- continue
- yield full_installed_path
-
- def pyc_output_path(path):
- # type: (str) -> str
- """Return the path the pyc file would have been written to.
- """
- return importlib.util.cache_from_source(path)
-
- # Compile all of the pyc files for the installed files
- if pycompile:
- with captured_stdout() as stdout:
- with warnings.catch_warnings():
- warnings.filterwarnings('ignore')
- for path in pyc_source_file_paths():
- # Python 2's `compileall.compile_file` requires a str in
- # error cases, so we must convert to the native type.
- path_arg = ensure_str(
- path, encoding=sys.getfilesystemencoding()
- )
- success = compileall.compile_file(
- path_arg, force=True, quiet=True
- )
- if success:
- pyc_path = pyc_output_path(path)
- assert os.path.exists(pyc_path)
- pyc_record_path = cast(
- "RecordPath", pyc_path.replace(os.path.sep, "/")
- )
- record_installed(pyc_record_path, pyc_path)
- logger.debug(stdout.getvalue())
-
- maker = PipScriptMaker(None, scheme.scripts)
-
- # Ensure old scripts are overwritten.
- # See https://github.com/pypa/pip/issues/1800
- maker.clobber = True
-
- # Ensure we don't generate any variants for scripts because this is almost
- # never what somebody wants.
- # See https://bitbucket.org/pypa/distlib/issue/35/
- maker.variants = {''}
-
- # This is required because otherwise distlib creates scripts that are not
- # executable.
- # See https://bitbucket.org/pypa/distlib/issue/32/
- maker.set_mode = True
-
- # Generate the console and GUI entry points specified in the wheel
- scripts_to_generate = get_console_script_specs(console)
-
- gui_scripts_to_generate = list(starmap('{} = {}'.format, gui.items()))
-
- generated_console_scripts = maker.make_multiple(scripts_to_generate)
- generated.extend(generated_console_scripts)
-
- generated.extend(
- maker.make_multiple(gui_scripts_to_generate, {'gui': True})
- )
-
- if warn_script_location:
- msg = message_about_scripts_not_on_PATH(generated_console_scripts)
- if msg is not None:
- logger.warning(msg)
-
- generated_file_mode = 0o666 & ~current_umask()
-
- @contextlib.contextmanager
- def _generate_file(path, **kwargs):
- # type: (str, **Any) -> Iterator[BinaryIO]
- with adjacent_tmp_file(path, **kwargs) as f:
- yield f
- os.chmod(f.name, generated_file_mode)
- replace(f.name, path)
-
- dest_info_dir = os.path.join(lib_dir, info_dir)
-
- # Record pip as the installer
- installer_path = os.path.join(dest_info_dir, 'INSTALLER')
- with _generate_file(installer_path) as installer_file:
- installer_file.write(b'pip\n')
- generated.append(installer_path)
-
- # Record the PEP 610 direct URL reference
- if direct_url is not None:
- direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME)
- with _generate_file(direct_url_path) as direct_url_file:
- direct_url_file.write(direct_url.to_json().encode("utf-8"))
- generated.append(direct_url_path)
-
- # Record the REQUESTED file
- if requested:
- requested_path = os.path.join(dest_info_dir, 'REQUESTED')
- with open(requested_path, "wb"):
- pass
- generated.append(requested_path)
-
- record_text = distribution.get_metadata('RECORD')
- record_rows = list(csv.reader(record_text.splitlines()))
-
- rows = get_csv_rows_for_installed(
- record_rows,
- installed=installed,
- changed=changed,
- generated=generated,
- lib_dir=lib_dir)
-
- # Record details of all files installed
- record_path = os.path.join(dest_info_dir, 'RECORD')
-
- with _generate_file(record_path, **csv_io_kwargs('w')) as record_file:
- # The type mypy infers for record_file is different for Python 3
- # (typing.IO[Any]) and Python 2 (typing.BinaryIO). We explicitly
- # cast to typing.IO[str] as a workaround.
- writer = csv.writer(cast('IO[str]', record_file))
- writer.writerows(_normalized_outrows(rows))
-
-
-@contextlib.contextmanager
-def req_error_context(req_description):
- # type: (str) -> Iterator[None]
- try:
- yield
- except InstallationError as e:
- message = "For req: {}. {}".format(req_description, e.args[0])
- reraise(
- InstallationError, InstallationError(message), sys.exc_info()[2]
- )
-
-
-def install_wheel(
- name, # type: str
- wheel_path, # type: str
- scheme, # type: Scheme
- req_description, # type: str
- pycompile=True, # type: bool
- warn_script_location=True, # type: bool
- direct_url=None, # type: Optional[DirectUrl]
- requested=False, # type: bool
-):
- # type: (...) -> None
- with ZipFile(wheel_path, allowZip64=True) as z:
- with req_error_context(req_description):
- _install_wheel(
- name=name,
- wheel_zip=z,
- wheel_path=wheel_path,
- scheme=scheme,
- pycompile=pycompile,
- warn_script_location=warn_script_location,
- direct_url=direct_url,
- requested=requested,
- )
diff --git a/venv/Lib/site-packages/pip/_internal/operations/prepare.py b/venv/Lib/site-packages/pip/_internal/operations/prepare.py
deleted file mode 100644
index 3d074f9..0000000
--- a/venv/Lib/site-packages/pip/_internal/operations/prepare.py
+++ /dev/null
@@ -1,655 +0,0 @@
-"""Prepares a distribution for installation
-"""
-
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-import logging
-import mimetypes
-import os
-import shutil
-from typing import Dict, Iterable, List, Optional, Tuple
-
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.distributions import make_distribution_for_install_requirement
-from pip._internal.distributions.installed import InstalledDistribution
-from pip._internal.exceptions import (
- DirectoryUrlHashUnsupported,
- HashMismatch,
- HashUnpinned,
- InstallationError,
- NetworkConnectionError,
- PreviousBuildDirError,
- VcsHashUnsupported,
-)
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.models.link import Link
-from pip._internal.models.wheel import Wheel
-from pip._internal.network.download import BatchDownloader, Downloader
-from pip._internal.network.lazy_wheel import (
- HTTPRangeRequestUnsupported,
- dist_from_wheel_url,
-)
-from pip._internal.network.session import PipSession
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.req.req_tracker import RequirementTracker
-from pip._internal.utils.deprecation import deprecated
-from pip._internal.utils.filesystem import copy2_fixed
-from pip._internal.utils.hashes import Hashes, MissingHashes
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import display_path, hide_url, rmtree
-from pip._internal.utils.temp_dir import TempDirectory
-from pip._internal.utils.unpacking import unpack_file
-from pip._internal.vcs import vcs
-
-logger = logging.getLogger(__name__)
-
-
-def _get_prepared_distribution(
- req, # type: InstallRequirement
- req_tracker, # type: RequirementTracker
- finder, # type: PackageFinder
- build_isolation, # type: bool
-):
- # type: (...) -> Distribution
- """Prepare a distribution for installation."""
- abstract_dist = make_distribution_for_install_requirement(req)
- with req_tracker.track(req):
- abstract_dist.prepare_distribution_metadata(finder, build_isolation)
- return abstract_dist.get_pkg_resources_distribution()
-
-
-def unpack_vcs_link(link, location):
- # type: (Link, str) -> None
- vcs_backend = vcs.get_backend_for_scheme(link.scheme)
- assert vcs_backend is not None
- vcs_backend.unpack(location, url=hide_url(link.url))
-
-
-class File:
-
- def __init__(self, path, content_type):
- # type: (str, Optional[str]) -> None
- self.path = path
- if content_type is None:
- self.content_type = mimetypes.guess_type(path)[0]
- else:
- self.content_type = content_type
-
-
-def get_http_url(
- link, # type: Link
- download, # type: Downloader
- download_dir=None, # type: Optional[str]
- hashes=None, # type: Optional[Hashes]
-):
- # type: (...) -> File
- temp_dir = TempDirectory(kind="unpack", globally_managed=True)
- # If a download dir is specified, is the file already downloaded there?
- already_downloaded_path = None
- if download_dir:
- already_downloaded_path = _check_download_dir(
- link, download_dir, hashes
- )
-
- if already_downloaded_path:
- from_path = already_downloaded_path
- content_type = None
- else:
- # let's download to a tmp dir
- from_path, content_type = download(link, temp_dir.path)
- if hashes:
- hashes.check_against_path(from_path)
-
- return File(from_path, content_type)
-
-
-def _copy2_ignoring_special_files(src, dest):
- # type: (str, str) -> None
- """Copying special files is not supported, but as a convenience to users
- we skip errors copying them. This supports tools that may create e.g.
- socket files in the project source directory.
- """
- try:
- copy2_fixed(src, dest)
- except shutil.SpecialFileError as e:
- # SpecialFileError may be raised due to either the source or
- # destination. If the destination was the cause then we would actually
- # care, but since the destination directory is deleted prior to
- # copy we ignore all of them assuming it is caused by the source.
- logger.warning(
- "Ignoring special file error '%s' encountered copying %s to %s.",
- str(e),
- src,
- dest,
- )
-
-
-def _copy_source_tree(source, target):
- # type: (str, str) -> None
- target_abspath = os.path.abspath(target)
- target_basename = os.path.basename(target_abspath)
- target_dirname = os.path.dirname(target_abspath)
-
- def ignore(d, names):
- # type: (str, List[str]) -> List[str]
- skipped = [] # type: List[str]
- if d == source:
- # Pulling in those directories can potentially be very slow,
- # exclude the following directories if they appear in the top
- # level dir (and only it).
- # See discussion at https://github.com/pypa/pip/pull/6770
- skipped += ['.tox', '.nox']
- if os.path.abspath(d) == target_dirname:
- # Prevent an infinite recursion if the target is in source.
- # This can happen when TMPDIR is set to ${PWD}/...
- # and we copy PWD to TMPDIR.
- skipped += [target_basename]
- return skipped
-
- shutil.copytree(
- source,
- target,
- ignore=ignore,
- symlinks=True,
- copy_function=_copy2_ignoring_special_files,
- )
-
-
-def get_file_url(
- link, # type: Link
- download_dir=None, # type: Optional[str]
- hashes=None # type: Optional[Hashes]
-):
- # type: (...) -> File
- """Get file and optionally check its hash.
- """
- # If a download dir is specified, is the file already there and valid?
- already_downloaded_path = None
- if download_dir:
- already_downloaded_path = _check_download_dir(
- link, download_dir, hashes
- )
-
- if already_downloaded_path:
- from_path = already_downloaded_path
- else:
- from_path = link.file_path
-
- # If --require-hashes is off, `hashes` is either empty, the
- # link's embedded hash, or MissingHashes; it is required to
- # match. If --require-hashes is on, we are satisfied by any
- # hash in `hashes` matching: a URL-based or an option-based
- # one; no internet-sourced hash will be in `hashes`.
- if hashes:
- hashes.check_against_path(from_path)
- return File(from_path, None)
-
-
-def unpack_url(
- link, # type: Link
- location, # type: str
- download, # type: Downloader
- download_dir=None, # type: Optional[str]
- hashes=None, # type: Optional[Hashes]
-):
- # type: (...) -> Optional[File]
- """Unpack link into location, downloading if required.
-
- :param hashes: A Hashes object, one of whose embedded hashes must match,
- or HashMismatch will be raised. If the Hashes is empty, no matches are
- required, and unhashable types of requirements (like VCS ones, which
- would ordinarily raise HashUnsupported) are allowed.
- """
- # non-editable vcs urls
- if link.is_vcs:
- unpack_vcs_link(link, location)
- return None
-
- # Once out-of-tree-builds are no longer supported, could potentially
- # replace the below condition with `assert not link.is_existing_dir`
- # - unpack_url does not need to be called for in-tree-builds.
- #
- # As further cleanup, _copy_source_tree and accompanying tests can
- # be removed.
- if link.is_existing_dir():
- deprecated(
- "A future pip version will change local packages to be built "
- "in-place without first copying to a temporary directory. "
- "We recommend you use --use-feature=in-tree-build to test "
- "your packages with this new behavior before it becomes the "
- "default.\n",
- replacement=None,
- gone_in="21.3",
- issue=7555
- )
- if os.path.isdir(location):
- rmtree(location)
- _copy_source_tree(link.file_path, location)
- return None
-
- # file urls
- if link.is_file:
- file = get_file_url(link, download_dir, hashes=hashes)
-
- # http urls
- else:
- file = get_http_url(
- link,
- download,
- download_dir,
- hashes=hashes,
- )
-
- # unpack the archive to the build dir location. even when only downloading
- # archives, they have to be unpacked to parse dependencies, except wheels
- if not link.is_wheel:
- unpack_file(file.path, location, file.content_type)
-
- return file
-
-
-def _check_download_dir(link, download_dir, hashes):
- # type: (Link, str, Optional[Hashes]) -> Optional[str]
- """ Check download_dir for previously downloaded file with correct hash
- If a correct file is found return its path else None
- """
- download_path = os.path.join(download_dir, link.filename)
-
- if not os.path.exists(download_path):
- return None
-
- # If already downloaded, does its hash match?
- logger.info('File was already downloaded %s', download_path)
- if hashes:
- try:
- hashes.check_against_path(download_path)
- except HashMismatch:
- logger.warning(
- 'Previously-downloaded file %s has bad hash. '
- 'Re-downloading.',
- download_path
- )
- os.unlink(download_path)
- return None
- return download_path
-
-
-class RequirementPreparer:
- """Prepares a Requirement
- """
-
- def __init__(
- self,
- build_dir, # type: str
- download_dir, # type: Optional[str]
- src_dir, # type: str
- build_isolation, # type: bool
- req_tracker, # type: RequirementTracker
- session, # type: PipSession
- progress_bar, # type: str
- finder, # type: PackageFinder
- require_hashes, # type: bool
- use_user_site, # type: bool
- lazy_wheel, # type: bool
- in_tree_build, # type: bool
- ):
- # type: (...) -> None
- super().__init__()
-
- self.src_dir = src_dir
- self.build_dir = build_dir
- self.req_tracker = req_tracker
- self._session = session
- self._download = Downloader(session, progress_bar)
- self._batch_download = BatchDownloader(session, progress_bar)
- self.finder = finder
-
- # Where still-packed archives should be written to. If None, they are
- # not saved, and are deleted immediately after unpacking.
- self.download_dir = download_dir
-
- # Is build isolation allowed?
- self.build_isolation = build_isolation
-
- # Should hash-checking be required?
- self.require_hashes = require_hashes
-
- # Should install in user site-packages?
- self.use_user_site = use_user_site
-
- # Should wheels be downloaded lazily?
- self.use_lazy_wheel = lazy_wheel
-
- # Should in-tree builds be used for local paths?
- self.in_tree_build = in_tree_build
-
- # Memoized downloaded files, as mapping of url: (path, mime type)
- self._downloaded = {} # type: Dict[str, Tuple[str, str]]
-
- # Previous "header" printed for a link-based InstallRequirement
- self._previous_requirement_header = ("", "")
-
- def _log_preparing_link(self, req):
- # type: (InstallRequirement) -> None
- """Provide context for the requirement being prepared."""
- if req.link.is_file and not req.original_link_is_in_wheel_cache:
- message = "Processing %s"
- information = str(display_path(req.link.file_path))
- else:
- message = "Collecting %s"
- information = str(req.req or req)
-
- if (message, information) != self._previous_requirement_header:
- self._previous_requirement_header = (message, information)
- logger.info(message, information)
-
- if req.original_link_is_in_wheel_cache:
- with indent_log():
- logger.info("Using cached %s", req.link.filename)
-
- def _ensure_link_req_src_dir(self, req, parallel_builds):
- # type: (InstallRequirement, bool) -> None
- """Ensure source_dir of a linked InstallRequirement."""
- # Since source_dir is only set for editable requirements.
- if req.link.is_wheel:
- # We don't need to unpack wheels, so no need for a source
- # directory.
- return
- assert req.source_dir is None
- if req.link.is_existing_dir() and self.in_tree_build:
- # build local directories in-tree
- req.source_dir = req.link.file_path
- return
-
- # We always delete unpacked sdists after pip runs.
- req.ensure_has_source_dir(
- self.build_dir,
- autodelete=True,
- parallel_builds=parallel_builds,
- )
-
- # If a checkout exists, it's unwise to keep going. version
- # inconsistencies are logged later, but do not fail the
- # installation.
- # FIXME: this won't upgrade when there's an existing
- # package unpacked in `req.source_dir`
- if os.path.exists(os.path.join(req.source_dir, 'setup.py')):
- raise PreviousBuildDirError(
- "pip can't proceed with requirements '{}' due to a"
- "pre-existing build directory ({}). This is likely "
- "due to a previous installation that failed . pip is "
- "being responsible and not assuming it can delete this. "
- "Please delete it and try again.".format(req, req.source_dir)
- )
-
- def _get_linked_req_hashes(self, req):
- # type: (InstallRequirement) -> Hashes
- # By the time this is called, the requirement's link should have
- # been checked so we can tell what kind of requirements req is
- # and raise some more informative errors than otherwise.
- # (For example, we can raise VcsHashUnsupported for a VCS URL
- # rather than HashMissing.)
- if not self.require_hashes:
- return req.hashes(trust_internet=True)
-
- # We could check these first 2 conditions inside unpack_url
- # and save repetition of conditions, but then we would
- # report less-useful error messages for unhashable
- # requirements, complaining that there's no hash provided.
- if req.link.is_vcs:
- raise VcsHashUnsupported()
- if req.link.is_existing_dir():
- raise DirectoryUrlHashUnsupported()
-
- # Unpinned packages are asking for trouble when a new version
- # is uploaded. This isn't a security check, but it saves users
- # a surprising hash mismatch in the future.
- # file:/// URLs aren't pinnable, so don't complain about them
- # not being pinned.
- if req.original_link is None and not req.is_pinned:
- raise HashUnpinned()
-
- # If known-good hashes are missing for this requirement,
- # shim it with a facade object that will provoke hash
- # computation and then raise a HashMissing exception
- # showing the user what the hash should be.
- return req.hashes(trust_internet=False) or MissingHashes()
-
- def _fetch_metadata_using_lazy_wheel(self, link):
- # type: (Link) -> Optional[Distribution]
- """Fetch metadata using lazy wheel, if possible."""
- if not self.use_lazy_wheel:
- return None
- if self.require_hashes:
- logger.debug('Lazy wheel is not used as hash checking is required')
- return None
- if link.is_file or not link.is_wheel:
- logger.debug(
- 'Lazy wheel is not used as '
- '%r does not points to a remote wheel',
- link,
- )
- return None
-
- wheel = Wheel(link.filename)
- name = canonicalize_name(wheel.name)
- logger.info(
- 'Obtaining dependency information from %s %s',
- name, wheel.version,
- )
- url = link.url.split('#', 1)[0]
- try:
- return dist_from_wheel_url(name, url, self._session)
- except HTTPRangeRequestUnsupported:
- logger.debug('%s does not support range requests', url)
- return None
-
- def _complete_partial_requirements(
- self,
- partially_downloaded_reqs, # type: Iterable[InstallRequirement]
- parallel_builds=False, # type: bool
- ):
- # type: (...) -> None
- """Download any requirements which were only fetched by metadata."""
- # Download to a temporary directory. These will be copied over as
- # needed for downstream 'download', 'wheel', and 'install' commands.
- temp_dir = TempDirectory(kind="unpack", globally_managed=True).path
-
- # Map each link to the requirement that owns it. This allows us to set
- # `req.local_file_path` on the appropriate requirement after passing
- # all the links at once into BatchDownloader.
- links_to_fully_download = {} # type: Dict[Link, InstallRequirement]
- for req in partially_downloaded_reqs:
- assert req.link
- links_to_fully_download[req.link] = req
-
- batch_download = self._batch_download(
- links_to_fully_download.keys(),
- temp_dir,
- )
- for link, (filepath, _) in batch_download:
- logger.debug("Downloading link %s to %s", link, filepath)
- req = links_to_fully_download[link]
- req.local_file_path = filepath
-
- # This step is necessary to ensure all lazy wheels are processed
- # successfully by the 'download', 'wheel', and 'install' commands.
- for req in partially_downloaded_reqs:
- self._prepare_linked_requirement(req, parallel_builds)
-
- def prepare_linked_requirement(self, req, parallel_builds=False):
- # type: (InstallRequirement, bool) -> Distribution
- """Prepare a requirement to be obtained from req.link."""
- assert req.link
- link = req.link
- self._log_preparing_link(req)
- with indent_log():
- # Check if the relevant file is already available
- # in the download directory
- file_path = None
- if self.download_dir is not None and link.is_wheel:
- hashes = self._get_linked_req_hashes(req)
- file_path = _check_download_dir(req.link, self.download_dir, hashes)
-
- if file_path is not None:
- # The file is already available, so mark it as downloaded
- self._downloaded[req.link.url] = file_path, None
- else:
- # The file is not available, attempt to fetch only metadata
- wheel_dist = self._fetch_metadata_using_lazy_wheel(link)
- if wheel_dist is not None:
- req.needs_more_preparation = True
- return wheel_dist
-
- # None of the optimizations worked, fully prepare the requirement
- return self._prepare_linked_requirement(req, parallel_builds)
-
- def prepare_linked_requirements_more(self, reqs, parallel_builds=False):
- # type: (Iterable[InstallRequirement], bool) -> None
- """Prepare linked requirements more, if needed."""
- reqs = [req for req in reqs if req.needs_more_preparation]
- for req in reqs:
- # Determine if any of these requirements were already downloaded.
- if self.download_dir is not None and req.link.is_wheel:
- hashes = self._get_linked_req_hashes(req)
- file_path = _check_download_dir(req.link, self.download_dir, hashes)
- if file_path is not None:
- self._downloaded[req.link.url] = file_path, None
- req.needs_more_preparation = False
-
- # Prepare requirements we found were already downloaded for some
- # reason. The other downloads will be completed separately.
- partially_downloaded_reqs = [] # type: List[InstallRequirement]
- for req in reqs:
- if req.needs_more_preparation:
- partially_downloaded_reqs.append(req)
- else:
- self._prepare_linked_requirement(req, parallel_builds)
-
- # TODO: separate this part out from RequirementPreparer when the v1
- # resolver can be removed!
- self._complete_partial_requirements(
- partially_downloaded_reqs, parallel_builds=parallel_builds,
- )
-
- def _prepare_linked_requirement(self, req, parallel_builds):
- # type: (InstallRequirement, bool) -> Distribution
- assert req.link
- link = req.link
-
- self._ensure_link_req_src_dir(req, parallel_builds)
- hashes = self._get_linked_req_hashes(req)
-
- if link.is_existing_dir() and self.in_tree_build:
- local_file = None
- elif link.url not in self._downloaded:
- try:
- local_file = unpack_url(
- link, req.source_dir, self._download,
- self.download_dir, hashes
- )
- except NetworkConnectionError as exc:
- raise InstallationError(
- 'Could not install requirement {} because of HTTP '
- 'error {} for URL {}'.format(req, exc, link)
- )
- else:
- file_path, content_type = self._downloaded[link.url]
- if hashes:
- hashes.check_against_path(file_path)
- local_file = File(file_path, content_type)
-
- # For use in later processing,
- # preserve the file path on the requirement.
- if local_file:
- req.local_file_path = local_file.path
-
- dist = _get_prepared_distribution(
- req, self.req_tracker, self.finder, self.build_isolation,
- )
- return dist
-
- def save_linked_requirement(self, req):
- # type: (InstallRequirement) -> None
- assert self.download_dir is not None
- assert req.link is not None
- link = req.link
- if link.is_vcs or (link.is_existing_dir() and req.editable):
- # Make a .zip of the source_dir we already created.
- req.archive(self.download_dir)
- return
-
- if link.is_existing_dir():
- logger.debug(
- 'Not copying link to destination directory '
- 'since it is a directory: %s', link,
- )
- return
- if req.local_file_path is None:
- # No distribution was downloaded for this requirement.
- return
-
- download_location = os.path.join(self.download_dir, link.filename)
- if not os.path.exists(download_location):
- shutil.copy(req.local_file_path, download_location)
- download_path = display_path(download_location)
- logger.info('Saved %s', download_path)
-
- def prepare_editable_requirement(
- self,
- req, # type: InstallRequirement
- ):
- # type: (...) -> Distribution
- """Prepare an editable requirement
- """
- assert req.editable, "cannot prepare a non-editable req as editable"
-
- logger.info('Obtaining %s', req)
-
- with indent_log():
- if self.require_hashes:
- raise InstallationError(
- 'The editable requirement {} cannot be installed when '
- 'requiring hashes, because there is no single file to '
- 'hash.'.format(req)
- )
- req.ensure_has_source_dir(self.src_dir)
- req.update_editable()
-
- dist = _get_prepared_distribution(
- req, self.req_tracker, self.finder, self.build_isolation,
- )
-
- req.check_if_exists(self.use_user_site)
-
- return dist
-
- def prepare_installed_requirement(
- self,
- req, # type: InstallRequirement
- skip_reason # type: str
- ):
- # type: (...) -> Distribution
- """Prepare an already-installed requirement
- """
- assert req.satisfied_by, "req should have been satisfied but isn't"
- assert skip_reason is not None, (
- "did not get skip reason skipped but req.satisfied_by "
- "is set to {}".format(req.satisfied_by)
- )
- logger.info(
- 'Requirement %s: %s (%s)',
- skip_reason, req, req.satisfied_by.version
- )
- with indent_log():
- if self.require_hashes:
- logger.debug(
- 'Since it is already installed, we are trusting this '
- 'package without checking its hash. To ensure a '
- 'completely repeatable environment, install into an '
- 'empty virtualenv.'
- )
- return InstalledDistribution(req).get_pkg_resources_distribution()
diff --git a/venv/Lib/site-packages/pip/_internal/pyproject.py b/venv/Lib/site-packages/pip/_internal/pyproject.py
deleted file mode 100644
index 9016d35..0000000
--- a/venv/Lib/site-packages/pip/_internal/pyproject.py
+++ /dev/null
@@ -1,183 +0,0 @@
-import os
-from collections import namedtuple
-from typing import Any, List, Optional
-
-from pip._vendor import toml
-from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
-
-from pip._internal.exceptions import InstallationError
-
-
-def _is_list_of_str(obj):
- # type: (Any) -> bool
- return (
- isinstance(obj, list) and
- all(isinstance(item, str) for item in obj)
- )
-
-
-def make_pyproject_path(unpacked_source_directory):
- # type: (str) -> str
- return os.path.join(unpacked_source_directory, 'pyproject.toml')
-
-
-BuildSystemDetails = namedtuple('BuildSystemDetails', [
- 'requires', 'backend', 'check', 'backend_path'
-])
-
-
-def load_pyproject_toml(
- use_pep517, # type: Optional[bool]
- pyproject_toml, # type: str
- setup_py, # type: str
- req_name # type: str
-):
- # type: (...) -> Optional[BuildSystemDetails]
- """Load the pyproject.toml file.
-
- Parameters:
- use_pep517 - Has the user requested PEP 517 processing? None
- means the user hasn't explicitly specified.
- pyproject_toml - Location of the project's pyproject.toml file
- setup_py - Location of the project's setup.py file
- req_name - The name of the requirement we're processing (for
- error reporting)
-
- Returns:
- None if we should use the legacy code path, otherwise a tuple
- (
- requirements from pyproject.toml,
- name of PEP 517 backend,
- requirements we should check are installed after setting
- up the build environment
- directory paths to import the backend from (backend-path),
- relative to the project root.
- )
- """
- has_pyproject = os.path.isfile(pyproject_toml)
- has_setup = os.path.isfile(setup_py)
-
- if has_pyproject:
- with open(pyproject_toml, encoding="utf-8") as f:
- pp_toml = toml.load(f)
- build_system = pp_toml.get("build-system")
- else:
- build_system = None
-
- # The following cases must use PEP 517
- # We check for use_pep517 being non-None and falsey because that means
- # the user explicitly requested --no-use-pep517. The value 0 as
- # opposed to False can occur when the value is provided via an
- # environment variable or config file option (due to the quirk of
- # strtobool() returning an integer in pip's configuration code).
- if has_pyproject and not has_setup:
- if use_pep517 is not None and not use_pep517:
- raise InstallationError(
- "Disabling PEP 517 processing is invalid: "
- "project does not have a setup.py"
- )
- use_pep517 = True
- elif build_system and "build-backend" in build_system:
- if use_pep517 is not None and not use_pep517:
- raise InstallationError(
- "Disabling PEP 517 processing is invalid: "
- "project specifies a build backend of {} "
- "in pyproject.toml".format(
- build_system["build-backend"]
- )
- )
- use_pep517 = True
-
- # If we haven't worked out whether to use PEP 517 yet,
- # and the user hasn't explicitly stated a preference,
- # we do so if the project has a pyproject.toml file.
- elif use_pep517 is None:
- use_pep517 = has_pyproject
-
- # At this point, we know whether we're going to use PEP 517.
- assert use_pep517 is not None
-
- # If we're using the legacy code path, there is nothing further
- # for us to do here.
- if not use_pep517:
- return None
-
- if build_system is None:
- # Either the user has a pyproject.toml with no build-system
- # section, or the user has no pyproject.toml, but has opted in
- # explicitly via --use-pep517.
- # In the absence of any explicit backend specification, we
- # assume the setuptools backend that most closely emulates the
- # traditional direct setup.py execution, and require wheel and
- # a version of setuptools that supports that backend.
-
- build_system = {
- "requires": ["setuptools>=40.8.0", "wheel"],
- "build-backend": "setuptools.build_meta:__legacy__",
- }
-
- # If we're using PEP 517, we have build system information (either
- # from pyproject.toml, or defaulted by the code above).
- # Note that at this point, we do not know if the user has actually
- # specified a backend, though.
- assert build_system is not None
-
- # Ensure that the build-system section in pyproject.toml conforms
- # to PEP 518.
- error_template = (
- "{package} has a pyproject.toml file that does not comply "
- "with PEP 518: {reason}"
- )
-
- # Specifying the build-system table but not the requires key is invalid
- if "requires" not in build_system:
- raise InstallationError(
- error_template.format(package=req_name, reason=(
- "it has a 'build-system' table but not "
- "'build-system.requires' which is mandatory in the table"
- ))
- )
-
- # Error out if requires is not a list of strings
- requires = build_system["requires"]
- if not _is_list_of_str(requires):
- raise InstallationError(error_template.format(
- package=req_name,
- reason="'build-system.requires' is not a list of strings.",
- ))
-
- # Each requirement must be valid as per PEP 508
- for requirement in requires:
- try:
- Requirement(requirement)
- except InvalidRequirement:
- raise InstallationError(
- error_template.format(
- package=req_name,
- reason=(
- "'build-system.requires' contains an invalid "
- "requirement: {!r}".format(requirement)
- ),
- )
- )
-
- backend = build_system.get("build-backend")
- backend_path = build_system.get("backend-path", [])
- check = [] # type: List[str]
- if backend is None:
- # If the user didn't specify a backend, we assume they want to use
- # the setuptools backend. But we can't be sure they have included
- # a version of setuptools which supplies the backend, or wheel
- # (which is needed by the backend) in their requirements. So we
- # make a note to check that those requirements are present once
- # we have set up the environment.
- # This is quite a lot of work to check for a very specific case. But
- # the problem is, that case is potentially quite common - projects that
- # adopted PEP 518 early for the ability to specify requirements to
- # execute setup.py, but never considered needing to mention the build
- # tools themselves. The original PEP 518 code had a similar check (but
- # implemented in a different way).
- backend = "setuptools.build_meta:__legacy__"
- check = ["setuptools>=40.8.0", "wheel"]
-
- return BuildSystemDetails(requires, backend, check, backend_path)
diff --git a/venv/Lib/site-packages/pip/_internal/req/__init__.py b/venv/Lib/site-packages/pip/_internal/req/__init__.py
deleted file mode 100644
index 06f0a08..0000000
--- a/venv/Lib/site-packages/pip/_internal/req/__init__.py
+++ /dev/null
@@ -1,98 +0,0 @@
-import collections
-import logging
-from typing import Iterator, List, Optional, Sequence, Tuple
-
-from pip._internal.utils.logging import indent_log
-
-from .req_file import parse_requirements
-from .req_install import InstallRequirement
-from .req_set import RequirementSet
-
-__all__ = [
- "RequirementSet", "InstallRequirement",
- "parse_requirements", "install_given_reqs",
-]
-
-logger = logging.getLogger(__name__)
-
-
-class InstallationResult:
- def __init__(self, name):
- # type: (str) -> None
- self.name = name
-
- def __repr__(self):
- # type: () -> str
- return f"InstallationResult(name={self.name!r})"
-
-
-def _validate_requirements(
- requirements, # type: List[InstallRequirement]
-):
- # type: (...) -> Iterator[Tuple[str, InstallRequirement]]
- for req in requirements:
- assert req.name, f"invalid to-be-installed requirement: {req}"
- yield req.name, req
-
-
-def install_given_reqs(
- requirements, # type: List[InstallRequirement]
- install_options, # type: List[str]
- global_options, # type: Sequence[str]
- root, # type: Optional[str]
- home, # type: Optional[str]
- prefix, # type: Optional[str]
- warn_script_location, # type: bool
- use_user_site, # type: bool
- pycompile, # type: bool
-):
- # type: (...) -> List[InstallationResult]
- """
- Install everything in the given list.
-
- (to be called after having downloaded and unpacked the packages)
- """
- to_install = collections.OrderedDict(_validate_requirements(requirements))
-
- if to_install:
- logger.info(
- 'Installing collected packages: %s',
- ', '.join(to_install.keys()),
- )
-
- installed = []
-
- with indent_log():
- for req_name, requirement in to_install.items():
- if requirement.should_reinstall:
- logger.info('Attempting uninstall: %s', req_name)
- with indent_log():
- uninstalled_pathset = requirement.uninstall(
- auto_confirm=True
- )
- else:
- uninstalled_pathset = None
-
- try:
- requirement.install(
- install_options,
- global_options,
- root=root,
- home=home,
- prefix=prefix,
- warn_script_location=warn_script_location,
- use_user_site=use_user_site,
- pycompile=pycompile,
- )
- except Exception:
- # if install did not succeed, rollback previous uninstall
- if uninstalled_pathset and not requirement.install_succeeded:
- uninstalled_pathset.rollback()
- raise
- else:
- if uninstalled_pathset and requirement.install_succeeded:
- uninstalled_pathset.commit()
-
- installed.append(InstallationResult(req_name))
-
- return installed
diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 643827f..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-39.pyc
deleted file mode 100644
index 758ad61..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-39.pyc
deleted file mode 100644
index 90ae716..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-39.pyc
deleted file mode 100644
index b159c51..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-39.pyc
deleted file mode 100644
index 56b48fb..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc
deleted file mode 100644
index 2ae5955..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-39.pyc
deleted file mode 100644
index ea91ccc..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/req/constructors.py b/venv/Lib/site-packages/pip/_internal/req/constructors.py
deleted file mode 100644
index 3f9e7dd..0000000
--- a/venv/Lib/site-packages/pip/_internal/req/constructors.py
+++ /dev/null
@@ -1,486 +0,0 @@
-"""Backing implementation for InstallRequirement's various constructors
-
-The idea here is that these formed a major chunk of InstallRequirement's size
-so, moving them and support code dedicated to them outside of that class
-helps creates for better understandability for the rest of the code.
-
-These are meant to be used elsewhere within pip to create instances of
-InstallRequirement.
-"""
-
-import logging
-import os
-import re
-from typing import Any, Dict, Optional, Set, Tuple, Union
-
-from pip._vendor.packaging.markers import Marker
-from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
-from pip._vendor.packaging.specifiers import Specifier
-from pip._vendor.pkg_resources import RequirementParseError, parse_requirements
-
-from pip._internal.exceptions import InstallationError
-from pip._internal.models.index import PyPI, TestPyPI
-from pip._internal.models.link import Link
-from pip._internal.models.wheel import Wheel
-from pip._internal.pyproject import make_pyproject_path
-from pip._internal.req.req_file import ParsedRequirement
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.filetypes import is_archive_file
-from pip._internal.utils.misc import is_installable_dir
-from pip._internal.utils.urls import path_to_url
-from pip._internal.vcs import is_url, vcs
-
-__all__ = [
- "install_req_from_editable", "install_req_from_line",
- "parse_editable"
-]
-
-logger = logging.getLogger(__name__)
-operators = Specifier._operators.keys()
-
-
-def _strip_extras(path):
- # type: (str) -> Tuple[str, Optional[str]]
- m = re.match(r'^(.+)(\[[^\]]+\])$', path)
- extras = None
- if m:
- path_no_extras = m.group(1)
- extras = m.group(2)
- else:
- path_no_extras = path
-
- return path_no_extras, extras
-
-
-def convert_extras(extras):
- # type: (Optional[str]) -> Set[str]
- if not extras:
- return set()
- return Requirement("placeholder" + extras.lower()).extras
-
-
-def parse_editable(editable_req):
- # type: (str) -> Tuple[Optional[str], str, Set[str]]
- """Parses an editable requirement into:
- - a requirement name
- - an URL
- - extras
- - editable options
- Accepted requirements:
- svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir
- .[some_extra]
- """
-
- url = editable_req
-
- # If a file path is specified with extras, strip off the extras.
- url_no_extras, extras = _strip_extras(url)
-
- if os.path.isdir(url_no_extras):
- setup_py = os.path.join(url_no_extras, 'setup.py')
- setup_cfg = os.path.join(url_no_extras, 'setup.cfg')
- if not os.path.exists(setup_py) and not os.path.exists(setup_cfg):
- msg = (
- 'File "setup.py" or "setup.cfg" not found. Directory cannot be '
- 'installed in editable mode: {}'
- .format(os.path.abspath(url_no_extras))
- )
- pyproject_path = make_pyproject_path(url_no_extras)
- if os.path.isfile(pyproject_path):
- msg += (
- '\n(A "pyproject.toml" file was found, but editable '
- 'mode currently requires a setuptools-based build.)'
- )
- raise InstallationError(msg)
-
- # Treating it as code that has already been checked out
- url_no_extras = path_to_url(url_no_extras)
-
- if url_no_extras.lower().startswith('file:'):
- package_name = Link(url_no_extras).egg_fragment
- if extras:
- return (
- package_name,
- url_no_extras,
- Requirement("placeholder" + extras.lower()).extras,
- )
- else:
- return package_name, url_no_extras, set()
-
- for version_control in vcs:
- if url.lower().startswith(f'{version_control}:'):
- url = f'{version_control}+{url}'
- break
-
- link = Link(url)
-
- if not link.is_vcs:
- backends = ", ".join(vcs.all_schemes)
- raise InstallationError(
- f'{editable_req} is not a valid editable requirement. '
- f'It should either be a path to a local project or a VCS URL '
- f'(beginning with {backends}).'
- )
-
- package_name = link.egg_fragment
- if not package_name:
- raise InstallationError(
- "Could not detect requirement name for '{}', please specify one "
- "with #egg=your_package_name".format(editable_req)
- )
- return package_name, url, set()
-
-
-def deduce_helpful_msg(req):
- # type: (str) -> str
- """Returns helpful msg in case requirements file does not exist,
- or cannot be parsed.
-
- :params req: Requirements file path
- """
- msg = ""
- if os.path.exists(req):
- msg = " The path does exist. "
- # Try to parse and check if it is a requirements file.
- try:
- with open(req) as fp:
- # parse first line only
- next(parse_requirements(fp.read()))
- msg += (
- "The argument you provided "
- "({}) appears to be a"
- " requirements file. If that is the"
- " case, use the '-r' flag to install"
- " the packages specified within it."
- ).format(req)
- except RequirementParseError:
- logger.debug(
- "Cannot parse '%s' as requirements file", req, exc_info=True
- )
- else:
- msg += f" File '{req}' does not exist."
- return msg
-
-
-class RequirementParts:
- def __init__(
- self,
- requirement, # type: Optional[Requirement]
- link, # type: Optional[Link]
- markers, # type: Optional[Marker]
- extras, # type: Set[str]
- ):
- self.requirement = requirement
- self.link = link
- self.markers = markers
- self.extras = extras
-
-
-def parse_req_from_editable(editable_req):
- # type: (str) -> RequirementParts
- name, url, extras_override = parse_editable(editable_req)
-
- if name is not None:
- try:
- req = Requirement(name) # type: Optional[Requirement]
- except InvalidRequirement:
- raise InstallationError(f"Invalid requirement: '{name}'")
- else:
- req = None
-
- link = Link(url)
-
- return RequirementParts(req, link, None, extras_override)
-
-
-# ---- The actual constructors follow ----
-
-
-def install_req_from_editable(
- editable_req, # type: str
- comes_from=None, # type: Optional[Union[InstallRequirement, str]]
- use_pep517=None, # type: Optional[bool]
- isolated=False, # type: bool
- options=None, # type: Optional[Dict[str, Any]]
- constraint=False, # type: bool
- user_supplied=False, # type: bool
-):
- # type: (...) -> InstallRequirement
-
- parts = parse_req_from_editable(editable_req)
-
- return InstallRequirement(
- parts.requirement,
- comes_from=comes_from,
- user_supplied=user_supplied,
- editable=True,
- link=parts.link,
- constraint=constraint,
- use_pep517=use_pep517,
- isolated=isolated,
- install_options=options.get("install_options", []) if options else [],
- global_options=options.get("global_options", []) if options else [],
- hash_options=options.get("hashes", {}) if options else {},
- extras=parts.extras,
- )
-
-
-def _looks_like_path(name):
- # type: (str) -> bool
- """Checks whether the string "looks like" a path on the filesystem.
-
- This does not check whether the target actually exists, only judge from the
- appearance.
-
- Returns true if any of the following conditions is true:
- * a path separator is found (either os.path.sep or os.path.altsep);
- * a dot is found (which represents the current directory).
- """
- if os.path.sep in name:
- return True
- if os.path.altsep is not None and os.path.altsep in name:
- return True
- if name.startswith("."):
- return True
- return False
-
-
-def _get_url_from_path(path, name):
- # type: (str, str) -> Optional[str]
- """
- First, it checks whether a provided path is an installable directory
- (e.g. it has a setup.py). If it is, returns the path.
-
- If false, check if the path is an archive file (such as a .whl).
- The function checks if the path is a file. If false, if the path has
- an @, it will treat it as a PEP 440 URL requirement and return the path.
- """
- if _looks_like_path(name) and os.path.isdir(path):
- if is_installable_dir(path):
- return path_to_url(path)
- raise InstallationError(
- f"Directory {name!r} is not installable. Neither 'setup.py' "
- "nor 'pyproject.toml' found."
- )
- if not is_archive_file(path):
- return None
- if os.path.isfile(path):
- return path_to_url(path)
- urlreq_parts = name.split('@', 1)
- if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]):
- # If the path contains '@' and the part before it does not look
- # like a path, try to treat it as a PEP 440 URL req instead.
- return None
- logger.warning(
- 'Requirement %r looks like a filename, but the '
- 'file does not exist',
- name
- )
- return path_to_url(path)
-
-
-def parse_req_from_line(name, line_source):
- # type: (str, Optional[str]) -> RequirementParts
- if is_url(name):
- marker_sep = '; '
- else:
- marker_sep = ';'
- if marker_sep in name:
- name, markers_as_string = name.split(marker_sep, 1)
- markers_as_string = markers_as_string.strip()
- if not markers_as_string:
- markers = None
- else:
- markers = Marker(markers_as_string)
- else:
- markers = None
- name = name.strip()
- req_as_string = None
- path = os.path.normpath(os.path.abspath(name))
- link = None
- extras_as_string = None
-
- if is_url(name):
- link = Link(name)
- else:
- p, extras_as_string = _strip_extras(path)
- url = _get_url_from_path(p, name)
- if url is not None:
- link = Link(url)
-
- # it's a local file, dir, or url
- if link:
- # Handle relative file URLs
- if link.scheme == 'file' and re.search(r'\.\./', link.url):
- link = Link(
- path_to_url(os.path.normpath(os.path.abspath(link.path))))
- # wheel file
- if link.is_wheel:
- wheel = Wheel(link.filename) # can raise InvalidWheelFilename
- req_as_string = f"{wheel.name}=={wheel.version}"
- else:
- # set the req to the egg fragment. when it's not there, this
- # will become an 'unnamed' requirement
- req_as_string = link.egg_fragment
-
- # a requirement specifier
- else:
- req_as_string = name
-
- extras = convert_extras(extras_as_string)
-
- def with_source(text):
- # type: (str) -> str
- if not line_source:
- return text
- return f'{text} (from {line_source})'
-
- def _parse_req_string(req_as_string: str) -> Requirement:
- try:
- req = Requirement(req_as_string)
- except InvalidRequirement:
- if os.path.sep in req_as_string:
- add_msg = "It looks like a path."
- add_msg += deduce_helpful_msg(req_as_string)
- elif ('=' in req_as_string and
- not any(op in req_as_string for op in operators)):
- add_msg = "= is not a valid operator. Did you mean == ?"
- else:
- add_msg = ''
- msg = with_source(
- f'Invalid requirement: {req_as_string!r}'
- )
- if add_msg:
- msg += f'\nHint: {add_msg}'
- raise InstallationError(msg)
- else:
- # Deprecate extras after specifiers: "name>=1.0[extras]"
- # This currently works by accident because _strip_extras() parses
- # any extras in the end of the string and those are saved in
- # RequirementParts
- for spec in req.specifier:
- spec_str = str(spec)
- if spec_str.endswith(']'):
- msg = f"Extras after version '{spec_str}'."
- raise InstallationError(msg)
- return req
-
- if req_as_string is not None:
- req = _parse_req_string(req_as_string) # type: Optional[Requirement]
- else:
- req = None
-
- return RequirementParts(req, link, markers, extras)
-
-
-def install_req_from_line(
- name, # type: str
- comes_from=None, # type: Optional[Union[str, InstallRequirement]]
- use_pep517=None, # type: Optional[bool]
- isolated=False, # type: bool
- options=None, # type: Optional[Dict[str, Any]]
- constraint=False, # type: bool
- line_source=None, # type: Optional[str]
- user_supplied=False, # type: bool
-):
- # type: (...) -> InstallRequirement
- """Creates an InstallRequirement from a name, which might be a
- requirement, directory containing 'setup.py', filename, or URL.
-
- :param line_source: An optional string describing where the line is from,
- for logging purposes in case of an error.
- """
- parts = parse_req_from_line(name, line_source)
-
- return InstallRequirement(
- parts.requirement, comes_from, link=parts.link, markers=parts.markers,
- use_pep517=use_pep517, isolated=isolated,
- install_options=options.get("install_options", []) if options else [],
- global_options=options.get("global_options", []) if options else [],
- hash_options=options.get("hashes", {}) if options else {},
- constraint=constraint,
- extras=parts.extras,
- user_supplied=user_supplied,
- )
-
-
-def install_req_from_req_string(
- req_string, # type: str
- comes_from=None, # type: Optional[InstallRequirement]
- isolated=False, # type: bool
- use_pep517=None, # type: Optional[bool]
- user_supplied=False, # type: bool
-):
- # type: (...) -> InstallRequirement
- try:
- req = Requirement(req_string)
- except InvalidRequirement:
- raise InstallationError(f"Invalid requirement: '{req_string}'")
-
- domains_not_allowed = [
- PyPI.file_storage_domain,
- TestPyPI.file_storage_domain,
- ]
- if (req.url and comes_from and comes_from.link and
- comes_from.link.netloc in domains_not_allowed):
- # Explicitly disallow pypi packages that depend on external urls
- raise InstallationError(
- "Packages installed from PyPI cannot depend on packages "
- "which are not also hosted on PyPI.\n"
- "{} depends on {} ".format(comes_from.name, req)
- )
-
- return InstallRequirement(
- req,
- comes_from,
- isolated=isolated,
- use_pep517=use_pep517,
- user_supplied=user_supplied,
- )
-
-
-def install_req_from_parsed_requirement(
- parsed_req, # type: ParsedRequirement
- isolated=False, # type: bool
- use_pep517=None, # type: Optional[bool]
- user_supplied=False, # type: bool
-):
- # type: (...) -> InstallRequirement
- if parsed_req.is_editable:
- req = install_req_from_editable(
- parsed_req.requirement,
- comes_from=parsed_req.comes_from,
- use_pep517=use_pep517,
- constraint=parsed_req.constraint,
- isolated=isolated,
- user_supplied=user_supplied,
- )
-
- else:
- req = install_req_from_line(
- parsed_req.requirement,
- comes_from=parsed_req.comes_from,
- use_pep517=use_pep517,
- isolated=isolated,
- options=parsed_req.options,
- constraint=parsed_req.constraint,
- line_source=parsed_req.line_source,
- user_supplied=user_supplied,
- )
- return req
-
-
-def install_req_from_link_and_ireq(link, ireq):
- # type: (Link, InstallRequirement) -> InstallRequirement
- return InstallRequirement(
- req=ireq.req,
- comes_from=ireq.comes_from,
- editable=ireq.editable,
- link=link,
- markers=ireq.markers,
- use_pep517=ireq.use_pep517,
- isolated=ireq.isolated,
- install_options=ireq.install_options,
- global_options=ireq.global_options,
- hash_options=ireq.hash_options,
- )
diff --git a/venv/Lib/site-packages/pip/_internal/req/req_file.py b/venv/Lib/site-packages/pip/_internal/req/req_file.py
deleted file mode 100644
index 080c128..0000000
--- a/venv/Lib/site-packages/pip/_internal/req/req_file.py
+++ /dev/null
@@ -1,551 +0,0 @@
-"""
-Requirements file parsing
-"""
-
-import optparse
-import os
-import re
-import shlex
-import urllib.parse
-from optparse import Values
-from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Tuple
-
-from pip._internal.cli import cmdoptions
-from pip._internal.exceptions import InstallationError, RequirementsFileParseError
-from pip._internal.models.search_scope import SearchScope
-from pip._internal.network.session import PipSession
-from pip._internal.network.utils import raise_for_status
-from pip._internal.utils.encoding import auto_decode
-from pip._internal.utils.urls import get_url_scheme, url_to_path
-
-if TYPE_CHECKING:
- # NoReturn introduced in 3.6.2; imported only for type checking to maintain
- # pip compatibility with older patch versions of Python 3.6
- from typing import NoReturn
-
- from pip._internal.index.package_finder import PackageFinder
-
-__all__ = ['parse_requirements']
-
-ReqFileLines = Iterator[Tuple[int, str]]
-
-LineParser = Callable[[str], Tuple[str, Values]]
-
-SCHEME_RE = re.compile(r'^(http|https|file):', re.I)
-COMMENT_RE = re.compile(r'(^|\s+)#.*$')
-
-# Matches environment variable-style values in '${MY_VARIABLE_1}' with the
-# variable name consisting of only uppercase letters, digits or the '_'
-# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1,
-# 2013 Edition.
-ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})')
-
-SUPPORTED_OPTIONS = [
- cmdoptions.index_url,
- cmdoptions.extra_index_url,
- cmdoptions.no_index,
- cmdoptions.constraints,
- cmdoptions.requirements,
- cmdoptions.editable,
- cmdoptions.find_links,
- cmdoptions.no_binary,
- cmdoptions.only_binary,
- cmdoptions.prefer_binary,
- cmdoptions.require_hashes,
- cmdoptions.pre,
- cmdoptions.trusted_host,
- cmdoptions.use_new_feature,
-] # type: List[Callable[..., optparse.Option]]
-
-# options to be passed to requirements
-SUPPORTED_OPTIONS_REQ = [
- cmdoptions.install_options,
- cmdoptions.global_options,
- cmdoptions.hash,
-] # type: List[Callable[..., optparse.Option]]
-
-# the 'dest' string values
-SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ]
-
-
-class ParsedRequirement:
- def __init__(
- self,
- requirement, # type:str
- is_editable, # type: bool
- comes_from, # type: str
- constraint, # type: bool
- options=None, # type: Optional[Dict[str, Any]]
- line_source=None, # type: Optional[str]
- ):
- # type: (...) -> None
- self.requirement = requirement
- self.is_editable = is_editable
- self.comes_from = comes_from
- self.options = options
- self.constraint = constraint
- self.line_source = line_source
-
-
-class ParsedLine:
- def __init__(
- self,
- filename, # type: str
- lineno, # type: int
- args, # type: str
- opts, # type: Values
- constraint, # type: bool
- ):
- # type: (...) -> None
- self.filename = filename
- self.lineno = lineno
- self.opts = opts
- self.constraint = constraint
-
- if args:
- self.is_requirement = True
- self.is_editable = False
- self.requirement = args
- elif opts.editables:
- self.is_requirement = True
- self.is_editable = True
- # We don't support multiple -e on one line
- self.requirement = opts.editables[0]
- else:
- self.is_requirement = False
-
-
-def parse_requirements(
- filename, # type: str
- session, # type: PipSession
- finder=None, # type: Optional[PackageFinder]
- options=None, # type: Optional[optparse.Values]
- constraint=False, # type: bool
-):
- # type: (...) -> Iterator[ParsedRequirement]
- """Parse a requirements file and yield ParsedRequirement instances.
-
- :param filename: Path or url of requirements file.
- :param session: PipSession instance.
- :param finder: Instance of pip.index.PackageFinder.
- :param options: cli options.
- :param constraint: If true, parsing a constraint file rather than
- requirements file.
- """
- line_parser = get_line_parser(finder)
- parser = RequirementsFileParser(session, line_parser)
-
- for parsed_line in parser.parse(filename, constraint):
- parsed_req = handle_line(
- parsed_line,
- options=options,
- finder=finder,
- session=session
- )
- if parsed_req is not None:
- yield parsed_req
-
-
-def preprocess(content):
- # type: (str) -> ReqFileLines
- """Split, filter, and join lines, and return a line iterator
-
- :param content: the content of the requirements file
- """
- lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines
- lines_enum = join_lines(lines_enum)
- lines_enum = ignore_comments(lines_enum)
- lines_enum = expand_env_variables(lines_enum)
- return lines_enum
-
-
-def handle_requirement_line(
- line, # type: ParsedLine
- options=None, # type: Optional[optparse.Values]
-):
- # type: (...) -> ParsedRequirement
-
- # preserve for the nested code path
- line_comes_from = '{} {} (line {})'.format(
- '-c' if line.constraint else '-r', line.filename, line.lineno,
- )
-
- assert line.is_requirement
-
- if line.is_editable:
- # For editable requirements, we don't support per-requirement
- # options, so just return the parsed requirement.
- return ParsedRequirement(
- requirement=line.requirement,
- is_editable=line.is_editable,
- comes_from=line_comes_from,
- constraint=line.constraint,
- )
- else:
- if options:
- # Disable wheels if the user has specified build options
- cmdoptions.check_install_build_global(options, line.opts)
-
- # get the options that apply to requirements
- req_options = {}
- for dest in SUPPORTED_OPTIONS_REQ_DEST:
- if dest in line.opts.__dict__ and line.opts.__dict__[dest]:
- req_options[dest] = line.opts.__dict__[dest]
-
- line_source = f'line {line.lineno} of {line.filename}'
- return ParsedRequirement(
- requirement=line.requirement,
- is_editable=line.is_editable,
- comes_from=line_comes_from,
- constraint=line.constraint,
- options=req_options,
- line_source=line_source,
- )
-
-
-def handle_option_line(
- opts, # type: Values
- filename, # type: str
- lineno, # type: int
- finder=None, # type: Optional[PackageFinder]
- options=None, # type: Optional[optparse.Values]
- session=None, # type: Optional[PipSession]
-):
- # type: (...) -> None
-
- if options:
- # percolate options upward
- if opts.require_hashes:
- options.require_hashes = opts.require_hashes
- if opts.features_enabled:
- options.features_enabled.extend(
- f for f in opts.features_enabled
- if f not in options.features_enabled
- )
-
- # set finder options
- if finder:
- find_links = finder.find_links
- index_urls = finder.index_urls
- if opts.index_url:
- index_urls = [opts.index_url]
- if opts.no_index is True:
- index_urls = []
- if opts.extra_index_urls:
- index_urls.extend(opts.extra_index_urls)
- if opts.find_links:
- # FIXME: it would be nice to keep track of the source
- # of the find_links: support a find-links local path
- # relative to a requirements file.
- value = opts.find_links[0]
- req_dir = os.path.dirname(os.path.abspath(filename))
- relative_to_reqs_file = os.path.join(req_dir, value)
- if os.path.exists(relative_to_reqs_file):
- value = relative_to_reqs_file
- find_links.append(value)
-
- if session:
- # We need to update the auth urls in session
- session.update_index_urls(index_urls)
-
- search_scope = SearchScope(
- find_links=find_links,
- index_urls=index_urls,
- )
- finder.search_scope = search_scope
-
- if opts.pre:
- finder.set_allow_all_prereleases()
-
- if opts.prefer_binary:
- finder.set_prefer_binary()
-
- if session:
- for host in opts.trusted_hosts or []:
- source = f'line {lineno} of {filename}'
- session.add_trusted_host(host, source=source)
-
-
-def handle_line(
- line, # type: ParsedLine
- options=None, # type: Optional[optparse.Values]
- finder=None, # type: Optional[PackageFinder]
- session=None, # type: Optional[PipSession]
-):
- # type: (...) -> Optional[ParsedRequirement]
- """Handle a single parsed requirements line; This can result in
- creating/yielding requirements, or updating the finder.
-
- :param line: The parsed line to be processed.
- :param options: CLI options.
- :param finder: The finder - updated by non-requirement lines.
- :param session: The session - updated by non-requirement lines.
-
- Returns a ParsedRequirement object if the line is a requirement line,
- otherwise returns None.
-
- For lines that contain requirements, the only options that have an effect
- are from SUPPORTED_OPTIONS_REQ, and they are scoped to the
- requirement. Other options from SUPPORTED_OPTIONS may be present, but are
- ignored.
-
- For lines that do not contain requirements, the only options that have an
- effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may
- be present, but are ignored. These lines may contain multiple options
- (although our docs imply only one is supported), and all our parsed and
- affect the finder.
- """
-
- if line.is_requirement:
- parsed_req = handle_requirement_line(line, options)
- return parsed_req
- else:
- handle_option_line(
- line.opts,
- line.filename,
- line.lineno,
- finder,
- options,
- session,
- )
- return None
-
-
-class RequirementsFileParser:
- def __init__(
- self,
- session, # type: PipSession
- line_parser, # type: LineParser
- ):
- # type: (...) -> None
- self._session = session
- self._line_parser = line_parser
-
- def parse(self, filename, constraint):
- # type: (str, bool) -> Iterator[ParsedLine]
- """Parse a given file, yielding parsed lines.
- """
- yield from self._parse_and_recurse(filename, constraint)
-
- def _parse_and_recurse(self, filename, constraint):
- # type: (str, bool) -> Iterator[ParsedLine]
- for line in self._parse_file(filename, constraint):
- if (
- not line.is_requirement and
- (line.opts.requirements or line.opts.constraints)
- ):
- # parse a nested requirements file
- if line.opts.requirements:
- req_path = line.opts.requirements[0]
- nested_constraint = False
- else:
- req_path = line.opts.constraints[0]
- nested_constraint = True
-
- # original file is over http
- if SCHEME_RE.search(filename):
- # do a url join so relative paths work
- req_path = urllib.parse.urljoin(filename, req_path)
- # original file and nested file are paths
- elif not SCHEME_RE.search(req_path):
- # do a join so relative paths work
- req_path = os.path.join(
- os.path.dirname(filename), req_path,
- )
-
- yield from self._parse_and_recurse(req_path, nested_constraint)
- else:
- yield line
-
- def _parse_file(self, filename, constraint):
- # type: (str, bool) -> Iterator[ParsedLine]
- _, content = get_file_content(filename, self._session)
-
- lines_enum = preprocess(content)
-
- for line_number, line in lines_enum:
- try:
- args_str, opts = self._line_parser(line)
- except OptionParsingError as e:
- # add offending line
- msg = f'Invalid requirement: {line}\n{e.msg}'
- raise RequirementsFileParseError(msg)
-
- yield ParsedLine(
- filename,
- line_number,
- args_str,
- opts,
- constraint,
- )
-
-
-def get_line_parser(finder):
- # type: (Optional[PackageFinder]) -> LineParser
- def parse_line(line):
- # type: (str) -> Tuple[str, Values]
- # Build new parser for each line since it accumulates appendable
- # options.
- parser = build_parser()
- defaults = parser.get_default_values()
- defaults.index_url = None
- if finder:
- defaults.format_control = finder.format_control
-
- args_str, options_str = break_args_options(line)
-
- opts, _ = parser.parse_args(shlex.split(options_str), defaults)
-
- return args_str, opts
-
- return parse_line
-
-
-def break_args_options(line):
- # type: (str) -> Tuple[str, str]
- """Break up the line into an args and options string. We only want to shlex
- (and then optparse) the options, not the args. args can contain markers
- which are corrupted by shlex.
- """
- tokens = line.split(' ')
- args = []
- options = tokens[:]
- for token in tokens:
- if token.startswith('-') or token.startswith('--'):
- break
- else:
- args.append(token)
- options.pop(0)
- return ' '.join(args), ' '.join(options)
-
-
-class OptionParsingError(Exception):
- def __init__(self, msg):
- # type: (str) -> None
- self.msg = msg
-
-
-def build_parser():
- # type: () -> optparse.OptionParser
- """
- Return a parser for parsing requirement lines
- """
- parser = optparse.OptionParser(add_help_option=False)
-
- option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ
- for option_factory in option_factories:
- option = option_factory()
- parser.add_option(option)
-
- # By default optparse sys.exits on parsing errors. We want to wrap
- # that in our own exception.
- def parser_exit(self, msg):
- # type: (Any, str) -> NoReturn
- raise OptionParsingError(msg)
- # NOTE: mypy disallows assigning to a method
- # https://github.com/python/mypy/issues/2427
- parser.exit = parser_exit # type: ignore
-
- return parser
-
-
-def join_lines(lines_enum):
- # type: (ReqFileLines) -> ReqFileLines
- """Joins a line ending in '\' with the previous line (except when following
- comments). The joined line takes on the index of the first line.
- """
- primary_line_number = None
- new_line = [] # type: List[str]
- for line_number, line in lines_enum:
- if not line.endswith('\\') or COMMENT_RE.match(line):
- if COMMENT_RE.match(line):
- # this ensures comments are always matched later
- line = ' ' + line
- if new_line:
- new_line.append(line)
- assert primary_line_number is not None
- yield primary_line_number, ''.join(new_line)
- new_line = []
- else:
- yield line_number, line
- else:
- if not new_line:
- primary_line_number = line_number
- new_line.append(line.strip('\\'))
-
- # last line contains \
- if new_line:
- assert primary_line_number is not None
- yield primary_line_number, ''.join(new_line)
-
- # TODO: handle space after '\'.
-
-
-def ignore_comments(lines_enum):
- # type: (ReqFileLines) -> ReqFileLines
- """
- Strips comments and filter empty lines.
- """
- for line_number, line in lines_enum:
- line = COMMENT_RE.sub('', line)
- line = line.strip()
- if line:
- yield line_number, line
-
-
-def expand_env_variables(lines_enum):
- # type: (ReqFileLines) -> ReqFileLines
- """Replace all environment variables that can be retrieved via `os.getenv`.
-
- The only allowed format for environment variables defined in the
- requirement file is `${MY_VARIABLE_1}` to ensure two things:
-
- 1. Strings that contain a `$` aren't accidentally (partially) expanded.
- 2. Ensure consistency across platforms for requirement files.
-
- These points are the result of a discussion on the `github pull
- request #3514 `_.
-
- Valid characters in variable names follow the `POSIX standard
- `_ and are limited
- to uppercase letter, digits and the `_` (underscore).
- """
- for line_number, line in lines_enum:
- for env_var, var_name in ENV_VAR_RE.findall(line):
- value = os.getenv(var_name)
- if not value:
- continue
-
- line = line.replace(env_var, value)
-
- yield line_number, line
-
-
-def get_file_content(url, session):
- # type: (str, PipSession) -> Tuple[str, str]
- """Gets the content of a file; it may be a filename, file: URL, or
- http: URL. Returns (location, content). Content is unicode.
- Respects # -*- coding: declarations on the retrieved files.
-
- :param url: File path or url.
- :param session: PipSession instance.
- """
- scheme = get_url_scheme(url)
-
- if scheme in ['http', 'https']:
- # FIXME: catch some errors
- resp = session.get(url)
- raise_for_status(resp)
- return resp.url, resp.text
-
- elif scheme == 'file':
- url = url_to_path(url)
-
- try:
- with open(url, 'rb') as f:
- content = auto_decode(f.read())
- except OSError as exc:
- raise InstallationError(
- f'Could not open requirements file: {exc}'
- )
- return url, content
diff --git a/venv/Lib/site-packages/pip/_internal/req/req_install.py b/venv/Lib/site-packages/pip/_internal/req/req_install.py
deleted file mode 100644
index c2eea37..0000000
--- a/venv/Lib/site-packages/pip/_internal/req/req_install.py
+++ /dev/null
@@ -1,892 +0,0 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-import logging
-import os
-import shutil
-import sys
-import uuid
-import zipfile
-from typing import Any, Dict, Iterable, List, Optional, Sequence, Union
-
-from pip._vendor import pkg_resources, six
-from pip._vendor.packaging.markers import Marker
-from pip._vendor.packaging.requirements import Requirement
-from pip._vendor.packaging.specifiers import SpecifierSet
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import Version
-from pip._vendor.packaging.version import parse as parse_version
-from pip._vendor.pep517.wrappers import Pep517HookCaller
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment
-from pip._internal.exceptions import InstallationError
-from pip._internal.locations import get_scheme
-from pip._internal.models.link import Link
-from pip._internal.operations.build.metadata import generate_metadata
-from pip._internal.operations.build.metadata_legacy import (
- generate_metadata as generate_metadata_legacy,
-)
-from pip._internal.operations.install.editable_legacy import (
- install_editable as install_editable_legacy,
-)
-from pip._internal.operations.install.legacy import LegacyInstallFailure
-from pip._internal.operations.install.legacy import install as install_legacy
-from pip._internal.operations.install.wheel import install_wheel
-from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path
-from pip._internal.req.req_uninstall import UninstallPathSet
-from pip._internal.utils.deprecation import deprecated
-from pip._internal.utils.direct_url_helpers import direct_url_from_link
-from pip._internal.utils.hashes import Hashes
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import (
- ask_path_exists,
- backup_dir,
- display_path,
- dist_in_site_packages,
- dist_in_usersite,
- get_distribution,
- hide_url,
- redact_auth_from_url,
-)
-from pip._internal.utils.packaging import get_metadata
-from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
-from pip._internal.utils.virtualenv import running_under_virtualenv
-from pip._internal.vcs import vcs
-
-logger = logging.getLogger(__name__)
-
-
-def _get_dist(metadata_directory):
- # type: (str) -> Distribution
- """Return a pkg_resources.Distribution for the provided
- metadata directory.
- """
- dist_dir = metadata_directory.rstrip(os.sep)
-
- # Build a PathMetadata object, from path to metadata. :wink:
- base_dir, dist_dir_name = os.path.split(dist_dir)
- metadata = pkg_resources.PathMetadata(base_dir, dist_dir)
-
- # Determine the correct Distribution object type.
- if dist_dir.endswith(".egg-info"):
- dist_cls = pkg_resources.Distribution
- dist_name = os.path.splitext(dist_dir_name)[0]
- else:
- assert dist_dir.endswith(".dist-info")
- dist_cls = pkg_resources.DistInfoDistribution
- dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0]
-
- return dist_cls(
- base_dir,
- project_name=dist_name,
- metadata=metadata,
- )
-
-
-class InstallRequirement:
- """
- Represents something that may be installed later on, may have information
- about where to fetch the relevant requirement and also contains logic for
- installing the said requirement.
- """
-
- def __init__(
- self,
- req, # type: Optional[Requirement]
- comes_from, # type: Optional[Union[str, InstallRequirement]]
- editable=False, # type: bool
- link=None, # type: Optional[Link]
- markers=None, # type: Optional[Marker]
- use_pep517=None, # type: Optional[bool]
- isolated=False, # type: bool
- install_options=None, # type: Optional[List[str]]
- global_options=None, # type: Optional[List[str]]
- hash_options=None, # type: Optional[Dict[str, List[str]]]
- constraint=False, # type: bool
- extras=(), # type: Iterable[str]
- user_supplied=False, # type: bool
- ):
- # type: (...) -> None
- assert req is None or isinstance(req, Requirement), req
- self.req = req
- self.comes_from = comes_from
- self.constraint = constraint
- self.editable = editable
- self.legacy_install_reason = None # type: Optional[int]
-
- # source_dir is the local directory where the linked requirement is
- # located, or unpacked. In case unpacking is needed, creating and
- # populating source_dir is done by the RequirementPreparer. Note this
- # is not necessarily the directory where pyproject.toml or setup.py is
- # located - that one is obtained via unpacked_source_directory.
- self.source_dir = None # type: Optional[str]
- if self.editable:
- assert link
- if link.is_file:
- self.source_dir = os.path.normpath(
- os.path.abspath(link.file_path)
- )
-
- if link is None and req and req.url:
- # PEP 508 URL requirement
- link = Link(req.url)
- self.link = self.original_link = link
- self.original_link_is_in_wheel_cache = False
-
- # Path to any downloaded or already-existing package.
- self.local_file_path = None # type: Optional[str]
- if self.link and self.link.is_file:
- self.local_file_path = self.link.file_path
-
- if extras:
- self.extras = extras
- elif req:
- self.extras = {
- pkg_resources.safe_extra(extra) for extra in req.extras
- }
- else:
- self.extras = set()
- if markers is None and req:
- markers = req.marker
- self.markers = markers
-
- # This holds the pkg_resources.Distribution object if this requirement
- # is already available:
- self.satisfied_by = None # type: Optional[Distribution]
- # Whether the installation process should try to uninstall an existing
- # distribution before installing this requirement.
- self.should_reinstall = False
- # Temporary build location
- self._temp_build_dir = None # type: Optional[TempDirectory]
- # Set to True after successful installation
- self.install_succeeded = None # type: Optional[bool]
- # Supplied options
- self.install_options = install_options if install_options else []
- self.global_options = global_options if global_options else []
- self.hash_options = hash_options if hash_options else {}
- # Set to True after successful preparation of this requirement
- self.prepared = False
- # User supplied requirement are explicitly requested for installation
- # by the user via CLI arguments or requirements files, as opposed to,
- # e.g. dependencies, extras or constraints.
- self.user_supplied = user_supplied
-
- self.isolated = isolated
- self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment
-
- # For PEP 517, the directory where we request the project metadata
- # gets stored. We need this to pass to build_wheel, so the backend
- # can ensure that the wheel matches the metadata (see the PEP for
- # details).
- self.metadata_directory = None # type: Optional[str]
-
- # The static build requirements (from pyproject.toml)
- self.pyproject_requires = None # type: Optional[List[str]]
-
- # Build requirements that we will check are available
- self.requirements_to_check = [] # type: List[str]
-
- # The PEP 517 backend we should use to build the project
- self.pep517_backend = None # type: Optional[Pep517HookCaller]
-
- # Are we using PEP 517 for this requirement?
- # After pyproject.toml has been loaded, the only valid values are True
- # and False. Before loading, None is valid (meaning "use the default").
- # Setting an explicit value before loading pyproject.toml is supported,
- # but after loading this flag should be treated as read only.
- self.use_pep517 = use_pep517
-
- # This requirement needs more preparation before it can be built
- self.needs_more_preparation = False
-
- def __str__(self):
- # type: () -> str
- if self.req:
- s = str(self.req)
- if self.link:
- s += ' from {}'.format(redact_auth_from_url(self.link.url))
- elif self.link:
- s = redact_auth_from_url(self.link.url)
- else:
- s = ''
- if self.satisfied_by is not None:
- s += ' in {}'.format(display_path(self.satisfied_by.location))
- if self.comes_from:
- if isinstance(self.comes_from, str):
- comes_from = self.comes_from # type: Optional[str]
- else:
- comes_from = self.comes_from.from_path()
- if comes_from:
- s += f' (from {comes_from})'
- return s
-
- def __repr__(self):
- # type: () -> str
- return '<{} object: {} editable={!r}>'.format(
- self.__class__.__name__, str(self), self.editable)
-
- def format_debug(self):
- # type: () -> str
- """An un-tested helper for getting state, for debugging.
- """
- attributes = vars(self)
- names = sorted(attributes)
-
- state = (
- "{}={!r}".format(attr, attributes[attr]) for attr in sorted(names)
- )
- return '<{name} object: {{{state}}}>'.format(
- name=self.__class__.__name__,
- state=", ".join(state),
- )
-
- # Things that are valid for all kinds of requirements?
- @property
- def name(self):
- # type: () -> Optional[str]
- if self.req is None:
- return None
- return pkg_resources.safe_name(self.req.name)
-
- @property
- def specifier(self):
- # type: () -> SpecifierSet
- return self.req.specifier
-
- @property
- def is_pinned(self):
- # type: () -> bool
- """Return whether I am pinned to an exact version.
-
- For example, some-package==1.2 is pinned; some-package>1.2 is not.
- """
- specifiers = self.specifier
- return (len(specifiers) == 1 and
- next(iter(specifiers)).operator in {'==', '==='})
-
- def match_markers(self, extras_requested=None):
- # type: (Optional[Iterable[str]]) -> bool
- if not extras_requested:
- # Provide an extra to safely evaluate the markers
- # without matching any extra
- extras_requested = ('',)
- if self.markers is not None:
- return any(
- self.markers.evaluate({'extra': extra})
- for extra in extras_requested)
- else:
- return True
-
- @property
- def has_hash_options(self):
- # type: () -> bool
- """Return whether any known-good hashes are specified as options.
-
- These activate --require-hashes mode; hashes specified as part of a
- URL do not.
-
- """
- return bool(self.hash_options)
-
- def hashes(self, trust_internet=True):
- # type: (bool) -> Hashes
- """Return a hash-comparer that considers my option- and URL-based
- hashes to be known-good.
-
- Hashes in URLs--ones embedded in the requirements file, not ones
- downloaded from an index server--are almost peers with ones from
- flags. They satisfy --require-hashes (whether it was implicitly or
- explicitly activated) but do not activate it. md5 and sha224 are not
- allowed in flags, which should nudge people toward good algos. We
- always OR all hashes together, even ones from URLs.
-
- :param trust_internet: Whether to trust URL-based (#md5=...) hashes
- downloaded from the internet, as by populate_link()
-
- """
- good_hashes = self.hash_options.copy()
- link = self.link if trust_internet else self.original_link
- if link and link.hash:
- good_hashes.setdefault(link.hash_name, []).append(link.hash)
- return Hashes(good_hashes)
-
- def from_path(self):
- # type: () -> Optional[str]
- """Format a nice indicator to show where this "comes from"
- """
- if self.req is None:
- return None
- s = str(self.req)
- if self.comes_from:
- if isinstance(self.comes_from, str):
- comes_from = self.comes_from
- else:
- comes_from = self.comes_from.from_path()
- if comes_from:
- s += '->' + comes_from
- return s
-
- def ensure_build_location(self, build_dir, autodelete, parallel_builds):
- # type: (str, bool, bool) -> str
- assert build_dir is not None
- if self._temp_build_dir is not None:
- assert self._temp_build_dir.path
- return self._temp_build_dir.path
- if self.req is None:
- # Some systems have /tmp as a symlink which confuses custom
- # builds (such as numpy). Thus, we ensure that the real path
- # is returned.
- self._temp_build_dir = TempDirectory(
- kind=tempdir_kinds.REQ_BUILD, globally_managed=True
- )
-
- return self._temp_build_dir.path
-
- # This is the only remaining place where we manually determine the path
- # for the temporary directory. It is only needed for editables where
- # it is the value of the --src option.
-
- # When parallel builds are enabled, add a UUID to the build directory
- # name so multiple builds do not interfere with each other.
- dir_name = canonicalize_name(self.name) # type: str
- if parallel_builds:
- dir_name = f"{dir_name}_{uuid.uuid4().hex}"
-
- # FIXME: Is there a better place to create the build_dir? (hg and bzr
- # need this)
- if not os.path.exists(build_dir):
- logger.debug('Creating directory %s', build_dir)
- os.makedirs(build_dir)
- actual_build_dir = os.path.join(build_dir, dir_name)
- # `None` indicates that we respect the globally-configured deletion
- # settings, which is what we actually want when auto-deleting.
- delete_arg = None if autodelete else False
- return TempDirectory(
- path=actual_build_dir,
- delete=delete_arg,
- kind=tempdir_kinds.REQ_BUILD,
- globally_managed=True,
- ).path
-
- def _set_requirement(self):
- # type: () -> None
- """Set requirement after generating metadata.
- """
- assert self.req is None
- assert self.metadata is not None
- assert self.source_dir is not None
-
- # Construct a Requirement object from the generated metadata
- if isinstance(parse_version(self.metadata["Version"]), Version):
- op = "=="
- else:
- op = "==="
-
- self.req = Requirement(
- "".join([
- self.metadata["Name"],
- op,
- self.metadata["Version"],
- ])
- )
-
- def warn_on_mismatching_name(self):
- # type: () -> None
- metadata_name = canonicalize_name(self.metadata["Name"])
- if canonicalize_name(self.req.name) == metadata_name:
- # Everything is fine.
- return
-
- # If we're here, there's a mismatch. Log a warning about it.
- logger.warning(
- 'Generating metadata for package %s '
- 'produced metadata for project name %s. Fix your '
- '#egg=%s fragments.',
- self.name, metadata_name, self.name
- )
- self.req = Requirement(metadata_name)
-
- def check_if_exists(self, use_user_site):
- # type: (bool) -> None
- """Find an installed distribution that satisfies or conflicts
- with this requirement, and set self.satisfied_by or
- self.should_reinstall appropriately.
- """
- if self.req is None:
- return
- existing_dist = get_distribution(self.req.name)
- if not existing_dist:
- return
-
- # pkg_resouces may contain a different copy of packaging.version from
- # pip in if the downstream distributor does a poor job debundling pip.
- # We avoid existing_dist.parsed_version and let SpecifierSet.contains
- # parses the version instead.
- existing_version = existing_dist.version
- version_compatible = (
- existing_version is not None and
- self.req.specifier.contains(existing_version, prereleases=True)
- )
- if not version_compatible:
- self.satisfied_by = None
- if use_user_site:
- if dist_in_usersite(existing_dist):
- self.should_reinstall = True
- elif (running_under_virtualenv() and
- dist_in_site_packages(existing_dist)):
- raise InstallationError(
- "Will not install to the user site because it will "
- "lack sys.path precedence to {} in {}".format(
- existing_dist.project_name, existing_dist.location)
- )
- else:
- self.should_reinstall = True
- else:
- if self.editable:
- self.should_reinstall = True
- # when installing editables, nothing pre-existing should ever
- # satisfy
- self.satisfied_by = None
- else:
- self.satisfied_by = existing_dist
-
- # Things valid for wheels
- @property
- def is_wheel(self):
- # type: () -> bool
- if not self.link:
- return False
- return self.link.is_wheel
-
- # Things valid for sdists
- @property
- def unpacked_source_directory(self):
- # type: () -> str
- return os.path.join(
- self.source_dir,
- self.link and self.link.subdirectory_fragment or '')
-
- @property
- def setup_py_path(self):
- # type: () -> str
- assert self.source_dir, f"No source dir for {self}"
- setup_py = os.path.join(self.unpacked_source_directory, 'setup.py')
-
- return setup_py
-
- @property
- def pyproject_toml_path(self):
- # type: () -> str
- assert self.source_dir, f"No source dir for {self}"
- return make_pyproject_path(self.unpacked_source_directory)
-
- def load_pyproject_toml(self):
- # type: () -> None
- """Load the pyproject.toml file.
-
- After calling this routine, all of the attributes related to PEP 517
- processing for this requirement have been set. In particular, the
- use_pep517 attribute can be used to determine whether we should
- follow the PEP 517 or legacy (setup.py) code path.
- """
- pyproject_toml_data = load_pyproject_toml(
- self.use_pep517,
- self.pyproject_toml_path,
- self.setup_py_path,
- str(self)
- )
-
- if pyproject_toml_data is None:
- self.use_pep517 = False
- return
-
- self.use_pep517 = True
- requires, backend, check, backend_path = pyproject_toml_data
- self.requirements_to_check = check
- self.pyproject_requires = requires
- self.pep517_backend = Pep517HookCaller(
- self.unpacked_source_directory, backend, backend_path=backend_path,
- )
-
- def _check_setup_py_or_cfg_exists(self) -> bool:
- """Check if the requirement actually has a setuptools build file.
-
- If setup.py does not exist, we also check setup.cfg in the same
- directory and allow the directory if that exists.
- """
- if os.path.exists(self.setup_py_path):
- return True
- stem, ext = os.path.splitext(self.setup_py_path)
- if ext == ".py" and os.path.exists(f"{stem}.cfg"):
- return True
- return False
-
- def _generate_metadata(self):
- # type: () -> str
- """Invokes metadata generator functions, with the required arguments.
- """
- if not self.use_pep517:
- assert self.unpacked_source_directory
-
- if not self._check_setup_py_or_cfg_exists():
- raise InstallationError(
- f'File "setup.py" or "setup.cfg" not found for legacy '
- f'project {self}.'
- )
-
- return generate_metadata_legacy(
- build_env=self.build_env,
- setup_py_path=self.setup_py_path,
- source_dir=self.unpacked_source_directory,
- isolated=self.isolated,
- details=self.name or f"from {self.link}"
- )
-
- assert self.pep517_backend is not None
-
- return generate_metadata(
- build_env=self.build_env,
- backend=self.pep517_backend,
- )
-
- def prepare_metadata(self):
- # type: () -> None
- """Ensure that project metadata is available.
-
- Under PEP 517, call the backend hook to prepare the metadata.
- Under legacy processing, call setup.py egg-info.
- """
- assert self.source_dir
-
- with indent_log():
- self.metadata_directory = self._generate_metadata()
-
- # Act on the newly generated metadata, based on the name and version.
- if not self.name:
- self._set_requirement()
- else:
- self.warn_on_mismatching_name()
-
- self.assert_source_matches_version()
-
- @property
- def metadata(self):
- # type: () -> Any
- if not hasattr(self, '_metadata'):
- self._metadata = get_metadata(self.get_dist())
-
- return self._metadata
-
- def get_dist(self):
- # type: () -> Distribution
- return _get_dist(self.metadata_directory)
-
- def assert_source_matches_version(self):
- # type: () -> None
- assert self.source_dir
- version = self.metadata['version']
- if self.req.specifier and version not in self.req.specifier:
- logger.warning(
- 'Requested %s, but installing version %s',
- self,
- version,
- )
- else:
- logger.debug(
- 'Source in %s has version %s, which satisfies requirement %s',
- display_path(self.source_dir),
- version,
- self,
- )
-
- # For both source distributions and editables
- def ensure_has_source_dir(
- self,
- parent_dir,
- autodelete=False,
- parallel_builds=False,
- ):
- # type: (str, bool, bool) -> None
- """Ensure that a source_dir is set.
-
- This will create a temporary build dir if the name of the requirement
- isn't known yet.
-
- :param parent_dir: The ideal pip parent_dir for the source_dir.
- Generally src_dir for editables and build_dir for sdists.
- :return: self.source_dir
- """
- if self.source_dir is None:
- self.source_dir = self.ensure_build_location(
- parent_dir,
- autodelete=autodelete,
- parallel_builds=parallel_builds,
- )
-
- # For editable installations
- def update_editable(self):
- # type: () -> None
- if not self.link:
- logger.debug(
- "Cannot update repository at %s; repository location is "
- "unknown",
- self.source_dir,
- )
- return
- assert self.editable
- assert self.source_dir
- if self.link.scheme == 'file':
- # Static paths don't get updated
- return
- vcs_backend = vcs.get_backend_for_scheme(self.link.scheme)
- # Editable requirements are validated in Requirement constructors.
- # So here, if it's neither a path nor a valid VCS URL, it's a bug.
- assert vcs_backend, f"Unsupported VCS URL {self.link.url}"
- hidden_url = hide_url(self.link.url)
- vcs_backend.obtain(self.source_dir, url=hidden_url)
-
- # Top-level Actions
- def uninstall(self, auto_confirm=False, verbose=False):
- # type: (bool, bool) -> Optional[UninstallPathSet]
- """
- Uninstall the distribution currently satisfying this requirement.
-
- Prompts before removing or modifying files unless
- ``auto_confirm`` is True.
-
- Refuses to delete or modify files outside of ``sys.prefix`` -
- thus uninstallation within a virtual environment can only
- modify that virtual environment, even if the virtualenv is
- linked to global site-packages.
-
- """
- assert self.req
- dist = get_distribution(self.req.name)
- if not dist:
- logger.warning("Skipping %s as it is not installed.", self.name)
- return None
- logger.info('Found existing installation: %s', dist)
-
- uninstalled_pathset = UninstallPathSet.from_dist(dist)
- uninstalled_pathset.remove(auto_confirm, verbose)
- return uninstalled_pathset
-
- def _get_archive_name(self, path, parentdir, rootdir):
- # type: (str, str, str) -> str
-
- def _clean_zip_name(name, prefix):
- # type: (str, str) -> str
- assert name.startswith(prefix + os.path.sep), (
- f"name {name!r} doesn't start with prefix {prefix!r}"
- )
- name = name[len(prefix) + 1:]
- name = name.replace(os.path.sep, '/')
- return name
-
- path = os.path.join(parentdir, path)
- name = _clean_zip_name(path, rootdir)
- return self.name + '/' + name
-
- def archive(self, build_dir):
- # type: (Optional[str]) -> None
- """Saves archive to provided build_dir.
-
- Used for saving downloaded VCS requirements as part of `pip download`.
- """
- assert self.source_dir
- if build_dir is None:
- return
-
- create_archive = True
- archive_name = '{}-{}.zip'.format(self.name, self.metadata["version"])
- archive_path = os.path.join(build_dir, archive_name)
-
- if os.path.exists(archive_path):
- response = ask_path_exists(
- 'The file {} exists. (i)gnore, (w)ipe, '
- '(b)ackup, (a)bort '.format(
- display_path(archive_path)),
- ('i', 'w', 'b', 'a'))
- if response == 'i':
- create_archive = False
- elif response == 'w':
- logger.warning('Deleting %s', display_path(archive_path))
- os.remove(archive_path)
- elif response == 'b':
- dest_file = backup_dir(archive_path)
- logger.warning(
- 'Backing up %s to %s',
- display_path(archive_path),
- display_path(dest_file),
- )
- shutil.move(archive_path, dest_file)
- elif response == 'a':
- sys.exit(-1)
-
- if not create_archive:
- return
-
- zip_output = zipfile.ZipFile(
- archive_path, 'w', zipfile.ZIP_DEFLATED, allowZip64=True,
- )
- with zip_output:
- dir = os.path.normcase(
- os.path.abspath(self.unpacked_source_directory)
- )
- for dirpath, dirnames, filenames in os.walk(dir):
- for dirname in dirnames:
- dir_arcname = self._get_archive_name(
- dirname, parentdir=dirpath, rootdir=dir,
- )
- zipdir = zipfile.ZipInfo(dir_arcname + '/')
- zipdir.external_attr = 0x1ED << 16 # 0o755
- zip_output.writestr(zipdir, '')
- for filename in filenames:
- file_arcname = self._get_archive_name(
- filename, parentdir=dirpath, rootdir=dir,
- )
- filename = os.path.join(dirpath, filename)
- zip_output.write(filename, file_arcname)
-
- logger.info('Saved %s', display_path(archive_path))
-
- def install(
- self,
- install_options, # type: List[str]
- global_options=None, # type: Optional[Sequence[str]]
- root=None, # type: Optional[str]
- home=None, # type: Optional[str]
- prefix=None, # type: Optional[str]
- warn_script_location=True, # type: bool
- use_user_site=False, # type: bool
- pycompile=True # type: bool
- ):
- # type: (...) -> None
- scheme = get_scheme(
- self.name,
- user=use_user_site,
- home=home,
- root=root,
- isolated=self.isolated,
- prefix=prefix,
- )
-
- global_options = global_options if global_options is not None else []
- if self.editable:
- install_editable_legacy(
- install_options,
- global_options,
- prefix=prefix,
- home=home,
- use_user_site=use_user_site,
- name=self.name,
- setup_py_path=self.setup_py_path,
- isolated=self.isolated,
- build_env=self.build_env,
- unpacked_source_directory=self.unpacked_source_directory,
- )
- self.install_succeeded = True
- return
-
- if self.is_wheel:
- assert self.local_file_path
- direct_url = None
- if self.original_link:
- direct_url = direct_url_from_link(
- self.original_link,
- self.source_dir,
- self.original_link_is_in_wheel_cache,
- )
- install_wheel(
- self.name,
- self.local_file_path,
- scheme=scheme,
- req_description=str(self.req),
- pycompile=pycompile,
- warn_script_location=warn_script_location,
- direct_url=direct_url,
- requested=self.user_supplied,
- )
- self.install_succeeded = True
- return
-
- # TODO: Why don't we do this for editable installs?
-
- # Extend the list of global and install options passed on to
- # the setup.py call with the ones from the requirements file.
- # Options specified in requirements file override those
- # specified on the command line, since the last option given
- # to setup.py is the one that is used.
- global_options = list(global_options) + self.global_options
- install_options = list(install_options) + self.install_options
-
- try:
- success = install_legacy(
- install_options=install_options,
- global_options=global_options,
- root=root,
- home=home,
- prefix=prefix,
- use_user_site=use_user_site,
- pycompile=pycompile,
- scheme=scheme,
- setup_py_path=self.setup_py_path,
- isolated=self.isolated,
- req_name=self.name,
- build_env=self.build_env,
- unpacked_source_directory=self.unpacked_source_directory,
- req_description=str(self.req),
- )
- except LegacyInstallFailure as exc:
- self.install_succeeded = False
- six.reraise(*exc.parent)
- except Exception:
- self.install_succeeded = True
- raise
-
- self.install_succeeded = success
-
- if success and self.legacy_install_reason == 8368:
- deprecated(
- reason=(
- "{} was installed using the legacy 'setup.py install' "
- "method, because a wheel could not be built for it.".
- format(self.name)
- ),
- replacement="to fix the wheel build issue reported above",
- gone_in=None,
- issue=8368,
- )
-
-
-def check_invalid_constraint_type(req):
- # type: (InstallRequirement) -> str
-
- # Check for unsupported forms
- problem = ""
- if not req.name:
- problem = "Unnamed requirements are not allowed as constraints"
- elif req.editable:
- problem = "Editable requirements are not allowed as constraints"
- elif req.extras:
- problem = "Constraints cannot have extras"
-
- if problem:
- deprecated(
- reason=(
- "Constraints are only allowed to take the form of a package "
- "name and a version specifier. Other forms were originally "
- "permitted as an accident of the implementation, but were "
- "undocumented. The new implementation of the resolver no "
- "longer supports these forms."
- ),
- replacement=(
- "replacing the constraint with a requirement."
- ),
- # No plan yet for when the new resolver becomes default
- gone_in=None,
- issue=8210
- )
-
- return problem
diff --git a/venv/Lib/site-packages/pip/_internal/req/req_set.py b/venv/Lib/site-packages/pip/_internal/req/req_set.py
deleted file mode 100644
index 59c5843..0000000
--- a/venv/Lib/site-packages/pip/_internal/req/req_set.py
+++ /dev/null
@@ -1,199 +0,0 @@
-import logging
-from collections import OrderedDict
-from typing import Dict, Iterable, List, Optional, Tuple
-
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.exceptions import InstallationError
-from pip._internal.models.wheel import Wheel
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils import compatibility_tags
-
-logger = logging.getLogger(__name__)
-
-
-class RequirementSet:
-
- def __init__(self, check_supported_wheels=True):
- # type: (bool) -> None
- """Create a RequirementSet.
- """
-
- self.requirements = OrderedDict() # type: Dict[str, InstallRequirement]
- self.check_supported_wheels = check_supported_wheels
-
- self.unnamed_requirements = [] # type: List[InstallRequirement]
-
- def __str__(self):
- # type: () -> str
- requirements = sorted(
- (req for req in self.requirements.values() if not req.comes_from),
- key=lambda req: canonicalize_name(req.name or ""),
- )
- return ' '.join(str(req.req) for req in requirements)
-
- def __repr__(self):
- # type: () -> str
- requirements = sorted(
- self.requirements.values(),
- key=lambda req: canonicalize_name(req.name or ""),
- )
-
- format_string = '<{classname} object; {count} requirement(s): {reqs}>'
- return format_string.format(
- classname=self.__class__.__name__,
- count=len(requirements),
- reqs=', '.join(str(req.req) for req in requirements),
- )
-
- def add_unnamed_requirement(self, install_req):
- # type: (InstallRequirement) -> None
- assert not install_req.name
- self.unnamed_requirements.append(install_req)
-
- def add_named_requirement(self, install_req):
- # type: (InstallRequirement) -> None
- assert install_req.name
-
- project_name = canonicalize_name(install_req.name)
- self.requirements[project_name] = install_req
-
- def add_requirement(
- self,
- install_req, # type: InstallRequirement
- parent_req_name=None, # type: Optional[str]
- extras_requested=None # type: Optional[Iterable[str]]
- ):
- # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]]
- """Add install_req as a requirement to install.
-
- :param parent_req_name: The name of the requirement that needed this
- added. The name is used because when multiple unnamed requirements
- resolve to the same name, we could otherwise end up with dependency
- links that point outside the Requirements set. parent_req must
- already be added. Note that None implies that this is a user
- supplied requirement, vs an inferred one.
- :param extras_requested: an iterable of extras used to evaluate the
- environment markers.
- :return: Additional requirements to scan. That is either [] if
- the requirement is not applicable, or [install_req] if the
- requirement is applicable and has just been added.
- """
- # If the markers do not match, ignore this requirement.
- if not install_req.match_markers(extras_requested):
- logger.info(
- "Ignoring %s: markers '%s' don't match your environment",
- install_req.name, install_req.markers,
- )
- return [], None
-
- # If the wheel is not supported, raise an error.
- # Should check this after filtering out based on environment markers to
- # allow specifying different wheels based on the environment/OS, in a
- # single requirements file.
- if install_req.link and install_req.link.is_wheel:
- wheel = Wheel(install_req.link.filename)
- tags = compatibility_tags.get_supported()
- if (self.check_supported_wheels and not wheel.supported(tags)):
- raise InstallationError(
- "{} is not a supported wheel on this platform.".format(
- wheel.filename)
- )
-
- # This next bit is really a sanity check.
- assert not install_req.user_supplied or parent_req_name is None, (
- "a user supplied req shouldn't have a parent"
- )
-
- # Unnamed requirements are scanned again and the requirement won't be
- # added as a dependency until after scanning.
- if not install_req.name:
- self.add_unnamed_requirement(install_req)
- return [install_req], None
-
- try:
- existing_req = self.get_requirement(
- install_req.name) # type: Optional[InstallRequirement]
- except KeyError:
- existing_req = None
-
- has_conflicting_requirement = (
- parent_req_name is None and
- existing_req and
- not existing_req.constraint and
- existing_req.extras == install_req.extras and
- existing_req.req and
- install_req.req and
- existing_req.req.specifier != install_req.req.specifier
- )
- if has_conflicting_requirement:
- raise InstallationError(
- "Double requirement given: {} (already in {}, name={!r})"
- .format(install_req, existing_req, install_req.name)
- )
-
- # When no existing requirement exists, add the requirement as a
- # dependency and it will be scanned again after.
- if not existing_req:
- self.add_named_requirement(install_req)
- # We'd want to rescan this requirement later
- return [install_req], install_req
-
- # Assume there's no need to scan, and that we've already
- # encountered this for scanning.
- if install_req.constraint or not existing_req.constraint:
- return [], existing_req
-
- does_not_satisfy_constraint = (
- install_req.link and
- not (
- existing_req.link and
- install_req.link.path == existing_req.link.path
- )
- )
- if does_not_satisfy_constraint:
- raise InstallationError(
- "Could not satisfy constraints for '{}': "
- "installation from path or url cannot be "
- "constrained to a version".format(install_req.name)
- )
- # If we're now installing a constraint, mark the existing
- # object for real installation.
- existing_req.constraint = False
- # If we're now installing a user supplied requirement,
- # mark the existing object as such.
- if install_req.user_supplied:
- existing_req.user_supplied = True
- existing_req.extras = tuple(sorted(
- set(existing_req.extras) | set(install_req.extras)
- ))
- logger.debug(
- "Setting %s extras to: %s",
- existing_req, existing_req.extras,
- )
- # Return the existing requirement for addition to the parent and
- # scanning again.
- return [existing_req], existing_req
-
- def has_requirement(self, name):
- # type: (str) -> bool
- project_name = canonicalize_name(name)
-
- return (
- project_name in self.requirements and
- not self.requirements[project_name].constraint
- )
-
- def get_requirement(self, name):
- # type: (str) -> InstallRequirement
- project_name = canonicalize_name(name)
-
- if project_name in self.requirements:
- return self.requirements[project_name]
-
- raise KeyError(f"No project with the name {name!r}")
-
- @property
- def all_requirements(self):
- # type: () -> List[InstallRequirement]
- return self.unnamed_requirements + list(self.requirements.values())
diff --git a/venv/Lib/site-packages/pip/_internal/req/req_tracker.py b/venv/Lib/site-packages/pip/_internal/req/req_tracker.py
deleted file mode 100644
index 542e0d9..0000000
--- a/venv/Lib/site-packages/pip/_internal/req/req_tracker.py
+++ /dev/null
@@ -1,140 +0,0 @@
-import contextlib
-import hashlib
-import logging
-import os
-from types import TracebackType
-from typing import Dict, Iterator, Optional, Set, Type, Union
-
-from pip._internal.models.link import Link
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.temp_dir import TempDirectory
-
-logger = logging.getLogger(__name__)
-
-
-@contextlib.contextmanager
-def update_env_context_manager(**changes):
- # type: (str) -> Iterator[None]
- target = os.environ
-
- # Save values from the target and change them.
- non_existent_marker = object()
- saved_values = {} # type: Dict[str, Union[object, str]]
- for name, new_value in changes.items():
- try:
- saved_values[name] = target[name]
- except KeyError:
- saved_values[name] = non_existent_marker
- target[name] = new_value
-
- try:
- yield
- finally:
- # Restore original values in the target.
- for name, original_value in saved_values.items():
- if original_value is non_existent_marker:
- del target[name]
- else:
- assert isinstance(original_value, str) # for mypy
- target[name] = original_value
-
-
-@contextlib.contextmanager
-def get_requirement_tracker():
- # type: () -> Iterator[RequirementTracker]
- root = os.environ.get('PIP_REQ_TRACKER')
- with contextlib.ExitStack() as ctx:
- if root is None:
- root = ctx.enter_context(
- TempDirectory(kind='req-tracker')
- ).path
- ctx.enter_context(update_env_context_manager(PIP_REQ_TRACKER=root))
- logger.debug("Initialized build tracking at %s", root)
-
- with RequirementTracker(root) as tracker:
- yield tracker
-
-
-class RequirementTracker:
-
- def __init__(self, root):
- # type: (str) -> None
- self._root = root
- self._entries = set() # type: Set[InstallRequirement]
- logger.debug("Created build tracker: %s", self._root)
-
- def __enter__(self):
- # type: () -> RequirementTracker
- logger.debug("Entered build tracker: %s", self._root)
- return self
-
- def __exit__(
- self,
- exc_type, # type: Optional[Type[BaseException]]
- exc_val, # type: Optional[BaseException]
- exc_tb # type: Optional[TracebackType]
- ):
- # type: (...) -> None
- self.cleanup()
-
- def _entry_path(self, link):
- # type: (Link) -> str
- hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest()
- return os.path.join(self._root, hashed)
-
- def add(self, req):
- # type: (InstallRequirement) -> None
- """Add an InstallRequirement to build tracking.
- """
-
- assert req.link
- # Get the file to write information about this requirement.
- entry_path = self._entry_path(req.link)
-
- # Try reading from the file. If it exists and can be read from, a build
- # is already in progress, so a LookupError is raised.
- try:
- with open(entry_path) as fp:
- contents = fp.read()
- except FileNotFoundError:
- pass
- else:
- message = '{} is already being built: {}'.format(
- req.link, contents)
- raise LookupError(message)
-
- # If we're here, req should really not be building already.
- assert req not in self._entries
-
- # Start tracking this requirement.
- with open(entry_path, 'w', encoding="utf-8") as fp:
- fp.write(str(req))
- self._entries.add(req)
-
- logger.debug('Added %s to build tracker %r', req, self._root)
-
- def remove(self, req):
- # type: (InstallRequirement) -> None
- """Remove an InstallRequirement from build tracking.
- """
-
- assert req.link
- # Delete the created file and the corresponding entries.
- os.unlink(self._entry_path(req.link))
- self._entries.remove(req)
-
- logger.debug('Removed %s from build tracker %r', req, self._root)
-
- def cleanup(self):
- # type: () -> None
- for req in set(self._entries):
- self.remove(req)
-
- logger.debug("Removed build tracker: %r", self._root)
-
- @contextlib.contextmanager
- def track(self, req):
- # type: (InstallRequirement) -> Iterator[None]
- self.add(req)
- yield
- self.remove(req)
diff --git a/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py b/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py
deleted file mode 100644
index b722341..0000000
--- a/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py
+++ /dev/null
@@ -1,640 +0,0 @@
-import csv
-import functools
-import logging
-import os
-import sys
-import sysconfig
-from importlib.util import cache_from_source
-from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple
-
-from pip._vendor import pkg_resources
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.exceptions import UninstallationError
-from pip._internal.locations import get_bin_prefix, get_bin_user
-from pip._internal.utils.compat import WINDOWS
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import (
- ask,
- dist_in_usersite,
- dist_is_local,
- egg_link_path,
- is_local,
- normalize_path,
- renames,
- rmtree,
-)
-from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory
-
-logger = logging.getLogger(__name__)
-
-
-def _script_names(dist, script_name, is_gui):
- # type: (Distribution, str, bool) -> List[str]
- """Create the fully qualified name of the files created by
- {console,gui}_scripts for the given ``dist``.
- Returns the list of file names
- """
- if dist_in_usersite(dist):
- bin_dir = get_bin_user()
- else:
- bin_dir = get_bin_prefix()
- exe_name = os.path.join(bin_dir, script_name)
- paths_to_remove = [exe_name]
- if WINDOWS:
- paths_to_remove.append(exe_name + '.exe')
- paths_to_remove.append(exe_name + '.exe.manifest')
- if is_gui:
- paths_to_remove.append(exe_name + '-script.pyw')
- else:
- paths_to_remove.append(exe_name + '-script.py')
- return paths_to_remove
-
-
-def _unique(fn):
- # type: (Callable[..., Iterator[Any]]) -> Callable[..., Iterator[Any]]
- @functools.wraps(fn)
- def unique(*args, **kw):
- # type: (Any, Any) -> Iterator[Any]
- seen = set() # type: Set[Any]
- for item in fn(*args, **kw):
- if item not in seen:
- seen.add(item)
- yield item
- return unique
-
-
-@_unique
-def uninstallation_paths(dist):
- # type: (Distribution) -> Iterator[str]
- """
- Yield all the uninstallation paths for dist based on RECORD-without-.py[co]
-
- Yield paths to all the files in RECORD. For each .py file in RECORD, add
- the .pyc and .pyo in the same directory.
-
- UninstallPathSet.add() takes care of the __pycache__ .py[co].
- """
- r = csv.reader(dist.get_metadata_lines('RECORD'))
- for row in r:
- path = os.path.join(dist.location, row[0])
- yield path
- if path.endswith('.py'):
- dn, fn = os.path.split(path)
- base = fn[:-3]
- path = os.path.join(dn, base + '.pyc')
- yield path
- path = os.path.join(dn, base + '.pyo')
- yield path
-
-
-def compact(paths):
- # type: (Iterable[str]) -> Set[str]
- """Compact a path set to contain the minimal number of paths
- necessary to contain all paths in the set. If /a/path/ and
- /a/path/to/a/file.txt are both in the set, leave only the
- shorter path."""
-
- sep = os.path.sep
- short_paths = set() # type: Set[str]
- for path in sorted(paths, key=len):
- should_skip = any(
- path.startswith(shortpath.rstrip("*")) and
- path[len(shortpath.rstrip("*").rstrip(sep))] == sep
- for shortpath in short_paths
- )
- if not should_skip:
- short_paths.add(path)
- return short_paths
-
-
-def compress_for_rename(paths):
- # type: (Iterable[str]) -> Set[str]
- """Returns a set containing the paths that need to be renamed.
-
- This set may include directories when the original sequence of paths
- included every file on disk.
- """
- case_map = {os.path.normcase(p): p for p in paths}
- remaining = set(case_map)
- unchecked = sorted({os.path.split(p)[0] for p in case_map.values()}, key=len)
- wildcards = set() # type: Set[str]
-
- def norm_join(*a):
- # type: (str) -> str
- return os.path.normcase(os.path.join(*a))
-
- for root in unchecked:
- if any(os.path.normcase(root).startswith(w)
- for w in wildcards):
- # This directory has already been handled.
- continue
-
- all_files = set() # type: Set[str]
- all_subdirs = set() # type: Set[str]
- for dirname, subdirs, files in os.walk(root):
- all_subdirs.update(norm_join(root, dirname, d)
- for d in subdirs)
- all_files.update(norm_join(root, dirname, f)
- for f in files)
- # If all the files we found are in our remaining set of files to
- # remove, then remove them from the latter set and add a wildcard
- # for the directory.
- if not (all_files - remaining):
- remaining.difference_update(all_files)
- wildcards.add(root + os.sep)
-
- return set(map(case_map.__getitem__, remaining)) | wildcards
-
-
-def compress_for_output_listing(paths):
- # type: (Iterable[str]) -> Tuple[Set[str], Set[str]]
- """Returns a tuple of 2 sets of which paths to display to user
-
- The first set contains paths that would be deleted. Files of a package
- are not added and the top-level directory of the package has a '*' added
- at the end - to signify that all it's contents are removed.
-
- The second set contains files that would have been skipped in the above
- folders.
- """
-
- will_remove = set(paths)
- will_skip = set()
-
- # Determine folders and files
- folders = set()
- files = set()
- for path in will_remove:
- if path.endswith(".pyc"):
- continue
- if path.endswith("__init__.py") or ".dist-info" in path:
- folders.add(os.path.dirname(path))
- files.add(path)
-
- # probably this one https://github.com/python/mypy/issues/390
- _normcased_files = set(map(os.path.normcase, files)) # type: ignore
-
- folders = compact(folders)
-
- # This walks the tree using os.walk to not miss extra folders
- # that might get added.
- for folder in folders:
- for dirpath, _, dirfiles in os.walk(folder):
- for fname in dirfiles:
- if fname.endswith(".pyc"):
- continue
-
- file_ = os.path.join(dirpath, fname)
- if (os.path.isfile(file_) and
- os.path.normcase(file_) not in _normcased_files):
- # We are skipping this file. Add it to the set.
- will_skip.add(file_)
-
- will_remove = files | {
- os.path.join(folder, "*") for folder in folders
- }
-
- return will_remove, will_skip
-
-
-class StashedUninstallPathSet:
- """A set of file rename operations to stash files while
- tentatively uninstalling them."""
- def __init__(self):
- # type: () -> None
- # Mapping from source file root to [Adjacent]TempDirectory
- # for files under that directory.
- self._save_dirs = {} # type: Dict[str, TempDirectory]
- # (old path, new path) tuples for each move that may need
- # to be undone.
- self._moves = [] # type: List[Tuple[str, str]]
-
- def _get_directory_stash(self, path):
- # type: (str) -> str
- """Stashes a directory.
-
- Directories are stashed adjacent to their original location if
- possible, or else moved/copied into the user's temp dir."""
-
- try:
- save_dir = AdjacentTempDirectory(path) # type: TempDirectory
- except OSError:
- save_dir = TempDirectory(kind="uninstall")
- self._save_dirs[os.path.normcase(path)] = save_dir
-
- return save_dir.path
-
- def _get_file_stash(self, path):
- # type: (str) -> str
- """Stashes a file.
-
- If no root has been provided, one will be created for the directory
- in the user's temp directory."""
- path = os.path.normcase(path)
- head, old_head = os.path.dirname(path), None
- save_dir = None
-
- while head != old_head:
- try:
- save_dir = self._save_dirs[head]
- break
- except KeyError:
- pass
- head, old_head = os.path.dirname(head), head
- else:
- # Did not find any suitable root
- head = os.path.dirname(path)
- save_dir = TempDirectory(kind='uninstall')
- self._save_dirs[head] = save_dir
-
- relpath = os.path.relpath(path, head)
- if relpath and relpath != os.path.curdir:
- return os.path.join(save_dir.path, relpath)
- return save_dir.path
-
- def stash(self, path):
- # type: (str) -> str
- """Stashes the directory or file and returns its new location.
- Handle symlinks as files to avoid modifying the symlink targets.
- """
- path_is_dir = os.path.isdir(path) and not os.path.islink(path)
- if path_is_dir:
- new_path = self._get_directory_stash(path)
- else:
- new_path = self._get_file_stash(path)
-
- self._moves.append((path, new_path))
- if (path_is_dir and os.path.isdir(new_path)):
- # If we're moving a directory, we need to
- # remove the destination first or else it will be
- # moved to inside the existing directory.
- # We just created new_path ourselves, so it will
- # be removable.
- os.rmdir(new_path)
- renames(path, new_path)
- return new_path
-
- def commit(self):
- # type: () -> None
- """Commits the uninstall by removing stashed files."""
- for _, save_dir in self._save_dirs.items():
- save_dir.cleanup()
- self._moves = []
- self._save_dirs = {}
-
- def rollback(self):
- # type: () -> None
- """Undoes the uninstall by moving stashed files back."""
- for p in self._moves:
- logger.info("Moving to %s\n from %s", *p)
-
- for new_path, path in self._moves:
- try:
- logger.debug('Replacing %s from %s', new_path, path)
- if os.path.isfile(new_path) or os.path.islink(new_path):
- os.unlink(new_path)
- elif os.path.isdir(new_path):
- rmtree(new_path)
- renames(path, new_path)
- except OSError as ex:
- logger.error("Failed to restore %s", new_path)
- logger.debug("Exception: %s", ex)
-
- self.commit()
-
- @property
- def can_rollback(self):
- # type: () -> bool
- return bool(self._moves)
-
-
-class UninstallPathSet:
- """A set of file paths to be removed in the uninstallation of a
- requirement."""
- def __init__(self, dist):
- # type: (Distribution) -> None
- self.paths = set() # type: Set[str]
- self._refuse = set() # type: Set[str]
- self.pth = {} # type: Dict[str, UninstallPthEntries]
- self.dist = dist
- self._moved_paths = StashedUninstallPathSet()
-
- def _permitted(self, path):
- # type: (str) -> bool
- """
- Return True if the given path is one we are permitted to
- remove/modify, False otherwise.
-
- """
- return is_local(path)
-
- def add(self, path):
- # type: (str) -> None
- head, tail = os.path.split(path)
-
- # we normalize the head to resolve parent directory symlinks, but not
- # the tail, since we only want to uninstall symlinks, not their targets
- path = os.path.join(normalize_path(head), os.path.normcase(tail))
-
- if not os.path.exists(path):
- return
- if self._permitted(path):
- self.paths.add(path)
- else:
- self._refuse.add(path)
-
- # __pycache__ files can show up after 'installed-files.txt' is created,
- # due to imports
- if os.path.splitext(path)[1] == '.py':
- self.add(cache_from_source(path))
-
- def add_pth(self, pth_file, entry):
- # type: (str, str) -> None
- pth_file = normalize_path(pth_file)
- if self._permitted(pth_file):
- if pth_file not in self.pth:
- self.pth[pth_file] = UninstallPthEntries(pth_file)
- self.pth[pth_file].add(entry)
- else:
- self._refuse.add(pth_file)
-
- def remove(self, auto_confirm=False, verbose=False):
- # type: (bool, bool) -> None
- """Remove paths in ``self.paths`` with confirmation (unless
- ``auto_confirm`` is True)."""
-
- if not self.paths:
- logger.info(
- "Can't uninstall '%s'. No files were found to uninstall.",
- self.dist.project_name,
- )
- return
-
- dist_name_version = (
- self.dist.project_name + "-" + self.dist.version
- )
- logger.info('Uninstalling %s:', dist_name_version)
-
- with indent_log():
- if auto_confirm or self._allowed_to_proceed(verbose):
- moved = self._moved_paths
-
- for_rename = compress_for_rename(self.paths)
-
- for path in sorted(compact(for_rename)):
- moved.stash(path)
- logger.debug('Removing file or directory %s', path)
-
- for pth in self.pth.values():
- pth.remove()
-
- logger.info('Successfully uninstalled %s', dist_name_version)
-
- def _allowed_to_proceed(self, verbose):
- # type: (bool) -> bool
- """Display which files would be deleted and prompt for confirmation
- """
-
- def _display(msg, paths):
- # type: (str, Iterable[str]) -> None
- if not paths:
- return
-
- logger.info(msg)
- with indent_log():
- for path in sorted(compact(paths)):
- logger.info(path)
-
- if not verbose:
- will_remove, will_skip = compress_for_output_listing(self.paths)
- else:
- # In verbose mode, display all the files that are going to be
- # deleted.
- will_remove = set(self.paths)
- will_skip = set()
-
- _display('Would remove:', will_remove)
- _display('Would not remove (might be manually added):', will_skip)
- _display('Would not remove (outside of prefix):', self._refuse)
- if verbose:
- _display('Will actually move:', compress_for_rename(self.paths))
-
- return ask('Proceed (y/n)? ', ('y', 'n')) == 'y'
-
- def rollback(self):
- # type: () -> None
- """Rollback the changes previously made by remove()."""
- if not self._moved_paths.can_rollback:
- logger.error(
- "Can't roll back %s; was not uninstalled",
- self.dist.project_name,
- )
- return
- logger.info('Rolling back uninstall of %s', self.dist.project_name)
- self._moved_paths.rollback()
- for pth in self.pth.values():
- pth.rollback()
-
- def commit(self):
- # type: () -> None
- """Remove temporary save dir: rollback will no longer be possible."""
- self._moved_paths.commit()
-
- @classmethod
- def from_dist(cls, dist):
- # type: (Distribution) -> UninstallPathSet
- dist_path = normalize_path(dist.location)
- if not dist_is_local(dist):
- logger.info(
- "Not uninstalling %s at %s, outside environment %s",
- dist.key,
- dist_path,
- sys.prefix,
- )
- return cls(dist)
-
- if dist_path in {p for p in {sysconfig.get_path("stdlib"),
- sysconfig.get_path("platstdlib")}
- if p}:
- logger.info(
- "Not uninstalling %s at %s, as it is in the standard library.",
- dist.key,
- dist_path,
- )
- return cls(dist)
-
- paths_to_remove = cls(dist)
- develop_egg_link = egg_link_path(dist)
- develop_egg_link_egg_info = '{}.egg-info'.format(
- pkg_resources.to_filename(dist.project_name))
- egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info)
- # Special case for distutils installed package
- distutils_egg_info = getattr(dist._provider, 'path', None)
-
- # Uninstall cases order do matter as in the case of 2 installs of the
- # same package, pip needs to uninstall the currently detected version
- if (egg_info_exists and dist.egg_info.endswith('.egg-info') and
- not dist.egg_info.endswith(develop_egg_link_egg_info)):
- # if dist.egg_info.endswith(develop_egg_link_egg_info), we
- # are in fact in the develop_egg_link case
- paths_to_remove.add(dist.egg_info)
- if dist.has_metadata('installed-files.txt'):
- for installed_file in dist.get_metadata(
- 'installed-files.txt').splitlines():
- path = os.path.normpath(
- os.path.join(dist.egg_info, installed_file)
- )
- paths_to_remove.add(path)
- # FIXME: need a test for this elif block
- # occurs with --single-version-externally-managed/--record outside
- # of pip
- elif dist.has_metadata('top_level.txt'):
- if dist.has_metadata('namespace_packages.txt'):
- namespaces = dist.get_metadata('namespace_packages.txt')
- else:
- namespaces = []
- for top_level_pkg in [
- p for p
- in dist.get_metadata('top_level.txt').splitlines()
- if p and p not in namespaces]:
- path = os.path.join(dist.location, top_level_pkg)
- paths_to_remove.add(path)
- paths_to_remove.add(path + '.py')
- paths_to_remove.add(path + '.pyc')
- paths_to_remove.add(path + '.pyo')
-
- elif distutils_egg_info:
- raise UninstallationError(
- "Cannot uninstall {!r}. It is a distutils installed project "
- "and thus we cannot accurately determine which files belong "
- "to it which would lead to only a partial uninstall.".format(
- dist.project_name,
- )
- )
-
- elif dist.location.endswith('.egg'):
- # package installed by easy_install
- # We cannot match on dist.egg_name because it can slightly vary
- # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg
- paths_to_remove.add(dist.location)
- easy_install_egg = os.path.split(dist.location)[1]
- easy_install_pth = os.path.join(os.path.dirname(dist.location),
- 'easy-install.pth')
- paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg)
-
- elif egg_info_exists and dist.egg_info.endswith('.dist-info'):
- for path in uninstallation_paths(dist):
- paths_to_remove.add(path)
-
- elif develop_egg_link:
- # develop egg
- with open(develop_egg_link) as fh:
- link_pointer = os.path.normcase(fh.readline().strip())
- assert (link_pointer == dist.location), (
- 'Egg-link {} does not match installed location of {} '
- '(at {})'.format(
- link_pointer, dist.project_name, dist.location)
- )
- paths_to_remove.add(develop_egg_link)
- easy_install_pth = os.path.join(os.path.dirname(develop_egg_link),
- 'easy-install.pth')
- paths_to_remove.add_pth(easy_install_pth, dist.location)
-
- else:
- logger.debug(
- 'Not sure how to uninstall: %s - Check: %s',
- dist, dist.location,
- )
-
- # find distutils scripts= scripts
- if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'):
- for script in dist.metadata_listdir('scripts'):
- if dist_in_usersite(dist):
- bin_dir = get_bin_user()
- else:
- bin_dir = get_bin_prefix()
- paths_to_remove.add(os.path.join(bin_dir, script))
- if WINDOWS:
- paths_to_remove.add(os.path.join(bin_dir, script) + '.bat')
-
- # find console_scripts
- _scripts_to_remove = []
- console_scripts = dist.get_entry_map(group='console_scripts')
- for name in console_scripts.keys():
- _scripts_to_remove.extend(_script_names(dist, name, False))
- # find gui_scripts
- gui_scripts = dist.get_entry_map(group='gui_scripts')
- for name in gui_scripts.keys():
- _scripts_to_remove.extend(_script_names(dist, name, True))
-
- for s in _scripts_to_remove:
- paths_to_remove.add(s)
-
- return paths_to_remove
-
-
-class UninstallPthEntries:
- def __init__(self, pth_file):
- # type: (str) -> None
- self.file = pth_file
- self.entries = set() # type: Set[str]
- self._saved_lines = None # type: Optional[List[bytes]]
-
- def add(self, entry):
- # type: (str) -> None
- entry = os.path.normcase(entry)
- # On Windows, os.path.normcase converts the entry to use
- # backslashes. This is correct for entries that describe absolute
- # paths outside of site-packages, but all the others use forward
- # slashes.
- # os.path.splitdrive is used instead of os.path.isabs because isabs
- # treats non-absolute paths with drive letter markings like c:foo\bar
- # as absolute paths. It also does not recognize UNC paths if they don't
- # have more than "\\sever\share". Valid examples: "\\server\share\" or
- # "\\server\share\folder".
- if WINDOWS and not os.path.splitdrive(entry)[0]:
- entry = entry.replace('\\', '/')
- self.entries.add(entry)
-
- def remove(self):
- # type: () -> None
- logger.debug('Removing pth entries from %s:', self.file)
-
- # If the file doesn't exist, log a warning and return
- if not os.path.isfile(self.file):
- logger.warning(
- "Cannot remove entries from nonexistent file %s", self.file
- )
- return
- with open(self.file, 'rb') as fh:
- # windows uses '\r\n' with py3k, but uses '\n' with py2.x
- lines = fh.readlines()
- self._saved_lines = lines
- if any(b'\r\n' in line for line in lines):
- endline = '\r\n'
- else:
- endline = '\n'
- # handle missing trailing newline
- if lines and not lines[-1].endswith(endline.encode("utf-8")):
- lines[-1] = lines[-1] + endline.encode("utf-8")
- for entry in self.entries:
- try:
- logger.debug('Removing entry: %s', entry)
- lines.remove((entry + endline).encode("utf-8"))
- except ValueError:
- pass
- with open(self.file, 'wb') as fh:
- fh.writelines(lines)
-
- def rollback(self):
- # type: () -> bool
- if self._saved_lines is None:
- logger.error(
- 'Cannot roll back changes to %s, none were made', self.file
- )
- return False
- logger.debug('Rolling %s back to previous state', self.file)
- with open(self.file, 'wb') as fh:
- fh.writelines(self._saved_lines)
- return True
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index d9be7ff..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc
deleted file mode 100644
index c7910c7..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/base.py b/venv/Lib/site-packages/pip/_internal/resolution/base.py
deleted file mode 100644
index 1be0cb2..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/base.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from typing import Callable, List
-
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.req.req_set import RequirementSet
-
-InstallRequirementProvider = Callable[[str, InstallRequirement], InstallRequirement]
-
-
-class BaseResolver:
- def resolve(self, root_reqs, check_supported_wheels):
- # type: (List[InstallRequirement], bool) -> RequirementSet
- raise NotImplementedError()
-
- def get_installation_order(self, req_set):
- # type: (RequirementSet) -> List[InstallRequirement]
- raise NotImplementedError()
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py b/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py
deleted file mode 100644
index 17de7f0..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py
+++ /dev/null
@@ -1,462 +0,0 @@
-"""Dependency Resolution
-
-The dependency resolution in pip is performed as follows:
-
-for top-level requirements:
- a. only one spec allowed per project, regardless of conflicts or not.
- otherwise a "double requirement" exception is raised
- b. they override sub-dependency requirements.
-for sub-dependencies
- a. "first found, wins" (where the order is breadth first)
-"""
-
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-import logging
-import sys
-from collections import defaultdict
-from itertools import chain
-from typing import DefaultDict, Iterable, List, Optional, Set, Tuple
-
-from pip._vendor.packaging import specifiers
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.cache import WheelCache
-from pip._internal.exceptions import (
- BestVersionAlreadyInstalled,
- DistributionNotFound,
- HashError,
- HashErrors,
- UnsupportedPythonVersion,
-)
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.models.link import Link
-from pip._internal.operations.prepare import RequirementPreparer
-from pip._internal.req.req_install import (
- InstallRequirement,
- check_invalid_constraint_type,
-)
-from pip._internal.req.req_set import RequirementSet
-from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider
-from pip._internal.utils.compatibility_tags import get_supported
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import dist_in_usersite, normalize_version_info
-from pip._internal.utils.packaging import check_requires_python, get_requires_python
-
-logger = logging.getLogger(__name__)
-
-DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]]
-
-
-def _check_dist_requires_python(
- dist, # type: Distribution
- version_info, # type: Tuple[int, int, int]
- ignore_requires_python=False, # type: bool
-):
- # type: (...) -> None
- """
- Check whether the given Python version is compatible with a distribution's
- "Requires-Python" value.
-
- :param version_info: A 3-tuple of ints representing the Python
- major-minor-micro version to check.
- :param ignore_requires_python: Whether to ignore the "Requires-Python"
- value if the given Python version isn't compatible.
-
- :raises UnsupportedPythonVersion: When the given Python version isn't
- compatible.
- """
- requires_python = get_requires_python(dist)
- try:
- is_compatible = check_requires_python(
- requires_python, version_info=version_info
- )
- except specifiers.InvalidSpecifier as exc:
- logger.warning(
- "Package %r has an invalid Requires-Python: %s", dist.project_name, exc
- )
- return
-
- if is_compatible:
- return
-
- version = ".".join(map(str, version_info))
- if ignore_requires_python:
- logger.debug(
- "Ignoring failed Requires-Python check for package %r: " "%s not in %r",
- dist.project_name,
- version,
- requires_python,
- )
- return
-
- raise UnsupportedPythonVersion(
- "Package {!r} requires a different Python: {} not in {!r}".format(
- dist.project_name, version, requires_python
- )
- )
-
-
-class Resolver(BaseResolver):
- """Resolves which packages need to be installed/uninstalled to perform \
- the requested operation without breaking the requirements of any package.
- """
-
- _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"}
-
- def __init__(
- self,
- preparer, # type: RequirementPreparer
- finder, # type: PackageFinder
- wheel_cache, # type: Optional[WheelCache]
- make_install_req, # type: InstallRequirementProvider
- use_user_site, # type: bool
- ignore_dependencies, # type: bool
- ignore_installed, # type: bool
- ignore_requires_python, # type: bool
- force_reinstall, # type: bool
- upgrade_strategy, # type: str
- py_version_info=None, # type: Optional[Tuple[int, ...]]
- ):
- # type: (...) -> None
- super().__init__()
- assert upgrade_strategy in self._allowed_strategies
-
- if py_version_info is None:
- py_version_info = sys.version_info[:3]
- else:
- py_version_info = normalize_version_info(py_version_info)
-
- self._py_version_info = py_version_info
-
- self.preparer = preparer
- self.finder = finder
- self.wheel_cache = wheel_cache
-
- self.upgrade_strategy = upgrade_strategy
- self.force_reinstall = force_reinstall
- self.ignore_dependencies = ignore_dependencies
- self.ignore_installed = ignore_installed
- self.ignore_requires_python = ignore_requires_python
- self.use_user_site = use_user_site
- self._make_install_req = make_install_req
-
- self._discovered_dependencies = defaultdict(
- list
- ) # type: DiscoveredDependencies
-
- def resolve(self, root_reqs, check_supported_wheels):
- # type: (List[InstallRequirement], bool) -> RequirementSet
- """Resolve what operations need to be done
-
- As a side-effect of this method, the packages (and their dependencies)
- are downloaded, unpacked and prepared for installation. This
- preparation is done by ``pip.operations.prepare``.
-
- Once PyPI has static dependency metadata available, it would be
- possible to move the preparation to become a step separated from
- dependency resolution.
- """
- requirement_set = RequirementSet(check_supported_wheels=check_supported_wheels)
- for req in root_reqs:
- if req.constraint:
- check_invalid_constraint_type(req)
- requirement_set.add_requirement(req)
-
- # Actually prepare the files, and collect any exceptions. Most hash
- # exceptions cannot be checked ahead of time, because
- # _populate_link() needs to be called before we can make decisions
- # based on link type.
- discovered_reqs = [] # type: List[InstallRequirement]
- hash_errors = HashErrors()
- for req in chain(requirement_set.all_requirements, discovered_reqs):
- try:
- discovered_reqs.extend(self._resolve_one(requirement_set, req))
- except HashError as exc:
- exc.req = req
- hash_errors.append(exc)
-
- if hash_errors:
- raise hash_errors
-
- return requirement_set
-
- def _is_upgrade_allowed(self, req):
- # type: (InstallRequirement) -> bool
- if self.upgrade_strategy == "to-satisfy-only":
- return False
- elif self.upgrade_strategy == "eager":
- return True
- else:
- assert self.upgrade_strategy == "only-if-needed"
- return req.user_supplied or req.constraint
-
- def _set_req_to_reinstall(self, req):
- # type: (InstallRequirement) -> None
- """
- Set a requirement to be installed.
- """
- # Don't uninstall the conflict if doing a user install and the
- # conflict is not a user install.
- if not self.use_user_site or dist_in_usersite(req.satisfied_by):
- req.should_reinstall = True
- req.satisfied_by = None
-
- def _check_skip_installed(self, req_to_install):
- # type: (InstallRequirement) -> Optional[str]
- """Check if req_to_install should be skipped.
-
- This will check if the req is installed, and whether we should upgrade
- or reinstall it, taking into account all the relevant user options.
-
- After calling this req_to_install will only have satisfied_by set to
- None if the req_to_install is to be upgraded/reinstalled etc. Any
- other value will be a dist recording the current thing installed that
- satisfies the requirement.
-
- Note that for vcs urls and the like we can't assess skipping in this
- routine - we simply identify that we need to pull the thing down,
- then later on it is pulled down and introspected to assess upgrade/
- reinstalls etc.
-
- :return: A text reason for why it was skipped, or None.
- """
- if self.ignore_installed:
- return None
-
- req_to_install.check_if_exists(self.use_user_site)
- if not req_to_install.satisfied_by:
- return None
-
- if self.force_reinstall:
- self._set_req_to_reinstall(req_to_install)
- return None
-
- if not self._is_upgrade_allowed(req_to_install):
- if self.upgrade_strategy == "only-if-needed":
- return "already satisfied, skipping upgrade"
- return "already satisfied"
-
- # Check for the possibility of an upgrade. For link-based
- # requirements we have to pull the tree down and inspect to assess
- # the version #, so it's handled way down.
- if not req_to_install.link:
- try:
- self.finder.find_requirement(req_to_install, upgrade=True)
- except BestVersionAlreadyInstalled:
- # Then the best version is installed.
- return "already up-to-date"
- except DistributionNotFound:
- # No distribution found, so we squash the error. It will
- # be raised later when we re-try later to do the install.
- # Why don't we just raise here?
- pass
-
- self._set_req_to_reinstall(req_to_install)
- return None
-
- def _find_requirement_link(self, req):
- # type: (InstallRequirement) -> Optional[Link]
- upgrade = self._is_upgrade_allowed(req)
- best_candidate = self.finder.find_requirement(req, upgrade)
- if not best_candidate:
- return None
-
- # Log a warning per PEP 592 if necessary before returning.
- link = best_candidate.link
- if link.is_yanked:
- reason = link.yanked_reason or ""
- msg = (
- # Mark this as a unicode string to prevent
- # "UnicodeEncodeError: 'ascii' codec can't encode character"
- # in Python 2 when the reason contains non-ascii characters.
- "The candidate selected for download or install is a "
- "yanked version: {candidate}\n"
- "Reason for being yanked: {reason}"
- ).format(candidate=best_candidate, reason=reason)
- logger.warning(msg)
-
- return link
-
- def _populate_link(self, req):
- # type: (InstallRequirement) -> None
- """Ensure that if a link can be found for this, that it is found.
-
- Note that req.link may still be None - if the requirement is already
- installed and not needed to be upgraded based on the return value of
- _is_upgrade_allowed().
-
- If preparer.require_hashes is True, don't use the wheel cache, because
- cached wheels, always built locally, have different hashes than the
- files downloaded from the index server and thus throw false hash
- mismatches. Furthermore, cached wheels at present have undeterministic
- contents due to file modification times.
- """
- if req.link is None:
- req.link = self._find_requirement_link(req)
-
- if self.wheel_cache is None or self.preparer.require_hashes:
- return
- cache_entry = self.wheel_cache.get_cache_entry(
- link=req.link,
- package_name=req.name,
- supported_tags=get_supported(),
- )
- if cache_entry is not None:
- logger.debug("Using cached wheel link: %s", cache_entry.link)
- if req.link is req.original_link and cache_entry.persistent:
- req.original_link_is_in_wheel_cache = True
- req.link = cache_entry.link
-
- def _get_dist_for(self, req):
- # type: (InstallRequirement) -> Distribution
- """Takes a InstallRequirement and returns a single AbstractDist \
- representing a prepared variant of the same.
- """
- if req.editable:
- return self.preparer.prepare_editable_requirement(req)
-
- # satisfied_by is only evaluated by calling _check_skip_installed,
- # so it must be None here.
- assert req.satisfied_by is None
- skip_reason = self._check_skip_installed(req)
-
- if req.satisfied_by:
- return self.preparer.prepare_installed_requirement(req, skip_reason)
-
- # We eagerly populate the link, since that's our "legacy" behavior.
- self._populate_link(req)
- dist = self.preparer.prepare_linked_requirement(req)
-
- # NOTE
- # The following portion is for determining if a certain package is
- # going to be re-installed/upgraded or not and reporting to the user.
- # This should probably get cleaned up in a future refactor.
-
- # req.req is only avail after unpack for URL
- # pkgs repeat check_if_exists to uninstall-on-upgrade
- # (#14)
- if not self.ignore_installed:
- req.check_if_exists(self.use_user_site)
-
- if req.satisfied_by:
- should_modify = (
- self.upgrade_strategy != "to-satisfy-only"
- or self.force_reinstall
- or self.ignore_installed
- or req.link.scheme == "file"
- )
- if should_modify:
- self._set_req_to_reinstall(req)
- else:
- logger.info(
- "Requirement already satisfied (use --upgrade to upgrade):" " %s",
- req,
- )
- return dist
-
- def _resolve_one(
- self,
- requirement_set, # type: RequirementSet
- req_to_install, # type: InstallRequirement
- ):
- # type: (...) -> List[InstallRequirement]
- """Prepare a single requirements file.
-
- :return: A list of additional InstallRequirements to also install.
- """
- # Tell user what we are doing for this requirement:
- # obtain (editable), skipping, processing (local url), collecting
- # (remote url or package name)
- if req_to_install.constraint or req_to_install.prepared:
- return []
-
- req_to_install.prepared = True
-
- # Parse and return dependencies
- dist = self._get_dist_for(req_to_install)
- # This will raise UnsupportedPythonVersion if the given Python
- # version isn't compatible with the distribution's Requires-Python.
- _check_dist_requires_python(
- dist,
- version_info=self._py_version_info,
- ignore_requires_python=self.ignore_requires_python,
- )
-
- more_reqs = [] # type: List[InstallRequirement]
-
- def add_req(subreq, extras_requested):
- # type: (Distribution, Iterable[str]) -> None
- sub_install_req = self._make_install_req(
- str(subreq),
- req_to_install,
- )
- parent_req_name = req_to_install.name
- to_scan_again, add_to_parent = requirement_set.add_requirement(
- sub_install_req,
- parent_req_name=parent_req_name,
- extras_requested=extras_requested,
- )
- if parent_req_name and add_to_parent:
- self._discovered_dependencies[parent_req_name].append(add_to_parent)
- more_reqs.extend(to_scan_again)
-
- with indent_log():
- # We add req_to_install before its dependencies, so that we
- # can refer to it when adding dependencies.
- if not requirement_set.has_requirement(req_to_install.name):
- # 'unnamed' requirements will get added here
- # 'unnamed' requirements can only come from being directly
- # provided by the user.
- assert req_to_install.user_supplied
- requirement_set.add_requirement(req_to_install, parent_req_name=None)
-
- if not self.ignore_dependencies:
- if req_to_install.extras:
- logger.debug(
- "Installing extra requirements: %r",
- ",".join(req_to_install.extras),
- )
- missing_requested = sorted(
- set(req_to_install.extras) - set(dist.extras)
- )
- for missing in missing_requested:
- logger.warning("%s does not provide the extra '%s'", dist, missing)
-
- available_requested = sorted(
- set(dist.extras) & set(req_to_install.extras)
- )
- for subreq in dist.requires(available_requested):
- add_req(subreq, extras_requested=available_requested)
-
- return more_reqs
-
- def get_installation_order(self, req_set):
- # type: (RequirementSet) -> List[InstallRequirement]
- """Create the installation order.
-
- The installation order is topological - requirements are installed
- before the requiring thing. We break cycles at an arbitrary point,
- and make no other guarantees.
- """
- # The current implementation, which we may change at any point
- # installs the user specified things in the order given, except when
- # dependencies must come earlier to achieve topological order.
- order = []
- ordered_reqs = set() # type: Set[InstallRequirement]
-
- def schedule(req):
- # type: (InstallRequirement) -> None
- if req.satisfied_by or req in ordered_reqs:
- return
- if req.constraint:
- return
- ordered_reqs.add(req)
- for dep in self._discovered_dependencies[req.name]:
- schedule(dep)
- order.append(req)
-
- for install_req in req_set.requirements.values():
- schedule(install_req)
- return order
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 66fed1e..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc
deleted file mode 100644
index 92b9667..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc
deleted file mode 100644
index 4a13bfa..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc
deleted file mode 100644
index 03abcae..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc
deleted file mode 100644
index 802a4fd..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc
deleted file mode 100644
index 81a15d8..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc
deleted file mode 100644
index 90398ac..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc
deleted file mode 100644
index 6d6f244..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc
deleted file mode 100644
index c2eb5b3..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py
deleted file mode 100644
index 26821a1..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py
+++ /dev/null
@@ -1,165 +0,0 @@
-from typing import FrozenSet, Iterable, Optional, Tuple, Union
-
-from pip._vendor.packaging.specifiers import SpecifierSet
-from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
-from pip._vendor.packaging.version import LegacyVersion, Version
-
-from pip._internal.models.link import Link, links_equivalent
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.hashes import Hashes
-
-CandidateLookup = Tuple[Optional["Candidate"], Optional[InstallRequirement]]
-CandidateVersion = Union[LegacyVersion, Version]
-
-
-def format_name(project, extras):
- # type: (str, FrozenSet[str]) -> str
- if not extras:
- return project
- canonical_extras = sorted(canonicalize_name(e) for e in extras)
- return "{}[{}]".format(project, ",".join(canonical_extras))
-
-
-class Constraint:
- def __init__(self, specifier, hashes, links):
- # type: (SpecifierSet, Hashes, FrozenSet[Link]) -> None
- self.specifier = specifier
- self.hashes = hashes
- self.links = links
-
- @classmethod
- def empty(cls):
- # type: () -> Constraint
- return Constraint(SpecifierSet(), Hashes(), frozenset())
-
- @classmethod
- def from_ireq(cls, ireq):
- # type: (InstallRequirement) -> Constraint
- links = frozenset([ireq.link]) if ireq.link else frozenset()
- return Constraint(ireq.specifier, ireq.hashes(trust_internet=False), links)
-
- def __nonzero__(self):
- # type: () -> bool
- return bool(self.specifier) or bool(self.hashes) or bool(self.links)
-
- def __bool__(self):
- # type: () -> bool
- return self.__nonzero__()
-
- def __and__(self, other):
- # type: (InstallRequirement) -> Constraint
- if not isinstance(other, InstallRequirement):
- return NotImplemented
- specifier = self.specifier & other.specifier
- hashes = self.hashes & other.hashes(trust_internet=False)
- links = self.links
- if other.link:
- links = links.union([other.link])
- return Constraint(specifier, hashes, links)
-
- def is_satisfied_by(self, candidate):
- # type: (Candidate) -> bool
- # Reject if there are any mismatched URL constraints on this package.
- if self.links and not all(_match_link(link, candidate) for link in self.links):
- return False
- # We can safely always allow prereleases here since PackageFinder
- # already implements the prerelease logic, and would have filtered out
- # prerelease candidates if the user does not expect them.
- return self.specifier.contains(candidate.version, prereleases=True)
-
-
-class Requirement:
- @property
- def project_name(self):
- # type: () -> NormalizedName
- """The "project name" of a requirement.
-
- This is different from ``name`` if this requirement contains extras,
- in which case ``name`` would contain the ``[...]`` part, while this
- refers to the name of the project.
- """
- raise NotImplementedError("Subclass should override")
-
- @property
- def name(self):
- # type: () -> str
- """The name identifying this requirement in the resolver.
-
- This is different from ``project_name`` if this requirement contains
- extras, where ``project_name`` would not contain the ``[...]`` part.
- """
- raise NotImplementedError("Subclass should override")
-
- def is_satisfied_by(self, candidate):
- # type: (Candidate) -> bool
- return False
-
- def get_candidate_lookup(self):
- # type: () -> CandidateLookup
- raise NotImplementedError("Subclass should override")
-
- def format_for_error(self):
- # type: () -> str
- raise NotImplementedError("Subclass should override")
-
-
-def _match_link(link, candidate):
- # type: (Link, Candidate) -> bool
- if candidate.source_link:
- return links_equivalent(link, candidate.source_link)
- return False
-
-
-class Candidate:
- @property
- def project_name(self):
- # type: () -> NormalizedName
- """The "project name" of the candidate.
-
- This is different from ``name`` if this candidate contains extras,
- in which case ``name`` would contain the ``[...]`` part, while this
- refers to the name of the project.
- """
- raise NotImplementedError("Override in subclass")
-
- @property
- def name(self):
- # type: () -> str
- """The name identifying this candidate in the resolver.
-
- This is different from ``project_name`` if this candidate contains
- extras, where ``project_name`` would not contain the ``[...]`` part.
- """
- raise NotImplementedError("Override in subclass")
-
- @property
- def version(self):
- # type: () -> CandidateVersion
- raise NotImplementedError("Override in subclass")
-
- @property
- def is_installed(self):
- # type: () -> bool
- raise NotImplementedError("Override in subclass")
-
- @property
- def is_editable(self):
- # type: () -> bool
- raise NotImplementedError("Override in subclass")
-
- @property
- def source_link(self):
- # type: () -> Optional[Link]
- raise NotImplementedError("Override in subclass")
-
- def iter_dependencies(self, with_requires):
- # type: (bool) -> Iterable[Optional[Requirement]]
- raise NotImplementedError("Override in subclass")
-
- def get_install_requirement(self):
- # type: () -> Optional[InstallRequirement]
- raise NotImplementedError("Override in subclass")
-
- def format_for_error(self):
- # type: () -> str
- raise NotImplementedError("Subclass should override")
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py
deleted file mode 100644
index da516ad..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+++ /dev/null
@@ -1,604 +0,0 @@
-import logging
-import sys
-from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast
-
-from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet
-from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
-from pip._vendor.packaging.version import Version
-from pip._vendor.packaging.version import parse as parse_version
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.exceptions import HashError, MetadataInconsistent
-from pip._internal.models.link import Link, links_equivalent
-from pip._internal.models.wheel import Wheel
-from pip._internal.req.constructors import (
- install_req_from_editable,
- install_req_from_line,
-)
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.misc import dist_is_editable, normalize_version_info
-from pip._internal.utils.packaging import get_requires_python
-
-from .base import Candidate, CandidateVersion, Requirement, format_name
-
-if TYPE_CHECKING:
- from .factory import Factory
-
-logger = logging.getLogger(__name__)
-
-BaseCandidate = Union[
- "AlreadyInstalledCandidate",
- "EditableCandidate",
- "LinkCandidate",
-]
-
-
-def as_base_candidate(candidate: Candidate) -> Optional[BaseCandidate]:
- """The runtime version of BaseCandidate."""
- base_candidate_classes = (
- AlreadyInstalledCandidate,
- EditableCandidate,
- LinkCandidate,
- )
- if isinstance(candidate, base_candidate_classes):
- return candidate
- return None
-
-
-def make_install_req_from_link(link, template):
- # type: (Link, InstallRequirement) -> InstallRequirement
- assert not template.editable, "template is editable"
- if template.req:
- line = str(template.req)
- else:
- line = link.url
- ireq = install_req_from_line(
- line,
- user_supplied=template.user_supplied,
- comes_from=template.comes_from,
- use_pep517=template.use_pep517,
- isolated=template.isolated,
- constraint=template.constraint,
- options=dict(
- install_options=template.install_options,
- global_options=template.global_options,
- hashes=template.hash_options,
- ),
- )
- ireq.original_link = template.original_link
- ireq.link = link
- return ireq
-
-
-def make_install_req_from_editable(link, template):
- # type: (Link, InstallRequirement) -> InstallRequirement
- assert template.editable, "template not editable"
- return install_req_from_editable(
- link.url,
- user_supplied=template.user_supplied,
- comes_from=template.comes_from,
- use_pep517=template.use_pep517,
- isolated=template.isolated,
- constraint=template.constraint,
- options=dict(
- install_options=template.install_options,
- global_options=template.global_options,
- hashes=template.hash_options,
- ),
- )
-
-
-def make_install_req_from_dist(dist, template):
- # type: (Distribution, InstallRequirement) -> InstallRequirement
- project_name = canonicalize_name(dist.project_name)
- if template.req:
- line = str(template.req)
- elif template.link:
- line = f"{project_name} @ {template.link.url}"
- else:
- line = f"{project_name}=={dist.parsed_version}"
- ireq = install_req_from_line(
- line,
- user_supplied=template.user_supplied,
- comes_from=template.comes_from,
- use_pep517=template.use_pep517,
- isolated=template.isolated,
- constraint=template.constraint,
- options=dict(
- install_options=template.install_options,
- global_options=template.global_options,
- hashes=template.hash_options,
- ),
- )
- ireq.satisfied_by = dist
- return ireq
-
-
-class _InstallRequirementBackedCandidate(Candidate):
- """A candidate backed by an ``InstallRequirement``.
-
- This represents a package request with the target not being already
- in the environment, and needs to be fetched and installed. The backing
- ``InstallRequirement`` is responsible for most of the leg work; this
- class exposes appropriate information to the resolver.
-
- :param link: The link passed to the ``InstallRequirement``. The backing
- ``InstallRequirement`` will use this link to fetch the distribution.
- :param source_link: The link this candidate "originates" from. This is
- different from ``link`` when the link is found in the wheel cache.
- ``link`` would point to the wheel cache, while this points to the
- found remote link (e.g. from pypi.org).
- """
-
- is_installed = False
-
- def __init__(
- self,
- link, # type: Link
- source_link, # type: Link
- ireq, # type: InstallRequirement
- factory, # type: Factory
- name=None, # type: Optional[NormalizedName]
- version=None, # type: Optional[CandidateVersion]
- ):
- # type: (...) -> None
- self._link = link
- self._source_link = source_link
- self._factory = factory
- self._ireq = ireq
- self._name = name
- self._version = version
- self.dist = self._prepare()
-
- def __str__(self):
- # type: () -> str
- return f"{self.name} {self.version}"
-
- def __repr__(self):
- # type: () -> str
- return "{class_name}({link!r})".format(
- class_name=self.__class__.__name__,
- link=str(self._link),
- )
-
- def __hash__(self):
- # type: () -> int
- return hash((self.__class__, self._link))
-
- def __eq__(self, other):
- # type: (Any) -> bool
- if isinstance(other, self.__class__):
- return links_equivalent(self._link, other._link)
- return False
-
- @property
- def source_link(self):
- # type: () -> Optional[Link]
- return self._source_link
-
- @property
- def project_name(self):
- # type: () -> NormalizedName
- """The normalised name of the project the candidate refers to"""
- if self._name is None:
- self._name = canonicalize_name(self.dist.project_name)
- return self._name
-
- @property
- def name(self):
- # type: () -> str
- return self.project_name
-
- @property
- def version(self):
- # type: () -> CandidateVersion
- if self._version is None:
- self._version = parse_version(self.dist.version)
- return self._version
-
- def format_for_error(self):
- # type: () -> str
- return "{} {} (from {})".format(
- self.name,
- self.version,
- self._link.file_path if self._link.is_file else self._link,
- )
-
- def _prepare_distribution(self):
- # type: () -> Distribution
- raise NotImplementedError("Override in subclass")
-
- def _check_metadata_consistency(self, dist):
- # type: (Distribution) -> None
- """Check for consistency of project name and version of dist."""
- canonical_name = canonicalize_name(dist.project_name)
- if self._name is not None and self._name != canonical_name:
- raise MetadataInconsistent(
- self._ireq,
- "name",
- self._name,
- dist.project_name,
- )
- parsed_version = parse_version(dist.version)
- if self._version is not None and self._version != parsed_version:
- raise MetadataInconsistent(
- self._ireq,
- "version",
- str(self._version),
- dist.version,
- )
-
- def _prepare(self):
- # type: () -> Distribution
- try:
- dist = self._prepare_distribution()
- except HashError as e:
- # Provide HashError the underlying ireq that caused it. This
- # provides context for the resulting error message to show the
- # offending line to the user.
- e.req = self._ireq
- raise
- self._check_metadata_consistency(dist)
- return dist
-
- def _get_requires_python_dependency(self):
- # type: () -> Optional[Requirement]
- requires_python = get_requires_python(self.dist)
- if requires_python is None:
- return None
- try:
- spec = SpecifierSet(requires_python)
- except InvalidSpecifier as e:
- message = "Package %r has an invalid Requires-Python: %s"
- logger.warning(message, self.name, e)
- return None
- return self._factory.make_requires_python_requirement(spec)
-
- def iter_dependencies(self, with_requires):
- # type: (bool) -> Iterable[Optional[Requirement]]
- requires = self.dist.requires() if with_requires else ()
- for r in requires:
- yield self._factory.make_requirement_from_spec(str(r), self._ireq)
- yield self._get_requires_python_dependency()
-
- def get_install_requirement(self):
- # type: () -> Optional[InstallRequirement]
- return self._ireq
-
-
-class LinkCandidate(_InstallRequirementBackedCandidate):
- is_editable = False
-
- def __init__(
- self,
- link, # type: Link
- template, # type: InstallRequirement
- factory, # type: Factory
- name=None, # type: Optional[NormalizedName]
- version=None, # type: Optional[CandidateVersion]
- ):
- # type: (...) -> None
- source_link = link
- cache_entry = factory.get_wheel_cache_entry(link, name)
- if cache_entry is not None:
- logger.debug("Using cached wheel link: %s", cache_entry.link)
- link = cache_entry.link
- ireq = make_install_req_from_link(link, template)
- assert ireq.link == link
- if ireq.link.is_wheel and not ireq.link.is_file:
- wheel = Wheel(ireq.link.filename)
- wheel_name = canonicalize_name(wheel.name)
- assert name == wheel_name, f"{name!r} != {wheel_name!r} for wheel"
- # Version may not be present for PEP 508 direct URLs
- if version is not None:
- wheel_version = Version(wheel.version)
- assert version == wheel_version, "{!r} != {!r} for wheel {}".format(
- version, wheel_version, name
- )
-
- if (
- cache_entry is not None
- and cache_entry.persistent
- and template.link is template.original_link
- ):
- ireq.original_link_is_in_wheel_cache = True
-
- super().__init__(
- link=link,
- source_link=source_link,
- ireq=ireq,
- factory=factory,
- name=name,
- version=version,
- )
-
- def _prepare_distribution(self):
- # type: () -> Distribution
- return self._factory.preparer.prepare_linked_requirement(
- self._ireq, parallel_builds=True
- )
-
-
-class EditableCandidate(_InstallRequirementBackedCandidate):
- is_editable = True
-
- def __init__(
- self,
- link, # type: Link
- template, # type: InstallRequirement
- factory, # type: Factory
- name=None, # type: Optional[NormalizedName]
- version=None, # type: Optional[CandidateVersion]
- ):
- # type: (...) -> None
- super().__init__(
- link=link,
- source_link=link,
- ireq=make_install_req_from_editable(link, template),
- factory=factory,
- name=name,
- version=version,
- )
-
- def _prepare_distribution(self):
- # type: () -> Distribution
- return self._factory.preparer.prepare_editable_requirement(self._ireq)
-
-
-class AlreadyInstalledCandidate(Candidate):
- is_installed = True
- source_link = None
-
- def __init__(
- self,
- dist, # type: Distribution
- template, # type: InstallRequirement
- factory, # type: Factory
- ):
- # type: (...) -> None
- self.dist = dist
- self._ireq = make_install_req_from_dist(dist, template)
- self._factory = factory
-
- # This is just logging some messages, so we can do it eagerly.
- # The returned dist would be exactly the same as self.dist because we
- # set satisfied_by in make_install_req_from_dist.
- # TODO: Supply reason based on force_reinstall and upgrade_strategy.
- skip_reason = "already satisfied"
- factory.preparer.prepare_installed_requirement(self._ireq, skip_reason)
-
- def __str__(self):
- # type: () -> str
- return str(self.dist)
-
- def __repr__(self):
- # type: () -> str
- return "{class_name}({distribution!r})".format(
- class_name=self.__class__.__name__,
- distribution=self.dist,
- )
-
- def __hash__(self):
- # type: () -> int
- return hash((self.__class__, self.name, self.version))
-
- def __eq__(self, other):
- # type: (Any) -> bool
- if isinstance(other, self.__class__):
- return self.name == other.name and self.version == other.version
- return False
-
- @property
- def project_name(self):
- # type: () -> NormalizedName
- return canonicalize_name(self.dist.project_name)
-
- @property
- def name(self):
- # type: () -> str
- return self.project_name
-
- @property
- def version(self):
- # type: () -> CandidateVersion
- return parse_version(self.dist.version)
-
- @property
- def is_editable(self):
- # type: () -> bool
- return dist_is_editable(self.dist)
-
- def format_for_error(self):
- # type: () -> str
- return f"{self.name} {self.version} (Installed)"
-
- def iter_dependencies(self, with_requires):
- # type: (bool) -> Iterable[Optional[Requirement]]
- if not with_requires:
- return
- for r in self.dist.requires():
- yield self._factory.make_requirement_from_spec(str(r), self._ireq)
-
- def get_install_requirement(self):
- # type: () -> Optional[InstallRequirement]
- return None
-
-
-class ExtrasCandidate(Candidate):
- """A candidate that has 'extras', indicating additional dependencies.
-
- Requirements can be for a project with dependencies, something like
- foo[extra]. The extras don't affect the project/version being installed
- directly, but indicate that we need additional dependencies. We model that
- by having an artificial ExtrasCandidate that wraps the "base" candidate.
-
- The ExtrasCandidate differs from the base in the following ways:
-
- 1. It has a unique name, of the form foo[extra]. This causes the resolver
- to treat it as a separate node in the dependency graph.
- 2. When we're getting the candidate's dependencies,
- a) We specify that we want the extra dependencies as well.
- b) We add a dependency on the base candidate.
- See below for why this is needed.
- 3. We return None for the underlying InstallRequirement, as the base
- candidate will provide it, and we don't want to end up with duplicates.
-
- The dependency on the base candidate is needed so that the resolver can't
- decide that it should recommend foo[extra1] version 1.0 and foo[extra2]
- version 2.0. Having those candidates depend on foo=1.0 and foo=2.0
- respectively forces the resolver to recognise that this is a conflict.
- """
-
- def __init__(
- self,
- base, # type: BaseCandidate
- extras, # type: FrozenSet[str]
- ):
- # type: (...) -> None
- self.base = base
- self.extras = extras
-
- def __str__(self):
- # type: () -> str
- name, rest = str(self.base).split(" ", 1)
- return "{}[{}] {}".format(name, ",".join(self.extras), rest)
-
- def __repr__(self):
- # type: () -> str
- return "{class_name}(base={base!r}, extras={extras!r})".format(
- class_name=self.__class__.__name__,
- base=self.base,
- extras=self.extras,
- )
-
- def __hash__(self):
- # type: () -> int
- return hash((self.base, self.extras))
-
- def __eq__(self, other):
- # type: (Any) -> bool
- if isinstance(other, self.__class__):
- return self.base == other.base and self.extras == other.extras
- return False
-
- @property
- def project_name(self):
- # type: () -> NormalizedName
- return self.base.project_name
-
- @property
- def name(self):
- # type: () -> str
- """The normalised name of the project the candidate refers to"""
- return format_name(self.base.project_name, self.extras)
-
- @property
- def version(self):
- # type: () -> CandidateVersion
- return self.base.version
-
- def format_for_error(self):
- # type: () -> str
- return "{} [{}]".format(
- self.base.format_for_error(), ", ".join(sorted(self.extras))
- )
-
- @property
- def is_installed(self):
- # type: () -> bool
- return self.base.is_installed
-
- @property
- def is_editable(self):
- # type: () -> bool
- return self.base.is_editable
-
- @property
- def source_link(self):
- # type: () -> Optional[Link]
- return self.base.source_link
-
- def iter_dependencies(self, with_requires):
- # type: (bool) -> Iterable[Optional[Requirement]]
- factory = self.base._factory
-
- # Add a dependency on the exact base
- # (See note 2b in the class docstring)
- yield factory.make_requirement_from_candidate(self.base)
- if not with_requires:
- return
-
- # The user may have specified extras that the candidate doesn't
- # support. We ignore any unsupported extras here.
- valid_extras = self.extras.intersection(self.base.dist.extras)
- invalid_extras = self.extras.difference(self.base.dist.extras)
- for extra in sorted(invalid_extras):
- logger.warning(
- "%s %s does not provide the extra '%s'",
- self.base.name,
- self.version,
- extra,
- )
-
- for r in self.base.dist.requires(valid_extras):
- requirement = factory.make_requirement_from_spec(
- str(r), self.base._ireq, valid_extras
- )
- if requirement:
- yield requirement
-
- def get_install_requirement(self):
- # type: () -> Optional[InstallRequirement]
- # We don't return anything here, because we always
- # depend on the base candidate, and we'll get the
- # install requirement from that.
- return None
-
-
-class RequiresPythonCandidate(Candidate):
- is_installed = False
- source_link = None
-
- def __init__(self, py_version_info):
- # type: (Optional[Tuple[int, ...]]) -> None
- if py_version_info is not None:
- version_info = normalize_version_info(py_version_info)
- else:
- version_info = sys.version_info[:3]
- self._version = Version(".".join(str(c) for c in version_info))
-
- # We don't need to implement __eq__() and __ne__() since there is always
- # only one RequiresPythonCandidate in a resolution, i.e. the host Python.
- # The built-in object.__eq__() and object.__ne__() do exactly what we want.
-
- def __str__(self):
- # type: () -> str
- return f"Python {self._version}"
-
- @property
- def project_name(self):
- # type: () -> NormalizedName
- # Avoid conflicting with the PyPI package "Python".
- return cast(NormalizedName, "")
-
- @property
- def name(self):
- # type: () -> str
- return self.project_name
-
- @property
- def version(self):
- # type: () -> CandidateVersion
- return self._version
-
- def format_for_error(self):
- # type: () -> str
- return f"Python {self.version}"
-
- def iter_dependencies(self, with_requires):
- # type: (bool) -> Iterable[Optional[Requirement]]
- return ()
-
- def get_install_requirement(self):
- # type: () -> Optional[InstallRequirement]
- return None
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py
deleted file mode 100644
index 5816a0e..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py
+++ /dev/null
@@ -1,661 +0,0 @@
-import contextlib
-import functools
-import logging
-from typing import (
- TYPE_CHECKING,
- Dict,
- FrozenSet,
- Iterable,
- Iterator,
- List,
- Mapping,
- Optional,
- Sequence,
- Set,
- Tuple,
- TypeVar,
- cast,
-)
-
-from pip._vendor.packaging.requirements import InvalidRequirement
-from pip._vendor.packaging.requirements import Requirement as PackagingRequirement
-from pip._vendor.packaging.specifiers import SpecifierSet
-from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
-from pip._vendor.pkg_resources import Distribution
-from pip._vendor.resolvelib import ResolutionImpossible
-
-from pip._internal.cache import CacheEntry, WheelCache
-from pip._internal.exceptions import (
- DistributionNotFound,
- InstallationError,
- InstallationSubprocessError,
- MetadataInconsistent,
- UnsupportedPythonVersion,
- UnsupportedWheel,
-)
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.models.link import Link
-from pip._internal.models.wheel import Wheel
-from pip._internal.operations.prepare import RequirementPreparer
-from pip._internal.req.constructors import install_req_from_link_and_ireq
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.resolution.base import InstallRequirementProvider
-from pip._internal.utils.compatibility_tags import get_supported
-from pip._internal.utils.hashes import Hashes
-from pip._internal.utils.misc import (
- dist_in_site_packages,
- dist_in_usersite,
- get_installed_distributions,
-)
-from pip._internal.utils.virtualenv import running_under_virtualenv
-
-from .base import Candidate, CandidateVersion, Constraint, Requirement
-from .candidates import (
- AlreadyInstalledCandidate,
- BaseCandidate,
- EditableCandidate,
- ExtrasCandidate,
- LinkCandidate,
- RequiresPythonCandidate,
- as_base_candidate,
-)
-from .found_candidates import FoundCandidates, IndexCandidateInfo
-from .requirements import (
- ExplicitRequirement,
- RequiresPythonRequirement,
- SpecifierRequirement,
- UnsatisfiableRequirement,
-)
-
-if TYPE_CHECKING:
- from typing import Protocol
-
- class ConflictCause(Protocol):
- requirement: RequiresPythonRequirement
- parent: Candidate
-
-
-logger = logging.getLogger(__name__)
-
-C = TypeVar("C")
-Cache = Dict[Link, C]
-
-
-class Factory:
- def __init__(
- self,
- finder, # type: PackageFinder
- preparer, # type: RequirementPreparer
- make_install_req, # type: InstallRequirementProvider
- wheel_cache, # type: Optional[WheelCache]
- use_user_site, # type: bool
- force_reinstall, # type: bool
- ignore_installed, # type: bool
- ignore_requires_python, # type: bool
- py_version_info=None, # type: Optional[Tuple[int, ...]]
- ):
- # type: (...) -> None
- self._finder = finder
- self.preparer = preparer
- self._wheel_cache = wheel_cache
- self._python_candidate = RequiresPythonCandidate(py_version_info)
- self._make_install_req_from_spec = make_install_req
- self._use_user_site = use_user_site
- self._force_reinstall = force_reinstall
- self._ignore_requires_python = ignore_requires_python
-
- self._build_failures = {} # type: Cache[InstallationError]
- self._link_candidate_cache = {} # type: Cache[LinkCandidate]
- self._editable_candidate_cache = {} # type: Cache[EditableCandidate]
- self._installed_candidate_cache = (
- {}
- ) # type: Dict[str, AlreadyInstalledCandidate]
- self._extras_candidate_cache = (
- {}
- ) # type: Dict[Tuple[int, FrozenSet[str]], ExtrasCandidate]
-
- if not ignore_installed:
- self._installed_dists = {
- canonicalize_name(dist.project_name): dist
- for dist in get_installed_distributions(local_only=False)
- }
- else:
- self._installed_dists = {}
-
- @property
- def force_reinstall(self):
- # type: () -> bool
- return self._force_reinstall
-
- def _fail_if_link_is_unsupported_wheel(self, link: Link) -> None:
- if not link.is_wheel:
- return
- wheel = Wheel(link.filename)
- if wheel.supported(self._finder.target_python.get_tags()):
- return
- msg = f"{link.filename} is not a supported wheel on this platform."
- raise UnsupportedWheel(msg)
-
- def _make_extras_candidate(self, base, extras):
- # type: (BaseCandidate, FrozenSet[str]) -> ExtrasCandidate
- cache_key = (id(base), extras)
- try:
- candidate = self._extras_candidate_cache[cache_key]
- except KeyError:
- candidate = ExtrasCandidate(base, extras)
- self._extras_candidate_cache[cache_key] = candidate
- return candidate
-
- def _make_candidate_from_dist(
- self,
- dist, # type: Distribution
- extras, # type: FrozenSet[str]
- template, # type: InstallRequirement
- ):
- # type: (...) -> Candidate
- try:
- base = self._installed_candidate_cache[dist.key]
- except KeyError:
- base = AlreadyInstalledCandidate(dist, template, factory=self)
- self._installed_candidate_cache[dist.key] = base
- if not extras:
- return base
- return self._make_extras_candidate(base, extras)
-
- def _make_candidate_from_link(
- self,
- link, # type: Link
- extras, # type: FrozenSet[str]
- template, # type: InstallRequirement
- name, # type: Optional[NormalizedName]
- version, # type: Optional[CandidateVersion]
- ):
- # type: (...) -> Optional[Candidate]
- # TODO: Check already installed candidate, and use it if the link and
- # editable flag match.
-
- if link in self._build_failures:
- # We already tried this candidate before, and it does not build.
- # Don't bother trying again.
- return None
-
- if template.editable:
- if link not in self._editable_candidate_cache:
- try:
- self._editable_candidate_cache[link] = EditableCandidate(
- link,
- template,
- factory=self,
- name=name,
- version=version,
- )
- except (InstallationSubprocessError, MetadataInconsistent) as e:
- logger.warning("Discarding %s. %s", link, e)
- self._build_failures[link] = e
- return None
- base = self._editable_candidate_cache[link] # type: BaseCandidate
- else:
- if link not in self._link_candidate_cache:
- try:
- self._link_candidate_cache[link] = LinkCandidate(
- link,
- template,
- factory=self,
- name=name,
- version=version,
- )
- except (InstallationSubprocessError, MetadataInconsistent) as e:
- logger.warning("Discarding %s. %s", link, e)
- self._build_failures[link] = e
- return None
- base = self._link_candidate_cache[link]
-
- if not extras:
- return base
- return self._make_extras_candidate(base, extras)
-
- def _iter_found_candidates(
- self,
- ireqs: Sequence[InstallRequirement],
- specifier: SpecifierSet,
- hashes: Hashes,
- prefers_installed: bool,
- incompatible_ids: Set[int],
- ) -> Iterable[Candidate]:
- if not ireqs:
- return ()
-
- # The InstallRequirement implementation requires us to give it a
- # "template". Here we just choose the first requirement to represent
- # all of them.
- # Hopefully the Project model can correct this mismatch in the future.
- template = ireqs[0]
- assert template.req, "Candidates found on index must be PEP 508"
- name = canonicalize_name(template.req.name)
-
- extras = frozenset() # type: FrozenSet[str]
- for ireq in ireqs:
- assert ireq.req, "Candidates found on index must be PEP 508"
- specifier &= ireq.req.specifier
- hashes &= ireq.hashes(trust_internet=False)
- extras |= frozenset(ireq.extras)
-
- def _get_installed_candidate() -> Optional[Candidate]:
- """Get the candidate for the currently-installed version."""
- # If --force-reinstall is set, we want the version from the index
- # instead, so we "pretend" there is nothing installed.
- if self._force_reinstall:
- return None
- try:
- installed_dist = self._installed_dists[name]
- except KeyError:
- return None
- # Don't use the installed distribution if its version does not fit
- # the current dependency graph.
- if not specifier.contains(installed_dist.version, prereleases=True):
- return None
- candidate = self._make_candidate_from_dist(
- dist=installed_dist,
- extras=extras,
- template=template,
- )
- # The candidate is a known incompatiblity. Don't use it.
- if id(candidate) in incompatible_ids:
- return None
- return candidate
-
- def iter_index_candidate_infos():
- # type: () -> Iterator[IndexCandidateInfo]
- result = self._finder.find_best_candidate(
- project_name=name,
- specifier=specifier,
- hashes=hashes,
- )
- icans = list(result.iter_applicable())
-
- # PEP 592: Yanked releases must be ignored unless only yanked
- # releases can satisfy the version range. So if this is false,
- # all yanked icans need to be skipped.
- all_yanked = all(ican.link.is_yanked for ican in icans)
-
- # PackageFinder returns earlier versions first, so we reverse.
- for ican in reversed(icans):
- if not all_yanked and ican.link.is_yanked:
- continue
- func = functools.partial(
- self._make_candidate_from_link,
- link=ican.link,
- extras=extras,
- template=template,
- name=name,
- version=ican.version,
- )
- yield ican.version, func
-
- return FoundCandidates(
- iter_index_candidate_infos,
- _get_installed_candidate(),
- prefers_installed,
- incompatible_ids,
- )
-
- def _iter_explicit_candidates_from_base(
- self,
- base_requirements: Iterable[Requirement],
- extras: FrozenSet[str],
- ) -> Iterator[Candidate]:
- """Produce explicit candidates from the base given an extra-ed package.
-
- :param base_requirements: Requirements known to the resolver. The
- requirements are guaranteed to not have extras.
- :param extras: The extras to inject into the explicit requirements'
- candidates.
- """
- for req in base_requirements:
- lookup_cand, _ = req.get_candidate_lookup()
- if lookup_cand is None: # Not explicit.
- continue
- # We've stripped extras from the identifier, and should always
- # get a BaseCandidate here, unless there's a bug elsewhere.
- base_cand = as_base_candidate(lookup_cand)
- assert base_cand is not None, "no extras here"
- yield self._make_extras_candidate(base_cand, extras)
-
- def _iter_candidates_from_constraints(
- self,
- identifier: str,
- constraint: Constraint,
- template: InstallRequirement,
- ) -> Iterator[Candidate]:
- """Produce explicit candidates from constraints.
-
- This creates "fake" InstallRequirement objects that are basically clones
- of what "should" be the template, but with original_link set to link.
- """
- for link in constraint.links:
- self._fail_if_link_is_unsupported_wheel(link)
- candidate = self._make_candidate_from_link(
- link,
- extras=frozenset(),
- template=install_req_from_link_and_ireq(link, template),
- name=canonicalize_name(identifier),
- version=None,
- )
- if candidate:
- yield candidate
-
- def find_candidates(
- self,
- identifier: str,
- requirements: Mapping[str, Iterator[Requirement]],
- incompatibilities: Mapping[str, Iterator[Candidate]],
- constraint: Constraint,
- prefers_installed: bool,
- ) -> Iterable[Candidate]:
- # Collect basic lookup information from the requirements.
- explicit_candidates = set() # type: Set[Candidate]
- ireqs = [] # type: List[InstallRequirement]
- for req in requirements[identifier]:
- cand, ireq = req.get_candidate_lookup()
- if cand is not None:
- explicit_candidates.add(cand)
- if ireq is not None:
- ireqs.append(ireq)
-
- # If the current identifier contains extras, add explicit candidates
- # from entries from extra-less identifier.
- with contextlib.suppress(InvalidRequirement):
- parsed_requirement = PackagingRequirement(identifier)
- explicit_candidates.update(
- self._iter_explicit_candidates_from_base(
- requirements.get(parsed_requirement.name, ()),
- frozenset(parsed_requirement.extras),
- ),
- )
-
- # Add explicit candidates from constraints. We only do this if there are
- # kown ireqs, which represent requirements not already explicit. If
- # there are no ireqs, we're constraining already-explicit requirements,
- # which is handled later when we return the explicit candidates.
- if ireqs:
- try:
- explicit_candidates.update(
- self._iter_candidates_from_constraints(
- identifier,
- constraint,
- template=ireqs[0],
- ),
- )
- except UnsupportedWheel:
- # If we're constrained to install a wheel incompatible with the
- # target architecture, no candidates will ever be valid.
- return ()
-
- # Since we cache all the candidates, incompatibility identification
- # can be made quicker by comparing only the id() values.
- incompat_ids = {id(c) for c in incompatibilities.get(identifier, ())}
-
- # If none of the requirements want an explicit candidate, we can ask
- # the finder for candidates.
- if not explicit_candidates:
- return self._iter_found_candidates(
- ireqs,
- constraint.specifier,
- constraint.hashes,
- prefers_installed,
- incompat_ids,
- )
-
- return (
- c
- for c in explicit_candidates
- if id(c) not in incompat_ids
- and constraint.is_satisfied_by(c)
- and all(req.is_satisfied_by(c) for req in requirements[identifier])
- )
-
- def make_requirement_from_install_req(self, ireq, requested_extras):
- # type: (InstallRequirement, Iterable[str]) -> Optional[Requirement]
- if not ireq.match_markers(requested_extras):
- logger.info(
- "Ignoring %s: markers '%s' don't match your environment",
- ireq.name,
- ireq.markers,
- )
- return None
- if not ireq.link:
- return SpecifierRequirement(ireq)
- self._fail_if_link_is_unsupported_wheel(ireq.link)
- cand = self._make_candidate_from_link(
- ireq.link,
- extras=frozenset(ireq.extras),
- template=ireq,
- name=canonicalize_name(ireq.name) if ireq.name else None,
- version=None,
- )
- if cand is None:
- # There's no way we can satisfy a URL requirement if the underlying
- # candidate fails to build. An unnamed URL must be user-supplied, so
- # we fail eagerly. If the URL is named, an unsatisfiable requirement
- # can make the resolver do the right thing, either backtrack (and
- # maybe find some other requirement that's buildable) or raise a
- # ResolutionImpossible eventually.
- if not ireq.name:
- raise self._build_failures[ireq.link]
- return UnsatisfiableRequirement(canonicalize_name(ireq.name))
- return self.make_requirement_from_candidate(cand)
-
- def make_requirement_from_candidate(self, candidate):
- # type: (Candidate) -> ExplicitRequirement
- return ExplicitRequirement(candidate)
-
- def make_requirement_from_spec(
- self,
- specifier, # type: str
- comes_from, # type: InstallRequirement
- requested_extras=(), # type: Iterable[str]
- ):
- # type: (...) -> Optional[Requirement]
- ireq = self._make_install_req_from_spec(specifier, comes_from)
- return self.make_requirement_from_install_req(ireq, requested_extras)
-
- def make_requires_python_requirement(self, specifier):
- # type: (Optional[SpecifierSet]) -> Optional[Requirement]
- if self._ignore_requires_python or specifier is None:
- return None
- return RequiresPythonRequirement(specifier, self._python_candidate)
-
- def get_wheel_cache_entry(self, link, name):
- # type: (Link, Optional[str]) -> Optional[CacheEntry]
- """Look up the link in the wheel cache.
-
- If ``preparer.require_hashes`` is True, don't use the wheel cache,
- because cached wheels, always built locally, have different hashes
- than the files downloaded from the index server and thus throw false
- hash mismatches. Furthermore, cached wheels at present have
- nondeterministic contents due to file modification times.
- """
- if self._wheel_cache is None or self.preparer.require_hashes:
- return None
- return self._wheel_cache.get_cache_entry(
- link=link,
- package_name=name,
- supported_tags=get_supported(),
- )
-
- def get_dist_to_uninstall(self, candidate):
- # type: (Candidate) -> Optional[Distribution]
- # TODO: Are there more cases this needs to return True? Editable?
- dist = self._installed_dists.get(candidate.project_name)
- if dist is None: # Not installed, no uninstallation required.
- return None
-
- # We're installing into global site. The current installation must
- # be uninstalled, no matter it's in global or user site, because the
- # user site installation has precedence over global.
- if not self._use_user_site:
- return dist
-
- # We're installing into user site. Remove the user site installation.
- if dist_in_usersite(dist):
- return dist
-
- # We're installing into user site, but the installed incompatible
- # package is in global site. We can't uninstall that, and would let
- # the new user installation to "shadow" it. But shadowing won't work
- # in virtual environments, so we error out.
- if running_under_virtualenv() and dist_in_site_packages(dist):
- raise InstallationError(
- "Will not install to the user site because it will "
- "lack sys.path precedence to {} in {}".format(
- dist.project_name,
- dist.location,
- )
- )
- return None
-
- def _report_requires_python_error(self, causes):
- # type: (Sequence[ConflictCause]) -> UnsupportedPythonVersion
- assert causes, "Requires-Python error reported with no cause"
-
- version = self._python_candidate.version
-
- if len(causes) == 1:
- specifier = str(causes[0].requirement.specifier)
- message = (
- f"Package {causes[0].parent.name!r} requires a different "
- f"Python: {version} not in {specifier!r}"
- )
- return UnsupportedPythonVersion(message)
-
- message = f"Packages require a different Python. {version} not in:"
- for cause in causes:
- package = cause.parent.format_for_error()
- specifier = str(cause.requirement.specifier)
- message += f"\n{specifier!r} (required by {package})"
- return UnsupportedPythonVersion(message)
-
- def _report_single_requirement_conflict(self, req, parent):
- # type: (Requirement, Optional[Candidate]) -> DistributionNotFound
- if parent is None:
- req_disp = str(req)
- else:
- req_disp = f"{req} (from {parent.name})"
-
- cands = self._finder.find_all_candidates(req.project_name)
- versions = [str(v) for v in sorted({c.version for c in cands})]
-
- logger.critical(
- "Could not find a version that satisfies the requirement %s "
- "(from versions: %s)",
- req_disp,
- ", ".join(versions) or "none",
- )
-
- return DistributionNotFound(f"No matching distribution found for {req}")
-
- def get_installation_error(
- self,
- e, # type: ResolutionImpossible[Requirement, Candidate]
- constraints, # type: Dict[str, Constraint]
- ):
- # type: (...) -> InstallationError
-
- assert e.causes, "Installation error reported with no cause"
-
- # If one of the things we can't solve is "we need Python X.Y",
- # that is what we report.
- requires_python_causes = [
- cause
- for cause in e.causes
- if isinstance(cause.requirement, RequiresPythonRequirement)
- and not cause.requirement.is_satisfied_by(self._python_candidate)
- ]
- if requires_python_causes:
- # The comprehension above makes sure all Requirement instances are
- # RequiresPythonRequirement, so let's cast for convinience.
- return self._report_requires_python_error(
- cast("Sequence[ConflictCause]", requires_python_causes),
- )
-
- # Otherwise, we have a set of causes which can't all be satisfied
- # at once.
-
- # The simplest case is when we have *one* cause that can't be
- # satisfied. We just report that case.
- if len(e.causes) == 1:
- req, parent = e.causes[0]
- if req.name not in constraints:
- return self._report_single_requirement_conflict(req, parent)
-
- # OK, we now have a list of requirements that can't all be
- # satisfied at once.
-
- # A couple of formatting helpers
- def text_join(parts):
- # type: (List[str]) -> str
- if len(parts) == 1:
- return parts[0]
-
- return ", ".join(parts[:-1]) + " and " + parts[-1]
-
- def describe_trigger(parent):
- # type: (Candidate) -> str
- ireq = parent.get_install_requirement()
- if not ireq or not ireq.comes_from:
- return f"{parent.name}=={parent.version}"
- if isinstance(ireq.comes_from, InstallRequirement):
- return str(ireq.comes_from.name)
- return str(ireq.comes_from)
-
- triggers = set()
- for req, parent in e.causes:
- if parent is None:
- # This is a root requirement, so we can report it directly
- trigger = req.format_for_error()
- else:
- trigger = describe_trigger(parent)
- triggers.add(trigger)
-
- if triggers:
- info = text_join(sorted(triggers))
- else:
- info = "the requested packages"
-
- msg = (
- "Cannot install {} because these package versions "
- "have conflicting dependencies.".format(info)
- )
- logger.critical(msg)
- msg = "\nThe conflict is caused by:"
-
- relevant_constraints = set()
- for req, parent in e.causes:
- if req.name in constraints:
- relevant_constraints.add(req.name)
- msg = msg + "\n "
- if parent:
- msg = msg + f"{parent.name} {parent.version} depends on "
- else:
- msg = msg + "The user requested "
- msg = msg + req.format_for_error()
- for key in relevant_constraints:
- spec = constraints[key].specifier
- msg += f"\n The user requested (constraint) {key}{spec}"
-
- msg = (
- msg
- + "\n\n"
- + "To fix this you could try to:\n"
- + "1. loosen the range of package versions you've specified\n"
- + "2. remove package versions to allow pip attempt to solve "
- + "the dependency conflict\n"
- )
-
- logger.info(msg)
-
- return DistributionNotFound(
- "ResolutionImpossible: for help visit "
- "https://pip.pypa.io/en/latest/user_guide/"
- "#fixing-conflicting-dependencies"
- )
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py
deleted file mode 100644
index 21fa08e..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py
+++ /dev/null
@@ -1,145 +0,0 @@
-"""Utilities to lazily create and visit candidates found.
-
-Creating and visiting a candidate is a *very* costly operation. It involves
-fetching, extracting, potentially building modules from source, and verifying
-distribution metadata. It is therefore crucial for performance to keep
-everything here lazy all the way down, so we only touch candidates that we
-absolutely need, and not "download the world" when we only need one version of
-something.
-"""
-
-import functools
-from typing import Callable, Iterator, Optional, Set, Tuple
-
-from pip._vendor.packaging.version import _BaseVersion
-from pip._vendor.six.moves import collections_abc # type: ignore
-
-from .base import Candidate
-
-IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]]
-
-
-def _iter_built(infos):
- # type: (Iterator[IndexCandidateInfo]) -> Iterator[Candidate]
- """Iterator for ``FoundCandidates``.
-
- This iterator is used when the package is not already installed. Candidates
- from index come later in their normal ordering.
- """
- versions_found = set() # type: Set[_BaseVersion]
- for version, func in infos:
- if version in versions_found:
- continue
- candidate = func()
- if candidate is None:
- continue
- yield candidate
- versions_found.add(version)
-
-
-def _iter_built_with_prepended(installed, infos):
- # type: (Candidate, Iterator[IndexCandidateInfo]) -> Iterator[Candidate]
- """Iterator for ``FoundCandidates``.
-
- This iterator is used when the resolver prefers the already-installed
- candidate and NOT to upgrade. The installed candidate is therefore
- always yielded first, and candidates from index come later in their
- normal ordering, except skipped when the version is already installed.
- """
- yield installed
- versions_found = {installed.version} # type: Set[_BaseVersion]
- for version, func in infos:
- if version in versions_found:
- continue
- candidate = func()
- if candidate is None:
- continue
- yield candidate
- versions_found.add(version)
-
-
-def _iter_built_with_inserted(installed, infos):
- # type: (Candidate, Iterator[IndexCandidateInfo]) -> Iterator[Candidate]
- """Iterator for ``FoundCandidates``.
-
- This iterator is used when the resolver prefers to upgrade an
- already-installed package. Candidates from index are returned in their
- normal ordering, except replaced when the version is already installed.
-
- The implementation iterates through and yields other candidates, inserting
- the installed candidate exactly once before we start yielding older or
- equivalent candidates, or after all other candidates if they are all newer.
- """
- versions_found = set() # type: Set[_BaseVersion]
- for version, func in infos:
- if version in versions_found:
- continue
- # If the installed candidate is better, yield it first.
- if installed.version >= version:
- yield installed
- versions_found.add(installed.version)
- candidate = func()
- if candidate is None:
- continue
- yield candidate
- versions_found.add(version)
-
- # If the installed candidate is older than all other candidates.
- if installed.version not in versions_found:
- yield installed
-
-
-class FoundCandidates(collections_abc.Sequence):
- """A lazy sequence to provide candidates to the resolver.
-
- The intended usage is to return this from `find_matches()` so the resolver
- can iterate through the sequence multiple times, but only access the index
- page when remote packages are actually needed. This improve performances
- when suitable candidates are already installed on disk.
- """
-
- def __init__(
- self,
- get_infos: Callable[[], Iterator[IndexCandidateInfo]],
- installed: Optional[Candidate],
- prefers_installed: bool,
- incompatible_ids: Set[int],
- ):
- self._get_infos = get_infos
- self._installed = installed
- self._prefers_installed = prefers_installed
- self._incompatible_ids = incompatible_ids
-
- def __getitem__(self, index):
- # type: (int) -> Candidate
- # Implemented to satisfy the ABC check. This is not needed by the
- # resolver, and should not be used by the provider either (for
- # performance reasons).
- raise NotImplementedError("don't do this")
-
- def __iter__(self):
- # type: () -> Iterator[Candidate]
- infos = self._get_infos()
- if not self._installed:
- iterator = _iter_built(infos)
- elif self._prefers_installed:
- iterator = _iter_built_with_prepended(self._installed, infos)
- else:
- iterator = _iter_built_with_inserted(self._installed, infos)
- return (c for c in iterator if id(c) not in self._incompatible_ids)
-
- def __len__(self):
- # type: () -> int
- # Implemented to satisfy the ABC check. This is not needed by the
- # resolver, and should not be used by the provider either (for
- # performance reasons).
- raise NotImplementedError("don't do this")
-
- @functools.lru_cache(maxsize=1)
- def __bool__(self):
- # type: () -> bool
- if self._prefers_installed and self._installed:
- return True
- return any(self)
-
- __nonzero__ = __bool__ # XXX: Python 2.
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py
deleted file mode 100644
index 0be58fd..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py
+++ /dev/null
@@ -1,175 +0,0 @@
-from typing import TYPE_CHECKING, Dict, Iterable, Iterator, Mapping, Sequence, Union
-
-from pip._vendor.resolvelib.providers import AbstractProvider
-
-from .base import Candidate, Constraint, Requirement
-from .factory import Factory
-
-if TYPE_CHECKING:
- from pip._vendor.resolvelib.providers import Preference
- from pip._vendor.resolvelib.resolvers import RequirementInformation
-
- PreferenceInformation = RequirementInformation[Requirement, Candidate]
-
- _ProviderBase = AbstractProvider[Requirement, Candidate, str]
-else:
- _ProviderBase = AbstractProvider
-
-# Notes on the relationship between the provider, the factory, and the
-# candidate and requirement classes.
-#
-# The provider is a direct implementation of the resolvelib class. Its role
-# is to deliver the API that resolvelib expects.
-#
-# Rather than work with completely abstract "requirement" and "candidate"
-# concepts as resolvelib does, pip has concrete classes implementing these two
-# ideas. The API of Requirement and Candidate objects are defined in the base
-# classes, but essentially map fairly directly to the equivalent provider
-# methods. In particular, `find_matches` and `is_satisfied_by` are
-# requirement methods, and `get_dependencies` is a candidate method.
-#
-# The factory is the interface to pip's internal mechanisms. It is stateless,
-# and is created by the resolver and held as a property of the provider. It is
-# responsible for creating Requirement and Candidate objects, and provides
-# services to those objects (access to pip's finder and preparer).
-
-
-class PipProvider(_ProviderBase):
- """Pip's provider implementation for resolvelib.
-
- :params constraints: A mapping of constraints specified by the user. Keys
- are canonicalized project names.
- :params ignore_dependencies: Whether the user specified ``--no-deps``.
- :params upgrade_strategy: The user-specified upgrade strategy.
- :params user_requested: A set of canonicalized package names that the user
- supplied for pip to install/upgrade.
- """
-
- def __init__(
- self,
- factory, # type: Factory
- constraints, # type: Dict[str, Constraint]
- ignore_dependencies, # type: bool
- upgrade_strategy, # type: str
- user_requested, # type: Dict[str, int]
- ):
- # type: (...) -> None
- self._factory = factory
- self._constraints = constraints
- self._ignore_dependencies = ignore_dependencies
- self._upgrade_strategy = upgrade_strategy
- self._user_requested = user_requested
-
- def identify(self, requirement_or_candidate):
- # type: (Union[Requirement, Candidate]) -> str
- return requirement_or_candidate.name
-
- def get_preference(
- self,
- identifier: str,
- resolutions: Mapping[str, Candidate],
- candidates: Mapping[str, Iterator[Candidate]],
- information: Mapping[str, Iterator["PreferenceInformation"]],
- ) -> "Preference":
- """Produce a sort key for given requirement based on preference.
-
- The lower the return value is, the more preferred this group of
- arguments is.
-
- Currently pip considers the followings in order:
-
- * Prefer if any of the known requirements points to an explicit URL.
- * If equal, prefer if any requirements contain ``===`` and ``==``.
- * If equal, prefer if requirements include version constraints, e.g.
- ``>=`` and ``<``.
- * If equal, prefer user-specified (non-transitive) requirements, and
- order user-specified requirements by the order they are specified.
- * If equal, order alphabetically for consistency (helps debuggability).
- """
-
- def _get_restrictive_rating(requirements):
- # type: (Iterable[Requirement]) -> int
- """Rate how restrictive a set of requirements are.
-
- ``Requirement.get_candidate_lookup()`` returns a 2-tuple for
- lookup. The first element is ``Optional[Candidate]`` and the
- second ``Optional[InstallRequirement]``.
-
- * If the requirement is an explicit one, the explicitly-required
- candidate is returned as the first element.
- * If the requirement is based on a PEP 508 specifier, the backing
- ``InstallRequirement`` is returned as the second element.
-
- We use the first element to check whether there is an explicit
- requirement, and the second for equality operator.
- """
- lookups = (r.get_candidate_lookup() for r in requirements)
- cands, ireqs = zip(*lookups)
- if any(cand is not None for cand in cands):
- return 0
- spec_sets = (ireq.specifier for ireq in ireqs if ireq)
- operators = [
- specifier.operator for spec_set in spec_sets for specifier in spec_set
- ]
- if any(op in ("==", "===") for op in operators):
- return 1
- if operators:
- return 2
- # A "bare" requirement without any version requirements.
- return 3
-
- rating = _get_restrictive_rating(r for r, _ in information[identifier])
- order = self._user_requested.get(identifier, float("inf"))
-
- # HACK: Setuptools have a very long and solid backward compatibility
- # track record, and extremely few projects would request a narrow,
- # non-recent version range of it since that would break a lot things.
- # (Most projects specify it only to request for an installer feature,
- # which does not work, but that's another topic.) Intentionally
- # delaying Setuptools helps reduce branches the resolver has to check.
- # This serves as a temporary fix for issues like "apache-airlfow[all]"
- # while we work on "proper" branch pruning techniques.
- delay_this = identifier == "setuptools"
-
- return (delay_this, rating, order, identifier)
-
- def find_matches(
- self,
- identifier: str,
- requirements: Mapping[str, Iterator[Requirement]],
- incompatibilities: Mapping[str, Iterator[Candidate]],
- ) -> Iterable[Candidate]:
- def _eligible_for_upgrade(name):
- # type: (str) -> bool
- """Are upgrades allowed for this project?
-
- This checks the upgrade strategy, and whether the project was one
- that the user specified in the command line, in order to decide
- whether we should upgrade if there's a newer version available.
-
- (Note that we don't need access to the `--upgrade` flag, because
- an upgrade strategy of "to-satisfy-only" means that `--upgrade`
- was not specified).
- """
- if self._upgrade_strategy == "eager":
- return True
- elif self._upgrade_strategy == "only-if-needed":
- return name in self._user_requested
- return False
-
- return self._factory.find_candidates(
- identifier=identifier,
- requirements=requirements,
- constraint=self._constraints.get(identifier, Constraint.empty()),
- prefers_installed=(not _eligible_for_upgrade(identifier)),
- incompatibilities=incompatibilities,
- )
-
- def is_satisfied_by(self, requirement, candidate):
- # type: (Requirement, Candidate) -> bool
- return requirement.is_satisfied_by(candidate)
-
- def get_dependencies(self, candidate):
- # type: (Candidate) -> Sequence[Requirement]
- with_requires = not self._ignore_dependencies
- return [r for r in candidate.iter_dependencies(with_requires) if r is not None]
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py
deleted file mode 100644
index 074583d..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py
+++ /dev/null
@@ -1,78 +0,0 @@
-from collections import defaultdict
-from logging import getLogger
-from typing import Any, DefaultDict
-
-from pip._vendor.resolvelib.reporters import BaseReporter
-
-from .base import Candidate, Requirement
-
-logger = getLogger(__name__)
-
-
-class PipReporter(BaseReporter):
- def __init__(self):
- # type: () -> None
- self.backtracks_by_package = defaultdict(int) # type: DefaultDict[str, int]
-
- self._messages_at_backtrack = {
- 1: (
- "pip is looking at multiple versions of {package_name} to "
- "determine which version is compatible with other "
- "requirements. This could take a while."
- ),
- 8: (
- "pip is looking at multiple versions of {package_name} to "
- "determine which version is compatible with other "
- "requirements. This could take a while."
- ),
- 13: (
- "This is taking longer than usual. You might need to provide "
- "the dependency resolver with stricter constraints to reduce "
- "runtime. If you want to abort this run, you can press "
- "Ctrl + C to do so. To improve how pip performs, tell us what "
- "happened here: https://pip.pypa.io/surveys/backtracking"
- ),
- }
-
- def backtracking(self, candidate):
- # type: (Candidate) -> None
- self.backtracks_by_package[candidate.name] += 1
-
- count = self.backtracks_by_package[candidate.name]
- if count not in self._messages_at_backtrack:
- return
-
- message = self._messages_at_backtrack[count]
- logger.info("INFO: %s", message.format(package_name=candidate.name))
-
-
-class PipDebuggingReporter(BaseReporter):
- """A reporter that does an info log for every event it sees."""
-
- def starting(self):
- # type: () -> None
- logger.info("Reporter.starting()")
-
- def starting_round(self, index):
- # type: (int) -> None
- logger.info("Reporter.starting_round(%r)", index)
-
- def ending_round(self, index, state):
- # type: (int, Any) -> None
- logger.info("Reporter.ending_round(%r, state)", index)
-
- def ending(self, state):
- # type: (Any) -> None
- logger.info("Reporter.ending(%r)", state)
-
- def adding_requirement(self, requirement, parent):
- # type: (Requirement, Candidate) -> None
- logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent)
-
- def backtracking(self, candidate):
- # type: (Candidate) -> None
- logger.info("Reporter.backtracking(%r)", candidate)
-
- def pinning(self, candidate):
- # type: (Candidate) -> None
- logger.info("Reporter.pinning(%r)", candidate)
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py
deleted file mode 100644
index a7fcdd1..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+++ /dev/null
@@ -1,198 +0,0 @@
-from pip._vendor.packaging.specifiers import SpecifierSet
-from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
-
-from pip._internal.req.req_install import InstallRequirement
-
-from .base import Candidate, CandidateLookup, Requirement, format_name
-
-
-class ExplicitRequirement(Requirement):
- def __init__(self, candidate):
- # type: (Candidate) -> None
- self.candidate = candidate
-
- def __str__(self):
- # type: () -> str
- return str(self.candidate)
-
- def __repr__(self):
- # type: () -> str
- return "{class_name}({candidate!r})".format(
- class_name=self.__class__.__name__,
- candidate=self.candidate,
- )
-
- @property
- def project_name(self):
- # type: () -> NormalizedName
- # No need to canonicalise - the candidate did this
- return self.candidate.project_name
-
- @property
- def name(self):
- # type: () -> str
- # No need to canonicalise - the candidate did this
- return self.candidate.name
-
- def format_for_error(self):
- # type: () -> str
- return self.candidate.format_for_error()
-
- def get_candidate_lookup(self):
- # type: () -> CandidateLookup
- return self.candidate, None
-
- def is_satisfied_by(self, candidate):
- # type: (Candidate) -> bool
- return candidate == self.candidate
-
-
-class SpecifierRequirement(Requirement):
- def __init__(self, ireq):
- # type: (InstallRequirement) -> None
- assert ireq.link is None, "This is a link, not a specifier"
- self._ireq = ireq
- self._extras = frozenset(ireq.extras)
-
- def __str__(self):
- # type: () -> str
- return str(self._ireq.req)
-
- def __repr__(self):
- # type: () -> str
- return "{class_name}({requirement!r})".format(
- class_name=self.__class__.__name__,
- requirement=str(self._ireq.req),
- )
-
- @property
- def project_name(self):
- # type: () -> NormalizedName
- assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
- return canonicalize_name(self._ireq.req.name)
-
- @property
- def name(self):
- # type: () -> str
- return format_name(self.project_name, self._extras)
-
- def format_for_error(self):
- # type: () -> str
-
- # Convert comma-separated specifiers into "A, B, ..., F and G"
- # This makes the specifier a bit more "human readable", without
- # risking a change in meaning. (Hopefully! Not all edge cases have
- # been checked)
- parts = [s.strip() for s in str(self).split(",")]
- if len(parts) == 0:
- return ""
- elif len(parts) == 1:
- return parts[0]
-
- return ", ".join(parts[:-1]) + " and " + parts[-1]
-
- def get_candidate_lookup(self):
- # type: () -> CandidateLookup
- return None, self._ireq
-
- def is_satisfied_by(self, candidate):
- # type: (Candidate) -> bool
- assert candidate.name == self.name, (
- f"Internal issue: Candidate is not for this requirement "
- f"{candidate.name} vs {self.name}"
- )
- # We can safely always allow prereleases here since PackageFinder
- # already implements the prerelease logic, and would have filtered out
- # prerelease candidates if the user does not expect them.
- assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
- spec = self._ireq.req.specifier
- return spec.contains(candidate.version, prereleases=True)
-
-
-class RequiresPythonRequirement(Requirement):
- """A requirement representing Requires-Python metadata."""
-
- def __init__(self, specifier, match):
- # type: (SpecifierSet, Candidate) -> None
- self.specifier = specifier
- self._candidate = match
-
- def __str__(self):
- # type: () -> str
- return f"Python {self.specifier}"
-
- def __repr__(self):
- # type: () -> str
- return "{class_name}({specifier!r})".format(
- class_name=self.__class__.__name__,
- specifier=str(self.specifier),
- )
-
- @property
- def project_name(self):
- # type: () -> NormalizedName
- return self._candidate.project_name
-
- @property
- def name(self):
- # type: () -> str
- return self._candidate.name
-
- def format_for_error(self):
- # type: () -> str
- return str(self)
-
- def get_candidate_lookup(self):
- # type: () -> CandidateLookup
- if self.specifier.contains(self._candidate.version, prereleases=True):
- return self._candidate, None
- return None, None
-
- def is_satisfied_by(self, candidate):
- # type: (Candidate) -> bool
- assert candidate.name == self._candidate.name, "Not Python candidate"
- # We can safely always allow prereleases here since PackageFinder
- # already implements the prerelease logic, and would have filtered out
- # prerelease candidates if the user does not expect them.
- return self.specifier.contains(candidate.version, prereleases=True)
-
-
-class UnsatisfiableRequirement(Requirement):
- """A requirement that cannot be satisfied."""
-
- def __init__(self, name):
- # type: (NormalizedName) -> None
- self._name = name
-
- def __str__(self):
- # type: () -> str
- return f"{self._name} (unavailable)"
-
- def __repr__(self):
- # type: () -> str
- return "{class_name}({name!r})".format(
- class_name=self.__class__.__name__,
- name=str(self._name),
- )
-
- @property
- def project_name(self):
- # type: () -> NormalizedName
- return self._name
-
- @property
- def name(self):
- # type: () -> str
- return self._name
-
- def format_for_error(self):
- # type: () -> str
- return str(self)
-
- def get_candidate_lookup(self):
- # type: () -> CandidateLookup
- return None, None
-
- def is_satisfied_by(self, candidate):
- # type: (Candidate) -> bool
- return False
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py
deleted file mode 100644
index b90f82c..0000000
--- a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+++ /dev/null
@@ -1,305 +0,0 @@
-import functools
-import logging
-import os
-from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast
-
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import parse as parse_version
-from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible
-from pip._vendor.resolvelib import Resolver as RLResolver
-from pip._vendor.resolvelib.structs import DirectedGraph
-
-from pip._internal.cache import WheelCache
-from pip._internal.exceptions import InstallationError
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.operations.prepare import RequirementPreparer
-from pip._internal.req.req_install import (
- InstallRequirement,
- check_invalid_constraint_type,
-)
-from pip._internal.req.req_set import RequirementSet
-from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider
-from pip._internal.resolution.resolvelib.provider import PipProvider
-from pip._internal.resolution.resolvelib.reporter import (
- PipDebuggingReporter,
- PipReporter,
-)
-from pip._internal.utils.deprecation import deprecated
-from pip._internal.utils.filetypes import is_archive_file
-from pip._internal.utils.misc import dist_is_editable
-
-from .base import Candidate, Constraint, Requirement
-from .factory import Factory
-
-if TYPE_CHECKING:
- from pip._vendor.resolvelib.resolvers import Result as RLResult
-
- Result = RLResult[Requirement, Candidate, str]
-
-
-logger = logging.getLogger(__name__)
-
-
-class Resolver(BaseResolver):
- _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"}
-
- def __init__(
- self,
- preparer, # type: RequirementPreparer
- finder, # type: PackageFinder
- wheel_cache, # type: Optional[WheelCache]
- make_install_req, # type: InstallRequirementProvider
- use_user_site, # type: bool
- ignore_dependencies, # type: bool
- ignore_installed, # type: bool
- ignore_requires_python, # type: bool
- force_reinstall, # type: bool
- upgrade_strategy, # type: str
- py_version_info=None, # type: Optional[Tuple[int, ...]]
- ):
- super().__init__()
- assert upgrade_strategy in self._allowed_strategies
-
- self.factory = Factory(
- finder=finder,
- preparer=preparer,
- make_install_req=make_install_req,
- wheel_cache=wheel_cache,
- use_user_site=use_user_site,
- force_reinstall=force_reinstall,
- ignore_installed=ignore_installed,
- ignore_requires_python=ignore_requires_python,
- py_version_info=py_version_info,
- )
- self.ignore_dependencies = ignore_dependencies
- self.upgrade_strategy = upgrade_strategy
- self._result = None # type: Optional[Result]
-
- def resolve(self, root_reqs, check_supported_wheels):
- # type: (List[InstallRequirement], bool) -> RequirementSet
-
- constraints = {} # type: Dict[str, Constraint]
- user_requested = {} # type: Dict[str, int]
- requirements = []
- for i, req in enumerate(root_reqs):
- if req.constraint:
- # Ensure we only accept valid constraints
- problem = check_invalid_constraint_type(req)
- if problem:
- raise InstallationError(problem)
- if not req.match_markers():
- continue
- assert req.name, "Constraint must be named"
- name = canonicalize_name(req.name)
- if name in constraints:
- constraints[name] &= req
- else:
- constraints[name] = Constraint.from_ireq(req)
- else:
- if req.user_supplied and req.name:
- canonical_name = canonicalize_name(req.name)
- if canonical_name not in user_requested:
- user_requested[canonical_name] = i
- r = self.factory.make_requirement_from_install_req(
- req, requested_extras=()
- )
- if r is not None:
- requirements.append(r)
-
- provider = PipProvider(
- factory=self.factory,
- constraints=constraints,
- ignore_dependencies=self.ignore_dependencies,
- upgrade_strategy=self.upgrade_strategy,
- user_requested=user_requested,
- )
- if "PIP_RESOLVER_DEBUG" in os.environ:
- reporter = PipDebuggingReporter() # type: BaseReporter
- else:
- reporter = PipReporter()
- resolver = RLResolver(
- provider,
- reporter,
- ) # type: RLResolver[Requirement, Candidate, str]
-
- try:
- try_to_avoid_resolution_too_deep = 2000000
- result = self._result = resolver.resolve(
- requirements, max_rounds=try_to_avoid_resolution_too_deep
- )
-
- except ResolutionImpossible as e:
- error = self.factory.get_installation_error(
- cast("ResolutionImpossible[Requirement, Candidate]", e),
- constraints,
- )
- raise error from e
-
- req_set = RequirementSet(check_supported_wheels=check_supported_wheels)
- for candidate in result.mapping.values():
- ireq = candidate.get_install_requirement()
- if ireq is None:
- continue
-
- # Check if there is already an installation under the same name,
- # and set a flag for later stages to uninstall it, if needed.
- installed_dist = self.factory.get_dist_to_uninstall(candidate)
- if installed_dist is None:
- # There is no existing installation -- nothing to uninstall.
- ireq.should_reinstall = False
- elif self.factory.force_reinstall:
- # The --force-reinstall flag is set -- reinstall.
- ireq.should_reinstall = True
- elif parse_version(installed_dist.version) != candidate.version:
- # The installation is different in version -- reinstall.
- ireq.should_reinstall = True
- elif candidate.is_editable or dist_is_editable(installed_dist):
- # The incoming distribution is editable, or different in
- # editable-ness to installation -- reinstall.
- ireq.should_reinstall = True
- elif candidate.source_link and candidate.source_link.is_file:
- # The incoming distribution is under file://
- if candidate.source_link.is_wheel:
- # is a local wheel -- do nothing.
- logger.info(
- "%s is already installed with the same version as the "
- "provided wheel. Use --force-reinstall to force an "
- "installation of the wheel.",
- ireq.name,
- )
- continue
-
- looks_like_sdist = (
- is_archive_file(candidate.source_link.file_path)
- and candidate.source_link.ext != ".zip"
- )
- if looks_like_sdist:
- # is a local sdist -- show a deprecation warning!
- reason = (
- "Source distribution is being reinstalled despite an "
- "installed package having the same name and version as "
- "the installed package."
- )
- replacement = "use --force-reinstall"
- deprecated(
- reason=reason,
- replacement=replacement,
- gone_in="21.2",
- issue=8711,
- )
-
- # is a local sdist or path -- reinstall
- ireq.should_reinstall = True
- else:
- continue
-
- link = candidate.source_link
- if link and link.is_yanked:
- # The reason can contain non-ASCII characters, Unicode
- # is required for Python 2.
- msg = (
- "The candidate selected for download or install is a "
- "yanked version: {name!r} candidate (version {version} "
- "at {link})\nReason for being yanked: {reason}"
- ).format(
- name=candidate.name,
- version=candidate.version,
- link=link,
- reason=link.yanked_reason or "",
- )
- logger.warning(msg)
-
- req_set.add_named_requirement(ireq)
-
- reqs = req_set.all_requirements
- self.factory.preparer.prepare_linked_requirements_more(reqs)
- return req_set
-
- def get_installation_order(self, req_set):
- # type: (RequirementSet) -> List[InstallRequirement]
- """Get order for installation of requirements in RequirementSet.
-
- The returned list contains a requirement before another that depends on
- it. This helps ensure that the environment is kept consistent as they
- get installed one-by-one.
-
- The current implementation creates a topological ordering of the
- dependency graph, while breaking any cycles in the graph at arbitrary
- points. We make no guarantees about where the cycle would be broken,
- other than they would be broken.
- """
- assert self._result is not None, "must call resolve() first"
-
- graph = self._result.graph
- weights = get_topological_weights(
- graph,
- expected_node_count=len(self._result.mapping) + 1,
- )
-
- sorted_items = sorted(
- req_set.requirements.items(),
- key=functools.partial(_req_set_item_sorter, weights=weights),
- reverse=True,
- )
- return [ireq for _, ireq in sorted_items]
-
-
-def get_topological_weights(graph, expected_node_count):
- # type: (DirectedGraph[Optional[str]], int) -> Dict[Optional[str], int]
- """Assign weights to each node based on how "deep" they are.
-
- This implementation may change at any point in the future without prior
- notice.
-
- We take the length for the longest path to any node from root, ignoring any
- paths that contain a single node twice (i.e. cycles). This is done through
- a depth-first search through the graph, while keeping track of the path to
- the node.
-
- Cycles in the graph result would result in node being revisited while also
- being it's own path. In this case, take no action. This helps ensure we
- don't get stuck in a cycle.
-
- When assigning weight, the longer path (i.e. larger length) is preferred.
- """
- path = set() # type: Set[Optional[str]]
- weights = {} # type: Dict[Optional[str], int]
-
- def visit(node):
- # type: (Optional[str]) -> None
- if node in path:
- # We hit a cycle, so we'll break it here.
- return
-
- # Time to visit the children!
- path.add(node)
- for child in graph.iter_children(node):
- visit(child)
- path.remove(node)
-
- last_known_parent_count = weights.get(node, 0)
- weights[node] = max(last_known_parent_count, len(path))
-
- # `None` is guaranteed to be the root node by resolvelib.
- visit(None)
-
- # Sanity checks
- assert weights[None] == 0
- assert len(weights) == expected_node_count
-
- return weights
-
-
-def _req_set_item_sorter(
- item, # type: Tuple[str, InstallRequirement]
- weights, # type: Dict[Optional[str], int]
-):
- # type: (...) -> Tuple[int, str]
- """Key function used to sort install requirements for installation.
-
- Based on the "weight" mapping calculated in ``get_installation_order()``.
- The canonical package name is returned as the second member as a tie-
- breaker to ensure the result is predictable, which is useful in tests.
- """
- name = canonicalize_name(item[0])
- return weights[name], name
diff --git a/venv/Lib/site-packages/pip/_internal/self_outdated_check.py b/venv/Lib/site-packages/pip/_internal/self_outdated_check.py
deleted file mode 100644
index 6b24965..0000000
--- a/venv/Lib/site-packages/pip/_internal/self_outdated_check.py
+++ /dev/null
@@ -1,187 +0,0 @@
-import datetime
-import hashlib
-import json
-import logging
-import optparse
-import os.path
-import sys
-from typing import Any, Dict
-
-from pip._vendor.packaging.version import parse as parse_version
-
-from pip._internal.index.collector import LinkCollector
-from pip._internal.index.package_finder import PackageFinder
-from pip._internal.metadata import get_default_environment
-from pip._internal.models.selection_prefs import SelectionPreferences
-from pip._internal.network.session import PipSession
-from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace
-from pip._internal.utils.misc import ensure_dir
-
-SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ"
-
-
-logger = logging.getLogger(__name__)
-
-
-def _get_statefile_name(key):
- # type: (str) -> str
- key_bytes = key.encode()
- name = hashlib.sha224(key_bytes).hexdigest()
- return name
-
-
-class SelfCheckState:
- def __init__(self, cache_dir):
- # type: (str) -> None
- self.state = {} # type: Dict[str, Any]
- self.statefile_path = None
-
- # Try to load the existing state
- if cache_dir:
- self.statefile_path = os.path.join(
- cache_dir, "selfcheck", _get_statefile_name(self.key)
- )
- try:
- with open(self.statefile_path, encoding="utf-8") as statefile:
- self.state = json.load(statefile)
- except (OSError, ValueError, KeyError):
- # Explicitly suppressing exceptions, since we don't want to
- # error out if the cache file is invalid.
- pass
-
- @property
- def key(self):
- # type: () -> str
- return sys.prefix
-
- def save(self, pypi_version, current_time):
- # type: (str, datetime.datetime) -> None
- # If we do not have a path to cache in, don't bother saving.
- if not self.statefile_path:
- return
-
- # Check to make sure that we own the directory
- if not check_path_owner(os.path.dirname(self.statefile_path)):
- return
-
- # Now that we've ensured the directory is owned by this user, we'll go
- # ahead and make sure that all our directories are created.
- ensure_dir(os.path.dirname(self.statefile_path))
-
- state = {
- # Include the key so it's easy to tell which pip wrote the
- # file.
- "key": self.key,
- "last_check": current_time.strftime(SELFCHECK_DATE_FMT),
- "pypi_version": pypi_version,
- }
-
- text = json.dumps(state, sort_keys=True, separators=(",", ":"))
-
- with adjacent_tmp_file(self.statefile_path) as f:
- f.write(text.encode())
-
- try:
- # Since we have a prefix-specific state file, we can just
- # overwrite whatever is there, no need to check.
- replace(f.name, self.statefile_path)
- except OSError:
- # Best effort.
- pass
-
-
-def was_installed_by_pip(pkg):
- # type: (str) -> bool
- """Checks whether pkg was installed by pip
-
- This is used not to display the upgrade message when pip is in fact
- installed by system package manager, such as dnf on Fedora.
- """
- dist = get_default_environment().get_distribution(pkg)
- return dist is not None and "pip" == dist.installer
-
-
-def pip_self_version_check(session, options):
- # type: (PipSession, optparse.Values) -> None
- """Check for an update for pip.
-
- Limit the frequency of checks to once per week. State is stored either in
- the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
- of the pip script path.
- """
- installed_dist = get_default_environment().get_distribution("pip")
- if not installed_dist:
- return
-
- pip_version = installed_dist.version
- pypi_version = None
-
- try:
- state = SelfCheckState(cache_dir=options.cache_dir)
-
- current_time = datetime.datetime.utcnow()
- # Determine if we need to refresh the state
- if "last_check" in state.state and "pypi_version" in state.state:
- last_check = datetime.datetime.strptime(
- state.state["last_check"],
- SELFCHECK_DATE_FMT
- )
- if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60:
- pypi_version = state.state["pypi_version"]
-
- # Refresh the version if we need to or just see if we need to warn
- if pypi_version is None:
- # Lets use PackageFinder to see what the latest pip version is
- link_collector = LinkCollector.create(
- session,
- options=options,
- suppress_no_index=True,
- )
-
- # Pass allow_yanked=False so we don't suggest upgrading to a
- # yanked version.
- selection_prefs = SelectionPreferences(
- allow_yanked=False,
- allow_all_prereleases=False, # Explicitly set to False
- )
-
- finder = PackageFinder.create(
- link_collector=link_collector,
- selection_prefs=selection_prefs,
- )
- best_candidate = finder.find_best_candidate("pip").best_candidate
- if best_candidate is None:
- return
- pypi_version = str(best_candidate.version)
-
- # save that we've performed a check
- state.save(pypi_version, current_time)
-
- remote_version = parse_version(pypi_version)
-
- local_version_is_older = (
- pip_version < remote_version and
- pip_version.base_version != remote_version.base_version and
- was_installed_by_pip('pip')
- )
-
- # Determine if our pypi_version is older
- if not local_version_is_older:
- return
-
- # We cannot tell how the current pip is available in the current
- # command context, so be pragmatic here and suggest the command
- # that's always available. This does not accommodate spaces in
- # `sys.executable`.
- pip_cmd = f"{sys.executable} -m pip"
- logger.warning(
- "You are using pip version %s; however, version %s is "
- "available.\nYou should consider upgrading via the "
- "'%s install --upgrade pip' command.",
- pip_version, pypi_version, pip_cmd
- )
- except Exception:
- logger.debug(
- "There was an error checking the latest version of pip",
- exc_info=True,
- )
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__init__.py b/venv/Lib/site-packages/pip/_internal/utils/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index c5b84af..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc
deleted file mode 100644
index d643280..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-39.pyc
deleted file mode 100644
index 7c13434..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc
deleted file mode 100644
index c283b76..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-39.pyc
deleted file mode 100644
index 4a2971d..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc
deleted file mode 100644
index 81b714a..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc
deleted file mode 100644
index 262dd9b..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-39.pyc
deleted file mode 100644
index 2f4445a..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-39.pyc
deleted file mode 100644
index 65f47e7..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc
deleted file mode 100644
index 33a75bd..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc
deleted file mode 100644
index ca0babe..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-39.pyc
deleted file mode 100644
index 09ed608..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc
deleted file mode 100644
index 3f52aab..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-39.pyc
deleted file mode 100644
index 929c8cc..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-39.pyc
deleted file mode 100644
index a9b27f5..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-39.pyc
deleted file mode 100644
index f0e7a16..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc
deleted file mode 100644
index 4d5bff9..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-39.pyc
deleted file mode 100644
index d76b68c..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc
deleted file mode 100644
index 9103918..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-39.pyc
deleted file mode 100644
index afddeab..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc
deleted file mode 100644
index d9cb6ff..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc
deleted file mode 100644
index fced2e2..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc
deleted file mode 100644
index b6688ad..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc
deleted file mode 100644
index 494c7c2..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-39.pyc
deleted file mode 100644
index 3142259..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/utils/appdirs.py b/venv/Lib/site-packages/pip/_internal/utils/appdirs.py
deleted file mode 100644
index db974da..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/appdirs.py
+++ /dev/null
@@ -1,38 +0,0 @@
-"""
-This code wraps the vendored appdirs module to so the return values are
-compatible for the current pip code base.
-
-The intention is to rewrite current usages gradually, keeping the tests pass,
-and eventually drop this after all usages are changed.
-"""
-
-import os
-from typing import List
-
-from pip._vendor import appdirs as _appdirs
-
-
-def user_cache_dir(appname):
- # type: (str) -> str
- return _appdirs.user_cache_dir(appname, appauthor=False)
-
-
-def user_config_dir(appname, roaming=True):
- # type: (str, bool) -> str
- path = _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming)
- if _appdirs.system == "darwin" and not os.path.isdir(path):
- path = os.path.expanduser("~/.config/")
- if appname:
- path = os.path.join(path, appname)
- return path
-
-
-# for the discussion regarding site_config_dir locations
-# see
-def site_config_dirs(appname):
- # type: (str) -> List[str]
- dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True)
- if _appdirs.system not in ["win32", "darwin"]:
- # always look in /etc directly as well
- return dirval.split(os.pathsep) + ["/etc"]
- return [dirval]
diff --git a/venv/Lib/site-packages/pip/_internal/utils/compat.py b/venv/Lib/site-packages/pip/_internal/utils/compat.py
deleted file mode 100644
index 1fb2dc7..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/compat.py
+++ /dev/null
@@ -1,65 +0,0 @@
-"""Stuff that differs in different Python versions and platform
-distributions."""
-
-import logging
-import os
-import sys
-
-__all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"]
-
-
-logger = logging.getLogger(__name__)
-
-
-def has_tls():
- # type: () -> bool
- try:
- import _ssl # noqa: F401 # ignore unused
-
- return True
- except ImportError:
- pass
-
- from pip._vendor.urllib3.util import IS_PYOPENSSL
-
- return IS_PYOPENSSL
-
-
-def get_path_uid(path):
- # type: (str) -> int
- """
- Return path's uid.
-
- Does not follow symlinks:
- https://github.com/pypa/pip/pull/935#discussion_r5307003
-
- Placed this function in compat due to differences on AIX and
- Jython, that should eventually go away.
-
- :raises OSError: When path is a symlink or can't be read.
- """
- if hasattr(os, "O_NOFOLLOW"):
- fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW)
- file_uid = os.fstat(fd).st_uid
- os.close(fd)
- else: # AIX and Jython
- # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW
- if not os.path.islink(path):
- # older versions of Jython don't have `os.fstat`
- file_uid = os.stat(path).st_uid
- else:
- # raise OSError for parity with os.O_NOFOLLOW above
- raise OSError(f"{path} is a symlink; Will not return uid for symlinks")
- return file_uid
-
-
-# packages in the stdlib that may have installation metadata, but should not be
-# considered 'installed'. this theoretically could be determined based on
-# dist.location (py27:`sysconfig.get_paths()['stdlib']`,
-# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may
-# make this ineffective, so hard-coding
-stdlib_pkgs = {"python", "wsgiref", "argparse"}
-
-
-# windows detection, covers cpython and ironpython
-WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt")
diff --git a/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py b/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py
deleted file mode 100644
index 14fe51c..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py
+++ /dev/null
@@ -1,174 +0,0 @@
-"""Generate and work with PEP 425 Compatibility Tags.
-"""
-
-import re
-from typing import TYPE_CHECKING, List, Optional, Tuple
-
-from pip._vendor.packaging.tags import (
- Tag,
- compatible_tags,
- cpython_tags,
- generic_tags,
- interpreter_name,
- interpreter_version,
- mac_platforms,
-)
-
-if TYPE_CHECKING:
- from pip._vendor.packaging.tags import PythonVersion
-
-
-_osx_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)")
-
-
-def version_info_to_nodot(version_info):
- # type: (Tuple[int, ...]) -> str
- # Only use up to the first two numbers.
- return "".join(map(str, version_info[:2]))
-
-
-def _mac_platforms(arch):
- # type: (str) -> List[str]
- match = _osx_arch_pat.match(arch)
- if match:
- name, major, minor, actual_arch = match.groups()
- mac_version = (int(major), int(minor))
- arches = [
- # Since we have always only checked that the platform starts
- # with "macosx", for backwards-compatibility we extract the
- # actual prefix provided by the user in case they provided
- # something like "macosxcustom_". It may be good to remove
- # this as undocumented or deprecate it in the future.
- "{}_{}".format(name, arch[len("macosx_") :])
- for arch in mac_platforms(mac_version, actual_arch)
- ]
- else:
- # arch pattern didn't match (?!)
- arches = [arch]
- return arches
-
-
-def _custom_manylinux_platforms(arch):
- # type: (str) -> List[str]
- arches = [arch]
- arch_prefix, arch_sep, arch_suffix = arch.partition("_")
- if arch_prefix == "manylinux2014":
- # manylinux1/manylinux2010 wheels run on most manylinux2014 systems
- # with the exception of wheels depending on ncurses. PEP 599 states
- # manylinux1/manylinux2010 wheels should be considered
- # manylinux2014 wheels:
- # https://www.python.org/dev/peps/pep-0599/#backwards-compatibility-with-manylinux2010-wheels
- if arch_suffix in {"i686", "x86_64"}:
- arches.append("manylinux2010" + arch_sep + arch_suffix)
- arches.append("manylinux1" + arch_sep + arch_suffix)
- elif arch_prefix == "manylinux2010":
- # manylinux1 wheels run on most manylinux2010 systems with the
- # exception of wheels depending on ncurses. PEP 571 states
- # manylinux1 wheels should be considered manylinux2010 wheels:
- # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels
- arches.append("manylinux1" + arch_sep + arch_suffix)
- return arches
-
-
-def _get_custom_platforms(arch):
- # type: (str) -> List[str]
- arch_prefix, arch_sep, arch_suffix = arch.partition("_")
- if arch.startswith("macosx"):
- arches = _mac_platforms(arch)
- elif arch_prefix in ["manylinux2014", "manylinux2010"]:
- arches = _custom_manylinux_platforms(arch)
- else:
- arches = [arch]
- return arches
-
-
-def _expand_allowed_platforms(platforms):
- # type: (Optional[List[str]]) -> Optional[List[str]]
- if not platforms:
- return None
-
- seen = set()
- result = []
-
- for p in platforms:
- if p in seen:
- continue
- additions = [c for c in _get_custom_platforms(p) if c not in seen]
- seen.update(additions)
- result.extend(additions)
-
- return result
-
-
-def _get_python_version(version):
- # type: (str) -> PythonVersion
- if len(version) > 1:
- return int(version[0]), int(version[1:])
- else:
- return (int(version[0]),)
-
-
-def _get_custom_interpreter(implementation=None, version=None):
- # type: (Optional[str], Optional[str]) -> str
- if implementation is None:
- implementation = interpreter_name()
- if version is None:
- version = interpreter_version()
- return f"{implementation}{version}"
-
-
-def get_supported(
- version=None, # type: Optional[str]
- platforms=None, # type: Optional[List[str]]
- impl=None, # type: Optional[str]
- abis=None, # type: Optional[List[str]]
-):
- # type: (...) -> List[Tag]
- """Return a list of supported tags for each version specified in
- `versions`.
-
- :param version: a string version, of the form "33" or "32",
- or None. The version will be assumed to support our ABI.
- :param platform: specify a list of platforms you want valid
- tags for, or None. If None, use the local system platform.
- :param impl: specify the exact implementation you want valid
- tags for, or None. If None, use the local interpreter impl.
- :param abis: specify a list of abis you want valid
- tags for, or None. If None, use the local interpreter abi.
- """
- supported = [] # type: List[Tag]
-
- python_version = None # type: Optional[PythonVersion]
- if version is not None:
- python_version = _get_python_version(version)
-
- interpreter = _get_custom_interpreter(impl, version)
-
- platforms = _expand_allowed_platforms(platforms)
-
- is_cpython = (impl or interpreter_name()) == "cp"
- if is_cpython:
- supported.extend(
- cpython_tags(
- python_version=python_version,
- abis=abis,
- platforms=platforms,
- )
- )
- else:
- supported.extend(
- generic_tags(
- interpreter=interpreter,
- abis=abis,
- platforms=platforms,
- )
- )
- supported.extend(
- compatible_tags(
- python_version=python_version,
- interpreter=interpreter,
- platforms=platforms,
- )
- )
-
- return supported
diff --git a/venv/Lib/site-packages/pip/_internal/utils/datetime.py b/venv/Lib/site-packages/pip/_internal/utils/datetime.py
deleted file mode 100644
index b638646..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/datetime.py
+++ /dev/null
@@ -1,12 +0,0 @@
-"""For when pip wants to check the date or time.
-"""
-
-import datetime
-
-
-def today_is_later_than(year, month, day):
- # type: (int, int, int) -> bool
- today = datetime.date.today()
- given = datetime.date(year, month, day)
-
- return today > given
diff --git a/venv/Lib/site-packages/pip/_internal/utils/deprecation.py b/venv/Lib/site-packages/pip/_internal/utils/deprecation.py
deleted file mode 100644
index b62b3fb..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/deprecation.py
+++ /dev/null
@@ -1,102 +0,0 @@
-"""
-A module that implements tooling to enable easy warnings about deprecations.
-"""
-
-import logging
-import warnings
-from typing import Any, Optional, TextIO, Type, Union
-
-from pip._vendor.packaging.version import parse
-
-from pip import __version__ as current_version
-
-DEPRECATION_MSG_PREFIX = "DEPRECATION: "
-
-
-class PipDeprecationWarning(Warning):
- pass
-
-
-_original_showwarning = None # type: Any
-
-
-# Warnings <-> Logging Integration
-def _showwarning(
- message, # type: Union[Warning, str]
- category, # type: Type[Warning]
- filename, # type: str
- lineno, # type: int
- file=None, # type: Optional[TextIO]
- line=None, # type: Optional[str]
-):
- # type: (...) -> None
- if file is not None:
- if _original_showwarning is not None:
- _original_showwarning(message, category, filename, lineno, file, line)
- elif issubclass(category, PipDeprecationWarning):
- # We use a specially named logger which will handle all of the
- # deprecation messages for pip.
- logger = logging.getLogger("pip._internal.deprecations")
- logger.warning(message)
- else:
- _original_showwarning(message, category, filename, lineno, file, line)
-
-
-def install_warning_logger():
- # type: () -> None
- # Enable our Deprecation Warnings
- warnings.simplefilter("default", PipDeprecationWarning, append=True)
-
- global _original_showwarning
-
- if _original_showwarning is None:
- _original_showwarning = warnings.showwarning
- warnings.showwarning = _showwarning
-
-
-def deprecated(reason, replacement, gone_in, issue=None):
- # type: (str, Optional[str], Optional[str], Optional[int]) -> None
- """Helper to deprecate existing functionality.
-
- reason:
- Textual reason shown to the user about why this functionality has
- been deprecated.
- replacement:
- Textual suggestion shown to the user about what alternative
- functionality they can use.
- gone_in:
- The version of pip does this functionality should get removed in.
- Raises errors if pip's current version is greater than or equal to
- this.
- issue:
- Issue number on the tracker that would serve as a useful place for
- users to find related discussion and provide feedback.
-
- Always pass replacement, gone_in and issue as keyword arguments for clarity
- at the call site.
- """
-
- # Construct a nice message.
- # This is eagerly formatted as we want it to get logged as if someone
- # typed this entire message out.
- sentences = [
- (reason, DEPRECATION_MSG_PREFIX + "{}"),
- (gone_in, "pip {} will remove support for this functionality."),
- (replacement, "A possible replacement is {}."),
- (
- issue,
- (
- "You can find discussion regarding this at "
- "https://github.com/pypa/pip/issues/{}."
- ),
- ),
- ]
- message = " ".join(
- template.format(val) for val, template in sentences if val is not None
- )
-
- # Raise as an error if it has to be removed.
- if gone_in is not None and parse(current_version) >= parse(gone_in):
- raise PipDeprecationWarning(message)
-
- warnings.warn(message, category=PipDeprecationWarning, stacklevel=2)
diff --git a/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py b/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py
deleted file mode 100644
index eb50ac4..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py
+++ /dev/null
@@ -1,117 +0,0 @@
-import json
-import logging
-from typing import Optional
-
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.models.direct_url import (
- DIRECT_URL_METADATA_NAME,
- ArchiveInfo,
- DirectUrl,
- DirectUrlValidationError,
- DirInfo,
- VcsInfo,
-)
-from pip._internal.models.link import Link
-from pip._internal.vcs import vcs
-
-logger = logging.getLogger(__name__)
-
-
-def direct_url_as_pep440_direct_reference(direct_url, name):
- # type: (DirectUrl, str) -> str
- """Convert a DirectUrl to a pip requirement string."""
- direct_url.validate() # if invalid, this is a pip bug
- requirement = name + " @ "
- fragments = []
- if isinstance(direct_url.info, VcsInfo):
- requirement += "{}+{}@{}".format(
- direct_url.info.vcs, direct_url.url, direct_url.info.commit_id
- )
- elif isinstance(direct_url.info, ArchiveInfo):
- requirement += direct_url.url
- if direct_url.info.hash:
- fragments.append(direct_url.info.hash)
- else:
- assert isinstance(direct_url.info, DirInfo)
- requirement += direct_url.url
- if direct_url.subdirectory:
- fragments.append("subdirectory=" + direct_url.subdirectory)
- if fragments:
- requirement += "#" + "&".join(fragments)
- return requirement
-
-
-def direct_url_from_link(link, source_dir=None, link_is_in_wheel_cache=False):
- # type: (Link, Optional[str], bool) -> DirectUrl
- if link.is_vcs:
- vcs_backend = vcs.get_backend_for_scheme(link.scheme)
- assert vcs_backend
- url, requested_revision, _ = vcs_backend.get_url_rev_and_auth(
- link.url_without_fragment
- )
- # For VCS links, we need to find out and add commit_id.
- if link_is_in_wheel_cache:
- # If the requested VCS link corresponds to a cached
- # wheel, it means the requested revision was an
- # immutable commit hash, otherwise it would not have
- # been cached. In that case we don't have a source_dir
- # with the VCS checkout.
- assert requested_revision
- commit_id = requested_revision
- else:
- # If the wheel was not in cache, it means we have
- # had to checkout from VCS to build and we have a source_dir
- # which we can inspect to find out the commit id.
- assert source_dir
- commit_id = vcs_backend.get_revision(source_dir)
- return DirectUrl(
- url=url,
- info=VcsInfo(
- vcs=vcs_backend.name,
- commit_id=commit_id,
- requested_revision=requested_revision,
- ),
- subdirectory=link.subdirectory_fragment,
- )
- elif link.is_existing_dir():
- return DirectUrl(
- url=link.url_without_fragment,
- info=DirInfo(),
- subdirectory=link.subdirectory_fragment,
- )
- else:
- hash = None
- hash_name = link.hash_name
- if hash_name:
- hash = f"{hash_name}={link.hash}"
- return DirectUrl(
- url=link.url_without_fragment,
- info=ArchiveInfo(hash=hash),
- subdirectory=link.subdirectory_fragment,
- )
-
-
-def dist_get_direct_url(dist):
- # type: (Distribution) -> Optional[DirectUrl]
- """Obtain a DirectUrl from a pkg_resource.Distribution.
-
- Returns None if the distribution has no `direct_url.json` metadata,
- or if `direct_url.json` is invalid.
- """
- if not dist.has_metadata(DIRECT_URL_METADATA_NAME):
- return None
- try:
- return DirectUrl.from_json(dist.get_metadata(DIRECT_URL_METADATA_NAME))
- except (
- DirectUrlValidationError,
- json.JSONDecodeError,
- UnicodeDecodeError,
- ) as e:
- logger.warning(
- "Error parsing %s for %s: %s",
- DIRECT_URL_METADATA_NAME,
- dist.project_name,
- e,
- )
- return None
diff --git a/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py b/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py
deleted file mode 100644
index e886c88..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py
+++ /dev/null
@@ -1,43 +0,0 @@
-from distutils.errors import DistutilsArgError
-from distutils.fancy_getopt import FancyGetopt
-from typing import Dict, List
-
-_options = [
- ("exec-prefix=", None, ""),
- ("home=", None, ""),
- ("install-base=", None, ""),
- ("install-data=", None, ""),
- ("install-headers=", None, ""),
- ("install-lib=", None, ""),
- ("install-platlib=", None, ""),
- ("install-purelib=", None, ""),
- ("install-scripts=", None, ""),
- ("prefix=", None, ""),
- ("root=", None, ""),
- ("user", None, ""),
-]
-
-
-# typeshed doesn't permit Tuple[str, None, str], see python/typeshed#3469.
-_distutils_getopt = FancyGetopt(_options) # type: ignore
-
-
-def parse_distutils_args(args):
- # type: (List[str]) -> Dict[str, str]
- """Parse provided arguments, returning an object that has the
- matched arguments.
-
- Any unknown arguments are ignored.
- """
- result = {}
- for arg in args:
- try:
- _, match = _distutils_getopt.getopt(args=[arg])
- except DistutilsArgError:
- # We don't care about any other options, which here may be
- # considered unrecognized since our option list is not
- # exhaustive.
- pass
- else:
- result.update(match.__dict__)
- return result
diff --git a/venv/Lib/site-packages/pip/_internal/utils/encoding.py b/venv/Lib/site-packages/pip/_internal/utils/encoding.py
deleted file mode 100644
index 7c8893d..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/encoding.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import codecs
-import locale
-import re
-import sys
-from typing import List, Tuple
-
-BOMS = [
- (codecs.BOM_UTF8, "utf-8"),
- (codecs.BOM_UTF16, "utf-16"),
- (codecs.BOM_UTF16_BE, "utf-16-be"),
- (codecs.BOM_UTF16_LE, "utf-16-le"),
- (codecs.BOM_UTF32, "utf-32"),
- (codecs.BOM_UTF32_BE, "utf-32-be"),
- (codecs.BOM_UTF32_LE, "utf-32-le"),
-] # type: List[Tuple[bytes, str]]
-
-ENCODING_RE = re.compile(br"coding[:=]\s*([-\w.]+)")
-
-
-def auto_decode(data):
- # type: (bytes) -> str
- """Check a bytes string for a BOM to correctly detect the encoding
-
- Fallback to locale.getpreferredencoding(False) like open() on Python3"""
- for bom, encoding in BOMS:
- if data.startswith(bom):
- return data[len(bom) :].decode(encoding)
- # Lets check the first two lines as in PEP263
- for line in data.split(b"\n")[:2]:
- if line[0:1] == b"#" and ENCODING_RE.search(line):
- result = ENCODING_RE.search(line)
- assert result is not None
- encoding = result.groups()[0].decode("ascii")
- return data.decode(encoding)
- return data.decode(
- locale.getpreferredencoding(False) or sys.getdefaultencoding(),
- )
diff --git a/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py b/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py
deleted file mode 100644
index 879bf21..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import sys
-from typing import List, Optional
-
-from pip._internal.cli.main import main
-
-
-def _wrapper(args=None):
- # type: (Optional[List[str]]) -> int
- """Central wrapper for all old entrypoints.
-
- Historically pip has had several entrypoints defined. Because of issues
- arising from PATH, sys.path, multiple Pythons, their interactions, and most
- of them having a pip installed, users suffer every time an entrypoint gets
- moved.
-
- To alleviate this pain, and provide a mechanism for warning users and
- directing them to an appropriate place for help, we now define all of
- our old entrypoints as wrappers for the current one.
- """
- sys.stderr.write(
- "WARNING: pip is being invoked by an old script wrapper. This will "
- "fail in a future version of pip.\n"
- "Please see https://github.com/pypa/pip/issues/5599 for advice on "
- "fixing the underlying issue.\n"
- "To avoid this problem you can invoke Python with '-m pip' instead of "
- "running pip directly.\n"
- )
- return main(args)
diff --git a/venv/Lib/site-packages/pip/_internal/utils/filesystem.py b/venv/Lib/site-packages/pip/_internal/utils/filesystem.py
deleted file mode 100644
index 3db97dc..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/filesystem.py
+++ /dev/null
@@ -1,193 +0,0 @@
-import fnmatch
-import os
-import os.path
-import random
-import shutil
-import stat
-import sys
-from contextlib import contextmanager
-from tempfile import NamedTemporaryFile
-from typing import Any, BinaryIO, Iterator, List, Union, cast
-
-from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed
-
-from pip._internal.utils.compat import get_path_uid
-from pip._internal.utils.misc import format_size
-
-
-def check_path_owner(path):
- # type: (str) -> bool
- # If we don't have a way to check the effective uid of this process, then
- # we'll just assume that we own the directory.
- if sys.platform == "win32" or not hasattr(os, "geteuid"):
- return True
-
- assert os.path.isabs(path)
-
- previous = None
- while path != previous:
- if os.path.lexists(path):
- # Check if path is writable by current user.
- if os.geteuid() == 0:
- # Special handling for root user in order to handle properly
- # cases where users use sudo without -H flag.
- try:
- path_uid = get_path_uid(path)
- except OSError:
- return False
- return path_uid == 0
- else:
- return os.access(path, os.W_OK)
- else:
- previous, path = path, os.path.dirname(path)
- return False # assume we don't own the path
-
-
-def copy2_fixed(src, dest):
- # type: (str, str) -> None
- """Wrap shutil.copy2() but map errors copying socket files to
- SpecialFileError as expected.
-
- See also https://bugs.python.org/issue37700.
- """
- try:
- shutil.copy2(src, dest)
- except OSError:
- for f in [src, dest]:
- try:
- is_socket_file = is_socket(f)
- except OSError:
- # An error has already occurred. Another error here is not
- # a problem and we can ignore it.
- pass
- else:
- if is_socket_file:
- raise shutil.SpecialFileError(f"`{f}` is a socket")
-
- raise
-
-
-def is_socket(path):
- # type: (str) -> bool
- return stat.S_ISSOCK(os.lstat(path).st_mode)
-
-
-@contextmanager
-def adjacent_tmp_file(path, **kwargs):
- # type: (str, **Any) -> Iterator[BinaryIO]
- """Return a file-like object pointing to a tmp file next to path.
-
- The file is created securely and is ensured to be written to disk
- after the context reaches its end.
-
- kwargs will be passed to tempfile.NamedTemporaryFile to control
- the way the temporary file will be opened.
- """
- with NamedTemporaryFile(
- delete=False,
- dir=os.path.dirname(path),
- prefix=os.path.basename(path),
- suffix=".tmp",
- **kwargs,
- ) as f:
- result = cast(BinaryIO, f)
- try:
- yield result
- finally:
- result.flush()
- os.fsync(result.fileno())
-
-
-# Tenacity raises RetryError by default, explictly raise the original exception
-_replace_retry = retry(reraise=True, stop=stop_after_delay(1), wait=wait_fixed(0.25))
-
-replace = _replace_retry(os.replace)
-
-
-# test_writable_dir and _test_writable_dir_win are copied from Flit,
-# with the author's agreement to also place them under pip's license.
-def test_writable_dir(path):
- # type: (str) -> bool
- """Check if a directory is writable.
-
- Uses os.access() on POSIX, tries creating files on Windows.
- """
- # If the directory doesn't exist, find the closest parent that does.
- while not os.path.isdir(path):
- parent = os.path.dirname(path)
- if parent == path:
- break # Should never get here, but infinite loops are bad
- path = parent
-
- if os.name == "posix":
- return os.access(path, os.W_OK)
-
- return _test_writable_dir_win(path)
-
-
-def _test_writable_dir_win(path):
- # type: (str) -> bool
- # os.access doesn't work on Windows: http://bugs.python.org/issue2528
- # and we can't use tempfile: http://bugs.python.org/issue22107
- basename = "accesstest_deleteme_fishfingers_custard_"
- alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
- for _ in range(10):
- name = basename + "".join(random.choice(alphabet) for _ in range(6))
- file = os.path.join(path, name)
- try:
- fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL)
- except FileExistsError:
- pass
- except PermissionError:
- # This could be because there's a directory with the same name.
- # But it's highly unlikely there's a directory called that,
- # so we'll assume it's because the parent dir is not writable.
- # This could as well be because the parent dir is not readable,
- # due to non-privileged user access.
- return False
- else:
- os.close(fd)
- os.unlink(file)
- return True
-
- # This should never be reached
- raise OSError("Unexpected condition testing for writable directory")
-
-
-def find_files(path, pattern):
- # type: (str, str) -> List[str]
- """Returns a list of absolute paths of files beneath path, recursively,
- with filenames which match the UNIX-style shell glob pattern."""
- result = [] # type: List[str]
- for root, _, files in os.walk(path):
- matches = fnmatch.filter(files, pattern)
- result.extend(os.path.join(root, f) for f in matches)
- return result
-
-
-def file_size(path):
- # type: (str) -> Union[int, float]
- # If it's a symlink, return 0.
- if os.path.islink(path):
- return 0
- return os.path.getsize(path)
-
-
-def format_file_size(path):
- # type: (str) -> str
- return format_size(file_size(path))
-
-
-def directory_size(path):
- # type: (str) -> Union[int, float]
- size = 0.0
- for root, _dirs, files in os.walk(path):
- for filename in files:
- file_path = os.path.join(root, filename)
- size += file_size(file_path)
- return size
-
-
-def format_directory_size(path):
- # type: (str) -> str
- return format_size(directory_size(path))
diff --git a/venv/Lib/site-packages/pip/_internal/utils/filetypes.py b/venv/Lib/site-packages/pip/_internal/utils/filetypes.py
deleted file mode 100644
index da93584..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/filetypes.py
+++ /dev/null
@@ -1,28 +0,0 @@
-"""Filetype information.
-"""
-
-from typing import Tuple
-
-from pip._internal.utils.misc import splitext
-
-WHEEL_EXTENSION = ".whl"
-BZ2_EXTENSIONS = (".tar.bz2", ".tbz") # type: Tuple[str, ...]
-XZ_EXTENSIONS = (
- ".tar.xz",
- ".txz",
- ".tlz",
- ".tar.lz",
- ".tar.lzma",
-) # type: Tuple[str, ...]
-ZIP_EXTENSIONS = (".zip", WHEEL_EXTENSION) # type: Tuple[str, ...]
-TAR_EXTENSIONS = (".tar.gz", ".tgz", ".tar") # type: Tuple[str, ...]
-ARCHIVE_EXTENSIONS = ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS
-
-
-def is_archive_file(name):
- # type: (str) -> bool
- """Return True if `name` is a considered as an archive file."""
- ext = splitext(name)[1].lower()
- if ext in ARCHIVE_EXTENSIONS:
- return True
- return False
diff --git a/venv/Lib/site-packages/pip/_internal/utils/glibc.py b/venv/Lib/site-packages/pip/_internal/utils/glibc.py
deleted file mode 100644
index 1c9ff35..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/glibc.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-import os
-import sys
-from typing import Optional, Tuple
-
-
-def glibc_version_string():
- # type: () -> Optional[str]
- "Returns glibc version string, or None if not using glibc."
- return glibc_version_string_confstr() or glibc_version_string_ctypes()
-
-
-def glibc_version_string_confstr():
- # type: () -> Optional[str]
- "Primary implementation of glibc_version_string using os.confstr."
- # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely
- # to be broken or missing. This strategy is used in the standard library
- # platform module:
- # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183
- if sys.platform == "win32":
- return None
- try:
- # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17":
- _, version = os.confstr("CS_GNU_LIBC_VERSION").split()
- except (AttributeError, OSError, ValueError):
- # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)...
- return None
- return version
-
-
-def glibc_version_string_ctypes():
- # type: () -> Optional[str]
- "Fallback implementation of glibc_version_string using ctypes."
-
- try:
- import ctypes
- except ImportError:
- return None
-
- # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
- # manpage says, "If filename is NULL, then the returned handle is for the
- # main program". This way we can let the linker do the work to figure out
- # which libc our process is actually using.
- process_namespace = ctypes.CDLL(None)
- try:
- gnu_get_libc_version = process_namespace.gnu_get_libc_version
- except AttributeError:
- # Symbol doesn't exist -> therefore, we are not linked to
- # glibc.
- return None
-
- # Call gnu_get_libc_version, which returns a string like "2.5"
- gnu_get_libc_version.restype = ctypes.c_char_p
- version_str = gnu_get_libc_version()
- # py2 / py3 compatibility:
- if not isinstance(version_str, str):
- version_str = version_str.decode("ascii")
-
- return version_str
-
-
-# platform.libc_ver regularly returns completely nonsensical glibc
-# versions. E.g. on my computer, platform says:
-#
-# ~$ python2.7 -c 'import platform; print(platform.libc_ver())'
-# ('glibc', '2.7')
-# ~$ python3.5 -c 'import platform; print(platform.libc_ver())'
-# ('glibc', '2.9')
-#
-# But the truth is:
-#
-# ~$ ldd --version
-# ldd (Debian GLIBC 2.22-11) 2.22
-#
-# This is unfortunate, because it means that the linehaul data on libc
-# versions that was generated by pip 8.1.2 and earlier is useless and
-# misleading. Solution: instead of using platform, use our code that actually
-# works.
-def libc_ver():
- # type: () -> Tuple[str, str]
- """Try to determine the glibc version
-
- Returns a tuple of strings (lib, version) which default to empty strings
- in case the lookup fails.
- """
- glibc_version = glibc_version_string()
- if glibc_version is None:
- return ("", "")
- else:
- return ("glibc", glibc_version)
diff --git a/venv/Lib/site-packages/pip/_internal/utils/hashes.py b/venv/Lib/site-packages/pip/_internal/utils/hashes.py
deleted file mode 100644
index 3d20b8d..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/hashes.py
+++ /dev/null
@@ -1,165 +0,0 @@
-import hashlib
-from typing import TYPE_CHECKING, BinaryIO, Dict, Iterator, List
-
-from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError
-from pip._internal.utils.misc import read_chunks
-
-if TYPE_CHECKING:
- from hashlib import _Hash
-
- # NoReturn introduced in 3.6.2; imported only for type checking to maintain
- # pip compatibility with older patch versions of Python 3.6
- from typing import NoReturn
-
-
-# The recommended hash algo of the moment. Change this whenever the state of
-# the art changes; it won't hurt backward compatibility.
-FAVORITE_HASH = "sha256"
-
-
-# Names of hashlib algorithms allowed by the --hash option and ``pip hash``
-# Currently, those are the ones at least as collision-resistant as sha256.
-STRONG_HASHES = ["sha256", "sha384", "sha512"]
-
-
-class Hashes:
- """A wrapper that builds multiple hashes at once and checks them against
- known-good values
-
- """
-
- def __init__(self, hashes=None):
- # type: (Dict[str, List[str]]) -> None
- """
- :param hashes: A dict of algorithm names pointing to lists of allowed
- hex digests
- """
- allowed = {}
- if hashes is not None:
- for alg, keys in hashes.items():
- # Make sure values are always sorted (to ease equality checks)
- allowed[alg] = sorted(keys)
- self._allowed = allowed
-
- def __and__(self, other):
- # type: (Hashes) -> Hashes
- if not isinstance(other, Hashes):
- return NotImplemented
-
- # If either of the Hashes object is entirely empty (i.e. no hash
- # specified at all), all hashes from the other object are allowed.
- if not other:
- return self
- if not self:
- return other
-
- # Otherwise only hashes that present in both objects are allowed.
- new = {}
- for alg, values in other._allowed.items():
- if alg not in self._allowed:
- continue
- new[alg] = [v for v in values if v in self._allowed[alg]]
- return Hashes(new)
-
- @property
- def digest_count(self):
- # type: () -> int
- return sum(len(digests) for digests in self._allowed.values())
-
- def is_hash_allowed(
- self,
- hash_name, # type: str
- hex_digest, # type: str
- ):
- # type: (...) -> bool
- """Return whether the given hex digest is allowed."""
- return hex_digest in self._allowed.get(hash_name, [])
-
- def check_against_chunks(self, chunks):
- # type: (Iterator[bytes]) -> None
- """Check good hashes against ones built from iterable of chunks of
- data.
-
- Raise HashMismatch if none match.
-
- """
- gots = {}
- for hash_name in self._allowed.keys():
- try:
- gots[hash_name] = hashlib.new(hash_name)
- except (ValueError, TypeError):
- raise InstallationError(f"Unknown hash name: {hash_name}")
-
- for chunk in chunks:
- for hash in gots.values():
- hash.update(chunk)
-
- for hash_name, got in gots.items():
- if got.hexdigest() in self._allowed[hash_name]:
- return
- self._raise(gots)
-
- def _raise(self, gots):
- # type: (Dict[str, _Hash]) -> NoReturn
- raise HashMismatch(self._allowed, gots)
-
- def check_against_file(self, file):
- # type: (BinaryIO) -> None
- """Check good hashes against a file-like object
-
- Raise HashMismatch if none match.
-
- """
- return self.check_against_chunks(read_chunks(file))
-
- def check_against_path(self, path):
- # type: (str) -> None
- with open(path, "rb") as file:
- return self.check_against_file(file)
-
- def __nonzero__(self):
- # type: () -> bool
- """Return whether I know any known-good hashes."""
- return bool(self._allowed)
-
- def __bool__(self):
- # type: () -> bool
- return self.__nonzero__()
-
- def __eq__(self, other):
- # type: (object) -> bool
- if not isinstance(other, Hashes):
- return NotImplemented
- return self._allowed == other._allowed
-
- def __hash__(self):
- # type: () -> int
- return hash(
- ",".join(
- sorted(
- ":".join((alg, digest))
- for alg, digest_list in self._allowed.items()
- for digest in digest_list
- )
- )
- )
-
-
-class MissingHashes(Hashes):
- """A workalike for Hashes used when we're missing a hash for a requirement
-
- It computes the actual hash of the requirement and raises a HashMissing
- exception showing it to the user.
-
- """
-
- def __init__(self):
- # type: () -> None
- """Don't offer the ``hashes`` kwarg."""
- # Pass our favorite hash in to generate a "gotten hash". With the
- # empty list, it will never match, so an error will always raise.
- super().__init__(hashes={FAVORITE_HASH: []})
-
- def _raise(self, gots):
- # type: (Dict[str, _Hash]) -> NoReturn
- raise HashMissing(gots[FAVORITE_HASH].hexdigest())
diff --git a/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py b/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py
deleted file mode 100644
index b6863d9..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py
+++ /dev/null
@@ -1,36 +0,0 @@
-"""A helper module that injects SecureTransport, on import.
-
-The import should be done as early as possible, to ensure all requests and
-sessions (or whatever) are created after injecting SecureTransport.
-
-Note that we only do the injection on macOS, when the linked OpenSSL is too
-old to handle TLSv1.2.
-"""
-
-import sys
-
-
-def inject_securetransport():
- # type: () -> None
- # Only relevant on macOS
- if sys.platform != "darwin":
- return
-
- try:
- import ssl
- except ImportError:
- return
-
- # Checks for OpenSSL 1.0.1
- if ssl.OPENSSL_VERSION_NUMBER >= 0x1000100F:
- return
-
- try:
- from pip._vendor.urllib3.contrib import securetransport
- except (ImportError, OSError):
- return
-
- securetransport.inject_into_urllib3()
-
-
-inject_securetransport()
diff --git a/venv/Lib/site-packages/pip/_internal/utils/logging.py b/venv/Lib/site-packages/pip/_internal/utils/logging.py
deleted file mode 100644
index 45798d5..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/logging.py
+++ /dev/null
@@ -1,387 +0,0 @@
-import contextlib
-import errno
-import logging
-import logging.handlers
-import os
-import sys
-from logging import Filter, getLogger
-from typing import IO, Any, Callable, Iterator, Optional, TextIO, Type, cast
-
-from pip._internal.utils.compat import WINDOWS
-from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX
-from pip._internal.utils.misc import ensure_dir
-
-try:
- import threading
-except ImportError:
- import dummy_threading as threading # type: ignore
-
-
-try:
- from pip._vendor import colorama
-# Lots of different errors can come from this, including SystemError and
-# ImportError.
-except Exception:
- colorama = None
-
-
-_log_state = threading.local()
-subprocess_logger = getLogger("pip.subprocessor")
-
-
-class BrokenStdoutLoggingError(Exception):
- """
- Raised if BrokenPipeError occurs for the stdout stream while logging.
- """
-
- pass
-
-
-# BrokenPipeError manifests differently in Windows and non-Windows.
-if WINDOWS:
- # In Windows, a broken pipe can show up as EINVAL rather than EPIPE:
- # https://bugs.python.org/issue19612
- # https://bugs.python.org/issue30418
- def _is_broken_pipe_error(exc_class, exc):
- # type: (Type[BaseException], BaseException) -> bool
- """See the docstring for non-Windows below."""
- return (exc_class is BrokenPipeError) or (
- isinstance(exc, OSError) and exc.errno in (errno.EINVAL, errno.EPIPE)
- )
-
-
-else:
- # Then we are in the non-Windows case.
- def _is_broken_pipe_error(exc_class, exc):
- # type: (Type[BaseException], BaseException) -> bool
- """
- Return whether an exception is a broken pipe error.
-
- Args:
- exc_class: an exception class.
- exc: an exception instance.
- """
- return exc_class is BrokenPipeError
-
-
-@contextlib.contextmanager
-def indent_log(num=2):
- # type: (int) -> Iterator[None]
- """
- A context manager which will cause the log output to be indented for any
- log messages emitted inside it.
- """
- # For thread-safety
- _log_state.indentation = get_indentation()
- _log_state.indentation += num
- try:
- yield
- finally:
- _log_state.indentation -= num
-
-
-def get_indentation():
- # type: () -> int
- return getattr(_log_state, "indentation", 0)
-
-
-class IndentingFormatter(logging.Formatter):
- default_time_format = "%Y-%m-%dT%H:%M:%S"
-
- def __init__(
- self,
- *args, # type: Any
- add_timestamp=False, # type: bool
- **kwargs, # type: Any
- ):
- # type: (...) -> None
- """
- A logging.Formatter that obeys the indent_log() context manager.
-
- :param add_timestamp: A bool indicating output lines should be prefixed
- with their record's timestamp.
- """
- self.add_timestamp = add_timestamp
- super().__init__(*args, **kwargs)
-
- def get_message_start(self, formatted, levelno):
- # type: (str, int) -> str
- """
- Return the start of the formatted log message (not counting the
- prefix to add to each line).
- """
- if levelno < logging.WARNING:
- return ""
- if formatted.startswith(DEPRECATION_MSG_PREFIX):
- # Then the message already has a prefix. We don't want it to
- # look like "WARNING: DEPRECATION: ...."
- return ""
- if levelno < logging.ERROR:
- return "WARNING: "
-
- return "ERROR: "
-
- def format(self, record):
- # type: (logging.LogRecord) -> str
- """
- Calls the standard formatter, but will indent all of the log message
- lines by our current indentation level.
- """
- formatted = super().format(record)
- message_start = self.get_message_start(formatted, record.levelno)
- formatted = message_start + formatted
-
- prefix = ""
- if self.add_timestamp:
- prefix = f"{self.formatTime(record)} "
- prefix += " " * get_indentation()
- formatted = "".join([prefix + line for line in formatted.splitlines(True)])
- return formatted
-
-
-def _color_wrap(*colors):
- # type: (*str) -> Callable[[str], str]
- def wrapped(inp):
- # type: (str) -> str
- return "".join(list(colors) + [inp, colorama.Style.RESET_ALL])
-
- return wrapped
-
-
-class ColorizedStreamHandler(logging.StreamHandler):
-
- # Don't build up a list of colors if we don't have colorama
- if colorama:
- COLORS = [
- # This needs to be in order from highest logging level to lowest.
- (logging.ERROR, _color_wrap(colorama.Fore.RED)),
- (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)),
- ]
- else:
- COLORS = []
-
- def __init__(self, stream=None, no_color=None):
- # type: (Optional[TextIO], bool) -> None
- super().__init__(stream)
- self._no_color = no_color
-
- if WINDOWS and colorama:
- self.stream = colorama.AnsiToWin32(self.stream)
-
- def _using_stdout(self):
- # type: () -> bool
- """
- Return whether the handler is using sys.stdout.
- """
- if WINDOWS and colorama:
- # Then self.stream is an AnsiToWin32 object.
- stream = cast(colorama.AnsiToWin32, self.stream)
- return stream.wrapped is sys.stdout
-
- return self.stream is sys.stdout
-
- def should_color(self):
- # type: () -> bool
- # Don't colorize things if we do not have colorama or if told not to
- if not colorama or self._no_color:
- return False
-
- real_stream = (
- self.stream
- if not isinstance(self.stream, colorama.AnsiToWin32)
- else self.stream.wrapped
- )
-
- # If the stream is a tty we should color it
- if hasattr(real_stream, "isatty") and real_stream.isatty():
- return True
-
- # If we have an ANSI term we should color it
- if os.environ.get("TERM") == "ANSI":
- return True
-
- # If anything else we should not color it
- return False
-
- def format(self, record):
- # type: (logging.LogRecord) -> str
- msg = super().format(record)
-
- if self.should_color():
- for level, color in self.COLORS:
- if record.levelno >= level:
- msg = color(msg)
- break
-
- return msg
-
- # The logging module says handleError() can be customized.
- def handleError(self, record):
- # type: (logging.LogRecord) -> None
- exc_class, exc = sys.exc_info()[:2]
- # If a broken pipe occurred while calling write() or flush() on the
- # stdout stream in logging's Handler.emit(), then raise our special
- # exception so we can handle it in main() instead of logging the
- # broken pipe error and continuing.
- if (
- exc_class
- and exc
- and self._using_stdout()
- and _is_broken_pipe_error(exc_class, exc)
- ):
- raise BrokenStdoutLoggingError()
-
- return super().handleError(record)
-
-
-class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler):
- def _open(self):
- # type: () -> IO[Any]
- ensure_dir(os.path.dirname(self.baseFilename))
- return super()._open()
-
-
-class MaxLevelFilter(Filter):
- def __init__(self, level):
- # type: (int) -> None
- self.level = level
-
- def filter(self, record):
- # type: (logging.LogRecord) -> bool
- return record.levelno < self.level
-
-
-class ExcludeLoggerFilter(Filter):
-
- """
- A logging Filter that excludes records from a logger (or its children).
- """
-
- def filter(self, record):
- # type: (logging.LogRecord) -> bool
- # The base Filter class allows only records from a logger (or its
- # children).
- return not super().filter(record)
-
-
-def setup_logging(verbosity, no_color, user_log_file):
- # type: (int, bool, Optional[str]) -> int
- """Configures and sets up all of the logging
-
- Returns the requested logging level, as its integer value.
- """
-
- # Determine the level to be logging at.
- if verbosity >= 1:
- level = "DEBUG"
- elif verbosity == -1:
- level = "WARNING"
- elif verbosity == -2:
- level = "ERROR"
- elif verbosity <= -3:
- level = "CRITICAL"
- else:
- level = "INFO"
-
- level_number = getattr(logging, level)
-
- # The "root" logger should match the "console" level *unless* we also need
- # to log to a user log file.
- include_user_log = user_log_file is not None
- if include_user_log:
- additional_log_file = user_log_file
- root_level = "DEBUG"
- else:
- additional_log_file = "/dev/null"
- root_level = level
-
- # Disable any logging besides WARNING unless we have DEBUG level logging
- # enabled for vendored libraries.
- vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG"
-
- # Shorthands for clarity
- log_streams = {
- "stdout": "ext://sys.stdout",
- "stderr": "ext://sys.stderr",
- }
- handler_classes = {
- "stream": "pip._internal.utils.logging.ColorizedStreamHandler",
- "file": "pip._internal.utils.logging.BetterRotatingFileHandler",
- }
- handlers = ["console", "console_errors", "console_subprocess"] + (
- ["user_log"] if include_user_log else []
- )
-
- logging.config.dictConfig(
- {
- "version": 1,
- "disable_existing_loggers": False,
- "filters": {
- "exclude_warnings": {
- "()": "pip._internal.utils.logging.MaxLevelFilter",
- "level": logging.WARNING,
- },
- "restrict_to_subprocess": {
- "()": "logging.Filter",
- "name": subprocess_logger.name,
- },
- "exclude_subprocess": {
- "()": "pip._internal.utils.logging.ExcludeLoggerFilter",
- "name": subprocess_logger.name,
- },
- },
- "formatters": {
- "indent": {
- "()": IndentingFormatter,
- "format": "%(message)s",
- },
- "indent_with_timestamp": {
- "()": IndentingFormatter,
- "format": "%(message)s",
- "add_timestamp": True,
- },
- },
- "handlers": {
- "console": {
- "level": level,
- "class": handler_classes["stream"],
- "no_color": no_color,
- "stream": log_streams["stdout"],
- "filters": ["exclude_subprocess", "exclude_warnings"],
- "formatter": "indent",
- },
- "console_errors": {
- "level": "WARNING",
- "class": handler_classes["stream"],
- "no_color": no_color,
- "stream": log_streams["stderr"],
- "filters": ["exclude_subprocess"],
- "formatter": "indent",
- },
- # A handler responsible for logging to the console messages
- # from the "subprocessor" logger.
- "console_subprocess": {
- "level": level,
- "class": handler_classes["stream"],
- "no_color": no_color,
- "stream": log_streams["stderr"],
- "filters": ["restrict_to_subprocess"],
- "formatter": "indent",
- },
- "user_log": {
- "level": "DEBUG",
- "class": handler_classes["file"],
- "filename": additional_log_file,
- "delay": True,
- "formatter": "indent_with_timestamp",
- },
- },
- "root": {
- "level": root_level,
- "handlers": handlers,
- },
- "loggers": {"pip._vendor": {"level": vendored_log_level}},
- }
- )
-
- return level_number
diff --git a/venv/Lib/site-packages/pip/_internal/utils/misc.py b/venv/Lib/site-packages/pip/_internal/utils/misc.py
deleted file mode 100644
index a4ad35b..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/misc.py
+++ /dev/null
@@ -1,821 +0,0 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-import contextlib
-import errno
-import getpass
-import hashlib
-import io
-import logging
-import os
-import posixpath
-import shutil
-import stat
-import sys
-import urllib.parse
-from io import StringIO
-from itertools import filterfalse, tee, zip_longest
-from types import TracebackType
-from typing import (
- Any,
- AnyStr,
- BinaryIO,
- Callable,
- Container,
- ContextManager,
- Iterable,
- Iterator,
- List,
- Optional,
- TextIO,
- Tuple,
- Type,
- TypeVar,
- cast,
-)
-
-from pip._vendor.pkg_resources import Distribution
-from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed
-
-from pip import __version__
-from pip._internal.exceptions import CommandError
-from pip._internal.locations import get_major_minor_version, site_packages, user_site
-from pip._internal.utils.compat import WINDOWS, stdlib_pkgs
-from pip._internal.utils.virtualenv import (
- running_under_virtualenv,
- virtualenv_no_global,
-)
-
-__all__ = [
- "rmtree",
- "display_path",
- "backup_dir",
- "ask",
- "splitext",
- "format_size",
- "is_installable_dir",
- "normalize_path",
- "renames",
- "get_prog",
- "captured_stdout",
- "ensure_dir",
- "remove_auth_from_url",
-]
-
-
-logger = logging.getLogger(__name__)
-
-T = TypeVar("T")
-ExcInfo = Tuple[Type[BaseException], BaseException, TracebackType]
-VersionInfo = Tuple[int, int, int]
-NetlocTuple = Tuple[str, Tuple[Optional[str], Optional[str]]]
-
-
-def get_pip_version():
- # type: () -> str
- pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..")
- pip_pkg_dir = os.path.abspath(pip_pkg_dir)
-
- return "pip {} from {} (python {})".format(
- __version__,
- pip_pkg_dir,
- get_major_minor_version(),
- )
-
-
-def normalize_version_info(py_version_info):
- # type: (Tuple[int, ...]) -> Tuple[int, int, int]
- """
- Convert a tuple of ints representing a Python version to one of length
- three.
-
- :param py_version_info: a tuple of ints representing a Python version,
- or None to specify no version. The tuple can have any length.
-
- :return: a tuple of length three if `py_version_info` is non-None.
- Otherwise, return `py_version_info` unchanged (i.e. None).
- """
- if len(py_version_info) < 3:
- py_version_info += (3 - len(py_version_info)) * (0,)
- elif len(py_version_info) > 3:
- py_version_info = py_version_info[:3]
-
- return cast("VersionInfo", py_version_info)
-
-
-def ensure_dir(path):
- # type: (AnyStr) -> None
- """os.path.makedirs without EEXIST."""
- try:
- os.makedirs(path)
- except OSError as e:
- # Windows can raise spurious ENOTEMPTY errors. See #6426.
- if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY:
- raise
-
-
-def get_prog():
- # type: () -> str
- try:
- prog = os.path.basename(sys.argv[0])
- if prog in ("__main__.py", "-c"):
- return f"{sys.executable} -m pip"
- else:
- return prog
- except (AttributeError, TypeError, IndexError):
- pass
- return "pip"
-
-
-# Retry every half second for up to 3 seconds
-# Tenacity raises RetryError by default, explictly raise the original exception
-@retry(reraise=True, stop=stop_after_delay(3), wait=wait_fixed(0.5))
-def rmtree(dir, ignore_errors=False):
- # type: (AnyStr, bool) -> None
- shutil.rmtree(dir, ignore_errors=ignore_errors, onerror=rmtree_errorhandler)
-
-
-def rmtree_errorhandler(func, path, exc_info):
- # type: (Callable[..., Any], str, ExcInfo) -> None
- """On Windows, the files in .svn are read-only, so when rmtree() tries to
- remove them, an exception is thrown. We catch that here, remove the
- read-only attribute, and hopefully continue without problems."""
- try:
- has_attr_readonly = not (os.stat(path).st_mode & stat.S_IWRITE)
- except OSError:
- # it's equivalent to os.path.exists
- return
-
- if has_attr_readonly:
- # convert to read/write
- os.chmod(path, stat.S_IWRITE)
- # use the original function to repeat the operation
- func(path)
- return
- else:
- raise
-
-
-def display_path(path):
- # type: (str) -> str
- """Gives the display value for a given path, making it relative to cwd
- if possible."""
- path = os.path.normcase(os.path.abspath(path))
- if path.startswith(os.getcwd() + os.path.sep):
- path = "." + path[len(os.getcwd()) :]
- return path
-
-
-def backup_dir(dir, ext=".bak"):
- # type: (str, str) -> str
- """Figure out the name of a directory to back up the given dir to
- (adding .bak, .bak2, etc)"""
- n = 1
- extension = ext
- while os.path.exists(dir + extension):
- n += 1
- extension = ext + str(n)
- return dir + extension
-
-
-def ask_path_exists(message, options):
- # type: (str, Iterable[str]) -> str
- for action in os.environ.get("PIP_EXISTS_ACTION", "").split():
- if action in options:
- return action
- return ask(message, options)
-
-
-def _check_no_input(message):
- # type: (str) -> None
- """Raise an error if no input is allowed."""
- if os.environ.get("PIP_NO_INPUT"):
- raise Exception(
- f"No input was expected ($PIP_NO_INPUT set); question: {message}"
- )
-
-
-def ask(message, options):
- # type: (str, Iterable[str]) -> str
- """Ask the message interactively, with the given possible responses"""
- while 1:
- _check_no_input(message)
- response = input(message)
- response = response.strip().lower()
- if response not in options:
- print(
- "Your response ({!r}) was not one of the expected responses: "
- "{}".format(response, ", ".join(options))
- )
- else:
- return response
-
-
-def ask_input(message):
- # type: (str) -> str
- """Ask for input interactively."""
- _check_no_input(message)
- return input(message)
-
-
-def ask_password(message):
- # type: (str) -> str
- """Ask for a password interactively."""
- _check_no_input(message)
- return getpass.getpass(message)
-
-
-def strtobool(val):
- # type: (str) -> int
- """Convert a string representation of truth to true (1) or false (0).
-
- True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
- are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if
- 'val' is anything else.
- """
- val = val.lower()
- if val in ("y", "yes", "t", "true", "on", "1"):
- return 1
- elif val in ("n", "no", "f", "false", "off", "0"):
- return 0
- else:
- raise ValueError(f"invalid truth value {val!r}")
-
-
-def format_size(bytes):
- # type: (float) -> str
- if bytes > 1000 * 1000:
- return "{:.1f} MB".format(bytes / 1000.0 / 1000)
- elif bytes > 10 * 1000:
- return "{} kB".format(int(bytes / 1000))
- elif bytes > 1000:
- return "{:.1f} kB".format(bytes / 1000.0)
- else:
- return "{} bytes".format(int(bytes))
-
-
-def tabulate(rows):
- # type: (Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]]
- """Return a list of formatted rows and a list of column sizes.
-
- For example::
-
- >>> tabulate([['foobar', 2000], [0xdeadbeef]])
- (['foobar 2000', '3735928559'], [10, 4])
- """
- rows = [tuple(map(str, row)) for row in rows]
- sizes = [max(map(len, col)) for col in zip_longest(*rows, fillvalue="")]
- table = [" ".join(map(str.ljust, row, sizes)).rstrip() for row in rows]
- return table, sizes
-
-
-def is_installable_dir(path: str) -> bool:
- """Is path is a directory containing pyproject.toml, setup.cfg or setup.py?"""
- if not os.path.isdir(path):
- return False
- return any(
- os.path.isfile(os.path.join(path, signifier))
- for signifier in ("pyproject.toml", "setup.cfg", "setup.py")
- )
-
-
-def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE):
- # type: (BinaryIO, int) -> Iterator[bytes]
- """Yield pieces of data from a file-like object until EOF."""
- while True:
- chunk = file.read(size)
- if not chunk:
- break
- yield chunk
-
-
-def normalize_path(path, resolve_symlinks=True):
- # type: (str, bool) -> str
- """
- Convert a path to its canonical, case-normalized, absolute version.
-
- """
- path = os.path.expanduser(path)
- if resolve_symlinks:
- path = os.path.realpath(path)
- else:
- path = os.path.abspath(path)
- return os.path.normcase(path)
-
-
-def splitext(path):
- # type: (str) -> Tuple[str, str]
- """Like os.path.splitext, but take off .tar too"""
- base, ext = posixpath.splitext(path)
- if base.lower().endswith(".tar"):
- ext = base[-4:] + ext
- base = base[:-4]
- return base, ext
-
-
-def renames(old, new):
- # type: (str, str) -> None
- """Like os.renames(), but handles renaming across devices."""
- # Implementation borrowed from os.renames().
- head, tail = os.path.split(new)
- if head and tail and not os.path.exists(head):
- os.makedirs(head)
-
- shutil.move(old, new)
-
- head, tail = os.path.split(old)
- if head and tail:
- try:
- os.removedirs(head)
- except OSError:
- pass
-
-
-def is_local(path):
- # type: (str) -> bool
- """
- Return True if path is within sys.prefix, if we're running in a virtualenv.
-
- If we're not in a virtualenv, all paths are considered "local."
-
- Caution: this function assumes the head of path has been normalized
- with normalize_path.
- """
- if not running_under_virtualenv():
- return True
- return path.startswith(normalize_path(sys.prefix))
-
-
-def dist_is_local(dist):
- # type: (Distribution) -> bool
- """
- Return True if given Distribution object is installed locally
- (i.e. within current virtualenv).
-
- Always True if we're not in a virtualenv.
-
- """
- return is_local(dist_location(dist))
-
-
-def dist_in_usersite(dist):
- # type: (Distribution) -> bool
- """
- Return True if given Distribution is installed in user site.
- """
- return dist_location(dist).startswith(normalize_path(user_site))
-
-
-def dist_in_site_packages(dist):
- # type: (Distribution) -> bool
- """
- Return True if given Distribution is installed in
- sysconfig.get_python_lib().
- """
- return dist_location(dist).startswith(normalize_path(site_packages))
-
-
-def dist_is_editable(dist):
- # type: (Distribution) -> bool
- """
- Return True if given Distribution is an editable install.
- """
- for path_item in sys.path:
- egg_link = os.path.join(path_item, dist.project_name + ".egg-link")
- if os.path.isfile(egg_link):
- return True
- return False
-
-
-def get_installed_distributions(
- local_only=True, # type: bool
- skip=stdlib_pkgs, # type: Container[str]
- include_editables=True, # type: bool
- editables_only=False, # type: bool
- user_only=False, # type: bool
- paths=None, # type: Optional[List[str]]
-):
- # type: (...) -> List[Distribution]
- """Return a list of installed Distribution objects.
-
- Left for compatibility until direct pkg_resources uses are refactored out.
- """
- from pip._internal.metadata import get_default_environment, get_environment
- from pip._internal.metadata.pkg_resources import Distribution as _Dist
-
- if paths is None:
- env = get_default_environment()
- else:
- env = get_environment(paths)
- dists = env.iter_installed_distributions(
- local_only=local_only,
- skip=skip,
- include_editables=include_editables,
- editables_only=editables_only,
- user_only=user_only,
- )
- return [cast(_Dist, dist)._dist for dist in dists]
-
-
-def get_distribution(req_name):
- # type: (str) -> Optional[Distribution]
- """Given a requirement name, return the installed Distribution object.
-
- This searches from *all* distributions available in the environment, to
- match the behavior of ``pkg_resources.get_distribution()``.
-
- Left for compatibility until direct pkg_resources uses are refactored out.
- """
- from pip._internal.metadata import get_default_environment
- from pip._internal.metadata.pkg_resources import Distribution as _Dist
-
- dist = get_default_environment().get_distribution(req_name)
- if dist is None:
- return None
- return cast(_Dist, dist)._dist
-
-
-def egg_link_path(dist):
- # type: (Distribution) -> Optional[str]
- """
- Return the path for the .egg-link file if it exists, otherwise, None.
-
- There's 3 scenarios:
- 1) not in a virtualenv
- try to find in site.USER_SITE, then site_packages
- 2) in a no-global virtualenv
- try to find in site_packages
- 3) in a yes-global virtualenv
- try to find in site_packages, then site.USER_SITE
- (don't look in global location)
-
- For #1 and #3, there could be odd cases, where there's an egg-link in 2
- locations.
-
- This method will just return the first one found.
- """
- sites = []
- if running_under_virtualenv():
- sites.append(site_packages)
- if not virtualenv_no_global() and user_site:
- sites.append(user_site)
- else:
- if user_site:
- sites.append(user_site)
- sites.append(site_packages)
-
- for site in sites:
- egglink = os.path.join(site, dist.project_name) + ".egg-link"
- if os.path.isfile(egglink):
- return egglink
- return None
-
-
-def dist_location(dist):
- # type: (Distribution) -> str
- """
- Get the site-packages location of this distribution. Generally
- this is dist.location, except in the case of develop-installed
- packages, where dist.location is the source code location, and we
- want to know where the egg-link file is.
-
- The returned location is normalized (in particular, with symlinks removed).
- """
- egg_link = egg_link_path(dist)
- if egg_link:
- return normalize_path(egg_link)
- return normalize_path(dist.location)
-
-
-def write_output(msg, *args):
- # type: (Any, Any) -> None
- logger.info(msg, *args)
-
-
-class StreamWrapper(StringIO):
- orig_stream = None # type: TextIO
-
- @classmethod
- def from_stream(cls, orig_stream):
- # type: (TextIO) -> StreamWrapper
- cls.orig_stream = orig_stream
- return cls()
-
- # compileall.compile_dir() needs stdout.encoding to print to stdout
- # https://github.com/python/mypy/issues/4125
- @property
- def encoding(self): # type: ignore
- return self.orig_stream.encoding
-
-
-@contextlib.contextmanager
-def captured_output(stream_name):
- # type: (str) -> Iterator[StreamWrapper]
- """Return a context manager used by captured_stdout/stdin/stderr
- that temporarily replaces the sys stream *stream_name* with a StringIO.
-
- Taken from Lib/support/__init__.py in the CPython repo.
- """
- orig_stdout = getattr(sys, stream_name)
- setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout))
- try:
- yield getattr(sys, stream_name)
- finally:
- setattr(sys, stream_name, orig_stdout)
-
-
-def captured_stdout():
- # type: () -> ContextManager[StreamWrapper]
- """Capture the output of sys.stdout:
-
- with captured_stdout() as stdout:
- print('hello')
- self.assertEqual(stdout.getvalue(), 'hello\n')
-
- Taken from Lib/support/__init__.py in the CPython repo.
- """
- return captured_output("stdout")
-
-
-def captured_stderr():
- # type: () -> ContextManager[StreamWrapper]
- """
- See captured_stdout().
- """
- return captured_output("stderr")
-
-
-# Simulates an enum
-def enum(*sequential, **named):
- # type: (*Any, **Any) -> Type[Any]
- enums = dict(zip(sequential, range(len(sequential))), **named)
- reverse = {value: key for key, value in enums.items()}
- enums["reverse_mapping"] = reverse
- return type("Enum", (), enums)
-
-
-def build_netloc(host, port):
- # type: (str, Optional[int]) -> str
- """
- Build a netloc from a host-port pair
- """
- if port is None:
- return host
- if ":" in host:
- # Only wrap host with square brackets when it is IPv6
- host = f"[{host}]"
- return f"{host}:{port}"
-
-
-def build_url_from_netloc(netloc, scheme="https"):
- # type: (str, str) -> str
- """
- Build a full URL from a netloc.
- """
- if netloc.count(":") >= 2 and "@" not in netloc and "[" not in netloc:
- # It must be a bare IPv6 address, so wrap it with brackets.
- netloc = f"[{netloc}]"
- return f"{scheme}://{netloc}"
-
-
-def parse_netloc(netloc):
- # type: (str) -> Tuple[str, Optional[int]]
- """
- Return the host-port pair from a netloc.
- """
- url = build_url_from_netloc(netloc)
- parsed = urllib.parse.urlparse(url)
- return parsed.hostname, parsed.port
-
-
-def split_auth_from_netloc(netloc):
- # type: (str) -> NetlocTuple
- """
- Parse out and remove the auth information from a netloc.
-
- Returns: (netloc, (username, password)).
- """
- if "@" not in netloc:
- return netloc, (None, None)
-
- # Split from the right because that's how urllib.parse.urlsplit()
- # behaves if more than one @ is present (which can be checked using
- # the password attribute of urlsplit()'s return value).
- auth, netloc = netloc.rsplit("@", 1)
- pw = None # type: Optional[str]
- if ":" in auth:
- # Split from the left because that's how urllib.parse.urlsplit()
- # behaves if more than one : is present (which again can be checked
- # using the password attribute of the return value)
- user, pw = auth.split(":", 1)
- else:
- user, pw = auth, None
-
- user = urllib.parse.unquote(user)
- if pw is not None:
- pw = urllib.parse.unquote(pw)
-
- return netloc, (user, pw)
-
-
-def redact_netloc(netloc):
- # type: (str) -> str
- """
- Replace the sensitive data in a netloc with "****", if it exists.
-
- For example:
- - "user:pass@example.com" returns "user:****@example.com"
- - "accesstoken@example.com" returns "****@example.com"
- """
- netloc, (user, password) = split_auth_from_netloc(netloc)
- if user is None:
- return netloc
- if password is None:
- user = "****"
- password = ""
- else:
- user = urllib.parse.quote(user)
- password = ":****"
- return "{user}{password}@{netloc}".format(
- user=user, password=password, netloc=netloc
- )
-
-
-def _transform_url(url, transform_netloc):
- # type: (str, Callable[[str], Tuple[Any, ...]]) -> Tuple[str, NetlocTuple]
- """Transform and replace netloc in a url.
-
- transform_netloc is a function taking the netloc and returning a
- tuple. The first element of this tuple is the new netloc. The
- entire tuple is returned.
-
- Returns a tuple containing the transformed url as item 0 and the
- original tuple returned by transform_netloc as item 1.
- """
- purl = urllib.parse.urlsplit(url)
- netloc_tuple = transform_netloc(purl.netloc)
- # stripped url
- url_pieces = (purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment)
- surl = urllib.parse.urlunsplit(url_pieces)
- return surl, cast("NetlocTuple", netloc_tuple)
-
-
-def _get_netloc(netloc):
- # type: (str) -> NetlocTuple
- return split_auth_from_netloc(netloc)
-
-
-def _redact_netloc(netloc):
- # type: (str) -> Tuple[str,]
- return (redact_netloc(netloc),)
-
-
-def split_auth_netloc_from_url(url):
- # type: (str) -> Tuple[str, str, Tuple[str, str]]
- """
- Parse a url into separate netloc, auth, and url with no auth.
-
- Returns: (url_without_auth, netloc, (username, password))
- """
- url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc)
- return url_without_auth, netloc, auth
-
-
-def remove_auth_from_url(url):
- # type: (str) -> str
- """Return a copy of url with 'username:password@' removed."""
- # username/pass params are passed to subversion through flags
- # and are not recognized in the url.
- return _transform_url(url, _get_netloc)[0]
-
-
-def redact_auth_from_url(url):
- # type: (str) -> str
- """Replace the password in a given url with ****."""
- return _transform_url(url, _redact_netloc)[0]
-
-
-class HiddenText:
- def __init__(
- self,
- secret, # type: str
- redacted, # type: str
- ):
- # type: (...) -> None
- self.secret = secret
- self.redacted = redacted
-
- def __repr__(self):
- # type: (...) -> str
- return "".format(str(self))
-
- def __str__(self):
- # type: (...) -> str
- return self.redacted
-
- # This is useful for testing.
- def __eq__(self, other):
- # type: (Any) -> bool
- if type(self) != type(other):
- return False
-
- # The string being used for redaction doesn't also have to match,
- # just the raw, original string.
- return self.secret == other.secret
-
-
-def hide_value(value):
- # type: (str) -> HiddenText
- return HiddenText(value, redacted="****")
-
-
-def hide_url(url):
- # type: (str) -> HiddenText
- redacted = redact_auth_from_url(url)
- return HiddenText(url, redacted=redacted)
-
-
-def protect_pip_from_modification_on_windows(modifying_pip):
- # type: (bool) -> None
- """Protection of pip.exe from modification on Windows
-
- On Windows, any operation modifying pip should be run as:
- python -m pip ...
- """
- pip_names = [
- "pip.exe",
- "pip{}.exe".format(sys.version_info[0]),
- "pip{}.{}.exe".format(*sys.version_info[:2]),
- ]
-
- # See https://github.com/pypa/pip/issues/1299 for more discussion
- should_show_use_python_msg = (
- modifying_pip and WINDOWS and os.path.basename(sys.argv[0]) in pip_names
- )
-
- if should_show_use_python_msg:
- new_command = [sys.executable, "-m", "pip"] + sys.argv[1:]
- raise CommandError(
- "To modify pip, please run the following command:\n{}".format(
- " ".join(new_command)
- )
- )
-
-
-def is_console_interactive():
- # type: () -> bool
- """Is this console interactive?"""
- return sys.stdin is not None and sys.stdin.isatty()
-
-
-def hash_file(path, blocksize=1 << 20):
- # type: (str, int) -> Tuple[Any, int]
- """Return (hash, length) for path using hashlib.sha256()"""
-
- h = hashlib.sha256()
- length = 0
- with open(path, "rb") as f:
- for block in read_chunks(f, size=blocksize):
- length += len(block)
- h.update(block)
- return h, length
-
-
-def is_wheel_installed():
- # type: () -> bool
- """
- Return whether the wheel package is installed.
- """
- try:
- import wheel # noqa: F401
- except ImportError:
- return False
-
- return True
-
-
-def pairwise(iterable):
- # type: (Iterable[Any]) -> Iterator[Tuple[Any, Any]]
- """
- Return paired elements.
-
- For example:
- s -> (s0, s1), (s2, s3), (s4, s5), ...
- """
- iterable = iter(iterable)
- return zip_longest(iterable, iterable)
-
-
-def partition(
- pred, # type: Callable[[T], bool]
- iterable, # type: Iterable[T]
-):
- # type: (...) -> Tuple[Iterable[T], Iterable[T]]
- """
- Use a predicate to partition entries into false entries and true entries,
- like
-
- partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9
- """
- t1, t2 = tee(iterable)
- return filterfalse(pred, t1), filter(pred, t2)
diff --git a/venv/Lib/site-packages/pip/_internal/utils/models.py b/venv/Lib/site-packages/pip/_internal/utils/models.py
deleted file mode 100644
index 0e02bc7..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/models.py
+++ /dev/null
@@ -1,47 +0,0 @@
-"""Utilities for defining models
-"""
-
-import operator
-from typing import Any, Callable, Type
-
-
-class KeyBasedCompareMixin:
- """Provides comparison capabilities that is based on a key"""
-
- __slots__ = ["_compare_key", "_defining_class"]
-
- def __init__(self, key, defining_class):
- # type: (Any, Type[KeyBasedCompareMixin]) -> None
- self._compare_key = key
- self._defining_class = defining_class
-
- def __hash__(self):
- # type: () -> int
- return hash(self._compare_key)
-
- def __lt__(self, other):
- # type: (Any) -> bool
- return self._compare(other, operator.__lt__)
-
- def __le__(self, other):
- # type: (Any) -> bool
- return self._compare(other, operator.__le__)
-
- def __gt__(self, other):
- # type: (Any) -> bool
- return self._compare(other, operator.__gt__)
-
- def __ge__(self, other):
- # type: (Any) -> bool
- return self._compare(other, operator.__ge__)
-
- def __eq__(self, other):
- # type: (Any) -> bool
- return self._compare(other, operator.__eq__)
-
- def _compare(self, other, method):
- # type: (Any, Callable[[Any, Any], bool]) -> bool
- if not isinstance(other, self._defining_class):
- return NotImplemented
-
- return method(self._compare_key, other._compare_key)
diff --git a/venv/Lib/site-packages/pip/_internal/utils/packaging.py b/venv/Lib/site-packages/pip/_internal/utils/packaging.py
deleted file mode 100644
index 3f9dbd3..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/packaging.py
+++ /dev/null
@@ -1,89 +0,0 @@
-import logging
-from email.message import Message
-from email.parser import FeedParser
-from typing import Optional, Tuple
-
-from pip._vendor import pkg_resources
-from pip._vendor.packaging import specifiers, version
-from pip._vendor.pkg_resources import Distribution
-
-from pip._internal.exceptions import NoneMetadataError
-from pip._internal.utils.misc import display_path
-
-logger = logging.getLogger(__name__)
-
-
-def check_requires_python(requires_python, version_info):
- # type: (Optional[str], Tuple[int, ...]) -> bool
- """
- Check if the given Python version matches a "Requires-Python" specifier.
-
- :param version_info: A 3-tuple of ints representing a Python
- major-minor-micro version to check (e.g. `sys.version_info[:3]`).
-
- :return: `True` if the given Python version satisfies the requirement.
- Otherwise, return `False`.
-
- :raises InvalidSpecifier: If `requires_python` has an invalid format.
- """
- if requires_python is None:
- # The package provides no information
- return True
- requires_python_specifier = specifiers.SpecifierSet(requires_python)
-
- python_version = version.parse(".".join(map(str, version_info)))
- return python_version in requires_python_specifier
-
-
-def get_metadata(dist):
- # type: (Distribution) -> Message
- """
- :raises NoneMetadataError: if the distribution reports `has_metadata()`
- True but `get_metadata()` returns None.
- """
- metadata_name = "METADATA"
- if isinstance(dist, pkg_resources.DistInfoDistribution) and dist.has_metadata(
- metadata_name
- ):
- metadata = dist.get_metadata(metadata_name)
- elif dist.has_metadata("PKG-INFO"):
- metadata_name = "PKG-INFO"
- metadata = dist.get_metadata(metadata_name)
- else:
- logger.warning("No metadata found in %s", display_path(dist.location))
- metadata = ""
-
- if metadata is None:
- raise NoneMetadataError(dist, metadata_name)
-
- feed_parser = FeedParser()
- # The following line errors out if with a "NoneType" TypeError if
- # passed metadata=None.
- feed_parser.feed(metadata)
- return feed_parser.close()
-
-
-def get_requires_python(dist):
- # type: (pkg_resources.Distribution) -> Optional[str]
- """
- Return the "Requires-Python" metadata for a distribution, or None
- if not present.
- """
- pkg_info_dict = get_metadata(dist)
- requires_python = pkg_info_dict.get("Requires-Python")
-
- if requires_python is not None:
- # Convert to a str to satisfy the type checker, since requires_python
- # can be a Header object.
- requires_python = str(requires_python)
-
- return requires_python
-
-
-def get_installer(dist):
- # type: (Distribution) -> str
- if dist.has_metadata("INSTALLER"):
- for line in dist.get_metadata_lines("INSTALLER"):
- if line.strip():
- return line.strip()
- return ""
diff --git a/venv/Lib/site-packages/pip/_internal/utils/parallel.py b/venv/Lib/site-packages/pip/_internal/utils/parallel.py
deleted file mode 100644
index de91dc8..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/parallel.py
+++ /dev/null
@@ -1,101 +0,0 @@
-"""Convenient parallelization of higher order functions.
-
-This module provides two helper functions, with appropriate fallbacks on
-Python 2 and on systems lacking support for synchronization mechanisms:
-
-- map_multiprocess
-- map_multithread
-
-These helpers work like Python 3's map, with two differences:
-
-- They don't guarantee the order of processing of
- the elements of the iterable.
-- The underlying process/thread pools chop the iterable into
- a number of chunks, so that for very long iterables using
- a large value for chunksize can make the job complete much faster
- than using the default value of 1.
-"""
-
-__all__ = ["map_multiprocess", "map_multithread"]
-
-from contextlib import contextmanager
-from multiprocessing import Pool as ProcessPool
-from multiprocessing import pool
-from multiprocessing.dummy import Pool as ThreadPool
-from typing import Callable, Iterable, Iterator, TypeVar, Union
-
-from pip._vendor.requests.adapters import DEFAULT_POOLSIZE
-
-Pool = Union[pool.Pool, pool.ThreadPool]
-S = TypeVar("S")
-T = TypeVar("T")
-
-# On platforms without sem_open, multiprocessing[.dummy] Pool
-# cannot be created.
-try:
- import multiprocessing.synchronize # noqa
-except ImportError:
- LACK_SEM_OPEN = True
-else:
- LACK_SEM_OPEN = False
-
-# Incredibly large timeout to work around bpo-8296 on Python 2.
-TIMEOUT = 2000000
-
-
-@contextmanager
-def closing(pool):
- # type: (Pool) -> Iterator[Pool]
- """Return a context manager making sure the pool closes properly."""
- try:
- yield pool
- finally:
- # For Pool.imap*, close and join are needed
- # for the returned iterator to begin yielding.
- pool.close()
- pool.join()
- pool.terminate()
-
-
-def _map_fallback(func, iterable, chunksize=1):
- # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T]
- """Make an iterator applying func to each element in iterable.
-
- This function is the sequential fallback either on Python 2
- where Pool.imap* doesn't react to KeyboardInterrupt
- or when sem_open is unavailable.
- """
- return map(func, iterable)
-
-
-def _map_multiprocess(func, iterable, chunksize=1):
- # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T]
- """Chop iterable into chunks and submit them to a process pool.
-
- For very long iterables using a large value for chunksize can make
- the job complete much faster than using the default value of 1.
-
- Return an unordered iterator of the results.
- """
- with closing(ProcessPool()) as pool:
- return pool.imap_unordered(func, iterable, chunksize)
-
-
-def _map_multithread(func, iterable, chunksize=1):
- # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T]
- """Chop iterable into chunks and submit them to a thread pool.
-
- For very long iterables using a large value for chunksize can make
- the job complete much faster than using the default value of 1.
-
- Return an unordered iterator of the results.
- """
- with closing(ThreadPool(DEFAULT_POOLSIZE)) as pool:
- return pool.imap_unordered(func, iterable, chunksize)
-
-
-if LACK_SEM_OPEN:
- map_multiprocess = map_multithread = _map_fallback
-else:
- map_multiprocess = _map_multiprocess
- map_multithread = _map_multithread
diff --git a/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py b/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py
deleted file mode 100644
index ee1eca3..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py
+++ /dev/null
@@ -1,40 +0,0 @@
-from typing import Dict, Iterable, List
-
-from pip._vendor.pkg_resources import yield_lines
-
-
-class DictMetadata:
- """IMetadataProvider that reads metadata files from a dictionary."""
-
- def __init__(self, metadata):
- # type: (Dict[str, bytes]) -> None
- self._metadata = metadata
-
- def has_metadata(self, name):
- # type: (str) -> bool
- return name in self._metadata
-
- def get_metadata(self, name):
- # type: (str) -> str
- try:
- return self._metadata[name].decode()
- except UnicodeDecodeError as e:
- # Mirrors handling done in pkg_resources.NullProvider.
- e.reason += f" in {name} file"
- raise
-
- def get_metadata_lines(self, name):
- # type: (str) -> Iterable[str]
- return yield_lines(self.get_metadata(name))
-
- def metadata_isdir(self, name):
- # type: (str) -> bool
- return False
-
- def metadata_listdir(self, name):
- # type: (str) -> List[str]
- return []
-
- def run_script(self, script_name, namespace):
- # type: (str, str) -> None
- pass
diff --git a/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py b/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py
deleted file mode 100644
index 4b8e4b3..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py
+++ /dev/null
@@ -1,173 +0,0 @@
-import sys
-from typing import List, Optional, Sequence
-
-# Shim to wrap setup.py invocation with setuptools
-#
-# We set sys.argv[0] to the path to the underlying setup.py file so
-# setuptools / distutils don't take the path to the setup.py to be "-c" when
-# invoking via the shim. This avoids e.g. the following manifest_maker
-# warning: "warning: manifest_maker: standard file '-c' not found".
-_SETUPTOOLS_SHIM = (
- "import io, os, sys, setuptools, tokenize; sys.argv[0] = {0!r}; __file__={0!r};"
- "f = getattr(tokenize, 'open', open)(__file__) "
- "if os.path.exists(__file__) "
- "else io.StringIO('from setuptools import setup; setup()');"
- "code = f.read().replace('\\r\\n', '\\n');"
- "f.close();"
- "exec(compile(code, __file__, 'exec'))"
-)
-
-
-def make_setuptools_shim_args(
- setup_py_path, # type: str
- global_options=None, # type: Sequence[str]
- no_user_config=False, # type: bool
- unbuffered_output=False, # type: bool
-):
- # type: (...) -> List[str]
- """
- Get setuptools command arguments with shim wrapped setup file invocation.
-
- :param setup_py_path: The path to setup.py to be wrapped.
- :param global_options: Additional global options.
- :param no_user_config: If True, disables personal user configuration.
- :param unbuffered_output: If True, adds the unbuffered switch to the
- argument list.
- """
- args = [sys.executable]
- if unbuffered_output:
- args += ["-u"]
- args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)]
- if global_options:
- args += global_options
- if no_user_config:
- args += ["--no-user-cfg"]
- return args
-
-
-def make_setuptools_bdist_wheel_args(
- setup_py_path, # type: str
- global_options, # type: Sequence[str]
- build_options, # type: Sequence[str]
- destination_dir, # type: str
-):
- # type: (...) -> List[str]
- # NOTE: Eventually, we'd want to also -S to the flags here, when we're
- # isolating. Currently, it breaks Python in virtualenvs, because it
- # relies on site.py to find parts of the standard library outside the
- # virtualenv.
- args = make_setuptools_shim_args(
- setup_py_path, global_options=global_options, unbuffered_output=True
- )
- args += ["bdist_wheel", "-d", destination_dir]
- args += build_options
- return args
-
-
-def make_setuptools_clean_args(
- setup_py_path, # type: str
- global_options, # type: Sequence[str]
-):
- # type: (...) -> List[str]
- args = make_setuptools_shim_args(
- setup_py_path, global_options=global_options, unbuffered_output=True
- )
- args += ["clean", "--all"]
- return args
-
-
-def make_setuptools_develop_args(
- setup_py_path, # type: str
- global_options, # type: Sequence[str]
- install_options, # type: Sequence[str]
- no_user_config, # type: bool
- prefix, # type: Optional[str]
- home, # type: Optional[str]
- use_user_site, # type: bool
-):
- # type: (...) -> List[str]
- assert not (use_user_site and prefix)
-
- args = make_setuptools_shim_args(
- setup_py_path,
- global_options=global_options,
- no_user_config=no_user_config,
- )
-
- args += ["develop", "--no-deps"]
-
- args += install_options
-
- if prefix:
- args += ["--prefix", prefix]
- if home is not None:
- args += ["--install-dir", home]
-
- if use_user_site:
- args += ["--user", "--prefix="]
-
- return args
-
-
-def make_setuptools_egg_info_args(
- setup_py_path, # type: str
- egg_info_dir, # type: Optional[str]
- no_user_config, # type: bool
-):
- # type: (...) -> List[str]
- args = make_setuptools_shim_args(setup_py_path, no_user_config=no_user_config)
-
- args += ["egg_info"]
-
- if egg_info_dir:
- args += ["--egg-base", egg_info_dir]
-
- return args
-
-
-def make_setuptools_install_args(
- setup_py_path, # type: str
- global_options, # type: Sequence[str]
- install_options, # type: Sequence[str]
- record_filename, # type: str
- root, # type: Optional[str]
- prefix, # type: Optional[str]
- header_dir, # type: Optional[str]
- home, # type: Optional[str]
- use_user_site, # type: bool
- no_user_config, # type: bool
- pycompile, # type: bool
-):
- # type: (...) -> List[str]
- assert not (use_user_site and prefix)
- assert not (use_user_site and root)
-
- args = make_setuptools_shim_args(
- setup_py_path,
- global_options=global_options,
- no_user_config=no_user_config,
- unbuffered_output=True,
- )
- args += ["install", "--record", record_filename]
- args += ["--single-version-externally-managed"]
-
- if root is not None:
- args += ["--root", root]
- if prefix is not None:
- args += ["--prefix", prefix]
- if home is not None:
- args += ["--home", home]
- if use_user_site:
- args += ["--user", "--prefix="]
-
- if pycompile:
- args += ["--compile"]
- else:
- args += ["--no-compile"]
-
- if header_dir:
- args += ["--install-headers", header_dir]
-
- args += install_options
-
- return args
diff --git a/venv/Lib/site-packages/pip/_internal/utils/subprocess.py b/venv/Lib/site-packages/pip/_internal/utils/subprocess.py
deleted file mode 100644
index 2c8cf21..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/subprocess.py
+++ /dev/null
@@ -1,281 +0,0 @@
-import logging
-import os
-import shlex
-import subprocess
-from typing import Any, Callable, Iterable, List, Mapping, Optional, Union
-
-from pip._internal.cli.spinners import SpinnerInterface, open_spinner
-from pip._internal.exceptions import InstallationSubprocessError
-from pip._internal.utils.logging import subprocess_logger
-from pip._internal.utils.misc import HiddenText
-
-CommandArgs = List[Union[str, HiddenText]]
-
-
-LOG_DIVIDER = "----------------------------------------"
-
-
-def make_command(*args):
- # type: (Union[str, HiddenText, CommandArgs]) -> CommandArgs
- """
- Create a CommandArgs object.
- """
- command_args = [] # type: CommandArgs
- for arg in args:
- # Check for list instead of CommandArgs since CommandArgs is
- # only known during type-checking.
- if isinstance(arg, list):
- command_args.extend(arg)
- else:
- # Otherwise, arg is str or HiddenText.
- command_args.append(arg)
-
- return command_args
-
-
-def format_command_args(args):
- # type: (Union[List[str], CommandArgs]) -> str
- """
- Format command arguments for display.
- """
- # For HiddenText arguments, display the redacted form by calling str().
- # Also, we don't apply str() to arguments that aren't HiddenText since
- # this can trigger a UnicodeDecodeError in Python 2 if the argument
- # has type unicode and includes a non-ascii character. (The type
- # checker doesn't ensure the annotations are correct in all cases.)
- return " ".join(
- shlex.quote(str(arg)) if isinstance(arg, HiddenText) else shlex.quote(arg)
- for arg in args
- )
-
-
-def reveal_command_args(args):
- # type: (Union[List[str], CommandArgs]) -> List[str]
- """
- Return the arguments in their raw, unredacted form.
- """
- return [arg.secret if isinstance(arg, HiddenText) else arg for arg in args]
-
-
-def make_subprocess_output_error(
- cmd_args, # type: Union[List[str], CommandArgs]
- cwd, # type: Optional[str]
- lines, # type: List[str]
- exit_status, # type: int
-):
- # type: (...) -> str
- """
- Create and return the error message to use to log a subprocess error
- with command output.
-
- :param lines: A list of lines, each ending with a newline.
- """
- command = format_command_args(cmd_args)
-
- # We know the joined output value ends in a newline.
- output = "".join(lines)
- msg = (
- # Use a unicode string to avoid "UnicodeEncodeError: 'ascii'
- # codec can't encode character ..." in Python 2 when a format
- # argument (e.g. `output`) has a non-ascii character.
- "Command errored out with exit status {exit_status}:\n"
- " command: {command_display}\n"
- " cwd: {cwd_display}\n"
- "Complete output ({line_count} lines):\n{output}{divider}"
- ).format(
- exit_status=exit_status,
- command_display=command,
- cwd_display=cwd,
- line_count=len(lines),
- output=output,
- divider=LOG_DIVIDER,
- )
- return msg
-
-
-def call_subprocess(
- cmd, # type: Union[List[str], CommandArgs]
- show_stdout=False, # type: bool
- cwd=None, # type: Optional[str]
- on_returncode="raise", # type: str
- extra_ok_returncodes=None, # type: Optional[Iterable[int]]
- command_desc=None, # type: Optional[str]
- extra_environ=None, # type: Optional[Mapping[str, Any]]
- unset_environ=None, # type: Optional[Iterable[str]]
- spinner=None, # type: Optional[SpinnerInterface]
- log_failed_cmd=True, # type: Optional[bool]
- stdout_only=False, # type: Optional[bool]
-):
- # type: (...) -> str
- """
- Args:
- show_stdout: if true, use INFO to log the subprocess's stderr and
- stdout streams. Otherwise, use DEBUG. Defaults to False.
- extra_ok_returncodes: an iterable of integer return codes that are
- acceptable, in addition to 0. Defaults to None, which means [].
- unset_environ: an iterable of environment variable names to unset
- prior to calling subprocess.Popen().
- log_failed_cmd: if false, failed commands are not logged, only raised.
- stdout_only: if true, return only stdout, else return both. When true,
- logging of both stdout and stderr occurs when the subprocess has
- terminated, else logging occurs as subprocess output is produced.
- """
- if extra_ok_returncodes is None:
- extra_ok_returncodes = []
- if unset_environ is None:
- unset_environ = []
- # Most places in pip use show_stdout=False. What this means is--
- #
- # - We connect the child's output (combined stderr and stdout) to a
- # single pipe, which we read.
- # - We log this output to stderr at DEBUG level as it is received.
- # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't
- # requested), then we show a spinner so the user can still see the
- # subprocess is in progress.
- # - If the subprocess exits with an error, we log the output to stderr
- # at ERROR level if it hasn't already been displayed to the console
- # (e.g. if --verbose logging wasn't enabled). This way we don't log
- # the output to the console twice.
- #
- # If show_stdout=True, then the above is still done, but with DEBUG
- # replaced by INFO.
- if show_stdout:
- # Then log the subprocess output at INFO level.
- log_subprocess = subprocess_logger.info
- used_level = logging.INFO
- else:
- # Then log the subprocess output using DEBUG. This also ensures
- # it will be logged to the log file (aka user_log), if enabled.
- log_subprocess = subprocess_logger.debug
- used_level = logging.DEBUG
-
- # Whether the subprocess will be visible in the console.
- showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level
-
- # Only use the spinner if we're not showing the subprocess output
- # and we have a spinner.
- use_spinner = not showing_subprocess and spinner is not None
-
- if command_desc is None:
- command_desc = format_command_args(cmd)
-
- log_subprocess("Running command %s", command_desc)
- env = os.environ.copy()
- if extra_environ:
- env.update(extra_environ)
- for name in unset_environ:
- env.pop(name, None)
- try:
- proc = subprocess.Popen(
- # Convert HiddenText objects to the underlying str.
- reveal_command_args(cmd),
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE,
- cwd=cwd,
- env=env,
- errors="backslashreplace",
- )
- except Exception as exc:
- if log_failed_cmd:
- subprocess_logger.critical(
- "Error %s while executing command %s",
- exc,
- command_desc,
- )
- raise
- all_output = []
- if not stdout_only:
- assert proc.stdout
- assert proc.stdin
- proc.stdin.close()
- # In this mode, stdout and stderr are in the same pipe.
- while True:
- line = proc.stdout.readline() # type: str
- if not line:
- break
- line = line.rstrip()
- all_output.append(line + "\n")
-
- # Show the line immediately.
- log_subprocess(line)
- # Update the spinner.
- if use_spinner:
- assert spinner
- spinner.spin()
- try:
- proc.wait()
- finally:
- if proc.stdout:
- proc.stdout.close()
- output = "".join(all_output)
- else:
- # In this mode, stdout and stderr are in different pipes.
- # We must use communicate() which is the only safe way to read both.
- out, err = proc.communicate()
- # log line by line to preserve pip log indenting
- for out_line in out.splitlines():
- log_subprocess(out_line)
- all_output.append(out)
- for err_line in err.splitlines():
- log_subprocess(err_line)
- all_output.append(err)
- output = out
-
- proc_had_error = proc.returncode and proc.returncode not in extra_ok_returncodes
- if use_spinner:
- assert spinner
- if proc_had_error:
- spinner.finish("error")
- else:
- spinner.finish("done")
- if proc_had_error:
- if on_returncode == "raise":
- if not showing_subprocess and log_failed_cmd:
- # Then the subprocess streams haven't been logged to the
- # console yet.
- msg = make_subprocess_output_error(
- cmd_args=cmd,
- cwd=cwd,
- lines=all_output,
- exit_status=proc.returncode,
- )
- subprocess_logger.error(msg)
- raise InstallationSubprocessError(proc.returncode, command_desc)
- elif on_returncode == "warn":
- subprocess_logger.warning(
- 'Command "%s" had error code %s in %s',
- command_desc,
- proc.returncode,
- cwd,
- )
- elif on_returncode == "ignore":
- pass
- else:
- raise ValueError(f"Invalid value: on_returncode={on_returncode!r}")
- return output
-
-
-def runner_with_spinner_message(message):
- # type: (str) -> Callable[..., None]
- """Provide a subprocess_runner that shows a spinner message.
-
- Intended for use with for pep517's Pep517HookCaller. Thus, the runner has
- an API that matches what's expected by Pep517HookCaller.subprocess_runner.
- """
-
- def runner(
- cmd, # type: List[str]
- cwd=None, # type: Optional[str]
- extra_environ=None, # type: Optional[Mapping[str, Any]]
- ):
- # type: (...) -> None
- with open_spinner(message) as spinner:
- call_subprocess(
- cmd,
- cwd=cwd,
- extra_environ=extra_environ,
- spinner=spinner,
- )
-
- return runner
diff --git a/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py b/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py
deleted file mode 100644
index 477cbe6..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py
+++ /dev/null
@@ -1,260 +0,0 @@
-import errno
-import itertools
-import logging
-import os.path
-import tempfile
-from contextlib import ExitStack, contextmanager
-from typing import Any, Dict, Iterator, Optional, TypeVar, Union
-
-from pip._internal.utils.misc import enum, rmtree
-
-logger = logging.getLogger(__name__)
-
-_T = TypeVar("_T", bound="TempDirectory")
-
-
-# Kinds of temporary directories. Only needed for ones that are
-# globally-managed.
-tempdir_kinds = enum(
- BUILD_ENV="build-env",
- EPHEM_WHEEL_CACHE="ephem-wheel-cache",
- REQ_BUILD="req-build",
-)
-
-
-_tempdir_manager = None # type: Optional[ExitStack]
-
-
-@contextmanager
-def global_tempdir_manager():
- # type: () -> Iterator[None]
- global _tempdir_manager
- with ExitStack() as stack:
- old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack
- try:
- yield
- finally:
- _tempdir_manager = old_tempdir_manager
-
-
-class TempDirectoryTypeRegistry:
- """Manages temp directory behavior"""
-
- def __init__(self):
- # type: () -> None
- self._should_delete = {} # type: Dict[str, bool]
-
- def set_delete(self, kind, value):
- # type: (str, bool) -> None
- """Indicate whether a TempDirectory of the given kind should be
- auto-deleted.
- """
- self._should_delete[kind] = value
-
- def get_delete(self, kind):
- # type: (str) -> bool
- """Get configured auto-delete flag for a given TempDirectory type,
- default True.
- """
- return self._should_delete.get(kind, True)
-
-
-_tempdir_registry = None # type: Optional[TempDirectoryTypeRegistry]
-
-
-@contextmanager
-def tempdir_registry():
- # type: () -> Iterator[TempDirectoryTypeRegistry]
- """Provides a scoped global tempdir registry that can be used to dictate
- whether directories should be deleted.
- """
- global _tempdir_registry
- old_tempdir_registry = _tempdir_registry
- _tempdir_registry = TempDirectoryTypeRegistry()
- try:
- yield _tempdir_registry
- finally:
- _tempdir_registry = old_tempdir_registry
-
-
-class _Default:
- pass
-
-
-_default = _Default()
-
-
-class TempDirectory:
- """Helper class that owns and cleans up a temporary directory.
-
- This class can be used as a context manager or as an OO representation of a
- temporary directory.
-
- Attributes:
- path
- Location to the created temporary directory
- delete
- Whether the directory should be deleted when exiting
- (when used as a contextmanager)
-
- Methods:
- cleanup()
- Deletes the temporary directory
-
- When used as a context manager, if the delete attribute is True, on
- exiting the context the temporary directory is deleted.
- """
-
- def __init__(
- self,
- path=None, # type: Optional[str]
- delete=_default, # type: Union[bool, None, _Default]
- kind="temp", # type: str
- globally_managed=False, # type: bool
- ):
- super().__init__()
-
- if delete is _default:
- if path is not None:
- # If we were given an explicit directory, resolve delete option
- # now.
- delete = False
- else:
- # Otherwise, we wait until cleanup and see what
- # tempdir_registry says.
- delete = None
-
- # The only time we specify path is in for editables where it
- # is the value of the --src option.
- if path is None:
- path = self._create(kind)
-
- self._path = path
- self._deleted = False
- self.delete = delete
- self.kind = kind
-
- if globally_managed:
- assert _tempdir_manager is not None
- _tempdir_manager.enter_context(self)
-
- @property
- def path(self):
- # type: () -> str
- assert not self._deleted, f"Attempted to access deleted path: {self._path}"
- return self._path
-
- def __repr__(self):
- # type: () -> str
- return f"<{self.__class__.__name__} {self.path!r}>"
-
- def __enter__(self):
- # type: (_T) -> _T
- return self
-
- def __exit__(self, exc, value, tb):
- # type: (Any, Any, Any) -> None
- if self.delete is not None:
- delete = self.delete
- elif _tempdir_registry:
- delete = _tempdir_registry.get_delete(self.kind)
- else:
- delete = True
-
- if delete:
- self.cleanup()
-
- def _create(self, kind):
- # type: (str) -> str
- """Create a temporary directory and store its path in self.path"""
- # We realpath here because some systems have their default tmpdir
- # symlinked to another directory. This tends to confuse build
- # scripts, so we canonicalize the path by traversing potential
- # symlinks here.
- path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-"))
- logger.debug("Created temporary directory: %s", path)
- return path
-
- def cleanup(self):
- # type: () -> None
- """Remove the temporary directory created and reset state"""
- self._deleted = True
- if not os.path.exists(self._path):
- return
- rmtree(self._path)
-
-
-class AdjacentTempDirectory(TempDirectory):
- """Helper class that creates a temporary directory adjacent to a real one.
-
- Attributes:
- original
- The original directory to create a temp directory for.
- path
- After calling create() or entering, contains the full
- path to the temporary directory.
- delete
- Whether the directory should be deleted when exiting
- (when used as a contextmanager)
-
- """
-
- # The characters that may be used to name the temp directory
- # We always prepend a ~ and then rotate through these until
- # a usable name is found.
- # pkg_resources raises a different error for .dist-info folder
- # with leading '-' and invalid metadata
- LEADING_CHARS = "-~.=%0123456789"
-
- def __init__(self, original, delete=None):
- # type: (str, Optional[bool]) -> None
- self.original = original.rstrip("/\\")
- super().__init__(delete=delete)
-
- @classmethod
- def _generate_names(cls, name):
- # type: (str) -> Iterator[str]
- """Generates a series of temporary names.
-
- The algorithm replaces the leading characters in the name
- with ones that are valid filesystem characters, but are not
- valid package names (for both Python and pip definitions of
- package).
- """
- for i in range(1, len(name)):
- for candidate in itertools.combinations_with_replacement(
- cls.LEADING_CHARS, i - 1
- ):
- new_name = "~" + "".join(candidate) + name[i:]
- if new_name != name:
- yield new_name
-
- # If we make it this far, we will have to make a longer name
- for i in range(len(cls.LEADING_CHARS)):
- for candidate in itertools.combinations_with_replacement(
- cls.LEADING_CHARS, i
- ):
- new_name = "~" + "".join(candidate) + name
- if new_name != name:
- yield new_name
-
- def _create(self, kind):
- # type: (str) -> str
- root, name = os.path.split(self.original)
- for candidate in self._generate_names(name):
- path = os.path.join(root, candidate)
- try:
- os.mkdir(path)
- except OSError as ex:
- # Continue if the name exists already
- if ex.errno != errno.EEXIST:
- raise
- else:
- path = os.path.realpath(path)
- break
- else:
- # Final fallback on the default behavior.
- path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-"))
-
- logger.debug("Created temporary directory: %s", path)
- return path
diff --git a/venv/Lib/site-packages/pip/_internal/utils/unpacking.py b/venv/Lib/site-packages/pip/_internal/utils/unpacking.py
deleted file mode 100644
index 44ac475..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/unpacking.py
+++ /dev/null
@@ -1,267 +0,0 @@
-"""Utilities related archives.
-"""
-
-import logging
-import os
-import shutil
-import stat
-import tarfile
-import zipfile
-from typing import Iterable, List, Optional
-from zipfile import ZipInfo
-
-from pip._internal.exceptions import InstallationError
-from pip._internal.utils.filetypes import (
- BZ2_EXTENSIONS,
- TAR_EXTENSIONS,
- XZ_EXTENSIONS,
- ZIP_EXTENSIONS,
-)
-from pip._internal.utils.misc import ensure_dir
-
-logger = logging.getLogger(__name__)
-
-
-SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS
-
-try:
- import bz2 # noqa
-
- SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS
-except ImportError:
- logger.debug("bz2 module is not available")
-
-try:
- # Only for Python 3.3+
- import lzma # noqa
-
- SUPPORTED_EXTENSIONS += XZ_EXTENSIONS
-except ImportError:
- logger.debug("lzma module is not available")
-
-
-def current_umask():
- # type: () -> int
- """Get the current umask which involves having to set it temporarily."""
- mask = os.umask(0)
- os.umask(mask)
- return mask
-
-
-def split_leading_dir(path):
- # type: (str) -> List[str]
- path = path.lstrip("/").lstrip("\\")
- if "/" in path and (
- ("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path
- ):
- return path.split("/", 1)
- elif "\\" in path:
- return path.split("\\", 1)
- else:
- return [path, ""]
-
-
-def has_leading_dir(paths):
- # type: (Iterable[str]) -> bool
- """Returns true if all the paths have the same leading path name
- (i.e., everything is in one subdirectory in an archive)"""
- common_prefix = None
- for path in paths:
- prefix, rest = split_leading_dir(path)
- if not prefix:
- return False
- elif common_prefix is None:
- common_prefix = prefix
- elif prefix != common_prefix:
- return False
- return True
-
-
-def is_within_directory(directory, target):
- # type: (str, str) -> bool
- """
- Return true if the absolute path of target is within the directory
- """
- abs_directory = os.path.abspath(directory)
- abs_target = os.path.abspath(target)
-
- prefix = os.path.commonprefix([abs_directory, abs_target])
- return prefix == abs_directory
-
-
-def set_extracted_file_to_default_mode_plus_executable(path):
- # type: (str) -> None
- """
- Make file present at path have execute for user/group/world
- (chmod +x) is no-op on windows per python docs
- """
- os.chmod(path, (0o777 & ~current_umask() | 0o111))
-
-
-def zip_item_is_executable(info):
- # type: (ZipInfo) -> bool
- mode = info.external_attr >> 16
- # if mode and regular file and any execute permissions for
- # user/group/world?
- return bool(mode and stat.S_ISREG(mode) and mode & 0o111)
-
-
-def unzip_file(filename, location, flatten=True):
- # type: (str, str, bool) -> None
- """
- Unzip the file (with path `filename`) to the destination `location`. All
- files are written based on system defaults and umask (i.e. permissions are
- not preserved), except that regular file members with any execute
- permissions (user, group, or world) have "chmod +x" applied after being
- written. Note that for windows, any execute changes using os.chmod are
- no-ops per the python docs.
- """
- ensure_dir(location)
- zipfp = open(filename, "rb")
- try:
- zip = zipfile.ZipFile(zipfp, allowZip64=True)
- leading = has_leading_dir(zip.namelist()) and flatten
- for info in zip.infolist():
- name = info.filename
- fn = name
- if leading:
- fn = split_leading_dir(name)[1]
- fn = os.path.join(location, fn)
- dir = os.path.dirname(fn)
- if not is_within_directory(location, fn):
- message = (
- "The zip file ({}) has a file ({}) trying to install "
- "outside target directory ({})"
- )
- raise InstallationError(message.format(filename, fn, location))
- if fn.endswith("/") or fn.endswith("\\"):
- # A directory
- ensure_dir(fn)
- else:
- ensure_dir(dir)
- # Don't use read() to avoid allocating an arbitrarily large
- # chunk of memory for the file's content
- fp = zip.open(name)
- try:
- with open(fn, "wb") as destfp:
- shutil.copyfileobj(fp, destfp)
- finally:
- fp.close()
- if zip_item_is_executable(info):
- set_extracted_file_to_default_mode_plus_executable(fn)
- finally:
- zipfp.close()
-
-
-def untar_file(filename, location):
- # type: (str, str) -> None
- """
- Untar the file (with path `filename`) to the destination `location`.
- All files are written based on system defaults and umask (i.e. permissions
- are not preserved), except that regular file members with any execute
- permissions (user, group, or world) have "chmod +x" applied after being
- written. Note that for windows, any execute changes using os.chmod are
- no-ops per the python docs.
- """
- ensure_dir(location)
- if filename.lower().endswith(".gz") or filename.lower().endswith(".tgz"):
- mode = "r:gz"
- elif filename.lower().endswith(BZ2_EXTENSIONS):
- mode = "r:bz2"
- elif filename.lower().endswith(XZ_EXTENSIONS):
- mode = "r:xz"
- elif filename.lower().endswith(".tar"):
- mode = "r"
- else:
- logger.warning(
- "Cannot determine compression type for file %s",
- filename,
- )
- mode = "r:*"
- tar = tarfile.open(filename, mode)
- try:
- leading = has_leading_dir([member.name for member in tar.getmembers()])
- for member in tar.getmembers():
- fn = member.name
- if leading:
- fn = split_leading_dir(fn)[1]
- path = os.path.join(location, fn)
- if not is_within_directory(location, path):
- message = (
- "The tar file ({}) has a file ({}) trying to install "
- "outside target directory ({})"
- )
- raise InstallationError(message.format(filename, path, location))
- if member.isdir():
- ensure_dir(path)
- elif member.issym():
- try:
- # https://github.com/python/typeshed/issues/2673
- tar._extract_member(member, path) # type: ignore
- except Exception as exc:
- # Some corrupt tar files seem to produce this
- # (specifically bad symlinks)
- logger.warning(
- "In the tar file %s the member %s is invalid: %s",
- filename,
- member.name,
- exc,
- )
- continue
- else:
- try:
- fp = tar.extractfile(member)
- except (KeyError, AttributeError) as exc:
- # Some corrupt tar files seem to produce this
- # (specifically bad symlinks)
- logger.warning(
- "In the tar file %s the member %s is invalid: %s",
- filename,
- member.name,
- exc,
- )
- continue
- ensure_dir(os.path.dirname(path))
- assert fp is not None
- with open(path, "wb") as destfp:
- shutil.copyfileobj(fp, destfp)
- fp.close()
- # Update the timestamp (useful for cython compiled files)
- tar.utime(member, path)
- # member have any execute permissions for user/group/world?
- if member.mode & 0o111:
- set_extracted_file_to_default_mode_plus_executable(path)
- finally:
- tar.close()
-
-
-def unpack_file(
- filename, # type: str
- location, # type: str
- content_type=None, # type: Optional[str]
-):
- # type: (...) -> None
- filename = os.path.realpath(filename)
- if (
- content_type == "application/zip"
- or filename.lower().endswith(ZIP_EXTENSIONS)
- or zipfile.is_zipfile(filename)
- ):
- unzip_file(filename, location, flatten=not filename.endswith(".whl"))
- elif (
- content_type == "application/x-gzip"
- or tarfile.is_tarfile(filename)
- or filename.lower().endswith(TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)
- ):
- untar_file(filename, location)
- else:
- # FIXME: handle?
- # FIXME: magic signatures?
- logger.critical(
- "Cannot unpack file %s (downloaded from %s, content-type: %s); "
- "cannot detect archive format",
- filename,
- location,
- content_type,
- )
- raise InstallationError(f"Cannot determine archive format of {location}")
diff --git a/venv/Lib/site-packages/pip/_internal/utils/urls.py b/venv/Lib/site-packages/pip/_internal/utils/urls.py
deleted file mode 100644
index 50a04d8..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/urls.py
+++ /dev/null
@@ -1,49 +0,0 @@
-import os
-import sys
-import urllib.parse
-import urllib.request
-from typing import Optional
-
-
-def get_url_scheme(url):
- # type: (str) -> Optional[str]
- if ":" not in url:
- return None
- return url.split(":", 1)[0].lower()
-
-
-def path_to_url(path):
- # type: (str) -> str
- """
- Convert a path to a file: URL. The path will be made absolute and have
- quoted path parts.
- """
- path = os.path.normpath(os.path.abspath(path))
- url = urllib.parse.urljoin("file:", urllib.request.pathname2url(path))
- return url
-
-
-def url_to_path(url):
- # type: (str) -> str
- """
- Convert a file: URL to a path.
- """
- assert url.startswith(
- "file:"
- ), f"You can only turn file: urls into filenames (not {url!r})"
-
- _, netloc, path, _, _ = urllib.parse.urlsplit(url)
-
- if not netloc or netloc == "localhost":
- # According to RFC 8089, same as empty authority.
- netloc = ""
- elif sys.platform == "win32":
- # If we have a UNC path, prepend UNC share notation.
- netloc = "\\\\" + netloc
- else:
- raise ValueError(
- f"non-local file URIs are not supported on this platform: {url!r}"
- )
-
- path = urllib.request.url2pathname(netloc + path)
- return path
diff --git a/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py b/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py
deleted file mode 100644
index 51cacb5..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py
+++ /dev/null
@@ -1,111 +0,0 @@
-import logging
-import os
-import re
-import site
-import sys
-from typing import List, Optional
-
-logger = logging.getLogger(__name__)
-_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile(
- r"include-system-site-packages\s*=\s*(?Ptrue|false)"
-)
-
-
-def _running_under_venv():
- # type: () -> bool
- """Checks if sys.base_prefix and sys.prefix match.
-
- This handles PEP 405 compliant virtual environments.
- """
- return sys.prefix != getattr(sys, "base_prefix", sys.prefix)
-
-
-def _running_under_regular_virtualenv():
- # type: () -> bool
- """Checks if sys.real_prefix is set.
-
- This handles virtual environments created with pypa's virtualenv.
- """
- # pypa/virtualenv case
- return hasattr(sys, "real_prefix")
-
-
-def running_under_virtualenv():
- # type: () -> bool
- """Return True if we're running inside a virtualenv, False otherwise."""
- return _running_under_venv() or _running_under_regular_virtualenv()
-
-
-def _get_pyvenv_cfg_lines():
- # type: () -> Optional[List[str]]
- """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines
-
- Returns None, if it could not read/access the file.
- """
- pyvenv_cfg_file = os.path.join(sys.prefix, "pyvenv.cfg")
- try:
- # Although PEP 405 does not specify, the built-in venv module always
- # writes with UTF-8. (pypa/pip#8717)
- with open(pyvenv_cfg_file, encoding="utf-8") as f:
- return f.read().splitlines() # avoids trailing newlines
- except OSError:
- return None
-
-
-def _no_global_under_venv():
- # type: () -> bool
- """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion
-
- PEP 405 specifies that when system site-packages are not supposed to be
- visible from a virtual environment, `pyvenv.cfg` must contain the following
- line:
-
- include-system-site-packages = false
-
- Additionally, log a warning if accessing the file fails.
- """
- cfg_lines = _get_pyvenv_cfg_lines()
- if cfg_lines is None:
- # We're not in a "sane" venv, so assume there is no system
- # site-packages access (since that's PEP 405's default state).
- logger.warning(
- "Could not access 'pyvenv.cfg' despite a virtual environment "
- "being active. Assuming global site-packages is not accessible "
- "in this environment."
- )
- return True
-
- for line in cfg_lines:
- match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line)
- if match is not None and match.group("value") == "false":
- return True
- return False
-
-
-def _no_global_under_regular_virtualenv():
- # type: () -> bool
- """Check if "no-global-site-packages.txt" exists beside site.py
-
- This mirrors logic in pypa/virtualenv for determining whether system
- site-packages are visible in the virtual environment.
- """
- site_mod_dir = os.path.dirname(os.path.abspath(site.__file__))
- no_global_site_packages_file = os.path.join(
- site_mod_dir,
- "no-global-site-packages.txt",
- )
- return os.path.exists(no_global_site_packages_file)
-
-
-def virtualenv_no_global():
- # type: () -> bool
- """Returns a boolean, whether running in venv with no system site-packages."""
- # PEP 405 compliance needs to be checked first since virtualenv >=20 would
- # return True for both checks, but is only able to use the PEP 405 config.
- if _running_under_venv():
- return _no_global_under_venv()
-
- if _running_under_regular_virtualenv():
- return _no_global_under_regular_virtualenv()
-
- return False
diff --git a/venv/Lib/site-packages/pip/_internal/utils/wheel.py b/venv/Lib/site-packages/pip/_internal/utils/wheel.py
deleted file mode 100644
index 42f0808..0000000
--- a/venv/Lib/site-packages/pip/_internal/utils/wheel.py
+++ /dev/null
@@ -1,189 +0,0 @@
-"""Support functions for working with wheel files.
-"""
-
-import logging
-from email.message import Message
-from email.parser import Parser
-from typing import Dict, Tuple
-from zipfile import BadZipFile, ZipFile
-
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.pkg_resources import DistInfoDistribution, Distribution
-
-from pip._internal.exceptions import UnsupportedWheel
-from pip._internal.utils.pkg_resources import DictMetadata
-
-VERSION_COMPATIBLE = (1, 0)
-
-
-logger = logging.getLogger(__name__)
-
-
-class WheelMetadata(DictMetadata):
- """Metadata provider that maps metadata decoding exceptions to our
- internal exception type.
- """
-
- def __init__(self, metadata, wheel_name):
- # type: (Dict[str, bytes], str) -> None
- super().__init__(metadata)
- self._wheel_name = wheel_name
-
- def get_metadata(self, name):
- # type: (str) -> str
- try:
- return super().get_metadata(name)
- except UnicodeDecodeError as e:
- # Augment the default error with the origin of the file.
- raise UnsupportedWheel(
- f"Error decoding metadata for {self._wheel_name}: {e}"
- )
-
-
-def pkg_resources_distribution_for_wheel(wheel_zip, name, location):
- # type: (ZipFile, str, str) -> Distribution
- """Get a pkg_resources distribution given a wheel.
-
- :raises UnsupportedWheel: on any errors
- """
- info_dir, _ = parse_wheel(wheel_zip, name)
-
- metadata_files = [p for p in wheel_zip.namelist() if p.startswith(f"{info_dir}/")]
-
- metadata_text = {} # type: Dict[str, bytes]
- for path in metadata_files:
- _, metadata_name = path.split("/", 1)
-
- try:
- metadata_text[metadata_name] = read_wheel_metadata_file(wheel_zip, path)
- except UnsupportedWheel as e:
- raise UnsupportedWheel("{} has an invalid wheel, {}".format(name, str(e)))
-
- metadata = WheelMetadata(metadata_text, location)
-
- return DistInfoDistribution(location=location, metadata=metadata, project_name=name)
-
-
-def parse_wheel(wheel_zip, name):
- # type: (ZipFile, str) -> Tuple[str, Message]
- """Extract information from the provided wheel, ensuring it meets basic
- standards.
-
- Returns the name of the .dist-info directory and the parsed WHEEL metadata.
- """
- try:
- info_dir = wheel_dist_info_dir(wheel_zip, name)
- metadata = wheel_metadata(wheel_zip, info_dir)
- version = wheel_version(metadata)
- except UnsupportedWheel as e:
- raise UnsupportedWheel("{} has an invalid wheel, {}".format(name, str(e)))
-
- check_compatibility(version, name)
-
- return info_dir, metadata
-
-
-def wheel_dist_info_dir(source, name):
- # type: (ZipFile, str) -> str
- """Returns the name of the contained .dist-info directory.
-
- Raises AssertionError or UnsupportedWheel if not found, >1 found, or
- it doesn't match the provided name.
- """
- # Zip file path separators must be /
- subdirs = {p.split("/", 1)[0] for p in source.namelist()}
-
- info_dirs = [s for s in subdirs if s.endswith(".dist-info")]
-
- if not info_dirs:
- raise UnsupportedWheel(".dist-info directory not found")
-
- if len(info_dirs) > 1:
- raise UnsupportedWheel(
- "multiple .dist-info directories found: {}".format(", ".join(info_dirs))
- )
-
- info_dir = info_dirs[0]
-
- info_dir_name = canonicalize_name(info_dir)
- canonical_name = canonicalize_name(name)
- if not info_dir_name.startswith(canonical_name):
- raise UnsupportedWheel(
- ".dist-info directory {!r} does not start with {!r}".format(
- info_dir, canonical_name
- )
- )
-
- return info_dir
-
-
-def read_wheel_metadata_file(source, path):
- # type: (ZipFile, str) -> bytes
- try:
- return source.read(path)
- # BadZipFile for general corruption, KeyError for missing entry,
- # and RuntimeError for password-protected files
- except (BadZipFile, KeyError, RuntimeError) as e:
- raise UnsupportedWheel(f"could not read {path!r} file: {e!r}")
-
-
-def wheel_metadata(source, dist_info_dir):
- # type: (ZipFile, str) -> Message
- """Return the WHEEL metadata of an extracted wheel, if possible.
- Otherwise, raise UnsupportedWheel.
- """
- path = f"{dist_info_dir}/WHEEL"
- # Zip file path separators must be /
- wheel_contents = read_wheel_metadata_file(source, path)
-
- try:
- wheel_text = wheel_contents.decode()
- except UnicodeDecodeError as e:
- raise UnsupportedWheel(f"error decoding {path!r}: {e!r}")
-
- # FeedParser (used by Parser) does not raise any exceptions. The returned
- # message may have .defects populated, but for backwards-compatibility we
- # currently ignore them.
- return Parser().parsestr(wheel_text)
-
-
-def wheel_version(wheel_data):
- # type: (Message) -> Tuple[int, ...]
- """Given WHEEL metadata, return the parsed Wheel-Version.
- Otherwise, raise UnsupportedWheel.
- """
- version_text = wheel_data["Wheel-Version"]
- if version_text is None:
- raise UnsupportedWheel("WHEEL is missing Wheel-Version")
-
- version = version_text.strip()
-
- try:
- return tuple(map(int, version.split(".")))
- except ValueError:
- raise UnsupportedWheel(f"invalid Wheel-Version: {version!r}")
-
-
-def check_compatibility(version, name):
- # type: (Tuple[int, ...], str) -> None
- """Raises errors or warns if called with an incompatible Wheel-Version.
-
- pip should refuse to install a Wheel-Version that's a major series
- ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when
- installing a version only minor version ahead (e.g 1.2 > 1.1).
-
- version: a 2-tuple representing a Wheel-Version (Major, Minor)
- name: name of wheel or package to raise exception about
-
- :raises UnsupportedWheel: when an incompatible Wheel-Version is given
- """
- if version[0] > VERSION_COMPATIBLE[0]:
- raise UnsupportedWheel(
- "{}'s Wheel-Version ({}) is not compatible with this version "
- "of pip".format(name, ".".join(map(str, version)))
- )
- elif version > VERSION_COMPATIBLE:
- logger.warning(
- "Installing from a newer Wheel-Version (%s)",
- ".".join(map(str, version)),
- )
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__init__.py b/venv/Lib/site-packages/pip/_internal/vcs/__init__.py
deleted file mode 100644
index 30025d6..0000000
--- a/venv/Lib/site-packages/pip/_internal/vcs/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Expose a limited set of classes and functions so callers outside of
-# the vcs package don't need to import deeper than `pip._internal.vcs`.
-# (The test directory may still need to import from a vcs sub-package.)
-# Import all vcs modules to register each VCS in the VcsSupport object.
-import pip._internal.vcs.bazaar
-import pip._internal.vcs.git
-import pip._internal.vcs.mercurial
-import pip._internal.vcs.subversion # noqa: F401
-from pip._internal.vcs.versioncontrol import ( # noqa: F401
- RemoteNotFoundError,
- is_url,
- make_vcs_requirement_url,
- vcs,
-)
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 893688b..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc
deleted file mode 100644
index 6045487..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc
deleted file mode 100644
index 18e8793..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc
deleted file mode 100644
index c4826f0..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc
deleted file mode 100644
index 01a2ccf..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc b/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc
deleted file mode 100644
index 266e5fe..0000000
Binary files a/venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py b/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py
deleted file mode 100644
index 42b6877..0000000
--- a/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py
+++ /dev/null
@@ -1,96 +0,0 @@
-import logging
-from typing import List, Optional, Tuple
-
-from pip._internal.utils.misc import HiddenText, display_path
-from pip._internal.utils.subprocess import make_command
-from pip._internal.utils.urls import path_to_url
-from pip._internal.vcs.versioncontrol import (
- AuthInfo,
- RemoteNotFoundError,
- RevOptions,
- VersionControl,
- vcs,
-)
-
-logger = logging.getLogger(__name__)
-
-
-class Bazaar(VersionControl):
- name = 'bzr'
- dirname = '.bzr'
- repo_name = 'branch'
- schemes = (
- 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp',
- 'bzr+lp', 'bzr+file'
- )
-
- @staticmethod
- def get_base_rev_args(rev):
- # type: (str) -> List[str]
- return ['-r', rev]
-
- def fetch_new(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- rev_display = rev_options.to_display()
- logger.info(
- 'Checking out %s%s to %s',
- url,
- rev_display,
- display_path(dest),
- )
- cmd_args = (
- make_command('branch', '-q', rev_options.to_args(), url, dest)
- )
- self.run_command(cmd_args)
-
- def switch(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- self.run_command(make_command('switch', url), cwd=dest)
-
- def update(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- cmd_args = make_command('pull', '-q', rev_options.to_args())
- self.run_command(cmd_args, cwd=dest)
-
- @classmethod
- def get_url_rev_and_auth(cls, url):
- # type: (str) -> Tuple[str, Optional[str], AuthInfo]
- # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it
- url, rev, user_pass = super().get_url_rev_and_auth(url)
- if url.startswith('ssh://'):
- url = 'bzr+' + url
- return url, rev, user_pass
-
- @classmethod
- def get_remote_url(cls, location):
- # type: (str) -> str
- urls = cls.run_command(
- ['info'], show_stdout=False, stdout_only=True, cwd=location
- )
- for line in urls.splitlines():
- line = line.strip()
- for x in ('checkout of branch: ',
- 'parent branch: '):
- if line.startswith(x):
- repo = line.split(x)[1]
- if cls._is_local_repository(repo):
- return path_to_url(repo)
- return repo
- raise RemoteNotFoundError
-
- @classmethod
- def get_revision(cls, location):
- # type: (str) -> str
- revision = cls.run_command(
- ['revno'], show_stdout=False, stdout_only=True, cwd=location,
- )
- return revision.splitlines()[-1]
-
- @classmethod
- def is_commit_id_equal(cls, dest, name):
- # type: (str, Optional[str]) -> bool
- """Always assume the versions don't match"""
- return False
-
-
-vcs.register(Bazaar)
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/git.py b/venv/Lib/site-packages/pip/_internal/vcs/git.py
deleted file mode 100644
index b7c1b9f..0000000
--- a/venv/Lib/site-packages/pip/_internal/vcs/git.py
+++ /dev/null
@@ -1,450 +0,0 @@
-import logging
-import os.path
-import re
-import urllib.parse
-import urllib.request
-from typing import List, Optional, Tuple
-
-from pip._vendor.packaging.version import _BaseVersion
-from pip._vendor.packaging.version import parse as parse_version
-
-from pip._internal.exceptions import BadCommand, InstallationError
-from pip._internal.utils.misc import HiddenText, display_path, hide_url
-from pip._internal.utils.subprocess import make_command
-from pip._internal.vcs.versioncontrol import (
- AuthInfo,
- RemoteNotFoundError,
- RevOptions,
- VersionControl,
- find_path_to_setup_from_repo_root,
- vcs,
-)
-
-urlsplit = urllib.parse.urlsplit
-urlunsplit = urllib.parse.urlunsplit
-
-
-logger = logging.getLogger(__name__)
-
-
-HASH_REGEX = re.compile('^[a-fA-F0-9]{40}$')
-
-
-def looks_like_hash(sha):
- # type: (str) -> bool
- return bool(HASH_REGEX.match(sha))
-
-
-class Git(VersionControl):
- name = 'git'
- dirname = '.git'
- repo_name = 'clone'
- schemes = (
- 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file',
- )
- # Prevent the user's environment variables from interfering with pip:
- # https://github.com/pypa/pip/issues/1130
- unset_environ = ('GIT_DIR', 'GIT_WORK_TREE')
- default_arg_rev = 'HEAD'
-
- @staticmethod
- def get_base_rev_args(rev):
- # type: (str) -> List[str]
- return [rev]
-
- def is_immutable_rev_checkout(self, url, dest):
- # type: (str, str) -> bool
- _, rev_options = self.get_url_rev_options(hide_url(url))
- if not rev_options.rev:
- return False
- if not self.is_commit_id_equal(dest, rev_options.rev):
- # the current commit is different from rev,
- # which means rev was something else than a commit hash
- return False
- # return False in the rare case rev is both a commit hash
- # and a tag or a branch; we don't want to cache in that case
- # because that branch/tag could point to something else in the future
- is_tag_or_branch = bool(
- self.get_revision_sha(dest, rev_options.rev)[0]
- )
- return not is_tag_or_branch
-
- def get_git_version(self):
- # type: () -> _BaseVersion
- VERSION_PFX = 'git version '
- version = self.run_command(
- ['version'], show_stdout=False, stdout_only=True
- )
- if version.startswith(VERSION_PFX):
- version = version[len(VERSION_PFX):].split()[0]
- else:
- version = ''
- # get first 3 positions of the git version because
- # on windows it is x.y.z.windows.t, and this parses as
- # LegacyVersion which always smaller than a Version.
- version = '.'.join(version.split('.')[:3])
- return parse_version(version)
-
- @classmethod
- def get_current_branch(cls, location):
- # type: (str) -> Optional[str]
- """
- Return the current branch, or None if HEAD isn't at a branch
- (e.g. detached HEAD).
- """
- # git-symbolic-ref exits with empty stdout if "HEAD" is a detached
- # HEAD rather than a symbolic ref. In addition, the -q causes the
- # command to exit with status code 1 instead of 128 in this case
- # and to suppress the message to stderr.
- args = ['symbolic-ref', '-q', 'HEAD']
- output = cls.run_command(
- args,
- extra_ok_returncodes=(1, ),
- show_stdout=False,
- stdout_only=True,
- cwd=location,
- )
- ref = output.strip()
-
- if ref.startswith('refs/heads/'):
- return ref[len('refs/heads/'):]
-
- return None
-
- @classmethod
- def get_revision_sha(cls, dest, rev):
- # type: (str, str) -> Tuple[Optional[str], bool]
- """
- Return (sha_or_none, is_branch), where sha_or_none is a commit hash
- if the revision names a remote branch or tag, otherwise None.
-
- Args:
- dest: the repository directory.
- rev: the revision name.
- """
- # Pass rev to pre-filter the list.
- output = cls.run_command(
- ['show-ref', rev],
- cwd=dest,
- show_stdout=False,
- stdout_only=True,
- on_returncode='ignore',
- )
- refs = {}
- # NOTE: We do not use splitlines here since that would split on other
- # unicode separators, which can be maliciously used to install a
- # different revision.
- for line in output.strip().split("\n"):
- line = line.rstrip("\r")
- if not line:
- continue
- try:
- ref_sha, ref_name = line.split(" ", maxsplit=2)
- except ValueError:
- # Include the offending line to simplify troubleshooting if
- # this error ever occurs.
- raise ValueError(f'unexpected show-ref line: {line!r}')
-
- refs[ref_name] = ref_sha
-
- branch_ref = f'refs/remotes/origin/{rev}'
- tag_ref = f'refs/tags/{rev}'
-
- sha = refs.get(branch_ref)
- if sha is not None:
- return (sha, True)
-
- sha = refs.get(tag_ref)
-
- return (sha, False)
-
- @classmethod
- def _should_fetch(cls, dest, rev):
- # type: (str, str) -> bool
- """
- Return true if rev is a ref or is a commit that we don't have locally.
-
- Branches and tags are not considered in this method because they are
- assumed to be always available locally (which is a normal outcome of
- ``git clone`` and ``git fetch --tags``).
- """
- if rev.startswith("refs/"):
- # Always fetch remote refs.
- return True
-
- if not looks_like_hash(rev):
- # Git fetch would fail with abbreviated commits.
- return False
-
- if cls.has_commit(dest, rev):
- # Don't fetch if we have the commit locally.
- return False
-
- return True
-
- @classmethod
- def resolve_revision(cls, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> RevOptions
- """
- Resolve a revision to a new RevOptions object with the SHA1 of the
- branch, tag, or ref if found.
-
- Args:
- rev_options: a RevOptions object.
- """
- rev = rev_options.arg_rev
- # The arg_rev property's implementation for Git ensures that the
- # rev return value is always non-None.
- assert rev is not None
-
- sha, is_branch = cls.get_revision_sha(dest, rev)
-
- if sha is not None:
- rev_options = rev_options.make_new(sha)
- rev_options.branch_name = rev if is_branch else None
-
- return rev_options
-
- # Do not show a warning for the common case of something that has
- # the form of a Git commit hash.
- if not looks_like_hash(rev):
- logger.warning(
- "Did not find branch or tag '%s', assuming revision or ref.",
- rev,
- )
-
- if not cls._should_fetch(dest, rev):
- return rev_options
-
- # fetch the requested revision
- cls.run_command(
- make_command('fetch', '-q', url, rev_options.to_args()),
- cwd=dest,
- )
- # Change the revision to the SHA of the ref we fetched
- sha = cls.get_revision(dest, rev='FETCH_HEAD')
- rev_options = rev_options.make_new(sha)
-
- return rev_options
-
- @classmethod
- def is_commit_id_equal(cls, dest, name):
- # type: (str, Optional[str]) -> bool
- """
- Return whether the current commit hash equals the given name.
-
- Args:
- dest: the repository directory.
- name: a string name.
- """
- if not name:
- # Then avoid an unnecessary subprocess call.
- return False
-
- return cls.get_revision(dest) == name
-
- def fetch_new(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- rev_display = rev_options.to_display()
- logger.info('Cloning %s%s to %s', url, rev_display, display_path(dest))
- self.run_command(make_command('clone', '-q', url, dest))
-
- if rev_options.rev:
- # Then a specific revision was requested.
- rev_options = self.resolve_revision(dest, url, rev_options)
- branch_name = getattr(rev_options, 'branch_name', None)
- if branch_name is None:
- # Only do a checkout if the current commit id doesn't match
- # the requested revision.
- if not self.is_commit_id_equal(dest, rev_options.rev):
- cmd_args = make_command(
- 'checkout', '-q', rev_options.to_args(),
- )
- self.run_command(cmd_args, cwd=dest)
- elif self.get_current_branch(dest) != branch_name:
- # Then a specific branch was requested, and that branch
- # is not yet checked out.
- track_branch = f'origin/{branch_name}'
- cmd_args = [
- 'checkout', '-b', branch_name, '--track', track_branch,
- ]
- self.run_command(cmd_args, cwd=dest)
-
- #: repo may contain submodules
- self.update_submodules(dest)
-
- def switch(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- self.run_command(
- make_command('config', 'remote.origin.url', url),
- cwd=dest,
- )
- cmd_args = make_command('checkout', '-q', rev_options.to_args())
- self.run_command(cmd_args, cwd=dest)
-
- self.update_submodules(dest)
-
- def update(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- # First fetch changes from the default remote
- if self.get_git_version() >= parse_version('1.9.0'):
- # fetch tags in addition to everything else
- self.run_command(['fetch', '-q', '--tags'], cwd=dest)
- else:
- self.run_command(['fetch', '-q'], cwd=dest)
- # Then reset to wanted revision (maybe even origin/master)
- rev_options = self.resolve_revision(dest, url, rev_options)
- cmd_args = make_command('reset', '--hard', '-q', rev_options.to_args())
- self.run_command(cmd_args, cwd=dest)
- #: update submodules
- self.update_submodules(dest)
-
- @classmethod
- def get_remote_url(cls, location):
- # type: (str) -> str
- """
- Return URL of the first remote encountered.
-
- Raises RemoteNotFoundError if the repository does not have a remote
- url configured.
- """
- # We need to pass 1 for extra_ok_returncodes since the command
- # exits with return code 1 if there are no matching lines.
- stdout = cls.run_command(
- ['config', '--get-regexp', r'remote\..*\.url'],
- extra_ok_returncodes=(1, ),
- show_stdout=False,
- stdout_only=True,
- cwd=location,
- )
- remotes = stdout.splitlines()
- try:
- found_remote = remotes[0]
- except IndexError:
- raise RemoteNotFoundError
-
- for remote in remotes:
- if remote.startswith('remote.origin.url '):
- found_remote = remote
- break
- url = found_remote.split(' ')[1]
- return url.strip()
-
- @classmethod
- def has_commit(cls, location, rev):
- # type: (str, str) -> bool
- """
- Check if rev is a commit that is available in the local repository.
- """
- try:
- cls.run_command(
- ['rev-parse', '-q', '--verify', "sha^" + rev],
- cwd=location,
- log_failed_cmd=False,
- )
- except InstallationError:
- return False
- else:
- return True
-
- @classmethod
- def get_revision(cls, location, rev=None):
- # type: (str, Optional[str]) -> str
- if rev is None:
- rev = 'HEAD'
- current_rev = cls.run_command(
- ['rev-parse', rev],
- show_stdout=False,
- stdout_only=True,
- cwd=location,
- )
- return current_rev.strip()
-
- @classmethod
- def get_subdirectory(cls, location):
- # type: (str) -> Optional[str]
- """
- Return the path to setup.py, relative to the repo root.
- Return None if setup.py is in the repo root.
- """
- # find the repo root
- git_dir = cls.run_command(
- ['rev-parse', '--git-dir'],
- show_stdout=False,
- stdout_only=True,
- cwd=location,
- ).strip()
- if not os.path.isabs(git_dir):
- git_dir = os.path.join(location, git_dir)
- repo_root = os.path.abspath(os.path.join(git_dir, '..'))
- return find_path_to_setup_from_repo_root(location, repo_root)
-
- @classmethod
- def get_url_rev_and_auth(cls, url):
- # type: (str) -> Tuple[str, Optional[str], AuthInfo]
- """
- Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
- That's required because although they use SSH they sometimes don't
- work with a ssh:// scheme (e.g. GitHub). But we need a scheme for
- parsing. Hence we remove it again afterwards and return it as a stub.
- """
- # Works around an apparent Git bug
- # (see https://article.gmane.org/gmane.comp.version-control.git/146500)
- scheme, netloc, path, query, fragment = urlsplit(url)
- if scheme.endswith('file'):
- initial_slashes = path[:-len(path.lstrip('/'))]
- newpath = (
- initial_slashes +
- urllib.request.url2pathname(path)
- .replace('\\', '/').lstrip('/')
- )
- after_plus = scheme.find('+') + 1
- url = scheme[:after_plus] + urlunsplit(
- (scheme[after_plus:], netloc, newpath, query, fragment),
- )
-
- if '://' not in url:
- assert 'file:' not in url
- url = url.replace('git+', 'git+ssh://')
- url, rev, user_pass = super().get_url_rev_and_auth(url)
- url = url.replace('ssh://', '')
- else:
- url, rev, user_pass = super().get_url_rev_and_auth(url)
-
- return url, rev, user_pass
-
- @classmethod
- def update_submodules(cls, location):
- # type: (str) -> None
- if not os.path.exists(os.path.join(location, '.gitmodules')):
- return
- cls.run_command(
- ['submodule', 'update', '--init', '--recursive', '-q'],
- cwd=location,
- )
-
- @classmethod
- def get_repository_root(cls, location):
- # type: (str) -> Optional[str]
- loc = super().get_repository_root(location)
- if loc:
- return loc
- try:
- r = cls.run_command(
- ['rev-parse', '--show-toplevel'],
- cwd=location,
- show_stdout=False,
- stdout_only=True,
- on_returncode='raise',
- log_failed_cmd=False,
- )
- except BadCommand:
- logger.debug("could not determine if %s is under git control "
- "because git is not available", location)
- return None
- except InstallationError:
- return None
- return os.path.normpath(r.rstrip('\r\n'))
-
-
-vcs.register(Git)
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py b/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py
deleted file mode 100644
index b4f887d..0000000
--- a/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py
+++ /dev/null
@@ -1,158 +0,0 @@
-import configparser
-import logging
-import os
-from typing import List, Optional
-
-from pip._internal.exceptions import BadCommand, InstallationError
-from pip._internal.utils.misc import HiddenText, display_path
-from pip._internal.utils.subprocess import make_command
-from pip._internal.utils.urls import path_to_url
-from pip._internal.vcs.versioncontrol import (
- RevOptions,
- VersionControl,
- find_path_to_setup_from_repo_root,
- vcs,
-)
-
-logger = logging.getLogger(__name__)
-
-
-class Mercurial(VersionControl):
- name = 'hg'
- dirname = '.hg'
- repo_name = 'clone'
- schemes = (
- 'hg+file', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http',
- )
-
- @staticmethod
- def get_base_rev_args(rev):
- # type: (str) -> List[str]
- return [rev]
-
- def fetch_new(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- rev_display = rev_options.to_display()
- logger.info(
- 'Cloning hg %s%s to %s',
- url,
- rev_display,
- display_path(dest),
- )
- self.run_command(make_command('clone', '--noupdate', '-q', url, dest))
- self.run_command(
- make_command('update', '-q', rev_options.to_args()),
- cwd=dest,
- )
-
- def switch(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- repo_config = os.path.join(dest, self.dirname, 'hgrc')
- config = configparser.RawConfigParser()
- try:
- config.read(repo_config)
- config.set('paths', 'default', url.secret)
- with open(repo_config, 'w') as config_file:
- config.write(config_file)
- except (OSError, configparser.NoSectionError) as exc:
- logger.warning(
- 'Could not switch Mercurial repository to %s: %s', url, exc,
- )
- else:
- cmd_args = make_command('update', '-q', rev_options.to_args())
- self.run_command(cmd_args, cwd=dest)
-
- def update(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- self.run_command(['pull', '-q'], cwd=dest)
- cmd_args = make_command('update', '-q', rev_options.to_args())
- self.run_command(cmd_args, cwd=dest)
-
- @classmethod
- def get_remote_url(cls, location):
- # type: (str) -> str
- url = cls.run_command(
- ['showconfig', 'paths.default'],
- show_stdout=False,
- stdout_only=True,
- cwd=location,
- ).strip()
- if cls._is_local_repository(url):
- url = path_to_url(url)
- return url.strip()
-
- @classmethod
- def get_revision(cls, location):
- # type: (str) -> str
- """
- Return the repository-local changeset revision number, as an integer.
- """
- current_revision = cls.run_command(
- ['parents', '--template={rev}'],
- show_stdout=False,
- stdout_only=True,
- cwd=location,
- ).strip()
- return current_revision
-
- @classmethod
- def get_requirement_revision(cls, location):
- # type: (str) -> str
- """
- Return the changeset identification hash, as a 40-character
- hexadecimal string
- """
- current_rev_hash = cls.run_command(
- ['parents', '--template={node}'],
- show_stdout=False,
- stdout_only=True,
- cwd=location,
- ).strip()
- return current_rev_hash
-
- @classmethod
- def is_commit_id_equal(cls, dest, name):
- # type: (str, Optional[str]) -> bool
- """Always assume the versions don't match"""
- return False
-
- @classmethod
- def get_subdirectory(cls, location):
- # type: (str) -> Optional[str]
- """
- Return the path to setup.py, relative to the repo root.
- Return None if setup.py is in the repo root.
- """
- # find the repo root
- repo_root = cls.run_command(
- ['root'], show_stdout=False, stdout_only=True, cwd=location
- ).strip()
- if not os.path.isabs(repo_root):
- repo_root = os.path.abspath(os.path.join(location, repo_root))
- return find_path_to_setup_from_repo_root(location, repo_root)
-
- @classmethod
- def get_repository_root(cls, location):
- # type: (str) -> Optional[str]
- loc = super().get_repository_root(location)
- if loc:
- return loc
- try:
- r = cls.run_command(
- ['root'],
- cwd=location,
- show_stdout=False,
- stdout_only=True,
- on_returncode='raise',
- log_failed_cmd=False,
- )
- except BadCommand:
- logger.debug("could not determine if %s is under hg control "
- "because hg is not available", location)
- return None
- except InstallationError:
- return None
- return os.path.normpath(r.rstrip('\r\n'))
-
-
-vcs.register(Mercurial)
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/subversion.py b/venv/Lib/site-packages/pip/_internal/vcs/subversion.py
deleted file mode 100644
index 4d1237c..0000000
--- a/venv/Lib/site-packages/pip/_internal/vcs/subversion.py
+++ /dev/null
@@ -1,329 +0,0 @@
-import logging
-import os
-import re
-from typing import List, Optional, Tuple
-
-from pip._internal.utils.misc import (
- HiddenText,
- display_path,
- is_console_interactive,
- split_auth_from_netloc,
-)
-from pip._internal.utils.subprocess import CommandArgs, make_command
-from pip._internal.vcs.versioncontrol import (
- AuthInfo,
- RemoteNotFoundError,
- RevOptions,
- VersionControl,
- vcs,
-)
-
-logger = logging.getLogger(__name__)
-
-_svn_xml_url_re = re.compile('url="([^"]+)"')
-_svn_rev_re = re.compile(r'committed-rev="(\d+)"')
-_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"')
-_svn_info_xml_url_re = re.compile(r'(.*) ')
-
-
-class Subversion(VersionControl):
- name = 'svn'
- dirname = '.svn'
- repo_name = 'checkout'
- schemes = (
- 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn', 'svn+file'
- )
-
- @classmethod
- def should_add_vcs_url_prefix(cls, remote_url):
- # type: (str) -> bool
- return True
-
- @staticmethod
- def get_base_rev_args(rev):
- # type: (str) -> List[str]
- return ['-r', rev]
-
- @classmethod
- def get_revision(cls, location):
- # type: (str) -> str
- """
- Return the maximum revision for all files under a given location
- """
- # Note: taken from setuptools.command.egg_info
- revision = 0
-
- for base, dirs, _ in os.walk(location):
- if cls.dirname not in dirs:
- dirs[:] = []
- continue # no sense walking uncontrolled subdirs
- dirs.remove(cls.dirname)
- entries_fn = os.path.join(base, cls.dirname, 'entries')
- if not os.path.exists(entries_fn):
- # FIXME: should we warn?
- continue
-
- dirurl, localrev = cls._get_svn_url_rev(base)
-
- if base == location:
- assert dirurl is not None
- base = dirurl + '/' # save the root url
- elif not dirurl or not dirurl.startswith(base):
- dirs[:] = []
- continue # not part of the same svn tree, skip it
- revision = max(revision, localrev)
- return str(revision)
-
- @classmethod
- def get_netloc_and_auth(cls, netloc, scheme):
- # type: (str, str) -> Tuple[str, Tuple[Optional[str], Optional[str]]]
- """
- This override allows the auth information to be passed to svn via the
- --username and --password options instead of via the URL.
- """
- if scheme == 'ssh':
- # The --username and --password options can't be used for
- # svn+ssh URLs, so keep the auth information in the URL.
- return super().get_netloc_and_auth(netloc, scheme)
-
- return split_auth_from_netloc(netloc)
-
- @classmethod
- def get_url_rev_and_auth(cls, url):
- # type: (str) -> Tuple[str, Optional[str], AuthInfo]
- # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it
- url, rev, user_pass = super().get_url_rev_and_auth(url)
- if url.startswith('ssh://'):
- url = 'svn+' + url
- return url, rev, user_pass
-
- @staticmethod
- def make_rev_args(username, password):
- # type: (Optional[str], Optional[HiddenText]) -> CommandArgs
- extra_args = [] # type: CommandArgs
- if username:
- extra_args += ['--username', username]
- if password:
- extra_args += ['--password', password]
-
- return extra_args
-
- @classmethod
- def get_remote_url(cls, location):
- # type: (str) -> str
- # In cases where the source is in a subdirectory, not alongside
- # setup.py we have to look up in the location until we find a real
- # setup.py
- orig_location = location
- while not os.path.exists(os.path.join(location, 'setup.py')):
- last_location = location
- location = os.path.dirname(location)
- if location == last_location:
- # We've traversed up to the root of the filesystem without
- # finding setup.py
- logger.warning(
- "Could not find setup.py for directory %s (tried all "
- "parent directories)",
- orig_location,
- )
- raise RemoteNotFoundError
-
- url, _rev = cls._get_svn_url_rev(location)
- if url is None:
- raise RemoteNotFoundError
-
- return url
-
- @classmethod
- def _get_svn_url_rev(cls, location):
- # type: (str) -> Tuple[Optional[str], int]
- from pip._internal.exceptions import InstallationError
-
- entries_path = os.path.join(location, cls.dirname, 'entries')
- if os.path.exists(entries_path):
- with open(entries_path) as f:
- data = f.read()
- else: # subversion >= 1.7 does not have the 'entries' file
- data = ''
-
- url = None
- if (data.startswith('8') or
- data.startswith('9') or
- data.startswith('10')):
- entries = list(map(str.splitlines, data.split('\n\x0c\n')))
- del entries[0][0] # get rid of the '8'
- url = entries[0][3]
- revs = [int(d[9]) for d in entries if len(d) > 9 and d[9]] + [0]
- elif data.startswith('= 1.7
- # Note that using get_remote_call_options is not necessary here
- # because `svn info` is being run against a local directory.
- # We don't need to worry about making sure interactive mode
- # is being used to prompt for passwords, because passwords
- # are only potentially needed for remote server requests.
- xml = cls.run_command(
- ['info', '--xml', location],
- show_stdout=False,
- stdout_only=True,
- )
- match = _svn_info_xml_url_re.search(xml)
- assert match is not None
- url = match.group(1)
- revs = [
- int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)
- ]
- except InstallationError:
- url, revs = None, []
-
- if revs:
- rev = max(revs)
- else:
- rev = 0
-
- return url, rev
-
- @classmethod
- def is_commit_id_equal(cls, dest, name):
- # type: (str, Optional[str]) -> bool
- """Always assume the versions don't match"""
- return False
-
- def __init__(self, use_interactive=None):
- # type: (bool) -> None
- if use_interactive is None:
- use_interactive = is_console_interactive()
- self.use_interactive = use_interactive
-
- # This member is used to cache the fetched version of the current
- # ``svn`` client.
- # Special value definitions:
- # None: Not evaluated yet.
- # Empty tuple: Could not parse version.
- self._vcs_version = None # type: Optional[Tuple[int, ...]]
-
- super().__init__()
-
- def call_vcs_version(self):
- # type: () -> Tuple[int, ...]
- """Query the version of the currently installed Subversion client.
-
- :return: A tuple containing the parts of the version information or
- ``()`` if the version returned from ``svn`` could not be parsed.
- :raises: BadCommand: If ``svn`` is not installed.
- """
- # Example versions:
- # svn, version 1.10.3 (r1842928)
- # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0
- # svn, version 1.7.14 (r1542130)
- # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu
- # svn, version 1.12.0-SlikSvn (SlikSvn/1.12.0)
- # compiled May 28 2019, 13:44:56 on x86_64-microsoft-windows6.2
- version_prefix = 'svn, version '
- version = self.run_command(
- ['--version'], show_stdout=False, stdout_only=True
- )
- if not version.startswith(version_prefix):
- return ()
-
- version = version[len(version_prefix):].split()[0]
- version_list = version.partition('-')[0].split('.')
- try:
- parsed_version = tuple(map(int, version_list))
- except ValueError:
- return ()
-
- return parsed_version
-
- def get_vcs_version(self):
- # type: () -> Tuple[int, ...]
- """Return the version of the currently installed Subversion client.
-
- If the version of the Subversion client has already been queried,
- a cached value will be used.
-
- :return: A tuple containing the parts of the version information or
- ``()`` if the version returned from ``svn`` could not be parsed.
- :raises: BadCommand: If ``svn`` is not installed.
- """
- if self._vcs_version is not None:
- # Use cached version, if available.
- # If parsing the version failed previously (empty tuple),
- # do not attempt to parse it again.
- return self._vcs_version
-
- vcs_version = self.call_vcs_version()
- self._vcs_version = vcs_version
- return vcs_version
-
- def get_remote_call_options(self):
- # type: () -> CommandArgs
- """Return options to be used on calls to Subversion that contact the server.
-
- These options are applicable for the following ``svn`` subcommands used
- in this class.
-
- - checkout
- - switch
- - update
-
- :return: A list of command line arguments to pass to ``svn``.
- """
- if not self.use_interactive:
- # --non-interactive switch is available since Subversion 0.14.4.
- # Subversion < 1.8 runs in interactive mode by default.
- return ['--non-interactive']
-
- svn_version = self.get_vcs_version()
- # By default, Subversion >= 1.8 runs in non-interactive mode if
- # stdin is not a TTY. Since that is how pip invokes SVN, in
- # call_subprocess(), pip must pass --force-interactive to ensure
- # the user can be prompted for a password, if required.
- # SVN added the --force-interactive option in SVN 1.8. Since
- # e.g. RHEL/CentOS 7, which is supported until 2024, ships with
- # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip
- # can't safely add the option if the SVN version is < 1.8 (or unknown).
- if svn_version >= (1, 8):
- return ['--force-interactive']
-
- return []
-
- def fetch_new(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- rev_display = rev_options.to_display()
- logger.info(
- 'Checking out %s%s to %s',
- url,
- rev_display,
- display_path(dest),
- )
- cmd_args = make_command(
- 'checkout', '-q', self.get_remote_call_options(),
- rev_options.to_args(), url, dest,
- )
- self.run_command(cmd_args)
-
- def switch(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- cmd_args = make_command(
- 'switch', self.get_remote_call_options(), rev_options.to_args(),
- url, dest,
- )
- self.run_command(cmd_args)
-
- def update(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- cmd_args = make_command(
- 'update', self.get_remote_call_options(), rev_options.to_args(),
- dest,
- )
- self.run_command(cmd_args)
-
-
-vcs.register(Subversion)
diff --git a/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py b/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py
deleted file mode 100644
index 97977b5..0000000
--- a/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py
+++ /dev/null
@@ -1,715 +0,0 @@
-"""Handles all VCS (version control) support"""
-
-import logging
-import os
-import shutil
-import sys
-import urllib.parse
-from typing import (
- Any,
- Dict,
- Iterable,
- Iterator,
- List,
- Mapping,
- Optional,
- Tuple,
- Type,
- Union,
-)
-
-from pip._internal.cli.spinners import SpinnerInterface
-from pip._internal.exceptions import BadCommand, InstallationError
-from pip._internal.utils.misc import (
- HiddenText,
- ask_path_exists,
- backup_dir,
- display_path,
- hide_url,
- hide_value,
- rmtree,
-)
-from pip._internal.utils.subprocess import CommandArgs, call_subprocess, make_command
-from pip._internal.utils.urls import get_url_scheme
-
-__all__ = ['vcs']
-
-
-logger = logging.getLogger(__name__)
-
-AuthInfo = Tuple[Optional[str], Optional[str]]
-
-
-def is_url(name):
- # type: (str) -> bool
- """
- Return true if the name looks like a URL.
- """
- scheme = get_url_scheme(name)
- if scheme is None:
- return False
- return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes
-
-
-def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None):
- # type: (str, str, str, Optional[str]) -> str
- """
- Return the URL for a VCS requirement.
-
- Args:
- repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+").
- project_name: the (unescaped) project name.
- """
- egg_project_name = project_name.replace("-", "_")
- req = f'{repo_url}@{rev}#egg={egg_project_name}'
- if subdir:
- req += f'&subdirectory={subdir}'
-
- return req
-
-
-def find_path_to_setup_from_repo_root(location, repo_root):
- # type: (str, str) -> Optional[str]
- """
- Find the path to `setup.py` by searching up the filesystem from `location`.
- Return the path to `setup.py` relative to `repo_root`.
- Return None if `setup.py` is in `repo_root` or cannot be found.
- """
- # find setup.py
- orig_location = location
- while not os.path.exists(os.path.join(location, 'setup.py')):
- last_location = location
- location = os.path.dirname(location)
- if location == last_location:
- # We've traversed up to the root of the filesystem without
- # finding setup.py
- logger.warning(
- "Could not find setup.py for directory %s (tried all "
- "parent directories)",
- orig_location,
- )
- return None
-
- if os.path.samefile(repo_root, location):
- return None
-
- return os.path.relpath(location, repo_root)
-
-
-class RemoteNotFoundError(Exception):
- pass
-
-
-class RevOptions:
-
- """
- Encapsulates a VCS-specific revision to install, along with any VCS
- install options.
-
- Instances of this class should be treated as if immutable.
- """
-
- def __init__(
- self,
- vc_class, # type: Type[VersionControl]
- rev=None, # type: Optional[str]
- extra_args=None, # type: Optional[CommandArgs]
- ):
- # type: (...) -> None
- """
- Args:
- vc_class: a VersionControl subclass.
- rev: the name of the revision to install.
- extra_args: a list of extra options.
- """
- if extra_args is None:
- extra_args = []
-
- self.extra_args = extra_args
- self.rev = rev
- self.vc_class = vc_class
- self.branch_name = None # type: Optional[str]
-
- def __repr__(self):
- # type: () -> str
- return f''
-
- @property
- def arg_rev(self):
- # type: () -> Optional[str]
- if self.rev is None:
- return self.vc_class.default_arg_rev
-
- return self.rev
-
- def to_args(self):
- # type: () -> CommandArgs
- """
- Return the VCS-specific command arguments.
- """
- args = [] # type: CommandArgs
- rev = self.arg_rev
- if rev is not None:
- args += self.vc_class.get_base_rev_args(rev)
- args += self.extra_args
-
- return args
-
- def to_display(self):
- # type: () -> str
- if not self.rev:
- return ''
-
- return f' (to revision {self.rev})'
-
- def make_new(self, rev):
- # type: (str) -> RevOptions
- """
- Make a copy of the current instance, but with a new rev.
-
- Args:
- rev: the name of the revision for the new object.
- """
- return self.vc_class.make_rev_options(rev, extra_args=self.extra_args)
-
-
-class VcsSupport:
- _registry = {} # type: Dict[str, VersionControl]
- schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn']
-
- def __init__(self):
- # type: () -> None
- # Register more schemes with urlparse for various version control
- # systems
- urllib.parse.uses_netloc.extend(self.schemes)
- super().__init__()
-
- def __iter__(self):
- # type: () -> Iterator[str]
- return self._registry.__iter__()
-
- @property
- def backends(self):
- # type: () -> List[VersionControl]
- return list(self._registry.values())
-
- @property
- def dirnames(self):
- # type: () -> List[str]
- return [backend.dirname for backend in self.backends]
-
- @property
- def all_schemes(self):
- # type: () -> List[str]
- schemes = [] # type: List[str]
- for backend in self.backends:
- schemes.extend(backend.schemes)
- return schemes
-
- def register(self, cls):
- # type: (Type[VersionControl]) -> None
- if not hasattr(cls, 'name'):
- logger.warning('Cannot register VCS %s', cls.__name__)
- return
- if cls.name not in self._registry:
- self._registry[cls.name] = cls()
- logger.debug('Registered VCS backend: %s', cls.name)
-
- def unregister(self, name):
- # type: (str) -> None
- if name in self._registry:
- del self._registry[name]
-
- def get_backend_for_dir(self, location):
- # type: (str) -> Optional[VersionControl]
- """
- Return a VersionControl object if a repository of that type is found
- at the given directory.
- """
- vcs_backends = {}
- for vcs_backend in self._registry.values():
- repo_path = vcs_backend.get_repository_root(location)
- if not repo_path:
- continue
- logger.debug('Determine that %s uses VCS: %s',
- location, vcs_backend.name)
- vcs_backends[repo_path] = vcs_backend
-
- if not vcs_backends:
- return None
-
- # Choose the VCS in the inner-most directory. Since all repository
- # roots found here would be either `location` or one of its
- # parents, the longest path should have the most path components,
- # i.e. the backend representing the inner-most repository.
- inner_most_repo_path = max(vcs_backends, key=len)
- return vcs_backends[inner_most_repo_path]
-
- def get_backend_for_scheme(self, scheme):
- # type: (str) -> Optional[VersionControl]
- """
- Return a VersionControl object or None.
- """
- for vcs_backend in self._registry.values():
- if scheme in vcs_backend.schemes:
- return vcs_backend
- return None
-
- def get_backend(self, name):
- # type: (str) -> Optional[VersionControl]
- """
- Return a VersionControl object or None.
- """
- name = name.lower()
- return self._registry.get(name)
-
-
-vcs = VcsSupport()
-
-
-class VersionControl:
- name = ''
- dirname = ''
- repo_name = ''
- # List of supported schemes for this Version Control
- schemes = () # type: Tuple[str, ...]
- # Iterable of environment variable names to pass to call_subprocess().
- unset_environ = () # type: Tuple[str, ...]
- default_arg_rev = None # type: Optional[str]
-
- @classmethod
- def should_add_vcs_url_prefix(cls, remote_url):
- # type: (str) -> bool
- """
- Return whether the vcs prefix (e.g. "git+") should be added to a
- repository's remote url when used in a requirement.
- """
- return not remote_url.lower().startswith(f'{cls.name}:')
-
- @classmethod
- def get_subdirectory(cls, location):
- # type: (str) -> Optional[str]
- """
- Return the path to setup.py, relative to the repo root.
- Return None if setup.py is in the repo root.
- """
- return None
-
- @classmethod
- def get_requirement_revision(cls, repo_dir):
- # type: (str) -> str
- """
- Return the revision string that should be used in a requirement.
- """
- return cls.get_revision(repo_dir)
-
- @classmethod
- def get_src_requirement(cls, repo_dir, project_name):
- # type: (str, str) -> str
- """
- Return the requirement string to use to redownload the files
- currently at the given repository directory.
-
- Args:
- project_name: the (unescaped) project name.
-
- The return value has a form similar to the following:
-
- {repository_url}@{revision}#egg={project_name}
- """
- repo_url = cls.get_remote_url(repo_dir)
-
- if cls.should_add_vcs_url_prefix(repo_url):
- repo_url = f'{cls.name}+{repo_url}'
-
- revision = cls.get_requirement_revision(repo_dir)
- subdir = cls.get_subdirectory(repo_dir)
- req = make_vcs_requirement_url(repo_url, revision, project_name,
- subdir=subdir)
-
- return req
-
- @staticmethod
- def get_base_rev_args(rev):
- # type: (str) -> List[str]
- """
- Return the base revision arguments for a vcs command.
-
- Args:
- rev: the name of a revision to install. Cannot be None.
- """
- raise NotImplementedError
-
- def is_immutable_rev_checkout(self, url, dest):
- # type: (str, str) -> bool
- """
- Return true if the commit hash checked out at dest matches
- the revision in url.
-
- Always return False, if the VCS does not support immutable commit
- hashes.
-
- This method does not check if there are local uncommitted changes
- in dest after checkout, as pip currently has no use case for that.
- """
- return False
-
- @classmethod
- def make_rev_options(cls, rev=None, extra_args=None):
- # type: (Optional[str], Optional[CommandArgs]) -> RevOptions
- """
- Return a RevOptions object.
-
- Args:
- rev: the name of a revision to install.
- extra_args: a list of extra options.
- """
- return RevOptions(cls, rev, extra_args=extra_args)
-
- @classmethod
- def _is_local_repository(cls, repo):
- # type: (str) -> bool
- """
- posix absolute paths start with os.path.sep,
- win32 ones start with drive (like c:\\folder)
- """
- drive, tail = os.path.splitdrive(repo)
- return repo.startswith(os.path.sep) or bool(drive)
-
- @classmethod
- def get_netloc_and_auth(cls, netloc, scheme):
- # type: (str, str) -> Tuple[str, Tuple[Optional[str], Optional[str]]]
- """
- Parse the repository URL's netloc, and return the new netloc to use
- along with auth information.
-
- Args:
- netloc: the original repository URL netloc.
- scheme: the repository URL's scheme without the vcs prefix.
-
- This is mainly for the Subversion class to override, so that auth
- information can be provided via the --username and --password options
- instead of through the URL. For other subclasses like Git without
- such an option, auth information must stay in the URL.
-
- Returns: (netloc, (username, password)).
- """
- return netloc, (None, None)
-
- @classmethod
- def get_url_rev_and_auth(cls, url):
- # type: (str) -> Tuple[str, Optional[str], AuthInfo]
- """
- Parse the repository URL to use, and return the URL, revision,
- and auth info to use.
-
- Returns: (url, rev, (username, password)).
- """
- scheme, netloc, path, query, frag = urllib.parse.urlsplit(url)
- if '+' not in scheme:
- raise ValueError(
- "Sorry, {!r} is a malformed VCS url. "
- "The format is +://, "
- "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url)
- )
- # Remove the vcs prefix.
- scheme = scheme.split('+', 1)[1]
- netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme)
- rev = None
- if '@' in path:
- path, rev = path.rsplit('@', 1)
- if not rev:
- raise InstallationError(
- "The URL {!r} has an empty revision (after @) "
- "which is not supported. Include a revision after @ "
- "or remove @ from the URL.".format(url)
- )
- url = urllib.parse.urlunsplit((scheme, netloc, path, query, ''))
- return url, rev, user_pass
-
- @staticmethod
- def make_rev_args(username, password):
- # type: (Optional[str], Optional[HiddenText]) -> CommandArgs
- """
- Return the RevOptions "extra arguments" to use in obtain().
- """
- return []
-
- def get_url_rev_options(self, url):
- # type: (HiddenText) -> Tuple[HiddenText, RevOptions]
- """
- Return the URL and RevOptions object to use in obtain(),
- as a tuple (url, rev_options).
- """
- secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret)
- username, secret_password = user_pass
- password = None # type: Optional[HiddenText]
- if secret_password is not None:
- password = hide_value(secret_password)
- extra_args = self.make_rev_args(username, password)
- rev_options = self.make_rev_options(rev, extra_args=extra_args)
-
- return hide_url(secret_url), rev_options
-
- @staticmethod
- def normalize_url(url):
- # type: (str) -> str
- """
- Normalize a URL for comparison by unquoting it and removing any
- trailing slash.
- """
- return urllib.parse.unquote(url).rstrip('/')
-
- @classmethod
- def compare_urls(cls, url1, url2):
- # type: (str, str) -> bool
- """
- Compare two repo URLs for identity, ignoring incidental differences.
- """
- return (cls.normalize_url(url1) == cls.normalize_url(url2))
-
- def fetch_new(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- """
- Fetch a revision from a repository, in the case that this is the
- first fetch from the repository.
-
- Args:
- dest: the directory to fetch the repository to.
- rev_options: a RevOptions object.
- """
- raise NotImplementedError
-
- def switch(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- """
- Switch the repo at ``dest`` to point to ``URL``.
-
- Args:
- rev_options: a RevOptions object.
- """
- raise NotImplementedError
-
- def update(self, dest, url, rev_options):
- # type: (str, HiddenText, RevOptions) -> None
- """
- Update an already-existing repo to the given ``rev_options``.
-
- Args:
- rev_options: a RevOptions object.
- """
- raise NotImplementedError
-
- @classmethod
- def is_commit_id_equal(cls, dest, name):
- # type: (str, Optional[str]) -> bool
- """
- Return whether the id of the current commit equals the given name.
-
- Args:
- dest: the repository directory.
- name: a string name.
- """
- raise NotImplementedError
-
- def obtain(self, dest, url):
- # type: (str, HiddenText) -> None
- """
- Install or update in editable mode the package represented by this
- VersionControl object.
-
- :param dest: the repository directory in which to install or update.
- :param url: the repository URL starting with a vcs prefix.
- """
- url, rev_options = self.get_url_rev_options(url)
-
- if not os.path.exists(dest):
- self.fetch_new(dest, url, rev_options)
- return
-
- rev_display = rev_options.to_display()
- if self.is_repository_directory(dest):
- existing_url = self.get_remote_url(dest)
- if self.compare_urls(existing_url, url.secret):
- logger.debug(
- '%s in %s exists, and has correct URL (%s)',
- self.repo_name.title(),
- display_path(dest),
- url,
- )
- if not self.is_commit_id_equal(dest, rev_options.rev):
- logger.info(
- 'Updating %s %s%s',
- display_path(dest),
- self.repo_name,
- rev_display,
- )
- self.update(dest, url, rev_options)
- else:
- logger.info('Skipping because already up-to-date.')
- return
-
- logger.warning(
- '%s %s in %s exists with URL %s',
- self.name,
- self.repo_name,
- display_path(dest),
- existing_url,
- )
- prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ',
- ('s', 'i', 'w', 'b'))
- else:
- logger.warning(
- 'Directory %s already exists, and is not a %s %s.',
- dest,
- self.name,
- self.repo_name,
- )
- # https://github.com/python/mypy/issues/1174
- prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore
- ('i', 'w', 'b'))
-
- logger.warning(
- 'The plan is to install the %s repository %s',
- self.name,
- url,
- )
- response = ask_path_exists('What to do? {}'.format(
- prompt[0]), prompt[1])
-
- if response == 'a':
- sys.exit(-1)
-
- if response == 'w':
- logger.warning('Deleting %s', display_path(dest))
- rmtree(dest)
- self.fetch_new(dest, url, rev_options)
- return
-
- if response == 'b':
- dest_dir = backup_dir(dest)
- logger.warning(
- 'Backing up %s to %s', display_path(dest), dest_dir,
- )
- shutil.move(dest, dest_dir)
- self.fetch_new(dest, url, rev_options)
- return
-
- # Do nothing if the response is "i".
- if response == 's':
- logger.info(
- 'Switching %s %s to %s%s',
- self.repo_name,
- display_path(dest),
- url,
- rev_display,
- )
- self.switch(dest, url, rev_options)
-
- def unpack(self, location, url):
- # type: (str, HiddenText) -> None
- """
- Clean up current location and download the url repository
- (and vcs infos) into location
-
- :param url: the repository URL starting with a vcs prefix.
- """
- if os.path.exists(location):
- rmtree(location)
- self.obtain(location, url=url)
-
- @classmethod
- def get_remote_url(cls, location):
- # type: (str) -> str
- """
- Return the url used at location
-
- Raises RemoteNotFoundError if the repository does not have a remote
- url configured.
- """
- raise NotImplementedError
-
- @classmethod
- def get_revision(cls, location):
- # type: (str) -> str
- """
- Return the current commit id of the files at the given location.
- """
- raise NotImplementedError
-
- @classmethod
- def run_command(
- cls,
- cmd, # type: Union[List[str], CommandArgs]
- show_stdout=True, # type: bool
- cwd=None, # type: Optional[str]
- on_returncode='raise', # type: str
- extra_ok_returncodes=None, # type: Optional[Iterable[int]]
- command_desc=None, # type: Optional[str]
- extra_environ=None, # type: Optional[Mapping[str, Any]]
- spinner=None, # type: Optional[SpinnerInterface]
- log_failed_cmd=True, # type: bool
- stdout_only=False, # type: bool
- ):
- # type: (...) -> str
- """
- Run a VCS subcommand
- This is simply a wrapper around call_subprocess that adds the VCS
- command name, and checks that the VCS is available
- """
- cmd = make_command(cls.name, *cmd)
- try:
- return call_subprocess(cmd, show_stdout, cwd,
- on_returncode=on_returncode,
- extra_ok_returncodes=extra_ok_returncodes,
- command_desc=command_desc,
- extra_environ=extra_environ,
- unset_environ=cls.unset_environ,
- spinner=spinner,
- log_failed_cmd=log_failed_cmd,
- stdout_only=stdout_only)
- except FileNotFoundError:
- # errno.ENOENT = no such file or directory
- # In other words, the VCS executable isn't available
- raise BadCommand(
- f'Cannot find command {cls.name!r} - do you have '
- f'{cls.name!r} installed and in your PATH?')
- except PermissionError:
- # errno.EACCES = Permission denied
- # This error occurs, for instance, when the command is installed
- # only for another user. So, the current user don't have
- # permission to call the other user command.
- raise BadCommand(
- f"No permission to execute {cls.name!r} - install it "
- f"locally, globally (ask admin), or check your PATH. "
- f"See possible solutions at "
- f"https://pip.pypa.io/en/latest/reference/pip_freeze/"
- f"#fixing-permission-denied."
- )
-
- @classmethod
- def is_repository_directory(cls, path):
- # type: (str) -> bool
- """
- Return whether a directory path is a repository directory.
- """
- logger.debug('Checking in %s for %s (%s)...',
- path, cls.dirname, cls.name)
- return os.path.exists(os.path.join(path, cls.dirname))
-
- @classmethod
- def get_repository_root(cls, location):
- # type: (str) -> Optional[str]
- """
- Return the "root" (top-level) directory controlled by the vcs,
- or `None` if the directory is not in any.
-
- It is meant to be overridden to implement smarter detection
- mechanisms for specific vcs.
-
- This can do more than is_repository_directory() alone. For
- example, the Git override checks that Git is actually available.
- """
- if cls.is_repository_directory(location):
- return location
- return None
diff --git a/venv/Lib/site-packages/pip/_internal/wheel_builder.py b/venv/Lib/site-packages/pip/_internal/wheel_builder.py
deleted file mode 100644
index 92f172b..0000000
--- a/venv/Lib/site-packages/pip/_internal/wheel_builder.py
+++ /dev/null
@@ -1,360 +0,0 @@
-"""Orchestrator for building wheels from InstallRequirements.
-"""
-
-import logging
-import os.path
-import re
-import shutil
-from typing import Any, Callable, Iterable, List, Optional, Tuple
-
-from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version
-from pip._vendor.packaging.version import InvalidVersion, Version
-
-from pip._internal.cache import WheelCache
-from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel
-from pip._internal.metadata import get_wheel_distribution
-from pip._internal.models.link import Link
-from pip._internal.models.wheel import Wheel
-from pip._internal.operations.build.wheel import build_wheel_pep517
-from pip._internal.operations.build.wheel_legacy import build_wheel_legacy
-from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed
-from pip._internal.utils.setuptools_build import make_setuptools_clean_args
-from pip._internal.utils.subprocess import call_subprocess
-from pip._internal.utils.temp_dir import TempDirectory
-from pip._internal.utils.urls import path_to_url
-from pip._internal.vcs import vcs
-
-logger = logging.getLogger(__name__)
-
-_egg_info_re = re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.IGNORECASE)
-
-BinaryAllowedPredicate = Callable[[InstallRequirement], bool]
-BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]]
-
-
-def _contains_egg_info(s):
- # type: (str) -> bool
- """Determine whether the string looks like an egg_info.
-
- :param s: The string to parse. E.g. foo-2.1
- """
- return bool(_egg_info_re.search(s))
-
-
-def _should_build(
- req, # type: InstallRequirement
- need_wheel, # type: bool
- check_binary_allowed, # type: BinaryAllowedPredicate
-):
- # type: (...) -> bool
- """Return whether an InstallRequirement should be built into a wheel."""
- if req.constraint:
- # never build requirements that are merely constraints
- return False
- if req.is_wheel:
- if need_wheel:
- logger.info(
- 'Skipping %s, due to already being wheel.', req.name,
- )
- return False
-
- if need_wheel:
- # i.e. pip wheel, not pip install
- return True
-
- # From this point, this concerns the pip install command only
- # (need_wheel=False).
-
- if req.editable or not req.source_dir:
- return False
-
- if req.use_pep517:
- return True
-
- if not check_binary_allowed(req):
- logger.info(
- "Skipping wheel build for %s, due to binaries "
- "being disabled for it.", req.name,
- )
- return False
-
- if not is_wheel_installed():
- # we don't build legacy requirements if wheel is not installed
- logger.info(
- "Using legacy 'setup.py install' for %s, "
- "since package 'wheel' is not installed.", req.name,
- )
- return False
-
- return True
-
-
-def should_build_for_wheel_command(
- req, # type: InstallRequirement
-):
- # type: (...) -> bool
- return _should_build(
- req, need_wheel=True, check_binary_allowed=_always_true
- )
-
-
-def should_build_for_install_command(
- req, # type: InstallRequirement
- check_binary_allowed, # type: BinaryAllowedPredicate
-):
- # type: (...) -> bool
- return _should_build(
- req, need_wheel=False, check_binary_allowed=check_binary_allowed
- )
-
-
-def _should_cache(
- req, # type: InstallRequirement
-):
- # type: (...) -> Optional[bool]
- """
- Return whether a built InstallRequirement can be stored in the persistent
- wheel cache, assuming the wheel cache is available, and _should_build()
- has determined a wheel needs to be built.
- """
- if req.editable or not req.source_dir:
- # never cache editable requirements
- return False
-
- if req.link and req.link.is_vcs:
- # VCS checkout. Do not cache
- # unless it points to an immutable commit hash.
- assert not req.editable
- assert req.source_dir
- vcs_backend = vcs.get_backend_for_scheme(req.link.scheme)
- assert vcs_backend
- if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir):
- return True
- return False
-
- assert req.link
- base, ext = req.link.splitext()
- if _contains_egg_info(base):
- return True
-
- # Otherwise, do not cache.
- return False
-
-
-def _get_cache_dir(
- req, # type: InstallRequirement
- wheel_cache, # type: WheelCache
-):
- # type: (...) -> str
- """Return the persistent or temporary cache directory where the built
- wheel need to be stored.
- """
- cache_available = bool(wheel_cache.cache_dir)
- assert req.link
- if cache_available and _should_cache(req):
- cache_dir = wheel_cache.get_path_for_link(req.link)
- else:
- cache_dir = wheel_cache.get_ephem_path_for_link(req.link)
- return cache_dir
-
-
-def _always_true(_):
- # type: (Any) -> bool
- return True
-
-
-def _verify_one(req, wheel_path):
- # type: (InstallRequirement, str) -> None
- canonical_name = canonicalize_name(req.name or "")
- w = Wheel(os.path.basename(wheel_path))
- if canonicalize_name(w.name) != canonical_name:
- raise InvalidWheelFilename(
- "Wheel has unexpected file name: expected {!r}, "
- "got {!r}".format(canonical_name, w.name),
- )
- dist = get_wheel_distribution(wheel_path, canonical_name)
- dist_verstr = str(dist.version)
- if canonicalize_version(dist_verstr) != canonicalize_version(w.version):
- raise InvalidWheelFilename(
- "Wheel has unexpected file name: expected {!r}, "
- "got {!r}".format(dist_verstr, w.version),
- )
- metadata_version_value = dist.metadata_version
- if metadata_version_value is None:
- raise UnsupportedWheel("Missing Metadata-Version")
- try:
- metadata_version = Version(metadata_version_value)
- except InvalidVersion:
- msg = f"Invalid Metadata-Version: {metadata_version_value}"
- raise UnsupportedWheel(msg)
- if (metadata_version >= Version("1.2")
- and not isinstance(dist.version, Version)):
- raise UnsupportedWheel(
- "Metadata 1.2 mandates PEP 440 version, "
- "but {!r} is not".format(dist_verstr)
- )
-
-
-def _build_one(
- req, # type: InstallRequirement
- output_dir, # type: str
- verify, # type: bool
- build_options, # type: List[str]
- global_options, # type: List[str]
-):
- # type: (...) -> Optional[str]
- """Build one wheel.
-
- :return: The filename of the built wheel, or None if the build failed.
- """
- try:
- ensure_dir(output_dir)
- except OSError as e:
- logger.warning(
- "Building wheel for %s failed: %s",
- req.name, e,
- )
- return None
-
- # Install build deps into temporary directory (PEP 518)
- with req.build_env:
- wheel_path = _build_one_inside_env(
- req, output_dir, build_options, global_options
- )
- if wheel_path and verify:
- try:
- _verify_one(req, wheel_path)
- except (InvalidWheelFilename, UnsupportedWheel) as e:
- logger.warning("Built wheel for %s is invalid: %s", req.name, e)
- return None
- return wheel_path
-
-
-def _build_one_inside_env(
- req, # type: InstallRequirement
- output_dir, # type: str
- build_options, # type: List[str]
- global_options, # type: List[str]
-):
- # type: (...) -> Optional[str]
- with TempDirectory(kind="wheel") as temp_dir:
- assert req.name
- if req.use_pep517:
- assert req.metadata_directory
- assert req.pep517_backend
- if global_options:
- logger.warning(
- 'Ignoring --global-option when building %s using PEP 517', req.name
- )
- if build_options:
- logger.warning(
- 'Ignoring --build-option when building %s using PEP 517', req.name
- )
- wheel_path = build_wheel_pep517(
- name=req.name,
- backend=req.pep517_backend,
- metadata_directory=req.metadata_directory,
- tempd=temp_dir.path,
- )
- else:
- wheel_path = build_wheel_legacy(
- name=req.name,
- setup_py_path=req.setup_py_path,
- source_dir=req.unpacked_source_directory,
- global_options=global_options,
- build_options=build_options,
- tempd=temp_dir.path,
- )
-
- if wheel_path is not None:
- wheel_name = os.path.basename(wheel_path)
- dest_path = os.path.join(output_dir, wheel_name)
- try:
- wheel_hash, length = hash_file(wheel_path)
- shutil.move(wheel_path, dest_path)
- logger.info('Created wheel for %s: '
- 'filename=%s size=%d sha256=%s',
- req.name, wheel_name, length,
- wheel_hash.hexdigest())
- logger.info('Stored in directory: %s', output_dir)
- return dest_path
- except Exception as e:
- logger.warning(
- "Building wheel for %s failed: %s",
- req.name, e,
- )
- # Ignore return, we can't do anything else useful.
- if not req.use_pep517:
- _clean_one_legacy(req, global_options)
- return None
-
-
-def _clean_one_legacy(req, global_options):
- # type: (InstallRequirement, List[str]) -> bool
- clean_args = make_setuptools_clean_args(
- req.setup_py_path,
- global_options=global_options,
- )
-
- logger.info('Running setup.py clean for %s', req.name)
- try:
- call_subprocess(clean_args, cwd=req.source_dir)
- return True
- except Exception:
- logger.error('Failed cleaning build dir for %s', req.name)
- return False
-
-
-def build(
- requirements, # type: Iterable[InstallRequirement]
- wheel_cache, # type: WheelCache
- verify, # type: bool
- build_options, # type: List[str]
- global_options, # type: List[str]
-):
- # type: (...) -> BuildResult
- """Build wheels.
-
- :return: The list of InstallRequirement that succeeded to build and
- the list of InstallRequirement that failed to build.
- """
- if not requirements:
- return [], []
-
- # Build the wheels.
- logger.info(
- 'Building wheels for collected packages: %s',
- ', '.join(req.name for req in requirements), # type: ignore
- )
-
- with indent_log():
- build_successes, build_failures = [], []
- for req in requirements:
- cache_dir = _get_cache_dir(req, wheel_cache)
- wheel_file = _build_one(
- req, cache_dir, verify, build_options, global_options
- )
- if wheel_file:
- # Update the link for this.
- req.link = Link(path_to_url(wheel_file))
- req.local_file_path = req.link.file_path
- assert req.link.is_wheel
- build_successes.append(req)
- else:
- build_failures.append(req)
-
- # notify success/failure
- if build_successes:
- logger.info(
- 'Successfully built %s',
- ' '.join([req.name for req in build_successes]), # type: ignore
- )
- if build_failures:
- logger.info(
- 'Failed to build %s',
- ' '.join([req.name for req in build_failures]), # type: ignore
- )
- # Return a list of requirements that failed to build
- return build_successes, build_failures
diff --git a/venv/Lib/site-packages/pip/_vendor/__init__.py b/venv/Lib/site-packages/pip/_vendor/__init__.py
deleted file mode 100644
index a10ecd6..0000000
--- a/venv/Lib/site-packages/pip/_vendor/__init__.py
+++ /dev/null
@@ -1,113 +0,0 @@
-"""
-pip._vendor is for vendoring dependencies of pip to prevent needing pip to
-depend on something external.
-
-Files inside of pip._vendor should be considered immutable and should only be
-updated to versions from upstream.
-"""
-from __future__ import absolute_import
-
-import glob
-import os.path
-import sys
-
-# Downstream redistributors which have debundled our dependencies should also
-# patch this value to be true. This will trigger the additional patching
-# to cause things like "six" to be available as pip.
-DEBUNDLED = False
-
-# By default, look in this directory for a bunch of .whl files which we will
-# add to the beginning of sys.path before attempting to import anything. This
-# is done to support downstream re-distributors like Debian and Fedora who
-# wish to create their own Wheels for our dependencies to aid in debundling.
-WHEEL_DIR = os.path.abspath(os.path.dirname(__file__))
-
-
-# Define a small helper function to alias our vendored modules to the real ones
-# if the vendored ones do not exist. This idea of this was taken from
-# https://github.com/kennethreitz/requests/pull/2567.
-def vendored(modulename):
- vendored_name = "{0}.{1}".format(__name__, modulename)
-
- try:
- __import__(modulename, globals(), locals(), level=0)
- except ImportError:
- # We can just silently allow import failures to pass here. If we
- # got to this point it means that ``import pip._vendor.whatever``
- # failed and so did ``import whatever``. Since we're importing this
- # upfront in an attempt to alias imports, not erroring here will
- # just mean we get a regular import error whenever pip *actually*
- # tries to import one of these modules to use it, which actually
- # gives us a better error message than we would have otherwise
- # gotten.
- pass
- else:
- sys.modules[vendored_name] = sys.modules[modulename]
- base, head = vendored_name.rsplit(".", 1)
- setattr(sys.modules[base], head, sys.modules[modulename])
-
-
-# If we're operating in a debundled setup, then we want to go ahead and trigger
-# the aliasing of our vendored libraries as well as looking for wheels to add
-# to our sys.path. This will cause all of this code to be a no-op typically
-# however downstream redistributors can enable it in a consistent way across
-# all platforms.
-if DEBUNDLED:
- # Actually look inside of WHEEL_DIR to find .whl files and add them to the
- # front of our sys.path.
- sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path
-
- # Actually alias all of our vendored dependencies.
- vendored("appdirs")
- vendored("cachecontrol")
- vendored("certifi")
- vendored("colorama")
- vendored("distlib")
- vendored("distro")
- vendored("html5lib")
- vendored("six")
- vendored("six.moves")
- vendored("six.moves.urllib")
- vendored("six.moves.urllib.parse")
- vendored("packaging")
- vendored("packaging.version")
- vendored("packaging.specifiers")
- vendored("pep517")
- vendored("pkg_resources")
- vendored("progress")
- vendored("requests")
- vendored("requests.exceptions")
- vendored("requests.packages")
- vendored("requests.packages.urllib3")
- vendored("requests.packages.urllib3._collections")
- vendored("requests.packages.urllib3.connection")
- vendored("requests.packages.urllib3.connectionpool")
- vendored("requests.packages.urllib3.contrib")
- vendored("requests.packages.urllib3.contrib.ntlmpool")
- vendored("requests.packages.urllib3.contrib.pyopenssl")
- vendored("requests.packages.urllib3.exceptions")
- vendored("requests.packages.urllib3.fields")
- vendored("requests.packages.urllib3.filepost")
- vendored("requests.packages.urllib3.packages")
- vendored("requests.packages.urllib3.packages.ordered_dict")
- vendored("requests.packages.urllib3.packages.six")
- vendored("requests.packages.urllib3.packages.ssl_match_hostname")
- vendored("requests.packages.urllib3.packages.ssl_match_hostname."
- "_implementation")
- vendored("requests.packages.urllib3.poolmanager")
- vendored("requests.packages.urllib3.request")
- vendored("requests.packages.urllib3.response")
- vendored("requests.packages.urllib3.util")
- vendored("requests.packages.urllib3.util.connection")
- vendored("requests.packages.urllib3.util.request")
- vendored("requests.packages.urllib3.util.response")
- vendored("requests.packages.urllib3.util.retry")
- vendored("requests.packages.urllib3.util.ssl_")
- vendored("requests.packages.urllib3.util.timeout")
- vendored("requests.packages.urllib3.util.url")
- vendored("resolvelib")
- vendored("tenacity")
- vendored("toml")
- vendored("toml.encoder")
- vendored("toml.decoder")
- vendored("urllib3")
diff --git a/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index fbca9ba..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/__pycache__/appdirs.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/__pycache__/appdirs.cpython-39.pyc
deleted file mode 100644
index e5328e0..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/__pycache__/appdirs.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc
deleted file mode 100644
index 97b7c3a..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc
deleted file mode 100644
index 0d52beb..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/appdirs.py b/venv/Lib/site-packages/pip/_vendor/appdirs.py
deleted file mode 100644
index 33a3b77..0000000
--- a/venv/Lib/site-packages/pip/_vendor/appdirs.py
+++ /dev/null
@@ -1,633 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# Copyright (c) 2005-2010 ActiveState Software Inc.
-# Copyright (c) 2013 Eddy Petrișor
-
-"""Utilities for determining application-specific dirs.
-
-See for details and usage.
-"""
-# Dev Notes:
-# - MSDN on where to store app data files:
-# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120
-# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html
-# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
-
-__version__ = "1.4.4"
-__version_info__ = tuple(int(segment) for segment in __version__.split("."))
-
-
-import sys
-import os
-
-PY3 = sys.version_info[0] == 3
-
-if PY3:
- unicode = str
-
-if sys.platform.startswith('java'):
- import platform
- os_name = platform.java_ver()[3][0]
- if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc.
- system = 'win32'
- elif os_name.startswith('Mac'): # "Mac OS X", etc.
- system = 'darwin'
- else: # "Linux", "SunOS", "FreeBSD", etc.
- # Setting this to "linux2" is not ideal, but only Windows or Mac
- # are actually checked for and the rest of the module expects
- # *sys.platform* style strings.
- system = 'linux2'
-elif sys.platform == 'cli' and os.name == 'nt':
- # Detect Windows in IronPython to match pip._internal.utils.compat.WINDOWS
- # Discussion:
- system = 'win32'
-else:
- system = sys.platform
-
-
-
-def user_data_dir(appname=None, appauthor=None, version=None, roaming=False):
- r"""Return full path to the user-specific data dir for this application.
-
- "appname" is the name of application.
- If None, just the system directory is returned.
- "appauthor" (only used on Windows) is the name of the
- appauthor or distributing body for this application. Typically
- it is the owning company name. This falls back to appname. You may
- pass False to disable it.
- "version" is an optional version path element to append to the
- path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this
- would typically be ".".
- Only applied when appname is present.
- "roaming" (boolean, default False) can be set True to use the Windows
- roaming appdata directory. That means that for users on a Windows
- network setup for roaming profiles, this user data will be
- sync'd on login. See
-
- for a discussion of issues.
-
- Typical user data directories are:
- Mac OS X: ~/Library/Application Support/ # or ~/.config/, if the other does not exist
- Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined
- Win XP (not roaming): C:\Documents and Settings\\Application Data\\
- Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\
- Win 7 (not roaming): C:\Users\\AppData\Local\\
- Win 7 (roaming): C:\Users\\AppData\Roaming\\
-
- For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
- That means, by default "~/.local/share/".
- """
- if system == "win32":
- if appauthor is None:
- appauthor = appname
- const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
- path = os.path.normpath(_get_win_folder(const))
- if appname:
- if appauthor is not False:
- path = os.path.join(path, appauthor, appname)
- else:
- path = os.path.join(path, appname)
- elif system == 'darwin':
- path = os.path.expanduser('~/Library/Application Support/')
- if appname:
- path = os.path.join(path, appname)
- else:
- path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share"))
- if appname:
- path = os.path.join(path, appname)
- if appname and version:
- path = os.path.join(path, version)
- return path
-
-
-def site_data_dir(appname=None, appauthor=None, version=None, multipath=False):
- r"""Return full path to the user-shared data dir for this application.
-
- "appname" is the name of application.
- If None, just the system directory is returned.
- "appauthor" (only used on Windows) is the name of the
- appauthor or distributing body for this application. Typically
- it is the owning company name. This falls back to appname. You may
- pass False to disable it.
- "version" is an optional version path element to append to the
- path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this
- would typically be ".".
- Only applied when appname is present.
- "multipath" is an optional parameter only applicable to *nix
- which indicates that the entire list of data dirs should be
- returned. By default, the first item from XDG_DATA_DIRS is
- returned, or '/usr/local/share/',
- if XDG_DATA_DIRS is not set
-
- Typical site data directories are:
- Mac OS X: /Library/Application Support/
- Unix: /usr/local/share/ or /usr/share/
- Win XP: C:\Documents and Settings\All Users\Application Data\\
- Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
- Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7.
-
- For Unix, this is using the $XDG_DATA_DIRS[0] default.
-
- WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
- """
- if system == "win32":
- if appauthor is None:
- appauthor = appname
- path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA"))
- if appname:
- if appauthor is not False:
- path = os.path.join(path, appauthor, appname)
- else:
- path = os.path.join(path, appname)
- elif system == 'darwin':
- path = os.path.expanduser('/Library/Application Support')
- if appname:
- path = os.path.join(path, appname)
- else:
- # XDG default for $XDG_DATA_DIRS
- # only first, if multipath is False
- path = os.getenv('XDG_DATA_DIRS',
- os.pathsep.join(['/usr/local/share', '/usr/share']))
- pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
- if appname:
- if version:
- appname = os.path.join(appname, version)
- pathlist = [os.path.join(x, appname) for x in pathlist]
-
- if multipath:
- path = os.pathsep.join(pathlist)
- else:
- path = pathlist[0]
- return path
-
- if appname and version:
- path = os.path.join(path, version)
- return path
-
-
-def user_config_dir(appname=None, appauthor=None, version=None, roaming=False):
- r"""Return full path to the user-specific config dir for this application.
-
- "appname" is the name of application.
- If None, just the system directory is returned.
- "appauthor" (only used on Windows) is the name of the
- appauthor or distributing body for this application. Typically
- it is the owning company name. This falls back to appname. You may
- pass False to disable it.
- "version" is an optional version path element to append to the
- path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this
- would typically be ".".
- Only applied when appname is present.
- "roaming" (boolean, default False) can be set True to use the Windows
- roaming appdata directory. That means that for users on a Windows
- network setup for roaming profiles, this user data will be
- sync'd on login. See
-
- for a discussion of issues.
-
- Typical user config directories are:
- Mac OS X: same as user_data_dir
- Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined
- Win *: same as user_data_dir
-
- For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
- That means, by default "~/.config/".
- """
- if system in ["win32", "darwin"]:
- path = user_data_dir(appname, appauthor, None, roaming)
- else:
- path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config"))
- if appname:
- path = os.path.join(path, appname)
- if appname and version:
- path = os.path.join(path, version)
- return path
-
-
-# for the discussion regarding site_config_dir locations
-# see
-def site_config_dir(appname=None, appauthor=None, version=None, multipath=False):
- r"""Return full path to the user-shared data dir for this application.
-
- "appname" is the name of application.
- If None, just the system directory is returned.
- "appauthor" (only used on Windows) is the name of the
- appauthor or distributing body for this application. Typically
- it is the owning company name. This falls back to appname. You may
- pass False to disable it.
- "version" is an optional version path element to append to the
- path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this
- would typically be ".".
- Only applied when appname is present.
- "multipath" is an optional parameter only applicable to *nix
- which indicates that the entire list of config dirs should be
- returned. By default, the first item from XDG_CONFIG_DIRS is
- returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set
-
- Typical site config directories are:
- Mac OS X: same as site_data_dir
- Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in
- $XDG_CONFIG_DIRS
- Win *: same as site_data_dir
- Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
-
- For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False
-
- WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
- """
- if system in ["win32", "darwin"]:
- path = site_data_dir(appname, appauthor)
- if appname and version:
- path = os.path.join(path, version)
- else:
- # XDG default for $XDG_CONFIG_DIRS (missing or empty)
- # see
- # only first, if multipath is False
- path = os.getenv('XDG_CONFIG_DIRS') or '/etc/xdg'
- pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep) if x]
- if appname:
- if version:
- appname = os.path.join(appname, version)
- pathlist = [os.path.join(x, appname) for x in pathlist]
-
- if multipath:
- path = os.pathsep.join(pathlist)
- else:
- path = pathlist[0]
- return path
-
-
-def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True):
- r"""Return full path to the user-specific cache dir for this application.
-
- "appname" is the name of application.
- If None, just the system directory is returned.
- "appauthor" (only used on Windows) is the name of the
- appauthor or distributing body for this application. Typically
- it is the owning company name. This falls back to appname. You may
- pass False to disable it.
- "version" is an optional version path element to append to the
- path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this
- would typically be ".".
- Only applied when appname is present.
- "opinion" (boolean) can be False to disable the appending of
- "Cache" to the base app data dir for Windows. See
- discussion below.
-
- Typical user cache directories are:
- Mac OS X: ~/Library/Caches/
- Unix: ~/.cache/ (XDG default)
- Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache
- Vista: C:\Users\\AppData\Local\\\Cache
-
- On Windows the only suggestion in the MSDN docs is that local settings go in
- the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming
- app data dir (the default returned by `user_data_dir` above). Apps typically
- put cache data somewhere *under* the given dir here. Some examples:
- ...\Mozilla\Firefox\Profiles\\Cache
- ...\Acme\SuperApp\Cache\1.0
- OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
- This can be disabled with the `opinion=False` option.
- """
- if system == "win32":
- if appauthor is None:
- appauthor = appname
- path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
- # When using Python 2, return paths as bytes on Windows like we do on
- # other operating systems. See helper function docs for more details.
- if not PY3 and isinstance(path, unicode):
- path = _win_path_to_bytes(path)
- if appname:
- if appauthor is not False:
- path = os.path.join(path, appauthor, appname)
- else:
- path = os.path.join(path, appname)
- if opinion:
- path = os.path.join(path, "Cache")
- elif system == 'darwin':
- path = os.path.expanduser('~/Library/Caches')
- if appname:
- path = os.path.join(path, appname)
- else:
- path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache'))
- if appname:
- path = os.path.join(path, appname)
- if appname and version:
- path = os.path.join(path, version)
- return path
-
-
-def user_state_dir(appname=None, appauthor=None, version=None, roaming=False):
- r"""Return full path to the user-specific state dir for this application.
-
- "appname" is the name of application.
- If None, just the system directory is returned.
- "appauthor" (only used on Windows) is the name of the
- appauthor or distributing body for this application. Typically
- it is the owning company name. This falls back to appname. You may
- pass False to disable it.
- "version" is an optional version path element to append to the
- path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this
- would typically be ".".
- Only applied when appname is present.
- "roaming" (boolean, default False) can be set True to use the Windows
- roaming appdata directory. That means that for users on a Windows
- network setup for roaming profiles, this user data will be
- sync'd on login. See
-
- for a discussion of issues.
-
- Typical user state directories are:
- Mac OS X: same as user_data_dir
- Unix: ~/.local/state/ # or in $XDG_STATE_HOME, if defined
- Win *: same as user_data_dir
-
- For Unix, we follow this Debian proposal
- to extend the XDG spec and support $XDG_STATE_HOME.
-
- That means, by default "~/.local/state/".
- """
- if system in ["win32", "darwin"]:
- path = user_data_dir(appname, appauthor, None, roaming)
- else:
- path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state"))
- if appname:
- path = os.path.join(path, appname)
- if appname and version:
- path = os.path.join(path, version)
- return path
-
-
-def user_log_dir(appname=None, appauthor=None, version=None, opinion=True):
- r"""Return full path to the user-specific log dir for this application.
-
- "appname" is the name of application.
- If None, just the system directory is returned.
- "appauthor" (only used on Windows) is the name of the
- appauthor or distributing body for this application. Typically
- it is the owning company name. This falls back to appname. You may
- pass False to disable it.
- "version" is an optional version path element to append to the
- path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this
- would typically be ".".
- Only applied when appname is present.
- "opinion" (boolean) can be False to disable the appending of
- "Logs" to the base app data dir for Windows, and "log" to the
- base cache dir for Unix. See discussion below.
-
- Typical user log directories are:
- Mac OS X: ~/Library/Logs/
- Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined
- Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs
- Vista: C:\Users\\AppData\Local\\\Logs
-
- On Windows the only suggestion in the MSDN docs is that local settings
- go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in
- examples of what some windows apps use for a logs dir.)
-
- OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA`
- value for Windows and appends "log" to the user cache dir for Unix.
- This can be disabled with the `opinion=False` option.
- """
- if system == "darwin":
- path = os.path.join(
- os.path.expanduser('~/Library/Logs'),
- appname)
- elif system == "win32":
- path = user_data_dir(appname, appauthor, version)
- version = False
- if opinion:
- path = os.path.join(path, "Logs")
- else:
- path = user_cache_dir(appname, appauthor, version)
- version = False
- if opinion:
- path = os.path.join(path, "log")
- if appname and version:
- path = os.path.join(path, version)
- return path
-
-
-class AppDirs(object):
- """Convenience wrapper for getting application dirs."""
- def __init__(self, appname=None, appauthor=None, version=None,
- roaming=False, multipath=False):
- self.appname = appname
- self.appauthor = appauthor
- self.version = version
- self.roaming = roaming
- self.multipath = multipath
-
- @property
- def user_data_dir(self):
- return user_data_dir(self.appname, self.appauthor,
- version=self.version, roaming=self.roaming)
-
- @property
- def site_data_dir(self):
- return site_data_dir(self.appname, self.appauthor,
- version=self.version, multipath=self.multipath)
-
- @property
- def user_config_dir(self):
- return user_config_dir(self.appname, self.appauthor,
- version=self.version, roaming=self.roaming)
-
- @property
- def site_config_dir(self):
- return site_config_dir(self.appname, self.appauthor,
- version=self.version, multipath=self.multipath)
-
- @property
- def user_cache_dir(self):
- return user_cache_dir(self.appname, self.appauthor,
- version=self.version)
-
- @property
- def user_state_dir(self):
- return user_state_dir(self.appname, self.appauthor,
- version=self.version)
-
- @property
- def user_log_dir(self):
- return user_log_dir(self.appname, self.appauthor,
- version=self.version)
-
-
-#---- internal support stuff
-
-def _get_win_folder_from_registry(csidl_name):
- """This is a fallback technique at best. I'm not sure if using the
- registry for this guarantees us the correct answer for all CSIDL_*
- names.
- """
- if PY3:
- import winreg as _winreg
- else:
- import _winreg
-
- shell_folder_name = {
- "CSIDL_APPDATA": "AppData",
- "CSIDL_COMMON_APPDATA": "Common AppData",
- "CSIDL_LOCAL_APPDATA": "Local AppData",
- }[csidl_name]
-
- key = _winreg.OpenKey(
- _winreg.HKEY_CURRENT_USER,
- r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
- )
- dir, type = _winreg.QueryValueEx(key, shell_folder_name)
- return dir
-
-
-def _get_win_folder_with_pywin32(csidl_name):
- from win32com.shell import shellcon, shell
- dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0)
- # Try to make this a unicode path because SHGetFolderPath does
- # not return unicode strings when there is unicode data in the
- # path.
- try:
- dir = unicode(dir)
-
- # Downgrade to short path name if have highbit chars. See
- # .
- has_high_char = False
- for c in dir:
- if ord(c) > 255:
- has_high_char = True
- break
- if has_high_char:
- try:
- import win32api
- dir = win32api.GetShortPathName(dir)
- except ImportError:
- pass
- except UnicodeError:
- pass
- return dir
-
-
-def _get_win_folder_with_ctypes(csidl_name):
- import ctypes
-
- csidl_const = {
- "CSIDL_APPDATA": 26,
- "CSIDL_COMMON_APPDATA": 35,
- "CSIDL_LOCAL_APPDATA": 28,
- }[csidl_name]
-
- buf = ctypes.create_unicode_buffer(1024)
- ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
-
- # Downgrade to short path name if have highbit chars. See
- # .
- has_high_char = False
- for c in buf:
- if ord(c) > 255:
- has_high_char = True
- break
- if has_high_char:
- buf2 = ctypes.create_unicode_buffer(1024)
- if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
- buf = buf2
-
- return buf.value
-
-def _get_win_folder_with_jna(csidl_name):
- import array
- from com.sun import jna
- from com.sun.jna.platform import win32
-
- buf_size = win32.WinDef.MAX_PATH * 2
- buf = array.zeros('c', buf_size)
- shell = win32.Shell32.INSTANCE
- shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf)
- dir = jna.Native.toString(buf.tostring()).rstrip("\0")
-
- # Downgrade to short path name if have highbit chars. See
- # .
- has_high_char = False
- for c in dir:
- if ord(c) > 255:
- has_high_char = True
- break
- if has_high_char:
- buf = array.zeros('c', buf_size)
- kernel = win32.Kernel32.INSTANCE
- if kernel.GetShortPathName(dir, buf, buf_size):
- dir = jna.Native.toString(buf.tostring()).rstrip("\0")
-
- return dir
-
-if system == "win32":
- try:
- from ctypes import windll
- _get_win_folder = _get_win_folder_with_ctypes
- except ImportError:
- try:
- import com.sun.jna
- _get_win_folder = _get_win_folder_with_jna
- except ImportError:
- _get_win_folder = _get_win_folder_from_registry
-
-
-def _win_path_to_bytes(path):
- """Encode Windows paths to bytes. Only used on Python 2.
-
- Motivation is to be consistent with other operating systems where paths
- are also returned as bytes. This avoids problems mixing bytes and Unicode
- elsewhere in the codebase. For more details and discussion see
- .
-
- If encoding using ASCII and MBCS fails, return the original Unicode path.
- """
- for encoding in ('ASCII', 'MBCS'):
- try:
- return path.encode(encoding)
- except (UnicodeEncodeError, LookupError):
- pass
- return path
-
-
-#---- self test code
-
-if __name__ == "__main__":
- appname = "MyApp"
- appauthor = "MyCompany"
-
- props = ("user_data_dir",
- "user_config_dir",
- "user_cache_dir",
- "user_state_dir",
- "user_log_dir",
- "site_data_dir",
- "site_config_dir")
-
- print("-- app dirs %s --" % __version__)
-
- print("-- app dirs (with optional 'version')")
- dirs = AppDirs(appname, appauthor, version="1.0")
- for prop in props:
- print("%s: %s" % (prop, getattr(dirs, prop)))
-
- print("\n-- app dirs (without optional 'version')")
- dirs = AppDirs(appname, appauthor)
- for prop in props:
- print("%s: %s" % (prop, getattr(dirs, prop)))
-
- print("\n-- app dirs (without optional 'appauthor')")
- dirs = AppDirs(appname)
- for prop in props:
- print("%s: %s" % (prop, getattr(dirs, prop)))
-
- print("\n-- app dirs (with disabled 'appauthor')")
- dirs = AppDirs(appname, appauthor=False)
- for prop in props:
- print("%s: %s" % (prop, getattr(dirs, prop)))
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py
deleted file mode 100644
index a1bbbbe..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py
+++ /dev/null
@@ -1,11 +0,0 @@
-"""CacheControl import Interface.
-
-Make it easy to import from cachecontrol without long namespaces.
-"""
-__author__ = "Eric Larson"
-__email__ = "eric@ionrock.org"
-__version__ = "0.12.6"
-
-from .wrapper import CacheControl
-from .adapter import CacheControlAdapter
-from .controller import CacheController
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index a3bb605..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc
deleted file mode 100644
index 468964d..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc
deleted file mode 100644
index 5a2a826..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc
deleted file mode 100644
index 1f97790..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc
deleted file mode 100644
index c9fa669..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-39.pyc
deleted file mode 100644
index f026d4a..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc
deleted file mode 100644
index 4760dd0..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc
deleted file mode 100644
index 3147c04..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py
deleted file mode 100644
index f1e0ad9..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py
+++ /dev/null
@@ -1,57 +0,0 @@
-import logging
-
-from pip._vendor import requests
-
-from pip._vendor.cachecontrol.adapter import CacheControlAdapter
-from pip._vendor.cachecontrol.cache import DictCache
-from pip._vendor.cachecontrol.controller import logger
-
-from argparse import ArgumentParser
-
-
-def setup_logging():
- logger.setLevel(logging.DEBUG)
- handler = logging.StreamHandler()
- logger.addHandler(handler)
-
-
-def get_session():
- adapter = CacheControlAdapter(
- DictCache(), cache_etags=True, serializer=None, heuristic=None
- )
- sess = requests.Session()
- sess.mount("http://", adapter)
- sess.mount("https://", adapter)
-
- sess.cache_controller = adapter.controller
- return sess
-
-
-def get_args():
- parser = ArgumentParser()
- parser.add_argument("url", help="The URL to try and cache")
- return parser.parse_args()
-
-
-def main(args=None):
- args = get_args()
- sess = get_session()
-
- # Make a request to get a response
- resp = sess.get(args.url)
-
- # Turn on logging
- setup_logging()
-
- # try setting the cache
- sess.cache_controller.cache_response(resp.request, resp.raw)
-
- # Now try to get it
- if sess.cache_controller.cached_request(resp.request):
- print("Cached!")
- else:
- print("Not cached :(")
-
-
-if __name__ == "__main__":
- main()
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py
deleted file mode 100644
index 815650e..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py
+++ /dev/null
@@ -1,133 +0,0 @@
-import types
-import functools
-import zlib
-
-from pip._vendor.requests.adapters import HTTPAdapter
-
-from .controller import CacheController
-from .cache import DictCache
-from .filewrapper import CallbackFileWrapper
-
-
-class CacheControlAdapter(HTTPAdapter):
- invalidating_methods = {"PUT", "DELETE"}
-
- def __init__(
- self,
- cache=None,
- cache_etags=True,
- controller_class=None,
- serializer=None,
- heuristic=None,
- cacheable_methods=None,
- *args,
- **kw
- ):
- super(CacheControlAdapter, self).__init__(*args, **kw)
- self.cache = DictCache() if cache is None else cache
- self.heuristic = heuristic
- self.cacheable_methods = cacheable_methods or ("GET",)
-
- controller_factory = controller_class or CacheController
- self.controller = controller_factory(
- self.cache, cache_etags=cache_etags, serializer=serializer
- )
-
- def send(self, request, cacheable_methods=None, **kw):
- """
- Send a request. Use the request information to see if it
- exists in the cache and cache the response if we need to and can.
- """
- cacheable = cacheable_methods or self.cacheable_methods
- if request.method in cacheable:
- try:
- cached_response = self.controller.cached_request(request)
- except zlib.error:
- cached_response = None
- if cached_response:
- return self.build_response(request, cached_response, from_cache=True)
-
- # check for etags and add headers if appropriate
- request.headers.update(self.controller.conditional_headers(request))
-
- resp = super(CacheControlAdapter, self).send(request, **kw)
-
- return resp
-
- def build_response(
- self, request, response, from_cache=False, cacheable_methods=None
- ):
- """
- Build a response by making a request or using the cache.
-
- This will end up calling send and returning a potentially
- cached response
- """
- cacheable = cacheable_methods or self.cacheable_methods
- if not from_cache and request.method in cacheable:
- # Check for any heuristics that might update headers
- # before trying to cache.
- if self.heuristic:
- response = self.heuristic.apply(response)
-
- # apply any expiration heuristics
- if response.status == 304:
- # We must have sent an ETag request. This could mean
- # that we've been expired already or that we simply
- # have an etag. In either case, we want to try and
- # update the cache if that is the case.
- cached_response = self.controller.update_cached_response(
- request, response
- )
-
- if cached_response is not response:
- from_cache = True
-
- # We are done with the server response, read a
- # possible response body (compliant servers will
- # not return one, but we cannot be 100% sure) and
- # release the connection back to the pool.
- response.read(decode_content=False)
- response.release_conn()
-
- response = cached_response
-
- # We always cache the 301 responses
- elif response.status == 301:
- self.controller.cache_response(request, response)
- else:
- # Wrap the response file with a wrapper that will cache the
- # response when the stream has been consumed.
- response._fp = CallbackFileWrapper(
- response._fp,
- functools.partial(
- self.controller.cache_response, request, response
- ),
- )
- if response.chunked:
- super_update_chunk_length = response._update_chunk_length
-
- def _update_chunk_length(self):
- super_update_chunk_length()
- if self.chunk_left == 0:
- self._fp._close()
-
- response._update_chunk_length = types.MethodType(
- _update_chunk_length, response
- )
-
- resp = super(CacheControlAdapter, self).build_response(request, response)
-
- # See if we should invalidate the cache.
- if request.method in self.invalidating_methods and resp.ok:
- cache_url = self.controller.cache_url(request.url)
- self.cache.delete(cache_url)
-
- # Give the request a from_cache attr to let people use it
- resp.from_cache = from_cache
-
- return resp
-
- def close(self):
- self.cache.close()
- super(CacheControlAdapter, self).close()
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py
deleted file mode 100644
index 94e0773..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""
-The cache object API for implementing caches. The default is a thread
-safe in-memory dictionary.
-"""
-from threading import Lock
-
-
-class BaseCache(object):
-
- def get(self, key):
- raise NotImplementedError()
-
- def set(self, key, value):
- raise NotImplementedError()
-
- def delete(self, key):
- raise NotImplementedError()
-
- def close(self):
- pass
-
-
-class DictCache(BaseCache):
-
- def __init__(self, init_dict=None):
- self.lock = Lock()
- self.data = init_dict or {}
-
- def get(self, key):
- return self.data.get(key, None)
-
- def set(self, key, value):
- with self.lock:
- self.data.update({key: value})
-
- def delete(self, key):
- with self.lock:
- if key in self.data:
- self.data.pop(key)
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py
deleted file mode 100644
index 0e1658f..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from .file_cache import FileCache # noqa
-from .redis_cache import RedisCache # noqa
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index ea5970a..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc
deleted file mode 100644
index f05b17f..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc
deleted file mode 100644
index 994a210..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
deleted file mode 100644
index 607b945..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
+++ /dev/null
@@ -1,146 +0,0 @@
-import hashlib
-import os
-from textwrap import dedent
-
-from ..cache import BaseCache
-from ..controller import CacheController
-
-try:
- FileNotFoundError
-except NameError:
- # py2.X
- FileNotFoundError = (IOError, OSError)
-
-
-def _secure_open_write(filename, fmode):
- # We only want to write to this file, so open it in write only mode
- flags = os.O_WRONLY
-
- # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only
- # will open *new* files.
- # We specify this because we want to ensure that the mode we pass is the
- # mode of the file.
- flags |= os.O_CREAT | os.O_EXCL
-
- # Do not follow symlinks to prevent someone from making a symlink that
- # we follow and insecurely open a cache file.
- if hasattr(os, "O_NOFOLLOW"):
- flags |= os.O_NOFOLLOW
-
- # On Windows we'll mark this file as binary
- if hasattr(os, "O_BINARY"):
- flags |= os.O_BINARY
-
- # Before we open our file, we want to delete any existing file that is
- # there
- try:
- os.remove(filename)
- except (IOError, OSError):
- # The file must not exist already, so we can just skip ahead to opening
- pass
-
- # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a
- # race condition happens between the os.remove and this line, that an
- # error will be raised. Because we utilize a lockfile this should only
- # happen if someone is attempting to attack us.
- fd = os.open(filename, flags, fmode)
- try:
- return os.fdopen(fd, "wb")
-
- except:
- # An error occurred wrapping our FD in a file object
- os.close(fd)
- raise
-
-
-class FileCache(BaseCache):
-
- def __init__(
- self,
- directory,
- forever=False,
- filemode=0o0600,
- dirmode=0o0700,
- use_dir_lock=None,
- lock_class=None,
- ):
-
- if use_dir_lock is not None and lock_class is not None:
- raise ValueError("Cannot use use_dir_lock and lock_class together")
-
- try:
- from lockfile import LockFile
- from lockfile.mkdirlockfile import MkdirLockFile
- except ImportError:
- notice = dedent(
- """
- NOTE: In order to use the FileCache you must have
- lockfile installed. You can install it via pip:
- pip install lockfile
- """
- )
- raise ImportError(notice)
-
- else:
- if use_dir_lock:
- lock_class = MkdirLockFile
-
- elif lock_class is None:
- lock_class = LockFile
-
- self.directory = directory
- self.forever = forever
- self.filemode = filemode
- self.dirmode = dirmode
- self.lock_class = lock_class
-
- @staticmethod
- def encode(x):
- return hashlib.sha224(x.encode()).hexdigest()
-
- def _fn(self, name):
- # NOTE: This method should not change as some may depend on it.
- # See: https://github.com/ionrock/cachecontrol/issues/63
- hashed = self.encode(name)
- parts = list(hashed[:5]) + [hashed]
- return os.path.join(self.directory, *parts)
-
- def get(self, key):
- name = self._fn(key)
- try:
- with open(name, "rb") as fh:
- return fh.read()
-
- except FileNotFoundError:
- return None
-
- def set(self, key, value):
- name = self._fn(key)
-
- # Make sure the directory exists
- try:
- os.makedirs(os.path.dirname(name), self.dirmode)
- except (IOError, OSError):
- pass
-
- with self.lock_class(name) as lock:
- # Write our actual file
- with _secure_open_write(lock.path, self.filemode) as fh:
- fh.write(value)
-
- def delete(self, key):
- name = self._fn(key)
- if not self.forever:
- try:
- os.remove(name)
- except FileNotFoundError:
- pass
-
-
-def url_to_file_path(url, filecache):
- """Return the file cache path based on the URL.
-
- This does not ensure the file exists!
- """
- key = CacheController.cache_url(url)
- return filecache._fn(key)
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py
deleted file mode 100644
index ed705ce..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from __future__ import division
-
-from datetime import datetime
-from pip._vendor.cachecontrol.cache import BaseCache
-
-
-class RedisCache(BaseCache):
-
- def __init__(self, conn):
- self.conn = conn
-
- def get(self, key):
- return self.conn.get(key)
-
- def set(self, key, value, expires=None):
- if not expires:
- self.conn.set(key, value)
- else:
- expires = expires - datetime.utcnow()
- self.conn.setex(key, int(expires.total_seconds()), value)
-
- def delete(self, key):
- self.conn.delete(key)
-
- def clear(self):
- """Helper for clearing all the keys in a database. Use with
- caution!"""
- for key in self.conn.keys():
- self.conn.delete(key)
-
- def close(self):
- """Redis uses connection pooling, no need to close the connection."""
- pass
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py
deleted file mode 100644
index 33b5aed..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py
+++ /dev/null
@@ -1,29 +0,0 @@
-try:
- from urllib.parse import urljoin
-except ImportError:
- from urlparse import urljoin
-
-
-try:
- import cPickle as pickle
-except ImportError:
- import pickle
-
-
-# Handle the case where the requests module has been patched to not have
-# urllib3 bundled as part of its source.
-try:
- from pip._vendor.requests.packages.urllib3.response import HTTPResponse
-except ImportError:
- from pip._vendor.urllib3.response import HTTPResponse
-
-try:
- from pip._vendor.requests.packages.urllib3.util import is_fp_closed
-except ImportError:
- from pip._vendor.urllib3.util import is_fp_closed
-
-# Replicate some six behaviour
-try:
- text_type = unicode
-except NameError:
- text_type = str
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py
deleted file mode 100644
index dafe55c..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py
+++ /dev/null
@@ -1,376 +0,0 @@
-"""
-The httplib2 algorithms ported for use with requests.
-"""
-import logging
-import re
-import calendar
-import time
-from email.utils import parsedate_tz
-
-from pip._vendor.requests.structures import CaseInsensitiveDict
-
-from .cache import DictCache
-from .serialize import Serializer
-
-
-logger = logging.getLogger(__name__)
-
-URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
-
-
-def parse_uri(uri):
- """Parses a URI using the regex given in Appendix B of RFC 3986.
-
- (scheme, authority, path, query, fragment) = parse_uri(uri)
- """
- groups = URI.match(uri).groups()
- return (groups[1], groups[3], groups[4], groups[6], groups[8])
-
-
-class CacheController(object):
- """An interface to see if request should cached or not.
- """
-
- def __init__(
- self, cache=None, cache_etags=True, serializer=None, status_codes=None
- ):
- self.cache = DictCache() if cache is None else cache
- self.cache_etags = cache_etags
- self.serializer = serializer or Serializer()
- self.cacheable_status_codes = status_codes or (200, 203, 300, 301)
-
- @classmethod
- def _urlnorm(cls, uri):
- """Normalize the URL to create a safe key for the cache"""
- (scheme, authority, path, query, fragment) = parse_uri(uri)
- if not scheme or not authority:
- raise Exception("Only absolute URIs are allowed. uri = %s" % uri)
-
- scheme = scheme.lower()
- authority = authority.lower()
-
- if not path:
- path = "/"
-
- # Could do syntax based normalization of the URI before
- # computing the digest. See Section 6.2.2 of Std 66.
- request_uri = query and "?".join([path, query]) or path
- defrag_uri = scheme + "://" + authority + request_uri
-
- return defrag_uri
-
- @classmethod
- def cache_url(cls, uri):
- return cls._urlnorm(uri)
-
- def parse_cache_control(self, headers):
- known_directives = {
- # https://tools.ietf.org/html/rfc7234#section-5.2
- "max-age": (int, True),
- "max-stale": (int, False),
- "min-fresh": (int, True),
- "no-cache": (None, False),
- "no-store": (None, False),
- "no-transform": (None, False),
- "only-if-cached": (None, False),
- "must-revalidate": (None, False),
- "public": (None, False),
- "private": (None, False),
- "proxy-revalidate": (None, False),
- "s-maxage": (int, True),
- }
-
- cc_headers = headers.get("cache-control", headers.get("Cache-Control", ""))
-
- retval = {}
-
- for cc_directive in cc_headers.split(","):
- if not cc_directive.strip():
- continue
-
- parts = cc_directive.split("=", 1)
- directive = parts[0].strip()
-
- try:
- typ, required = known_directives[directive]
- except KeyError:
- logger.debug("Ignoring unknown cache-control directive: %s", directive)
- continue
-
- if not typ or not required:
- retval[directive] = None
- if typ:
- try:
- retval[directive] = typ(parts[1].strip())
- except IndexError:
- if required:
- logger.debug(
- "Missing value for cache-control " "directive: %s",
- directive,
- )
- except ValueError:
- logger.debug(
- "Invalid value for cache-control directive " "%s, must be %s",
- directive,
- typ.__name__,
- )
-
- return retval
-
- def cached_request(self, request):
- """
- Return a cached response if it exists in the cache, otherwise
- return False.
- """
- cache_url = self.cache_url(request.url)
- logger.debug('Looking up "%s" in the cache', cache_url)
- cc = self.parse_cache_control(request.headers)
-
- # Bail out if the request insists on fresh data
- if "no-cache" in cc:
- logger.debug('Request header has "no-cache", cache bypassed')
- return False
-
- if "max-age" in cc and cc["max-age"] == 0:
- logger.debug('Request header has "max_age" as 0, cache bypassed')
- return False
-
- # Request allows serving from the cache, let's see if we find something
- cache_data = self.cache.get(cache_url)
- if cache_data is None:
- logger.debug("No cache entry available")
- return False
-
- # Check whether it can be deserialized
- resp = self.serializer.loads(request, cache_data)
- if not resp:
- logger.warning("Cache entry deserialization failed, entry ignored")
- return False
-
- # If we have a cached 301, return it immediately. We don't
- # need to test our response for other headers b/c it is
- # intrinsically "cacheable" as it is Permanent.
- # See:
- # https://tools.ietf.org/html/rfc7231#section-6.4.2
- #
- # Client can try to refresh the value by repeating the request
- # with cache busting headers as usual (ie no-cache).
- if resp.status == 301:
- msg = (
- 'Returning cached "301 Moved Permanently" response '
- "(ignoring date and etag information)"
- )
- logger.debug(msg)
- return resp
-
- headers = CaseInsensitiveDict(resp.headers)
- if not headers or "date" not in headers:
- if "etag" not in headers:
- # Without date or etag, the cached response can never be used
- # and should be deleted.
- logger.debug("Purging cached response: no date or etag")
- self.cache.delete(cache_url)
- logger.debug("Ignoring cached response: no date")
- return False
-
- now = time.time()
- date = calendar.timegm(parsedate_tz(headers["date"]))
- current_age = max(0, now - date)
- logger.debug("Current age based on date: %i", current_age)
-
- # TODO: There is an assumption that the result will be a
- # urllib3 response object. This may not be best since we
- # could probably avoid instantiating or constructing the
- # response until we know we need it.
- resp_cc = self.parse_cache_control(headers)
-
- # determine freshness
- freshness_lifetime = 0
-
- # Check the max-age pragma in the cache control header
- if "max-age" in resp_cc:
- freshness_lifetime = resp_cc["max-age"]
- logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime)
-
- # If there isn't a max-age, check for an expires header
- elif "expires" in headers:
- expires = parsedate_tz(headers["expires"])
- if expires is not None:
- expire_time = calendar.timegm(expires) - date
- freshness_lifetime = max(0, expire_time)
- logger.debug("Freshness lifetime from expires: %i", freshness_lifetime)
-
- # Determine if we are setting freshness limit in the
- # request. Note, this overrides what was in the response.
- if "max-age" in cc:
- freshness_lifetime = cc["max-age"]
- logger.debug(
- "Freshness lifetime from request max-age: %i", freshness_lifetime
- )
-
- if "min-fresh" in cc:
- min_fresh = cc["min-fresh"]
- # adjust our current age by our min fresh
- current_age += min_fresh
- logger.debug("Adjusted current age from min-fresh: %i", current_age)
-
- # Return entry if it is fresh enough
- if freshness_lifetime > current_age:
- logger.debug('The response is "fresh", returning cached response')
- logger.debug("%i > %i", freshness_lifetime, current_age)
- return resp
-
- # we're not fresh. If we don't have an Etag, clear it out
- if "etag" not in headers:
- logger.debug('The cached response is "stale" with no etag, purging')
- self.cache.delete(cache_url)
-
- # return the original handler
- return False
-
- def conditional_headers(self, request):
- cache_url = self.cache_url(request.url)
- resp = self.serializer.loads(request, self.cache.get(cache_url))
- new_headers = {}
-
- if resp:
- headers = CaseInsensitiveDict(resp.headers)
-
- if "etag" in headers:
- new_headers["If-None-Match"] = headers["ETag"]
-
- if "last-modified" in headers:
- new_headers["If-Modified-Since"] = headers["Last-Modified"]
-
- return new_headers
-
- def cache_response(self, request, response, body=None, status_codes=None):
- """
- Algorithm for caching requests.
-
- This assumes a requests Response object.
- """
- # From httplib2: Don't cache 206's since we aren't going to
- # handle byte range requests
- cacheable_status_codes = status_codes or self.cacheable_status_codes
- if response.status not in cacheable_status_codes:
- logger.debug(
- "Status code %s not in %s", response.status, cacheable_status_codes
- )
- return
-
- response_headers = CaseInsensitiveDict(response.headers)
-
- # If we've been given a body, our response has a Content-Length, that
- # Content-Length is valid then we can check to see if the body we've
- # been given matches the expected size, and if it doesn't we'll just
- # skip trying to cache it.
- if (
- body is not None
- and "content-length" in response_headers
- and response_headers["content-length"].isdigit()
- and int(response_headers["content-length"]) != len(body)
- ):
- return
-
- cc_req = self.parse_cache_control(request.headers)
- cc = self.parse_cache_control(response_headers)
-
- cache_url = self.cache_url(request.url)
- logger.debug('Updating cache with response from "%s"', cache_url)
-
- # Delete it from the cache if we happen to have it stored there
- no_store = False
- if "no-store" in cc:
- no_store = True
- logger.debug('Response header has "no-store"')
- if "no-store" in cc_req:
- no_store = True
- logger.debug('Request header has "no-store"')
- if no_store and self.cache.get(cache_url):
- logger.debug('Purging existing cache entry to honor "no-store"')
- self.cache.delete(cache_url)
- if no_store:
- return
-
- # https://tools.ietf.org/html/rfc7234#section-4.1:
- # A Vary header field-value of "*" always fails to match.
- # Storing such a response leads to a deserialization warning
- # during cache lookup and is not allowed to ever be served,
- # so storing it can be avoided.
- if "*" in response_headers.get("vary", ""):
- logger.debug('Response header has "Vary: *"')
- return
-
- # If we've been given an etag, then keep the response
- if self.cache_etags and "etag" in response_headers:
- logger.debug("Caching due to etag")
- self.cache.set(
- cache_url, self.serializer.dumps(request, response, body=body)
- )
-
- # Add to the cache any 301s. We do this before looking that
- # the Date headers.
- elif response.status == 301:
- logger.debug("Caching permanant redirect")
- self.cache.set(cache_url, self.serializer.dumps(request, response))
-
- # Add to the cache if the response headers demand it. If there
- # is no date header then we can't do anything about expiring
- # the cache.
- elif "date" in response_headers:
- # cache when there is a max-age > 0
- if "max-age" in cc and cc["max-age"] > 0:
- logger.debug("Caching b/c date exists and max-age > 0")
- self.cache.set(
- cache_url, self.serializer.dumps(request, response, body=body)
- )
-
- # If the request can expire, it means we should cache it
- # in the meantime.
- elif "expires" in response_headers:
- if response_headers["expires"]:
- logger.debug("Caching b/c of expires header")
- self.cache.set(
- cache_url, self.serializer.dumps(request, response, body=body)
- )
-
- def update_cached_response(self, request, response):
- """On a 304 we will get a new set of headers that we want to
- update our cached value with, assuming we have one.
-
- This should only ever be called when we've sent an ETag and
- gotten a 304 as the response.
- """
- cache_url = self.cache_url(request.url)
-
- cached_response = self.serializer.loads(request, self.cache.get(cache_url))
-
- if not cached_response:
- # we didn't have a cached response
- return response
-
- # Lets update our headers with the headers from the new request:
- # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1
- #
- # The server isn't supposed to send headers that would make
- # the cached body invalid. But... just in case, we'll be sure
- # to strip out ones we know that might be problmatic due to
- # typical assumptions.
- excluded_headers = ["content-length"]
-
- cached_response.headers.update(
- dict(
- (k, v)
- for k, v in response.headers.items()
- if k.lower() not in excluded_headers
- )
- )
-
- # we want a 200 b/c we have content via the cache
- cached_response.status = 200
-
- # update our cache
- self.cache.set(cache_url, self.serializer.dumps(request, cached_response))
-
- return cached_response
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py
deleted file mode 100644
index 30ed4c5..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py
+++ /dev/null
@@ -1,80 +0,0 @@
-from io import BytesIO
-
-
-class CallbackFileWrapper(object):
- """
- Small wrapper around a fp object which will tee everything read into a
- buffer, and when that file is closed it will execute a callback with the
- contents of that buffer.
-
- All attributes are proxied to the underlying file object.
-
- This class uses members with a double underscore (__) leading prefix so as
- not to accidentally shadow an attribute.
- """
-
- def __init__(self, fp, callback):
- self.__buf = BytesIO()
- self.__fp = fp
- self.__callback = callback
-
- def __getattr__(self, name):
- # The vaguaries of garbage collection means that self.__fp is
- # not always set. By using __getattribute__ and the private
- # name[0] allows looking up the attribute value and raising an
- # AttributeError when it doesn't exist. This stop thigns from
- # infinitely recursing calls to getattr in the case where
- # self.__fp hasn't been set.
- #
- # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers
- fp = self.__getattribute__("_CallbackFileWrapper__fp")
- return getattr(fp, name)
-
- def __is_fp_closed(self):
- try:
- return self.__fp.fp is None
-
- except AttributeError:
- pass
-
- try:
- return self.__fp.closed
-
- except AttributeError:
- pass
-
- # We just don't cache it then.
- # TODO: Add some logging here...
- return False
-
- def _close(self):
- if self.__callback:
- self.__callback(self.__buf.getvalue())
-
- # We assign this to None here, because otherwise we can get into
- # really tricky problems where the CPython interpreter dead locks
- # because the callback is holding a reference to something which
- # has a __del__ method. Setting this to None breaks the cycle
- # and allows the garbage collector to do it's thing normally.
- self.__callback = None
-
- def read(self, amt=None):
- data = self.__fp.read(amt)
- self.__buf.write(data)
- if self.__is_fp_closed():
- self._close()
-
- return data
-
- def _safe_read(self, amt):
- data = self.__fp._safe_read(amt)
- if amt == 2 and data == b"\r\n":
- # urllib executes this read to toss the CRLF at the end
- # of the chunk.
- return data
-
- self.__buf.write(data)
- if self.__is_fp_closed():
- self._close()
-
- return data
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py
deleted file mode 100644
index 6c0e979..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py
+++ /dev/null
@@ -1,135 +0,0 @@
-import calendar
-import time
-
-from email.utils import formatdate, parsedate, parsedate_tz
-
-from datetime import datetime, timedelta
-
-TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT"
-
-
-def expire_after(delta, date=None):
- date = date or datetime.utcnow()
- return date + delta
-
-
-def datetime_to_header(dt):
- return formatdate(calendar.timegm(dt.timetuple()))
-
-
-class BaseHeuristic(object):
-
- def warning(self, response):
- """
- Return a valid 1xx warning header value describing the cache
- adjustments.
-
- The response is provided too allow warnings like 113
- http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need
- to explicitly say response is over 24 hours old.
- """
- return '110 - "Response is Stale"'
-
- def update_headers(self, response):
- """Update the response headers with any new headers.
-
- NOTE: This SHOULD always include some Warning header to
- signify that the response was cached by the client, not
- by way of the provided headers.
- """
- return {}
-
- def apply(self, response):
- updated_headers = self.update_headers(response)
-
- if updated_headers:
- response.headers.update(updated_headers)
- warning_header_value = self.warning(response)
- if warning_header_value is not None:
- response.headers.update({"Warning": warning_header_value})
-
- return response
-
-
-class OneDayCache(BaseHeuristic):
- """
- Cache the response by providing an expires 1 day in the
- future.
- """
-
- def update_headers(self, response):
- headers = {}
-
- if "expires" not in response.headers:
- date = parsedate(response.headers["date"])
- expires = expire_after(timedelta(days=1), date=datetime(*date[:6]))
- headers["expires"] = datetime_to_header(expires)
- headers["cache-control"] = "public"
- return headers
-
-
-class ExpiresAfter(BaseHeuristic):
- """
- Cache **all** requests for a defined time period.
- """
-
- def __init__(self, **kw):
- self.delta = timedelta(**kw)
-
- def update_headers(self, response):
- expires = expire_after(self.delta)
- return {"expires": datetime_to_header(expires), "cache-control": "public"}
-
- def warning(self, response):
- tmpl = "110 - Automatically cached for %s. Response might be stale"
- return tmpl % self.delta
-
-
-class LastModified(BaseHeuristic):
- """
- If there is no Expires header already, fall back on Last-Modified
- using the heuristic from
- http://tools.ietf.org/html/rfc7234#section-4.2.2
- to calculate a reasonable value.
-
- Firefox also does something like this per
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ
- http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397
- Unlike mozilla we limit this to 24-hr.
- """
- cacheable_by_default_statuses = {
- 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501
- }
-
- def update_headers(self, resp):
- headers = resp.headers
-
- if "expires" in headers:
- return {}
-
- if "cache-control" in headers and headers["cache-control"] != "public":
- return {}
-
- if resp.status not in self.cacheable_by_default_statuses:
- return {}
-
- if "date" not in headers or "last-modified" not in headers:
- return {}
-
- date = calendar.timegm(parsedate_tz(headers["date"]))
- last_modified = parsedate(headers["last-modified"])
- if date is None or last_modified is None:
- return {}
-
- now = time.time()
- current_age = max(0, now - date)
- delta = date - calendar.timegm(last_modified)
- freshness_lifetime = max(0, min(delta / 10, 24 * 3600))
- if freshness_lifetime <= current_age:
- return {}
-
- expires = date + freshness_lifetime
- return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))}
-
- def warning(self, resp):
- return None
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py
deleted file mode 100644
index 3b6ec2d..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py
+++ /dev/null
@@ -1,188 +0,0 @@
-import base64
-import io
-import json
-import zlib
-
-from pip._vendor import msgpack
-from pip._vendor.requests.structures import CaseInsensitiveDict
-
-from .compat import HTTPResponse, pickle, text_type
-
-
-def _b64_decode_bytes(b):
- return base64.b64decode(b.encode("ascii"))
-
-
-def _b64_decode_str(s):
- return _b64_decode_bytes(s).decode("utf8")
-
-
-class Serializer(object):
-
- def dumps(self, request, response, body=None):
- response_headers = CaseInsensitiveDict(response.headers)
-
- if body is None:
- body = response.read(decode_content=False)
-
- # NOTE: 99% sure this is dead code. I'm only leaving it
- # here b/c I don't have a test yet to prove
- # it. Basically, before using
- # `cachecontrol.filewrapper.CallbackFileWrapper`,
- # this made an effort to reset the file handle. The
- # `CallbackFileWrapper` short circuits this code by
- # setting the body as the content is consumed, the
- # result being a `body` argument is *always* passed
- # into cache_response, and in turn,
- # `Serializer.dump`.
- response._fp = io.BytesIO(body)
-
- # NOTE: This is all a bit weird, but it's really important that on
- # Python 2.x these objects are unicode and not str, even when
- # they contain only ascii. The problem here is that msgpack
- # understands the difference between unicode and bytes and we
- # have it set to differentiate between them, however Python 2
- # doesn't know the difference. Forcing these to unicode will be
- # enough to have msgpack know the difference.
- data = {
- u"response": {
- u"body": body,
- u"headers": dict(
- (text_type(k), text_type(v)) for k, v in response.headers.items()
- ),
- u"status": response.status,
- u"version": response.version,
- u"reason": text_type(response.reason),
- u"strict": response.strict,
- u"decode_content": response.decode_content,
- }
- }
-
- # Construct our vary headers
- data[u"vary"] = {}
- if u"vary" in response_headers:
- varied_headers = response_headers[u"vary"].split(",")
- for header in varied_headers:
- header = text_type(header).strip()
- header_value = request.headers.get(header, None)
- if header_value is not None:
- header_value = text_type(header_value)
- data[u"vary"][header] = header_value
-
- return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)])
-
- def loads(self, request, data):
- # Short circuit if we've been given an empty set of data
- if not data:
- return
-
- # Determine what version of the serializer the data was serialized
- # with
- try:
- ver, data = data.split(b",", 1)
- except ValueError:
- ver = b"cc=0"
-
- # Make sure that our "ver" is actually a version and isn't a false
- # positive from a , being in the data stream.
- if ver[:3] != b"cc=":
- data = ver + data
- ver = b"cc=0"
-
- # Get the version number out of the cc=N
- ver = ver.split(b"=", 1)[-1].decode("ascii")
-
- # Dispatch to the actual load method for the given version
- try:
- return getattr(self, "_loads_v{}".format(ver))(request, data)
-
- except AttributeError:
- # This is a version we don't have a loads function for, so we'll
- # just treat it as a miss and return None
- return
-
- def prepare_response(self, request, cached):
- """Verify our vary headers match and construct a real urllib3
- HTTPResponse object.
- """
- # Special case the '*' Vary value as it means we cannot actually
- # determine if the cached response is suitable for this request.
- # This case is also handled in the controller code when creating
- # a cache entry, but is left here for backwards compatibility.
- if "*" in cached.get("vary", {}):
- return
-
- # Ensure that the Vary headers for the cached response match our
- # request
- for header, value in cached.get("vary", {}).items():
- if request.headers.get(header, None) != value:
- return
-
- body_raw = cached["response"].pop("body")
-
- headers = CaseInsensitiveDict(data=cached["response"]["headers"])
- if headers.get("transfer-encoding", "") == "chunked":
- headers.pop("transfer-encoding")
-
- cached["response"]["headers"] = headers
-
- try:
- body = io.BytesIO(body_raw)
- except TypeError:
- # This can happen if cachecontrol serialized to v1 format (pickle)
- # using Python 2. A Python 2 str(byte string) will be unpickled as
- # a Python 3 str (unicode string), which will cause the above to
- # fail with:
- #
- # TypeError: 'str' does not support the buffer interface
- body = io.BytesIO(body_raw.encode("utf8"))
-
- return HTTPResponse(body=body, preload_content=False, **cached["response"])
-
- def _loads_v0(self, request, data):
- # The original legacy cache data. This doesn't contain enough
- # information to construct everything we need, so we'll treat this as
- # a miss.
- return
-
- def _loads_v1(self, request, data):
- try:
- cached = pickle.loads(data)
- except ValueError:
- return
-
- return self.prepare_response(request, cached)
-
- def _loads_v2(self, request, data):
- try:
- cached = json.loads(zlib.decompress(data).decode("utf8"))
- except (ValueError, zlib.error):
- return
-
- # We need to decode the items that we've base64 encoded
- cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"])
- cached["response"]["headers"] = dict(
- (_b64_decode_str(k), _b64_decode_str(v))
- for k, v in cached["response"]["headers"].items()
- )
- cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"])
- cached["vary"] = dict(
- (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v)
- for k, v in cached["vary"].items()
- )
-
- return self.prepare_response(request, cached)
-
- def _loads_v3(self, request, data):
- # Due to Python 2 encoding issues, it's impossible to know for sure
- # exactly how to load v3 entries, thus we'll treat these as a miss so
- # that they get rewritten out as v4 entries.
- return
-
- def _loads_v4(self, request, data):
- try:
- cached = msgpack.loads(data, raw=False)
- except ValueError:
- return
-
- return self.prepare_response(request, cached)
diff --git a/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py
deleted file mode 100644
index d8e6fc6..0000000
--- a/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from .adapter import CacheControlAdapter
-from .cache import DictCache
-
-
-def CacheControl(
- sess,
- cache=None,
- cache_etags=True,
- serializer=None,
- heuristic=None,
- controller_class=None,
- adapter_class=None,
- cacheable_methods=None,
-):
-
- cache = DictCache() if cache is None else cache
- adapter_class = adapter_class or CacheControlAdapter
- adapter = adapter_class(
- cache,
- cache_etags=cache_etags,
- serializer=serializer,
- heuristic=heuristic,
- controller_class=controller_class,
- cacheable_methods=cacheable_methods,
- )
- sess.mount("http://", adapter)
- sess.mount("https://", adapter)
-
- return sess
diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py b/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py
deleted file mode 100644
index 17aaf90..0000000
--- a/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from .core import contents, where
-
-__version__ = "2020.12.05"
diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py b/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py
deleted file mode 100644
index 0037634..0000000
--- a/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import argparse
-
-from pip._vendor.certifi import contents, where
-
-parser = argparse.ArgumentParser()
-parser.add_argument("-c", "--contents", action="store_true")
-args = parser.parse_args()
-
-if args.contents:
- print(contents())
-else:
- print(where())
diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 581e52b..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-39.pyc
deleted file mode 100644
index 208febe..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem b/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem
deleted file mode 100644
index c9459dc..0000000
--- a/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem
+++ /dev/null
@@ -1,4325 +0,0 @@
-
-# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
-# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
-# Label: "GlobalSign Root CA"
-# Serial: 4835703278459707669005204
-# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
-# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
-# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
-MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
-AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
-yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
-38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
-AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
-DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
-HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
-# Label: "GlobalSign Root CA - R2"
-# Serial: 4835703278459682885658125
-# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
-# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
-# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
-MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
-v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
-eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
-tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
-C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
-zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
-mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
-V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
-bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
-3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
-J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
-291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
-ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
-AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
-# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
-# Label: "Entrust.net Premium 2048 Secure Server CA"
-# Serial: 946069240
-# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
-# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
-# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
-MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
-LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
-YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
-A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
-K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
-sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
-MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
-XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
-HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
-4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
-j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
-U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
-zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
-u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
-bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
-fF6adulZkMV8gzURZVE=
------END CERTIFICATE-----
-
-# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
-# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
-# Label: "Baltimore CyberTrust Root"
-# Serial: 33554617
-# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
-# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
-# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
-RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
-VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
-DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
-ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
-VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
-mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
-IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
-mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
-XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
-dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
-jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
-BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
-DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
-9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
-jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
-Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
-ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
-R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
-# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
-# Label: "Entrust Root Certification Authority"
-# Serial: 1164660820
-# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
-# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
-# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
-Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
-KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
-NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
-NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
-ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
-BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
-Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
-4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
-KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
-rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
-94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
-sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
-gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
-kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
-vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
-O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
-AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
-9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
-eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
-0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
-# Subject: CN=AAA Certificate Services O=Comodo CA Limited
-# Label: "Comodo AAA Services root"
-# Serial: 1
-# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
-# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
-# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
-YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
-GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
-BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
-3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
-YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
-rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
-ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
-oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
-QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
-b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
-AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
-GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
-G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
-l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
-smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
-# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
-# Label: "QuoVadis Root CA"
-# Serial: 985026699
-# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
-# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
-# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
-MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
-IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
-dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
-li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
-rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
-WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
-F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
-xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
-Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
-dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
-ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
-IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
-c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
-ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
-KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
-KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
-y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
-dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
-VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
-fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
-7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
-cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
-mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
-xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
-SnQ2+Q==
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 2"
-# Serial: 1289
-# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
-# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
-# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
-GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
-Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
-WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
-rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
-+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
-ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
-Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
-PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
-/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
-oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
-yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
-EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
-A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
-MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
-BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
-g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
-fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
-WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
-B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
-hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
-TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
-mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
-ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
-4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
-8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 3"
-# Serial: 1478
-# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
-# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
-# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
-V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
-4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
-H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
-8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
-vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
-mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
-btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
-T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
-WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
-c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
-4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
-VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
-CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
-aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
-dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
-czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
-A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
-Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
-7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
-d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
-+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
-4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
-t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
-DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
-k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
-zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
-Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
-mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
-4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
-
-# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
-# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
-# Label: "Security Communication Root CA"
-# Serial: 0
-# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
-# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
-# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
-MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
-dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
-WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
-VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
-9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
-DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
-Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
-QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
-xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
-A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
-kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
-Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
-Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
-JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
-RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
------END CERTIFICATE-----
-
-# Issuer: CN=Sonera Class2 CA O=Sonera
-# Subject: CN=Sonera Class2 CA O=Sonera
-# Label: "Sonera Class 2 Root CA"
-# Serial: 29
-# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
-# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
-# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
-MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
-MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
-BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
-Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
-5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
-3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
-vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
-8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
-DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
-MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
-zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
-3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
-FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
-Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
-ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
------END CERTIFICATE-----
-
-# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
-# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
-# Label: "XRamp Global CA Root"
-# Serial: 107108908803651509692980124233745014957
-# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
-# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
-# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
-gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
-MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
-UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
-NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
-dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
-dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
-38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
-KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
-DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
-qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
-JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
-PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
-BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
-jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
-eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
-vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
-IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
-i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
-O+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
-
-# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
-# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
-# Label: "Go Daddy Class 2 CA"
-# Serial: 0
-# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
-# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
-# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
-MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
-YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
-MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
-ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
-MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
-ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
-PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
-wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
-EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
-avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
-YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
-sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
-/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
-IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
-OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
-TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
-dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
-ReYNnyicsbkqWletNw+vHX/bvZ8=
------END CERTIFICATE-----
-
-# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
-# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
-# Label: "Starfield Class 2 CA"
-# Serial: 0
-# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
-# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
-# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
-MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
-U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
-NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
-ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
-ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
-DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
-8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
-+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
-X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
-K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
-1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
-A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
-zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
-YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
-bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
-DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
-L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
-eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
-VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
-WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root CA"
-# Serial: 17154717934120587862167794914071425081
-# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
-# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
-# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
-JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
-mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
-wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
-VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
-AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
-AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
-pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
-dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
-fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
-NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
-H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root CA"
-# Serial: 10944719598952040374951832963794454346
-# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
-# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
-# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
-QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
-CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
-nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
-43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
-T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
-gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
-BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
-TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
-DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
-hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
-06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
-PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
-YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert High Assurance EV Root CA"
-# Serial: 3553400076410547919724730734378100087
-# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
-# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
-# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
-LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
-RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
-+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
-PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
-xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
-Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
-hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
-EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
-FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
-nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
-eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
-hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
-Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
-+OkuE6N36B9K
------END CERTIFICATE-----
-
-# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
-# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
-# Label: "DST Root CA X3"
-# Serial: 91299735575339953335919266965803778155
-# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
-# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
-# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
-MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
-DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
-PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
-Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
-rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
-OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
-xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
-7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
-aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
-SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
-ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
-AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
-R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
-JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
-Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
-
-# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
-# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
-# Label: "SwissSign Gold CA - G2"
-# Serial: 13492815561806991280
-# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
-# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
-# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
-biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
-MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
-d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
-76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
-bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
-6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
-emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
-MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
-MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
-MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
-FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
-aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
-gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
-qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
-lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
-8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
-45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
-UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
-O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
-bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
-GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
-77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
-hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
-92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
-Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
-ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
-Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
-# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
-# Label: "SwissSign Silver CA - G2"
-# Serial: 5700383053117599563
-# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
-# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
-# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
-BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
-IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
-RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
-U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
-Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
-YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
-nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
-6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
-eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
-c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
-MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
-HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
-jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
-5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
-rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
-F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
-wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
-AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
-WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
-xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
-2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
-IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
-aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
-em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
-dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
-OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
-hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
-tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
-
-# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
-# Subject: CN=SecureTrust CA O=SecureTrust Corporation
-# Label: "SecureTrust CA"
-# Serial: 17199774589125277788362757014266862032
-# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
-# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
-# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
-MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
-cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
-Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
-0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
-wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
-7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
-8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
-BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
-JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
-NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
-6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
-3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
-D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
-CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-# Issuer: CN=Secure Global CA O=SecureTrust Corporation
-# Subject: CN=Secure Global CA O=SecureTrust Corporation
-# Label: "Secure Global CA"
-# Serial: 9751836167731051554232119481456978597
-# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
-# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
-# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
-MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
-Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
-iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
-/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
-jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
-HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
-sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
-gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
-KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
-AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
-URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
-H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
-I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
-iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
-# Label: "COMODO Certification Authority"
-# Serial: 104350513648249232941998508985834464573
-# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
-# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
-# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
-YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
-RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
-UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
-2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
-Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
-+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
-DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
-nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
-/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
-QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
-SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
-IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
-zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
-BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
-ZQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
-# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
-# Label: "Network Solutions Certificate Authority"
-# Serial: 116697915152937497490437556386812487904
-# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
-# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
-# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
-MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
-UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
-ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
-c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
-OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
-mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
-BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
-qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
-gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
-bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
-dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
-6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
-h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
-/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
-pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
-# Label: "COMODO ECC Certification Authority"
-# Serial: 41578283867086692638256921589707938090
-# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
-# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
-# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
-IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
-MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
-ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
-T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
-FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
-cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
-BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
-fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
-GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-# Issuer: CN=Certigna O=Dhimyotis
-# Subject: CN=Certigna O=Dhimyotis
-# Label: "Certigna"
-# Serial: 18364802974209362175
-# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
-# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
-# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
-BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
-DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
-BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
-QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
-gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
-zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
-130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
-JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
-ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
-AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
-AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
-9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
-bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
-fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
-HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
-t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
-
-# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
-# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
-# Label: "Cybertrust Global Root"
-# Serial: 4835703278459682877484360
-# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
-# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
-# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
-A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
-bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
-ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
-b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
-7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
-J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
-HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
-t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
-FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
-XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
-MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
-hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
-MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
-A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
-Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
-XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
-omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
-A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
-
-# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
-# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
-# Label: "ePKI Root Certification Authority"
-# Serial: 28956088682735189655030529057352760477
-# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
-# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
-# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
-MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
-ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
-IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
-SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
-SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
-ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
-DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
-TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
-fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
-sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
-WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
-nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
-dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
-NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
-AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
-MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
-uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
-PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
-JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
-gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
-j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
-5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
-o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
-/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
-Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
-W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
-hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
-
-# Issuer: O=certSIGN OU=certSIGN ROOT CA
-# Subject: O=certSIGN OU=certSIGN ROOT CA
-# Label: "certSIGN ROOT CA"
-# Serial: 35210227249154
-# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
-# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
-# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
-AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
-QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
-MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
-0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
-UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
-RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
-OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
-JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
-AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
-BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
-LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
-MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
-44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
-Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
-i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
-9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
-
-# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
-# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
-# Label: "GeoTrust Primary Certification Authority - G2"
-# Serial: 80682863203381065782177908751794619243
-# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
-# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
-# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
-MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
-KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
-MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
-NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
-BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
-MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
-So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
-tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
-CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
-qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
-rD6ogRLQy7rQkgu2npaqBA+K
------END CERTIFICATE-----
-
-# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
-# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
-# Label: "VeriSign Universal Root Certification Authority"
-# Serial: 85209574734084581917763752644031726877
-# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
-# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
-# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
-vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
-ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
-IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
-IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
-bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
-9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
-H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
-LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
-/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
-rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
-WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
-exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
-sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
-seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
-4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
-BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
-lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
-7M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
-
-# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
-# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
-# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny"
-# Serial: 80544274841616
-# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
-# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
-# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
-EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
-MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
-cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
-dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
-pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
-b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
-IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
-lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
-AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
-VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
-ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
-BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
-AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
-U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
-bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
-+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
-uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
-XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
-# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
-# Label: "Hongkong Post Root CA 1"
-# Serial: 1000
-# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca
-# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58
-# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
-FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
-Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
-A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
-b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
-jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
-PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
-ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
-nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
-q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
-MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
-mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
-7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
-oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
-EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
-fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
-AmvZWg==
------END CERTIFICATE-----
-
-# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
-# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
-# Label: "SecureSign RootCA11"
-# Serial: 1
-# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
-# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
-# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
------BEGIN CERTIFICATE-----
-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
-MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
-A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
-MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
-Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
-QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
-i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
-h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
-MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
-UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
-8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
-h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
-VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
-AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
-KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
-X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
-QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
-pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
-QSdJQO7e5iNEOdyhIta6A/I=
------END CERTIFICATE-----
-
-# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
-# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
-# Label: "Microsec e-Szigno Root CA 2009"
-# Serial: 14014712776195784473
-# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
-# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
-# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
------BEGIN CERTIFICATE-----
-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
-VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
-ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
-CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
-OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
-FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
-Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
-dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
-kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
-cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
-fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
-N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
-xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
-+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
-Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
-SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
-mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
-ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
-2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
-HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
-# Label: "GlobalSign Root CA - R3"
-# Serial: 4835703278459759426209954
-# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
-# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
-# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
-MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
-RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
-gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
-KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
-QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
-XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
-LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
-RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
-jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
-6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
-mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
-Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
-WD9f
------END CERTIFICATE-----
-
-# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
-# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
-# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
-# Serial: 6047274297262753887
-# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
-# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
-# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
-BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
-cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
-MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
-Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
-thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
-cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
-L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
-NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
-X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
-m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
-Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
-EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
-KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
-6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
-OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
-VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
-ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
-AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
-661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
-am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
-ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
-PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
-3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
-SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
-3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
-ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
-StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
-Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
-jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
-# Issuer: CN=Izenpe.com O=IZENPE S.A.
-# Subject: CN=Izenpe.com O=IZENPE S.A.
-# Label: "Izenpe.com"
-# Serial: 917563065490389241595536686991402621
-# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
-# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
-# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
-MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
-ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
-VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
-b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
-scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
-xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
-LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
-uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
-yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
-JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
-rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
-BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
-hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
-QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
-HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
-Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
-QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
-BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
-A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
-laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
-awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
-JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
-LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
-VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
-LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
-UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
-QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
-naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
-QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
-
-# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
-# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
-# Label: "Chambers of Commerce Root - 2008"
-# Serial: 11806822484801597146
-# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
-# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
-# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
-IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
-MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
-dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
-EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
-MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
-CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
-28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
-VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
-DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
-5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
-ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
-Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
-UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
-+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
-Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
-hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
-HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
-+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
-YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
-L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
-ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
-IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
-HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
-DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
-PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
-5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
-glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
-FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
-pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
-xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
-tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
-jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
-fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
-d0jQ
------END CERTIFICATE-----
-
-# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
-# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
-# Label: "Global Chambersign Root - 2008"
-# Serial: 14541511773111788494
-# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
-# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
-# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
-MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
-cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
-A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
-BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
-hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
-KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
-G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
-zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
-ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
-HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
-Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
-yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
-beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
-6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
-zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
-BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
-ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
-ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
-cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
-YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
-CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
-KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
-hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
-UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
-X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
-fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
-a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
-Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
-SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
-AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
-M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
-v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
-
-# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
-# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
-# Label: "Go Daddy Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
-# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
-# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
-EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
-ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
-NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
-EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
-AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
-E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
-/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
-DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
-GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
-tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
-AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
-FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
-WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
-9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
-gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
-2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
-4uJEvlz36hz1
------END CERTIFICATE-----
-
-# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Label: "Starfield Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
-# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
-# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
-ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
-MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
-aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
-Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
-nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
-HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
-Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
-dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
-HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
-CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
-sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
-4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
-8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
-mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Label: "Starfield Services Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
-# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
-# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
-ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
-VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
-ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
-dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
-OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
-8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
-Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
-hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
-6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
-AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
-bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
-ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
-qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
-0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
-sSi6
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
-# Subject: CN=AffirmTrust Commercial O=AffirmTrust
-# Label: "AffirmTrust Commercial"
-# Serial: 8608355977964138876
-# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
-# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
-# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
-Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
-ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
-MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
-yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
-VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
-nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
-XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
-vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
-Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
-N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
-nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Networking O=AffirmTrust
-# Subject: CN=AffirmTrust Networking O=AffirmTrust
-# Label: "AffirmTrust Networking"
-# Serial: 8957382827206547757
-# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
-# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
-# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
-YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
-kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
-QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
-6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
-yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
-QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
-tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
-QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
-Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
-olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
-x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Premium O=AffirmTrust
-# Subject: CN=AffirmTrust Premium O=AffirmTrust
-# Label: "AffirmTrust Premium"
-# Serial: 7893706540734352110
-# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
-# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
-# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
-dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
-A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
-cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
-qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
-JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
-+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
-s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
-HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
-70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
-V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
-qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
-5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
-C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
-OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
-FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
-KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
-8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
-MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
-0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
-u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
-u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
-YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
-GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
-RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
-KeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
-# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
-# Label: "AffirmTrust Premium ECC"
-# Serial: 8401224907861490260
-# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
-# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
-# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
-VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
-cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
-BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
-VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
-0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
-ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
-A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
-aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
-flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Label: "Certum Trusted Network CA"
-# Serial: 279744
-# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
-# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
-# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
-MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
-ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
-cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
-WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
-Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
-IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
-UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
-TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
-BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
-kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
-AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
-sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
-I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
-J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
-VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
-# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
-# Label: "TWCA Root Certification Authority"
-# Serial: 1
-# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
-# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
-# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
-MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
-V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
-WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
-LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
-AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
-K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
-RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
-rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
-3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
-hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
-MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
-XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
-lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
-aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
-YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
-
-# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
-# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
-# Label: "Security Communication RootCA2"
-# Serial: 0
-# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
-# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
-# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
-MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
-U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
-DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
-dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
-YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
-OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
-zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
-VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
-hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
-ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
-awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
-OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
-DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
-coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
-okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
-t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
-1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
-SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
-
-# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes
-# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes
-# Label: "EC-ACC"
-# Serial: -23701579247955709139626555126524820479
-# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09
-# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8
-# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99
------BEGIN CERTIFICATE-----
-MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB
-8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy
-dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1
-YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3
-dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh
-IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD
-LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG
-EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g
-KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD
-ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu
-bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg
-ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R
-85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm
-4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV
-HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd
-QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t
-lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB
-o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4
-opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo
-dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW
-ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN
-AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y
-/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k
-SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy
-Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS
-Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl
-nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI=
------END CERTIFICATE-----
-
-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
-# Label: "Hellenic Academic and Research Institutions RootCA 2011"
-# Serial: 0
-# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
-# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
-# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
------BEGIN CERTIFICATE-----
-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
-RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
-dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
-YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
-NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
-EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
-cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
-dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
-fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
-bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
-75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
-FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
-HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
-5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
-b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
-A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
-6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
-dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
-Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
-l7WdmplNsDz4SgCbZN2fOUvRJ9e4
------END CERTIFICATE-----
-
-# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
-# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
-# Label: "Actalis Authentication Root CA"
-# Serial: 6271844772424770508
-# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
-# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
-# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
------BEGIN CERTIFICATE-----
-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
-BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
-MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
-IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
-SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
-ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
-UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
-4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
-KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
-gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
-rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
-51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
-be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
-KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
-v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
-fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
-jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
-ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
-e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
-jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
-WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
-SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
-pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
-X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
-fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
-K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
-ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
-LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
-LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
------END CERTIFICATE-----
-
-# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
-# Subject: O=Trustis Limited OU=Trustis FPS Root CA
-# Label: "Trustis FPS Root CA"
-# Serial: 36053640375399034304724988975563710553
-# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
-# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
-# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
-MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
-ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
-MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
-MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
-AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
-iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
-vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
-0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
-OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
-BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
-FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
-GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
-zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
-1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
-f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
-jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
-ZetX2fNXlrtIzYE=
------END CERTIFICATE-----
-
-# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
-# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
-# Label: "Buypass Class 2 Root CA"
-# Serial: 2
-# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
-# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
-# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
-6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
-L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
-1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
-MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
-QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
-arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
-Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
-FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
-P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
-9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
-uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
-9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
-A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
-OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
-+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
-KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
-DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
-H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
-I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
-5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
-3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
-Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
------END CERTIFICATE-----
-
-# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
-# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
-# Label: "Buypass Class 3 Root CA"
-# Serial: 2
-# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
-# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
-# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
-ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
-N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
-tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
-0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
-/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
-KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
-zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
-O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
-34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
-K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
-Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
-QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
-IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
-HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
-O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
-033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
-dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
-kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
-3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
-u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
-4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
------END CERTIFICATE-----
-
-# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Label: "T-TeleSec GlobalRoot Class 3"
-# Serial: 1
-# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
-# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
-# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
-8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
-RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
-hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
-ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
-EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
-A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
-WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
-1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
-6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
-91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
-TpPDpFQUWw==
------END CERTIFICATE-----
-
-# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
-# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
-# Label: "D-TRUST Root Class 3 CA 2 2009"
-# Serial: 623603
-# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
-# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
-# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
------BEGIN CERTIFICATE-----
-MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
-ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
-HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
-UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
-tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
-ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
-lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
-/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
-A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
-A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
-dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
-MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
-cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
-L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
-BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
-acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
-o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
-zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
-PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
-Johw1+qRzT65ysCQblrGXnRl11z+o+I=
------END CERTIFICATE-----
-
-# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
-# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
-# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
-# Serial: 623604
-# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
-# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
-# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
-NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
-BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
-ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
-3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
-qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
-p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
-HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
-ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
-HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
-Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
-c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
-RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
-dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
-Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
-3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
-nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
-CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
-xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
-KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
------END CERTIFICATE-----
-
-# Issuer: CN=CA Disig Root R2 O=Disig a.s.
-# Subject: CN=CA Disig Root R2 O=Disig a.s.
-# Label: "CA Disig Root R2"
-# Serial: 10572350602393338211
-# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
-# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
-# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
------BEGIN CERTIFICATE-----
-MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
-BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
-MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
-MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
-EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
-ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
-NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
-PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
-x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
-QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
-yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
-QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
-H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
-QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
-i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
-nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
-rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
-hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
-tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
-GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
-lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
-+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
-TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
-nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
-gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
-G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
-zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
-L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
------END CERTIFICATE-----
-
-# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
-# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
-# Label: "ACCVRAIZ1"
-# Serial: 6828503384748696800
-# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
-# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
-# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
------BEGIN CERTIFICATE-----
-MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
-AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
-CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
-BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
-VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
-qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
-HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
-G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
-lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
-IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
-0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
-k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
-4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
-m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
-cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
-uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
-KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
-ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
-AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
-VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
-VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
-CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
-cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
-QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
-7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
-cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
-QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
-czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
-aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
-aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
-DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
-BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
-D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
-JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
-AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
-vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
-tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
-7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
-I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
-h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
-d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
-pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
------END CERTIFICATE-----
-
-# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
-# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
-# Label: "TWCA Global Root CA"
-# Serial: 3262
-# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
-# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
-# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
------BEGIN CERTIFICATE-----
-MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
-EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
-VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
-NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
-B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
-10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
-0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
-MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
-zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
-46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
-yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
-laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
-oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
-BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
-qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
-4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
-1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
-LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
-H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
-RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
-nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
-15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
-6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
-nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
-wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
-aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
-KwbQBM0=
------END CERTIFICATE-----
-
-# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera
-# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera
-# Label: "TeliaSonera Root CA v1"
-# Serial: 199041966741090107964904287217786801558
-# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c
-# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37
-# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89
------BEGIN CERTIFICATE-----
-MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
-NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
-b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
-VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
-VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
-7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
-Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
-/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
-81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
-dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
-Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
-sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
-pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
-slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
-arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
-VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
-9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
-dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
-0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
-TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
-Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
-Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
-OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
-vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
-t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
-HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
-SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
------END CERTIFICATE-----
-
-# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi
-# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi
-# Label: "E-Tugra Certification Authority"
-# Serial: 7667447206703254355
-# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49
-# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39
-# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
-BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
-aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
-BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
-Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
-MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
-BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
-em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
-ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
-B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
-D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
-Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
-q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
-k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
-fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
-dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
-ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
-zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
-rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
-U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
-Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
-XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
-Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
-HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
-GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
-77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
-+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
-vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
-FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
-yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
-AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
-y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
-NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
------END CERTIFICATE-----
-
-# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Label: "T-TeleSec GlobalRoot Class 2"
-# Serial: 1
-# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a
-# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9
-# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
-AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
-FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
-1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
-jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
-wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
-WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
-NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
-uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
-IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
-g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
-9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
-BSeOE6Fuwg==
------END CERTIFICATE-----
-
-# Issuer: CN=Atos TrustedRoot 2011 O=Atos
-# Subject: CN=Atos TrustedRoot 2011 O=Atos
-# Label: "Atos TrustedRoot 2011"
-# Serial: 6643877497813316402
-# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56
-# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21
-# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
-AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
-EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
-FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
-REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
-Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
-VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
-SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
-4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
-cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
-eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
-HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
-A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
-DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
-vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
-DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
-maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
-lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
-KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 1 G3"
-# Serial: 687049649626669250736271037606554624078720034195
-# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab
-# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67
-# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
-MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
-wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
-rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
-68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
-4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
-UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
-abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
-3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
-KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
-hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
-Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
-zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
-ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
-MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
-cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
-qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
-YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
-b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
-8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
-NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
-ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
-q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
-nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 2 G3"
-# Serial: 390156079458959257446133169266079962026824725800
-# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06
-# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36
-# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
-MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
-qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
-n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
-c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
-O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
-o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
-IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
-IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
-8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
-vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
-7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
-cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
-ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
-AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
-roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
-W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
-lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
-+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
-csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
-dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
-KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
-HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
-WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 3 G3"
-# Serial: 268090761170461462463995952157327242137089239581
-# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7
-# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d
-# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
-MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
-/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
-FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
-U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
-ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
-FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
-A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
-eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
-sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
-VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
-A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
-ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
-ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
-KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
-FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
-oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
-u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
-0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
-3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
-8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
-DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
-PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
-ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root G2"
-# Serial: 15385348160840213938643033620894905419
-# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
-# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
-# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
------BEGIN CERTIFICATE-----
-MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
-n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
-biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
-EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
-bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
-YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
-AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
-BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
-QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
-0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
-lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
-B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
-ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
-IhNzbM8m9Yop5w==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root G3"
-# Serial: 15459312981008553731928384953135426796
-# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
-# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
-# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
------BEGIN CERTIFICATE-----
-MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
-RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
-Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
-RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
-AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
-JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
-6pZjamVFkpUBtA==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root G2"
-# Serial: 4293743540046975378534879503202253541
-# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
-# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
-# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
------BEGIN CERTIFICATE-----
-MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
-MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
-2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
-1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
-q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
-tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
-vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
-5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
-1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
-NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
-Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
-8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
-pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
-MrY=
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root G3"
-# Serial: 7089244469030293291760083333884364146
-# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
-# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
-# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
------BEGIN CERTIFICATE-----
-MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
-Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
-EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
-IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
-K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
-fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
-Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
-BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
-AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
-oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
-sycX
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Trusted Root G4"
-# Serial: 7451500558977370777930084869016614236
-# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
-# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
-# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
------BEGIN CERTIFICATE-----
-MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
-RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
-ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
-xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
-ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
-DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
-jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
-CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
-EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
-fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
-uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
-chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
-9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
-ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
-SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
-+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
-fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
-sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
-cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
-0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
-4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
-r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
-/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
-gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
-# Label: "COMODO RSA Certification Authority"
-# Serial: 101909084537582093308941363524873193117
-# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
-# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
-# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
------BEGIN CERTIFICATE-----
-MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
-hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
-BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
-EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
-6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
-pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
-9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
-/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
-Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
-+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
-qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
-SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
-u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
-Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
-crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
-FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
-/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
-wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
-4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
-2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
-FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
-CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
-boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
-jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
-S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
-QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
-0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
-NVOFBkpdn627G190
------END CERTIFICATE-----
-
-# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
-# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
-# Label: "USERTrust RSA Certification Authority"
-# Serial: 2645093764781058787591871645665788717
-# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
-# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
-# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
------BEGIN CERTIFICATE-----
-MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
-iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
-cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
-BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
-MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
-BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
-aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
-3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
-tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
-Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
-VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
-79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
-c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
-Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
-c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
-UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
-Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
-BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
-Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
-VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
-ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
-8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
-iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
-Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
-XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
-qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
-VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
-L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
-jjxDah2nGN59PRbxYvnKkKj9
------END CERTIFICATE-----
-
-# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
-# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
-# Label: "USERTrust ECC Certification Authority"
-# Serial: 123013823720199481456569720443997572134
-# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
-# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
-# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
------BEGIN CERTIFICATE-----
-MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
-MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
-eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
-JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
-Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
-VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
-I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
-o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
-A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
-zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
-RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
-# Label: "GlobalSign ECC Root CA - R4"
-# Serial: 14367148294922964480859022125800977897474
-# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e
-# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb
-# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c
------BEGIN CERTIFICATE-----
-MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
-QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
-FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
-uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
-kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
-ewv4n4Q=
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
-# Label: "GlobalSign ECC Root CA - R5"
-# Serial: 32785792099990507226680698011560947931244
-# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
-# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
-# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
------BEGIN CERTIFICATE-----
-MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
-QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
-MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
-8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
-hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
-KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
-515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
-xwy8p2Fp8fc74SrL+SvzZpA3
------END CERTIFICATE-----
-
-# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
-# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
-# Label: "Staat der Nederlanden Root CA - G3"
-# Serial: 10003001
-# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37
-# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc
-# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28
------BEGIN CERTIFICATE-----
-MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
-DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
-ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
-b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
-cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
-IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
-xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
-KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
-9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
-5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
-6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
-Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
-bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
-BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
-XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
-MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
-INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
-U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
-LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
-Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
-gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
-/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
-0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
-fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
-4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
-1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
-QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
-94B7IWcnMFk=
------END CERTIFICATE-----
-
-# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
-# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
-# Label: "Staat der Nederlanden EV Root CA"
-# Serial: 10000013
-# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba
-# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb
-# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a
------BEGIN CERTIFICATE-----
-MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
-MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
-TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
-b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
-M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
-UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
-Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
-rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
-pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
-j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
-KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
-/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
-cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
-1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
-px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
-MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
-eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
-2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
-v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
-wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
-CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
-vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
-Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
-Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
-eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
-FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
-7uzXLg==
------END CERTIFICATE-----
-
-# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
-# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
-# Label: "IdenTrust Commercial Root CA 1"
-# Serial: 13298821034946342390520003877796839426
-# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7
-# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25
-# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
-VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
-MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
-JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
-3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
-+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
-S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
-bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
-T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
-vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
-Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
-dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
-c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
-l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
-iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
-ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
-6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
-LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
-nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
-+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
-W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
-AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
-l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
-4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
-mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
-7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
------END CERTIFICATE-----
-
-# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
-# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
-# Label: "IdenTrust Public Sector Root CA 1"
-# Serial: 13298821034946342390521976156843933698
-# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba
-# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd
-# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f
------BEGIN CERTIFICATE-----
-MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
-VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
-MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
-MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
-ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
-RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
-bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
-/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
-3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
-EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
-9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
-GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
-2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
-WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
-W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
-AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
-t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
-DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
-TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
-lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
-mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
-WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
-+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
-tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
-GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
-8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
-# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
-# Label: "Entrust Root Certification Authority - G2"
-# Serial: 1246989352
-# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
-# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
-# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
------BEGIN CERTIFICATE-----
-MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
-cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
-IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
-dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
-NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
-dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
-dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
-aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
-RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
-cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
-wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
-U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
-jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
-BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
-jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
-Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
-1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
-nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
-VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
-# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
-# Label: "Entrust Root Certification Authority - EC1"
-# Serial: 51543124481930649114116133369
-# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
-# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
-# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
------BEGIN CERTIFICATE-----
-MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
-A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
-d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
-dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
-RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
-MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
-VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
-L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
-Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
-A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
-ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
-Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
-BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
-R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
-hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
------END CERTIFICATE-----
-
-# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority
-# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority
-# Label: "CFCA EV ROOT"
-# Serial: 407555286
-# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30
-# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83
-# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd
------BEGIN CERTIFICATE-----
-MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
-TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
-MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
-aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
-T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
-sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
-TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
-/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
-7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
-EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
-hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
-a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
-aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
-TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
-PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
-cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
-tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
-BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
-ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
-ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
-jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
-ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
-P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
-xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
-Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
-5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
-/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
-AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
-5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
------END CERTIFICATE-----
-
-# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
-# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
-# Label: "OISTE WISeKey Global Root GB CA"
-# Serial: 157768595616588414422159278966750757568
-# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d
-# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed
-# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6
------BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
-MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
-Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
-YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
-CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
-b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
-bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
-HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
-WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
-1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
-u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
-99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
-M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
-BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
-cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
-gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
-ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
-aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
-Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
------END CERTIFICATE-----
-
-# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
-# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
-# Label: "SZAFIR ROOT CA2"
-# Serial: 357043034767186914217277344587386743377558296292
-# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99
-# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de
-# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe
------BEGIN CERTIFICATE-----
-MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL
-BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6
-ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw
-NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
-cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg
-Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN
-QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT
-3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw
-3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6
-3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5
-BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN
-XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
-AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF
-AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw
-8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG
-nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP
-oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy
-d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg
-LvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
------END CERTIFICATE-----
-
-# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Label: "Certum Trusted Network CA 2"
-# Serial: 44979900017204383099463764357512596969
-# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2
-# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92
-# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04
------BEGIN CERTIFICATE-----
-MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
-gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
-QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
-A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
-OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
-VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
-b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
-DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
-0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
-OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
-fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
-Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
-o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
-sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
-OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
-Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
-adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
-3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
-F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
-CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
-XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
-djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
-WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
-AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
-P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
-b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
-XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
-5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
-DrW5viSP
------END CERTIFICATE-----
-
-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Label: "Hellenic Academic and Research Institutions RootCA 2015"
-# Serial: 0
-# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce
-# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6
-# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36
------BEGIN CERTIFICATE-----
-MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
-DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
-IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
-N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
-dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
-A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
-ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
-QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
-dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
-4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
-AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
-4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
-ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
-9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
-gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
-Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
-NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
-LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
-Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
-ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
-XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
-M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
-9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
-Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
-j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
-X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
-l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
-bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
-pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
-e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
-vm9qp/UsQu0yrbYhnr68
------END CERTIFICATE-----
-
-# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015"
-# Serial: 0
-# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef
-# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66
-# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33
------BEGIN CERTIFICATE-----
-MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
-BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
-bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
-b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
-BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
-YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
-MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
-dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
-QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
-jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
-C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
-lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
-TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
------END CERTIFICATE-----
-
-# Issuer: CN=ISRG Root X1 O=Internet Security Research Group
-# Subject: CN=ISRG Root X1 O=Internet Security Research Group
-# Label: "ISRG Root X1"
-# Serial: 172886928669790476064670243504169061120
-# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e
-# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8
-# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6
------BEGIN CERTIFICATE-----
-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
------END CERTIFICATE-----
-
-# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
-# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
-# Label: "AC RAIZ FNMT-RCM"
-# Serial: 485876308206448804701554682760554759
-# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d
-# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20
-# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa
------BEGIN CERTIFICATE-----
-MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx
-CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ
-WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ
-BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG
-Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/
-yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf
-BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz
-WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF
-tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z
-374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC
-IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL
-mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7
-wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS
-MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2
-ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet
-UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H
-YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3
-LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
-nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1
-RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM
-LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf
-77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N
-JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm
-fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp
-6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp
-1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B
-9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok
-RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv
-uu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 1 O=Amazon
-# Subject: CN=Amazon Root CA 1 O=Amazon
-# Label: "Amazon Root CA 1"
-# Serial: 143266978916655856878034712317230054538369994
-# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6
-# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16
-# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e
------BEGIN CERTIFICATE-----
-MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
-b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
-b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
-ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
-9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
-IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
-VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
-93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
-jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
-A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
-U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
-N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
-o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
-5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
-rqXRfboQnoZsG4q5WTP468SQvvG5
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 2 O=Amazon
-# Subject: CN=Amazon Root CA 2 O=Amazon
-# Label: "Amazon Root CA 2"
-# Serial: 143266982885963551818349160658925006970653239
-# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66
-# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a
-# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4
------BEGIN CERTIFICATE-----
-MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
-b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
-b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
-gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
-W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
-1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
-8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
-2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
-z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
-8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
-mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
-7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
-+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
-0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
-Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
-UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
-LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
-+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
-k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
-7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
-btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
-urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
-fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
-n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
-76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
-9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
-4PsJYGw=
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 3 O=Amazon
-# Subject: CN=Amazon Root CA 3 O=Amazon
-# Label: "Amazon Root CA 3"
-# Serial: 143266986699090766294700635381230934788665930
-# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87
-# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e
-# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4
------BEGIN CERTIFICATE-----
-MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
-Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
-Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
-ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
-ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
-BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
-YyRIHN8wfdVoOw==
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 4 O=Amazon
-# Subject: CN=Amazon Root CA 4 O=Amazon
-# Label: "Amazon Root CA 4"
-# Serial: 143266989758080763974105200630763877849284878
-# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd
-# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be
-# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92
------BEGIN CERTIFICATE-----
-MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
-Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
-Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
-9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
-M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
-MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
-CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
-1KyLa2tJElMzrdfkviT8tQp21KW8EA==
------END CERTIFICATE-----
-
-# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
-# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
-# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1"
-# Serial: 1
-# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49
-# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca
-# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16
------BEGIN CERTIFICATE-----
-MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx
-GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp
-bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w
-KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0
-BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy
-dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG
-EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll
-IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU
-QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT
-TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg
-LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7
-a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr
-LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr
-N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X
-YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/
-iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f
-AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH
-V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
-BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
-AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf
-IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4
-lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c
-8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf
-lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
------END CERTIFICATE-----
-
-# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
-# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
-# Label: "GDCA TrustAUTH R5 ROOT"
-# Serial: 9009899650740120186
-# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4
-# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4
-# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93
------BEGIN CERTIFICATE-----
-MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE
-BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
-IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0
-MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV
-BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w
-HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj
-Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj
-TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u
-KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj
-qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm
-MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12
-ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP
-zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk
-L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC
-jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA
-HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC
-AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
-p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm
-DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5
-COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry
-L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf
-JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg
-IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io
-2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV
-09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ
-XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq
-T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe
-MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
------END CERTIFICATE-----
-
-# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Label: "TrustCor RootCert CA-1"
-# Serial: 15752444095811006489
-# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45
-# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a
-# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD
-VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
-MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y
-IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB
-pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h
-IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG
-A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU
-cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid
-RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V
-seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme
-9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV
-EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW
-hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/
-DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD
-ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I
-/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
-ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ
-yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts
-L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN
-zl/HHk484IkzlQsPpTLWPFp5LBk=
------END CERTIFICATE-----
-
-# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Label: "TrustCor RootCert CA-2"
-# Serial: 2711694510199101698
-# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64
-# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0
-# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65
------BEGIN CERTIFICATE-----
-MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV
-BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
-IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
-dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig
-Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk
-MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg
-Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD
-VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy
-dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+
-QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq
-1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp
-2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK
-DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape
-az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF
-3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88
-oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM
-g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3
-mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
-8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd
-BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U
-nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw
-DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX
-dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+
-MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL
-/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX
-CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa
-ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW
-2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7
-N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3
-Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB
-As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp
-5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu
-1uwJ
------END CERTIFICATE-----
-
-# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Label: "TrustCor ECA-1"
-# Serial: 9548242946988625984
-# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c
-# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd
-# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD
-VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
-MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y
-IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV
-BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
-IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
-dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig
-RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb
-3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA
-BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5
-3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou
-owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/
-wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF
-ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf
-BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/
-MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv
-civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2
-AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
-hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50
-soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI
-WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi
-tJ/X5g==
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
-# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
-# Label: "SSL.com Root Certification Authority RSA"
-# Serial: 8875640296558310041
-# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29
-# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb
-# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69
------BEGIN CERTIFICATE-----
-MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE
-BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
-DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz
-OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
-bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN
-AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R
-xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX
-qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC
-C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3
-6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh
-/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF
-YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E
-JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc
-US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8
-ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm
-+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi
-M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
-HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G
-A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV
-cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc
-Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs
-PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/
-q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0
-cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr
-a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I
-H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y
-K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu
-nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf
-oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY
-Ic2wBlX7Jz9TkHCpBB5XJ7k=
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
-# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
-# Label: "SSL.com Root Certification Authority ECC"
-# Serial: 8495723813297216424
-# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e
-# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a
-# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65
------BEGIN CERTIFICATE-----
-MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC
-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
-U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz
-WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0
-b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS
-b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI
-7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg
-CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud
-EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD
-VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T
-kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+
-gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
-# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
-# Label: "SSL.com EV Root Certification Authority RSA R2"
-# Serial: 6248227494352943350
-# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95
-# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a
-# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c
------BEGIN CERTIFICATE-----
-MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV
-BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
-CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy
-MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G
-A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD
-DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq
-M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf
-OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa
-4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9
-HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR
-aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA
-b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ
-Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV
-PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO
-pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu
-UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY
-MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
-HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4
-9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW
-s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5
-Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg
-cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM
-79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz
-/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt
-ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm
-Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK
-QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ
-w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi
-S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07
-mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
-# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
-# Label: "SSL.com EV Root Certification Authority ECC"
-# Serial: 3182246526754555285
-# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90
-# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d
-# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8
------BEGIN CERTIFICATE-----
-MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC
-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
-U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx
-NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv
-bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49
-AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA
-VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku
-WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP
-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX
-5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ
-ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg
-h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
-# Label: "GlobalSign Root CA - R6"
-# Serial: 1417766617973444989252670301619537
-# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae
-# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1
-# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69
------BEGIN CERTIFICATE-----
-MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg
-MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh
-bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx
-MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET
-MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI
-xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k
-ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD
-aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw
-LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw
-1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX
-k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2
-SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h
-bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n
-WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY
-rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce
-MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu
-bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
-nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt
-Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61
-55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj
-vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf
-cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz
-oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp
-nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs
-pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v
-JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R
-8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4
-5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
------END CERTIFICATE-----
-
-# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed
-# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed
-# Label: "OISTE WISeKey Global Root GC CA"
-# Serial: 44084345621038548146064804565436152554
-# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23
-# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31
-# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d
------BEGIN CERTIFICATE-----
-MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw
-CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91
-bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg
-Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ
-BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu
-ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS
-b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni
-eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W
-p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T
-rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV
-57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg
-Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R1 O=Google Trust Services LLC
-# Subject: CN=GTS Root R1 O=Google Trust Services LLC
-# Label: "GTS Root R1"
-# Serial: 146587175971765017618439757810265552097
-# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85
-# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8
-# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH
-MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
-QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy
-MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl
-cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
-f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX
-mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7
-zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P
-fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc
-vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4
-Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp
-zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO
-Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW
-k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+
-DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF
-lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW
-Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
-d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z
-XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR
-gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3
-d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv
-J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg
-DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM
-+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy
-F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9
-SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws
-E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R2 O=Google Trust Services LLC
-# Subject: CN=GTS Root R2 O=Google Trust Services LLC
-# Label: "GTS Root R2"
-# Serial: 146587176055767053814479386953112547951
-# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b
-# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d
-# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH
-MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
-QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy
-MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl
-cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
-CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg
-GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu
-XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd
-re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu
-PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1
-mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K
-8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj
-x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR
-nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0
-kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok
-twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp
-8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
-vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT
-z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA
-pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb
-pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB
-R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R
-RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk
-0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC
-5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF
-izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn
-yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R3 O=Google Trust Services LLC
-# Subject: CN=GTS Root R3 O=Google Trust Services LLC
-# Label: "GTS Root R3"
-# Serial: 146587176140553309517047991083707763997
-# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25
-# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5
-# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5
------BEGIN CERTIFICATE-----
-MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw
-CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
-MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
-MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
-Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout
-736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A
-DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
-DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk
-fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA
-njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R4 O=Google Trust Services LLC
-# Subject: CN=GTS Root R4 O=Google Trust Services LLC
-# Label: "GTS Root R4"
-# Serial: 146587176229350439916519468929765261721
-# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26
-# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb
-# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd
------BEGIN CERTIFICATE-----
-MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw
-CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
-MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
-MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
-Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu
-hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l
-xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
-DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0
-CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx
-sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w==
------END CERTIFICATE-----
-
-# Issuer: CN=UCA Global G2 Root O=UniTrust
-# Subject: CN=UCA Global G2 Root O=UniTrust
-# Label: "UCA Global G2 Root"
-# Serial: 124779693093741543919145257850076631279
-# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8
-# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a
-# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9
-MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH
-bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x
-CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds
-b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr
-b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9
-kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm
-VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R
-VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc
-C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj
-tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY
-D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv
-j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl
-NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6
-iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP
-O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV
-ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj
-L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
-1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl
-1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU
-b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV
-PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj
-y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb
-EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg
-DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI
-+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy
-YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX
-UB+K+wb1whnw0A==
------END CERTIFICATE-----
-
-# Issuer: CN=UCA Extended Validation Root O=UniTrust
-# Subject: CN=UCA Extended Validation Root O=UniTrust
-# Label: "UCA Extended Validation Root"
-# Serial: 106100277556486529736699587978573607008
-# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2
-# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a
-# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH
-MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF
-eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx
-MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV
-BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog
-D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS
-sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop
-O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk
-sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi
-c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj
-VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz
-KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/
-TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G
-sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs
-1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD
-fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN
-l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
-ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ
-VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5
-c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp
-4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s
-t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj
-2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO
-vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C
-xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx
-cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM
-fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax
------END CERTIFICATE-----
-
-# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036
-# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036
-# Label: "Certigna Root CA"
-# Serial: 269714418870597844693661054334862075617
-# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77
-# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43
-# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68
------BEGIN CERTIFICATE-----
-MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw
-WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw
-MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x
-MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD
-VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX
-BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO
-ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M
-CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu
-I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm
-TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh
-C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf
-ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz
-IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT
-Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k
-JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5
-hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB
-GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
-FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
-1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov
-L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo
-dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr
-aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq
-hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L
-6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG
-HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6
-0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB
-lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi
-o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1
-gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v
-faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63
-Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh
-jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw
-3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI
-# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI
-# Label: "emSign Root CA - G1"
-# Serial: 235931866688319308814040
-# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac
-# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c
-# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67
------BEGIN CERTIFICATE-----
-MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD
-VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU
-ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH
-MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO
-MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv
-Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz
-f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO
-8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq
-d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM
-tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt
-Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB
-o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x
-PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM
-wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d
-GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH
-6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby
-RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
-iN66zB+Afko=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI
-# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI
-# Label: "emSign ECC Root CA - G3"
-# Serial: 287880440101571086945156
-# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40
-# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1
-# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b
------BEGIN CERTIFICATE-----
-MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG
-EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo
-bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
-RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ
-TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s
-b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw
-djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0
-WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS
-fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB
-zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq
-hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB
-CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD
-+JbNR6iC8hZVdyR+EhCVBCyj
------END CERTIFICATE-----
-
-# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
-# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
-# Label: "emSign Root CA - C1"
-# Serial: 825510296613316004955058
-# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68
-# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01
-# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f
------BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG
-A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg
-SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw
-MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
-biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v
-dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ
-BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ
-HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH
-3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH
-GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c
-xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1
-aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq
-TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
-BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87
-/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4
-kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG
-YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT
-+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo
-WXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
-# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
-# Label: "emSign ECC Root CA - C3"
-# Serial: 582948710642506000014504
-# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5
-# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66
-# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3
------BEGIN CERTIFICATE-----
-MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG
-EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx
-IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw
-MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
-biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND
-IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci
-MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti
-sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O
-BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
-Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c
-3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J
-0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post
-# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post
-# Label: "Hongkong Post Root CA 3"
-# Serial: 46170865288971385588281144162979347873371282084
-# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0
-# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02
-# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6
------BEGIN CERTIFICATE-----
-MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL
-BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ
-SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n
-a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5
-NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT
-CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u
-Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO
-dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI
-VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV
-9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY
-2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY
-vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt
-bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb
-x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+
-l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK
-TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj
-Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
-i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw
-DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG
-7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk
-MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr
-gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk
-GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS
-3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm
-Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+
-l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c
-JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP
-L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa
-LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG
-mpv0
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only
-# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only
-# Label: "Entrust Root Certification Authority - G4"
-# Serial: 289383649854506086828220374796556676440
-# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88
-# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01
-# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw
-gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL
-Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg
-MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw
-BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0
-MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1
-c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ
-bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ
-2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E
-T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j
-5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM
-C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T
-DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX
-wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A
-2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm
-nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
-dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl
-N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj
-c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS
-5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS
-Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr
-hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/
-B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI
-AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw
-H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+
-b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk
-2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol
-IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk
-5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY
-n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw==
------END CERTIFICATE-----
-
-# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation
-# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation
-# Label: "Microsoft ECC Root Certificate Authority 2017"
-# Serial: 136839042543790627607696632466672567020
-# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67
-# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5
-# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02
------BEGIN CERTIFICATE-----
-MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw
-CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD
-VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw
-MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV
-UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy
-b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR
-ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb
-hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3
-FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV
-L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB
-iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
------END CERTIFICATE-----
-
-# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation
-# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation
-# Label: "Microsoft RSA Root Certificate Authority 2017"
-# Serial: 40975477897264996090493496164228220339
-# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47
-# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74
-# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0
------BEGIN CERTIFICATE-----
-MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl
-MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
-NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG
-EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N
-aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ
-Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0
-ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1
-HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm
-gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ
-jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc
-aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG
-YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6
-W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K
-UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH
-+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q
-W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
-NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC
-LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC
-gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6
-tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh
-SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2
-TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3
-pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR
-xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp
-GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9
-dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN
-AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB
-RA+GsCyRxj3qrg+E
------END CERTIFICATE-----
-
-# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd.
-# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd.
-# Label: "e-Szigno Root CA 2017"
-# Serial: 411379200276854331539784714
-# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98
-# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1
-# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99
------BEGIN CERTIFICATE-----
-MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV
-BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk
-LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv
-b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ
-BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg
-THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v
-IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv
-xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H
-Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB
-eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo
-jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ
-+efcMQ==
------END CERTIFICATE-----
-
-# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2
-# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2
-# Label: "certSIGN Root CA G2"
-# Serial: 313609486401300475190
-# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7
-# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32
-# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05
------BEGIN CERTIFICATE-----
-MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV
-BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g
-Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ
-BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ
-R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF
-dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw
-vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ
-uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp
-n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs
-cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW
-xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P
-rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF
-DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx
-DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy
-LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C
-eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ
-d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq
-kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
-b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl
-qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0
-OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c
-NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk
-ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO
-pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj
-03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk
-PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE
-1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX
-QRBdJ3NghVdJIgc=
------END CERTIFICATE-----
-
-# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc.
-# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc.
-# Label: "Trustwave Global Certification Authority"
-# Serial: 1846098327275375458322922162
-# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e
-# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5
-# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8
------BEGIN CERTIFICATE-----
-MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw
-CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x
-ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1
-c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx
-OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI
-SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI
-b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
-ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn
-swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu
-7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8
-1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW
-80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP
-JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l
-RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw
-hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10
-coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc
-BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n
-twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud
-DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W
-0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe
-uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q
-lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB
-aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE
-sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT
-MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe
-qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh
-VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8
-h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9
-EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK
-yeC2nOnOcXHebD8WpHk=
------END CERTIFICATE-----
-
-# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc.
-# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc.
-# Label: "Trustwave Global ECC P256 Certification Authority"
-# Serial: 4151900041497450638097112925
-# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54
-# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf
-# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4
------BEGIN CERTIFICATE-----
-MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD
-VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf
-BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3
-YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x
-NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G
-A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0
-d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF
-Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG
-SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN
-FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w
-DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw
-CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh
-DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
------END CERTIFICATE-----
-
-# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc.
-# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc.
-# Label: "Trustwave Global ECC P384 Certification Authority"
-# Serial: 2704997926503831671788816187
-# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6
-# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2
-# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97
------BEGIN CERTIFICATE-----
-MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD
-VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf
-BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3
-YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x
-NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G
-A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0
-d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF
-Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ
-j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF
-1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G
-A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3
-AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC
-MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu
-Sw==
------END CERTIFICATE-----
-
-# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp.
-# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp.
-# Label: "NAVER Global Root Certification Authority"
-# Serial: 9013692873798656336226253319739695165984492813
-# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b
-# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1
-# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65
------BEGIN CERTIFICATE-----
-MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM
-BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG
-T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx
-CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD
-b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA
-iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH
-38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE
-HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz
-kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP
-szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq
-vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf
-nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG
-YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo
-0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a
-CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K
-AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I
-36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB
-Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN
-qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj
-cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm
-+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL
-hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe
-lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7
-p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8
-piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR
-LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX
-5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO
-dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul
-9XXeifdy
------END CERTIFICATE-----
diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/core.py b/venv/Lib/site-packages/pip/_vendor/certifi/core.py
deleted file mode 100644
index b8140cf..0000000
--- a/venv/Lib/site-packages/pip/_vendor/certifi/core.py
+++ /dev/null
@@ -1,76 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-certifi.py
-~~~~~~~~~~
-
-This module returns the installation location of cacert.pem or its contents.
-"""
-import os
-
-
-class _PipPatchedCertificate(Exception):
- pass
-
-
-try:
- # Return a certificate file on disk for a standalone pip zipapp running in
- # an isolated build environment to use. Passing --cert to the standalone
- # pip does not work since requests calls where() unconditionally on import.
- _PIP_STANDALONE_CERT = os.environ.get("_PIP_STANDALONE_CERT")
- if _PIP_STANDALONE_CERT:
- def where():
- return _PIP_STANDALONE_CERT
- raise _PipPatchedCertificate()
-
- from importlib.resources import path as get_path, read_text
-
- _CACERT_CTX = None
- _CACERT_PATH = None
-
- def where():
- # This is slightly terrible, but we want to delay extracting the file
- # in cases where we're inside of a zipimport situation until someone
- # actually calls where(), but we don't want to re-extract the file
- # on every call of where(), so we'll do it once then store it in a
- # global variable.
- global _CACERT_CTX
- global _CACERT_PATH
- if _CACERT_PATH is None:
- # This is slightly janky, the importlib.resources API wants you to
- # manage the cleanup of this file, so it doesn't actually return a
- # path, it returns a context manager that will give you the path
- # when you enter it and will do any cleanup when you leave it. In
- # the common case of not needing a temporary file, it will just
- # return the file system location and the __exit__() is a no-op.
- #
- # We also have to hold onto the actual context manager, because
- # it will do the cleanup whenever it gets garbage collected, so
- # we will also store that at the global level as well.
- _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem")
- _CACERT_PATH = str(_CACERT_CTX.__enter__())
-
- return _CACERT_PATH
-
-except _PipPatchedCertificate:
- pass
-
-except ImportError:
- # This fallback will work for Python versions prior to 3.7 that lack the
- # importlib.resources module but relies on the existing `where` function
- # so won't address issues with environments like PyOxidizer that don't set
- # __file__ on modules.
- def read_text(_module, _path, encoding="ascii"):
- with open(where(), "r", encoding=encoding) as data:
- return data.read()
-
- # If we don't have importlib.resources, then we will just do the old logic
- # of assuming we're on the filesystem and munge the path directly.
- def where():
- f = os.path.dirname(__file__)
-
- return os.path.join(f, "cacert.pem")
-
-
-def contents():
- return read_text("certifi", "cacert.pem", encoding="ascii")
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py b/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py
deleted file mode 100644
index 80ad254..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py
+++ /dev/null
@@ -1,83 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-
-from .universaldetector import UniversalDetector
-from .enums import InputState
-from .version import __version__, VERSION
-
-
-__all__ = ['UniversalDetector', 'detect', 'detect_all', '__version__', 'VERSION']
-
-
-def detect(byte_str):
- """
- Detect the encoding of the given byte string.
-
- :param byte_str: The byte sequence to examine.
- :type byte_str: ``bytes`` or ``bytearray``
- """
- if not isinstance(byte_str, bytearray):
- if not isinstance(byte_str, bytes):
- raise TypeError('Expected object of type bytes or bytearray, got: '
- '{}'.format(type(byte_str)))
- else:
- byte_str = bytearray(byte_str)
- detector = UniversalDetector()
- detector.feed(byte_str)
- return detector.close()
-
-
-def detect_all(byte_str):
- """
- Detect all the possible encodings of the given byte string.
-
- :param byte_str: The byte sequence to examine.
- :type byte_str: ``bytes`` or ``bytearray``
- """
- if not isinstance(byte_str, bytearray):
- if not isinstance(byte_str, bytes):
- raise TypeError('Expected object of type bytes or bytearray, got: '
- '{}'.format(type(byte_str)))
- else:
- byte_str = bytearray(byte_str)
-
- detector = UniversalDetector()
- detector.feed(byte_str)
- detector.close()
-
- if detector._input_state == InputState.HIGH_BYTE:
- results = []
- for prober in detector._charset_probers:
- if prober.get_confidence() > detector.MINIMUM_THRESHOLD:
- charset_name = prober.charset_name
- lower_charset_name = prober.charset_name.lower()
- # Use Windows encoding name instead of ISO-8859 if we saw any
- # extra Windows-specific bytes
- if lower_charset_name.startswith('iso-8859'):
- if detector._has_win_bytes:
- charset_name = detector.ISO_WIN_MAP.get(lower_charset_name,
- charset_name)
- results.append({
- 'encoding': charset_name,
- 'confidence': prober.get_confidence(),
- 'language': prober.language,
- })
- if len(results) > 0:
- return sorted(results, key=lambda result: -result['confidence'])
-
- return [detector.result]
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 8b76e19..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc
deleted file mode 100644
index a415b65..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc
deleted file mode 100644
index f34aeb8..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc
deleted file mode 100644
index e89621a..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc
deleted file mode 100644
index 9f2265e..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc
deleted file mode 100644
index cb52558..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc
deleted file mode 100644
index 9192be8..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-39.pyc
deleted file mode 100644
index caa7f62..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc
deleted file mode 100644
index 8dd78da..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-39.pyc
deleted file mode 100644
index 5ec6364..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc
deleted file mode 100644
index ba3b060..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc
deleted file mode 100644
index 0f63067..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc
deleted file mode 100644
index 43fa3ea..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc
deleted file mode 100644
index 8c3cb1d..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc
deleted file mode 100644
index bc8c6cf..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-39.pyc
deleted file mode 100644
index d1a0aad..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc
deleted file mode 100644
index ad7d80c..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc
deleted file mode 100644
index 78f2998..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc
deleted file mode 100644
index 0ae780a..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-39.pyc
deleted file mode 100644
index 7379afb..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc
deleted file mode 100644
index 6eadc0d..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc
deleted file mode 100644
index 836d08b..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc
deleted file mode 100644
index 2b64be4..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc
deleted file mode 100644
index 559c7b4..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc
deleted file mode 100644
index 6bd3afa..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc
deleted file mode 100644
index ce4abe6..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc
deleted file mode 100644
index 9aa945b..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc
deleted file mode 100644
index 44523c9..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc
deleted file mode 100644
index 0c056e7..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-39.pyc
deleted file mode 100644
index f234111..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc
deleted file mode 100644
index eb07ec7..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc
deleted file mode 100644
index aa695f7..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-39.pyc
deleted file mode 100644
index 7b597c1..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc
deleted file mode 100644
index 4c07a1f..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc
deleted file mode 100644
index 72d08ca..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc
deleted file mode 100644
index e118b82..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc
deleted file mode 100644
index 8b7aa3e..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py b/venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py
deleted file mode 100644
index 38f3251..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py
+++ /dev/null
@@ -1,386 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Big5 frequency table
-# by Taiwan's Mandarin Promotion Council
-#
-#
-# 128 --> 0.42261
-# 256 --> 0.57851
-# 512 --> 0.74851
-# 1024 --> 0.89384
-# 2048 --> 0.97583
-#
-# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
-# Random Distribution Ration = 512/(5401-512)=0.105
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
-
-BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
-
-#Char to FreqOrder table
-BIG5_TABLE_SIZE = 5376
-
-BIG5_CHAR_TO_FREQ_ORDER = (
- 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16
-3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32
-1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48
- 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64
-3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80
-4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96
-5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112
- 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128
- 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144
- 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160
-2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176
-1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192
-3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208
- 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224
-1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240
-3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256
-2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272
- 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288
-3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304
-1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320
-5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336
- 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352
-5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368
-1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384
- 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400
- 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416
-3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432
-3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448
- 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464
-2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480
-2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496
- 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512
- 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528
-3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544
-1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560
-1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576
-1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592
-2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608
- 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624
-4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640
-1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656
-5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672
-2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688
- 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704
- 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720
- 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736
- 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752
-5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768
- 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784
-1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800
- 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816
- 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832
-5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848
-1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864
- 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880
-3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896
-4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912
-3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928
- 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944
- 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960
-1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976
-4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992
-3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
-3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
-2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
-5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056
-3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
-5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
-1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
-2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
-1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
- 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
-1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
-4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
-3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
- 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
- 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232
- 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
-2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
-5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
-1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
-2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
-1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
-1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
-5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
-5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
-5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
-3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
-4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
-4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
-2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
-5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
-3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
- 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
-5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520
-5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
-1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
-2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
-3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
-4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
-5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
-3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
-4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
-1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
-1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680
-4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
-1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
- 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
-1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
-1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
-3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
- 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
-5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
-2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
-1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
-1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856
-5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
- 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
-4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
- 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
-2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
- 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
-1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
-1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
- 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
-4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
-4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
-1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
-3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
-5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
-5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096
-1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
-2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
-1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
-3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
-2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
-3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
-2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
-4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
-4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
-3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
- 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
-3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
- 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
-3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
-4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
-3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
-1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
-5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
- 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
-5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
-1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
- 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
-4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464
-4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
- 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
-2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
-2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528
-3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
-1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
-4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
-2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
-1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
-1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
-2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
-3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
-1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
-5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688
-1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
-4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720
-1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
- 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
-1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
-4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
-4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
-2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
-1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
-4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
- 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
-5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
-2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
-3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
-4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
- 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
-5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
-5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
-1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
-4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
-4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
-2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040
-3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
-3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
-2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
-1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
-4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
-3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
-3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
-2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
-4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184
-5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
-3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
-2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
-3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
-1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
-2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
-3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
-4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312
-2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
-2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
-5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
-1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
-2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
-1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
-3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
-4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440
-2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
-3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
-3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
-2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
-4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
-2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
-3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
-4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
-5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
-3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
- 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
-1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632
-4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
-1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
-4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680
-5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
- 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
-5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
-5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
-2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
-3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
-2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
-2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
- 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
-1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
-4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
-3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
-3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
- 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
-2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
- 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
-2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
-4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
-1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
-4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
-1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
-3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
- 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
-3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
-5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
-5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
-3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
-3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
-1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
-2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
-5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
-1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
-1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
-3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
- 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
-1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
-4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
-5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
-2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
-3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
- 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
-1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
-2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
-2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
-5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
-5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
-5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
-2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
-2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
-1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
-4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
-3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
-3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
-4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
-4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
-2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
-2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
-5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
-4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
-5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
-4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
- 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
- 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
-1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
-3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
-4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
-1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
-5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
-2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
-2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
-3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
-5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
-1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
-3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
-5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
-1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
-5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
-2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
-3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
-2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
-3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
-3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
-3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
-4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
- 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
-2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
-4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
-3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
-5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
-1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
-5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
- 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
-1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
- 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
-4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
-1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
-4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
-1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
- 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
-3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
-4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
-5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
- 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
-3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
- 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
-2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376
-)
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py
deleted file mode 100644
index 98f9970..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import Big5DistributionAnalysis
-from .mbcssm import BIG5_SM_MODEL
-
-
-class Big5Prober(MultiByteCharSetProber):
- def __init__(self):
- super(Big5Prober, self).__init__()
- self.coding_sm = CodingStateMachine(BIG5_SM_MODEL)
- self.distribution_analyzer = Big5DistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self):
- return "Big5"
-
- @property
- def language(self):
- return "Chinese"
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py b/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py
deleted file mode 100644
index c0395f4..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py
+++ /dev/null
@@ -1,233 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE,
- EUCTW_TYPICAL_DISTRIBUTION_RATIO)
-from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE,
- EUCKR_TYPICAL_DISTRIBUTION_RATIO)
-from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE,
- GB2312_TYPICAL_DISTRIBUTION_RATIO)
-from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE,
- BIG5_TYPICAL_DISTRIBUTION_RATIO)
-from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE,
- JIS_TYPICAL_DISTRIBUTION_RATIO)
-
-
-class CharDistributionAnalysis(object):
- ENOUGH_DATA_THRESHOLD = 1024
- SURE_YES = 0.99
- SURE_NO = 0.01
- MINIMUM_DATA_THRESHOLD = 3
-
- def __init__(self):
- # Mapping table to get frequency order from char order (get from
- # GetOrder())
- self._char_to_freq_order = None
- self._table_size = None # Size of above table
- # This is a constant value which varies from language to language,
- # used in calculating confidence. See
- # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
- # for further detail.
- self.typical_distribution_ratio = None
- self._done = None
- self._total_chars = None
- self._freq_chars = None
- self.reset()
-
- def reset(self):
- """reset analyser, clear any state"""
- # If this flag is set to True, detection is done and conclusion has
- # been made
- self._done = False
- self._total_chars = 0 # Total characters encountered
- # The number of characters whose frequency order is less than 512
- self._freq_chars = 0
-
- def feed(self, char, char_len):
- """feed a character with known length"""
- if char_len == 2:
- # we only care about 2-bytes character in our distribution analysis
- order = self.get_order(char)
- else:
- order = -1
- if order >= 0:
- self._total_chars += 1
- # order is valid
- if order < self._table_size:
- if 512 > self._char_to_freq_order[order]:
- self._freq_chars += 1
-
- def get_confidence(self):
- """return confidence based on existing data"""
- # if we didn't receive any character in our consideration range,
- # return negative answer
- if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD:
- return self.SURE_NO
-
- if self._total_chars != self._freq_chars:
- r = (self._freq_chars / ((self._total_chars - self._freq_chars)
- * self.typical_distribution_ratio))
- if r < self.SURE_YES:
- return r
-
- # normalize confidence (we don't want to be 100% sure)
- return self.SURE_YES
-
- def got_enough_data(self):
- # It is not necessary to receive all data to draw conclusion.
- # For charset detection, certain amount of data is enough
- return self._total_chars > self.ENOUGH_DATA_THRESHOLD
-
- def get_order(self, byte_str):
- # We do not handle characters based on the original encoding string,
- # but convert this encoding string to a number, here called order.
- # This allows multiple encodings of a language to share one frequency
- # table.
- return -1
-
-
-class EUCTWDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self):
- super(EUCTWDistributionAnalysis, self).__init__()
- self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER
- self._table_size = EUCTW_TABLE_SIZE
- self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str):
- # for euc-TW encoding, we are interested
- # first byte range: 0xc4 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char = byte_str[0]
- if first_char >= 0xC4:
- return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1
- else:
- return -1
-
-
-class EUCKRDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self):
- super(EUCKRDistributionAnalysis, self).__init__()
- self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER
- self._table_size = EUCKR_TABLE_SIZE
- self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str):
- # for euc-KR encoding, we are interested
- # first byte range: 0xb0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char = byte_str[0]
- if first_char >= 0xB0:
- return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1
- else:
- return -1
-
-
-class GB2312DistributionAnalysis(CharDistributionAnalysis):
- def __init__(self):
- super(GB2312DistributionAnalysis, self).__init__()
- self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER
- self._table_size = GB2312_TABLE_SIZE
- self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str):
- # for GB2312 encoding, we are interested
- # first byte range: 0xb0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if (first_char >= 0xB0) and (second_char >= 0xA1):
- return 94 * (first_char - 0xB0) + second_char - 0xA1
- else:
- return -1
-
-
-class Big5DistributionAnalysis(CharDistributionAnalysis):
- def __init__(self):
- super(Big5DistributionAnalysis, self).__init__()
- self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER
- self._table_size = BIG5_TABLE_SIZE
- self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str):
- # for big5 encoding, we are interested
- # first byte range: 0xa4 -- 0xfe
- # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if first_char >= 0xA4:
- if second_char >= 0xA1:
- return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
- else:
- return 157 * (first_char - 0xA4) + second_char - 0x40
- else:
- return -1
-
-
-class SJISDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self):
- super(SJISDistributionAnalysis, self).__init__()
- self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
- self._table_size = JIS_TABLE_SIZE
- self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str):
- # for sjis encoding, we are interested
- # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
- # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if (first_char >= 0x81) and (first_char <= 0x9F):
- order = 188 * (first_char - 0x81)
- elif (first_char >= 0xE0) and (first_char <= 0xEF):
- order = 188 * (first_char - 0xE0 + 31)
- else:
- return -1
- order = order + second_char - 0x40
- if second_char > 0x7F:
- order = -1
- return order
-
-
-class EUCJPDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self):
- super(EUCJPDistributionAnalysis, self).__init__()
- self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
- self._table_size = JIS_TABLE_SIZE
- self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str):
- # for euc-JP encoding, we are interested
- # first byte range: 0xa0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- char = byte_str[0]
- if char >= 0xA0:
- return 94 * (char - 0xA1) + byte_str[1] - 0xa1
- else:
- return -1
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py
deleted file mode 100644
index 5812cef..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py
+++ /dev/null
@@ -1,107 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .enums import ProbingState
-from .charsetprober import CharSetProber
-
-
-class CharSetGroupProber(CharSetProber):
- def __init__(self, lang_filter=None):
- super(CharSetGroupProber, self).__init__(lang_filter=lang_filter)
- self._active_num = 0
- self.probers = []
- self._best_guess_prober = None
-
- def reset(self):
- super(CharSetGroupProber, self).reset()
- self._active_num = 0
- for prober in self.probers:
- if prober:
- prober.reset()
- prober.active = True
- self._active_num += 1
- self._best_guess_prober = None
-
- @property
- def charset_name(self):
- if not self._best_guess_prober:
- self.get_confidence()
- if not self._best_guess_prober:
- return None
- return self._best_guess_prober.charset_name
-
- @property
- def language(self):
- if not self._best_guess_prober:
- self.get_confidence()
- if not self._best_guess_prober:
- return None
- return self._best_guess_prober.language
-
- def feed(self, byte_str):
- for prober in self.probers:
- if not prober:
- continue
- if not prober.active:
- continue
- state = prober.feed(byte_str)
- if not state:
- continue
- if state == ProbingState.FOUND_IT:
- self._best_guess_prober = prober
- self._state = ProbingState.FOUND_IT
- return self.state
- elif state == ProbingState.NOT_ME:
- prober.active = False
- self._active_num -= 1
- if self._active_num <= 0:
- self._state = ProbingState.NOT_ME
- return self.state
- return self.state
-
- def get_confidence(self):
- state = self.state
- if state == ProbingState.FOUND_IT:
- return 0.99
- elif state == ProbingState.NOT_ME:
- return 0.01
- best_conf = 0.0
- self._best_guess_prober = None
- for prober in self.probers:
- if not prober:
- continue
- if not prober.active:
- self.logger.debug('%s not active', prober.charset_name)
- continue
- conf = prober.get_confidence()
- self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf)
- if best_conf < conf:
- best_conf = conf
- self._best_guess_prober = prober
- if not self._best_guess_prober:
- return 0.0
- return best_conf
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py
deleted file mode 100644
index eac4e59..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py
+++ /dev/null
@@ -1,145 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-import logging
-import re
-
-from .enums import ProbingState
-
-
-class CharSetProber(object):
-
- SHORTCUT_THRESHOLD = 0.95
-
- def __init__(self, lang_filter=None):
- self._state = None
- self.lang_filter = lang_filter
- self.logger = logging.getLogger(__name__)
-
- def reset(self):
- self._state = ProbingState.DETECTING
-
- @property
- def charset_name(self):
- return None
-
- def feed(self, buf):
- pass
-
- @property
- def state(self):
- return self._state
-
- def get_confidence(self):
- return 0.0
-
- @staticmethod
- def filter_high_byte_only(buf):
- buf = re.sub(b'([\x00-\x7F])+', b' ', buf)
- return buf
-
- @staticmethod
- def filter_international_words(buf):
- """
- We define three types of bytes:
- alphabet: english alphabets [a-zA-Z]
- international: international characters [\x80-\xFF]
- marker: everything else [^a-zA-Z\x80-\xFF]
-
- The input buffer can be thought to contain a series of words delimited
- by markers. This function works to filter all words that contain at
- least one international character. All contiguous sequences of markers
- are replaced by a single space ascii character.
-
- This filter applies to all scripts which do not use English characters.
- """
- filtered = bytearray()
-
- # This regex expression filters out only words that have at-least one
- # international character. The word may include one marker character at
- # the end.
- words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?',
- buf)
-
- for word in words:
- filtered.extend(word[:-1])
-
- # If the last character in the word is a marker, replace it with a
- # space as markers shouldn't affect our analysis (they are used
- # similarly across all languages and may thus have similar
- # frequencies).
- last_char = word[-1:]
- if not last_char.isalpha() and last_char < b'\x80':
- last_char = b' '
- filtered.extend(last_char)
-
- return filtered
-
- @staticmethod
- def filter_with_english_letters(buf):
- """
- Returns a copy of ``buf`` that retains only the sequences of English
- alphabet and high byte characters that are not between <> characters.
- Also retains English alphabet and high byte characters immediately
- before occurrences of >.
-
- This filter can be applied to all scripts which contain both English
- characters and extended ASCII characters, but is currently only used by
- ``Latin1Prober``.
- """
- filtered = bytearray()
- in_tag = False
- prev = 0
-
- for curr in range(len(buf)):
- # Slice here to get bytes instead of an int with Python 3
- buf_char = buf[curr:curr + 1]
- # Check if we're coming out of or entering an HTML tag
- if buf_char == b'>':
- in_tag = False
- elif buf_char == b'<':
- in_tag = True
-
- # If current character is not extended-ASCII and not alphabetic...
- if buf_char < b'\x80' and not buf_char.isalpha():
- # ...and we're not in a tag
- if curr > prev and not in_tag:
- # Keep everything after last non-extended-ASCII,
- # non-alphabetic character
- filtered.extend(buf[prev:curr])
- # Output a space to delimit stretch we kept
- filtered.extend(b' ')
- prev = curr + 1
-
- # If we're not in a tag...
- if not in_tag:
- # Keep everything after last non-extended-ASCII, non-alphabetic
- # character
- filtered.extend(buf[prev:])
-
- return filtered
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py b/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py
deleted file mode 100644
index 8b13789..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py b/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py
deleted file mode 100644
index 6d6f93a..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""
-Script which takes one or more file paths and reports on their detected
-encodings
-
-Example::
-
- % chardetect somefile someotherfile
- somefile: windows-1252 with confidence 0.5
- someotherfile: ascii with confidence 1.0
-
-If no paths are provided, it takes its input from stdin.
-
-"""
-
-from __future__ import absolute_import, print_function, unicode_literals
-
-import argparse
-import sys
-
-from pip._vendor.chardet import __version__
-from pip._vendor.chardet.compat import PY2
-from pip._vendor.chardet.universaldetector import UniversalDetector
-
-
-def description_of(lines, name='stdin'):
- """
- Return a string describing the probable encoding of a file or
- list of strings.
-
- :param lines: The lines to get the encoding of.
- :type lines: Iterable of bytes
- :param name: Name of file or collection of lines
- :type name: str
- """
- u = UniversalDetector()
- for line in lines:
- line = bytearray(line)
- u.feed(line)
- # shortcut out of the loop to save reading further - particularly useful if we read a BOM.
- if u.done:
- break
- u.close()
- result = u.result
- if PY2:
- name = name.decode(sys.getfilesystemencoding(), 'ignore')
- if result['encoding']:
- return '{}: {} with confidence {}'.format(name, result['encoding'],
- result['confidence'])
- else:
- return '{}: no result'.format(name)
-
-
-def main(argv=None):
- """
- Handles command line arguments and gets things started.
-
- :param argv: List of arguments, as if specified on the command-line.
- If None, ``sys.argv[1:]`` is used instead.
- :type argv: list of str
- """
- # Get command line arguments
- parser = argparse.ArgumentParser(
- description="Takes one or more file paths and reports their detected \
- encodings")
- parser.add_argument('input',
- help='File whose encoding we would like to determine. \
- (default: stdin)',
- type=argparse.FileType('rb'), nargs='*',
- default=[sys.stdin if PY2 else sys.stdin.buffer])
- parser.add_argument('--version', action='version',
- version='%(prog)s {}'.format(__version__))
- args = parser.parse_args(argv)
-
- for f in args.input:
- if f.isatty():
- print("You are running chardetect interactively. Press " +
- "CTRL-D twice at the start of a blank line to signal the " +
- "end of your input. If you want help, run chardetect " +
- "--help\n", file=sys.stderr)
- print(description_of(f, f.name))
-
-
-if __name__ == '__main__':
- main()
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py b/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py
deleted file mode 100644
index 68fba44..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py
+++ /dev/null
@@ -1,88 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-import logging
-
-from .enums import MachineState
-
-
-class CodingStateMachine(object):
- """
- A state machine to verify a byte sequence for a particular encoding. For
- each byte the detector receives, it will feed that byte to every active
- state machine available, one byte at a time. The state machine changes its
- state based on its previous state and the byte it receives. There are 3
- states in a state machine that are of interest to an auto-detector:
-
- START state: This is the state to start with, or a legal byte sequence
- (i.e. a valid code point) for character has been identified.
-
- ME state: This indicates that the state machine identified a byte sequence
- that is specific to the charset it is designed for and that
- there is no other possible encoding which can contain this byte
- sequence. This will to lead to an immediate positive answer for
- the detector.
-
- ERROR state: This indicates the state machine identified an illegal byte
- sequence for that encoding. This will lead to an immediate
- negative answer for this encoding. Detector will exclude this
- encoding from consideration from here on.
- """
- def __init__(self, sm):
- self._model = sm
- self._curr_byte_pos = 0
- self._curr_char_len = 0
- self._curr_state = None
- self.logger = logging.getLogger(__name__)
- self.reset()
-
- def reset(self):
- self._curr_state = MachineState.START
-
- def next_state(self, c):
- # for each byte we get its class
- # if it is first byte, we also get byte length
- byte_class = self._model['class_table'][c]
- if self._curr_state == MachineState.START:
- self._curr_byte_pos = 0
- self._curr_char_len = self._model['char_len_table'][byte_class]
- # from byte's class and state_table, we get its next state
- curr_state = (self._curr_state * self._model['class_factor']
- + byte_class)
- self._curr_state = self._model['state_table'][curr_state]
- self._curr_byte_pos += 1
- return self._curr_state
-
- def get_current_charlen(self):
- return self._curr_char_len
-
- def get_coding_state_machine(self):
- return self._model['name']
-
- @property
- def language(self):
- return self._model['language']
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/compat.py b/venv/Lib/site-packages/pip/_vendor/chardet/compat.py
deleted file mode 100644
index 8941572..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/compat.py
+++ /dev/null
@@ -1,36 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# Contributor(s):
-# Dan Blanchard
-# Ian Cordasco
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-import sys
-
-
-if sys.version_info < (3, 0):
- PY2 = True
- PY3 = False
- string_types = (str, unicode)
- text_type = unicode
- iteritems = dict.iteritems
-else:
- PY2 = False
- PY3 = True
- string_types = (bytes, str)
- text_type = str
- iteritems = dict.items
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py
deleted file mode 100644
index efd793a..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py
+++ /dev/null
@@ -1,49 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import EUCKRDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import CP949_SM_MODEL
-
-
-class CP949Prober(MultiByteCharSetProber):
- def __init__(self):
- super(CP949Prober, self).__init__()
- self.coding_sm = CodingStateMachine(CP949_SM_MODEL)
- # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
- # not different.
- self.distribution_analyzer = EUCKRDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self):
- return "CP949"
-
- @property
- def language(self):
- return "Korean"
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/enums.py b/venv/Lib/site-packages/pip/_vendor/chardet/enums.py
deleted file mode 100644
index 0451207..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/enums.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""
-All of the Enums that are used throughout the chardet package.
-
-:author: Dan Blanchard (dan.blanchard@gmail.com)
-"""
-
-
-class InputState(object):
- """
- This enum represents the different states a universal detector can be in.
- """
- PURE_ASCII = 0
- ESC_ASCII = 1
- HIGH_BYTE = 2
-
-
-class LanguageFilter(object):
- """
- This enum represents the different language filters we can apply to a
- ``UniversalDetector``.
- """
- CHINESE_SIMPLIFIED = 0x01
- CHINESE_TRADITIONAL = 0x02
- JAPANESE = 0x04
- KOREAN = 0x08
- NON_CJK = 0x10
- ALL = 0x1F
- CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL
- CJK = CHINESE | JAPANESE | KOREAN
-
-
-class ProbingState(object):
- """
- This enum represents the different states a prober can be in.
- """
- DETECTING = 0
- FOUND_IT = 1
- NOT_ME = 2
-
-
-class MachineState(object):
- """
- This enum represents the different states a state machine can be in.
- """
- START = 0
- ERROR = 1
- ITS_ME = 2
-
-
-class SequenceLikelihood(object):
- """
- This enum represents the likelihood of a character following the previous one.
- """
- NEGATIVE = 0
- UNLIKELY = 1
- LIKELY = 2
- POSITIVE = 3
-
- @classmethod
- def get_num_categories(cls):
- """:returns: The number of likelihood categories in the enum."""
- return 4
-
-
-class CharacterCategory(object):
- """
- This enum represents the different categories language models for
- ``SingleByteCharsetProber`` put characters into.
-
- Anything less than CONTROL is considered a letter.
- """
- UNDEFINED = 255
- LINE_BREAK = 254
- SYMBOL = 253
- DIGIT = 252
- CONTROL = 251
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py
deleted file mode 100644
index c70493f..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py
+++ /dev/null
@@ -1,101 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .codingstatemachine import CodingStateMachine
-from .enums import LanguageFilter, ProbingState, MachineState
-from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL,
- ISO2022KR_SM_MODEL)
-
-
-class EscCharSetProber(CharSetProber):
- """
- This CharSetProber uses a "code scheme" approach for detecting encodings,
- whereby easily recognizable escape or shift sequences are relied on to
- identify these encodings.
- """
-
- def __init__(self, lang_filter=None):
- super(EscCharSetProber, self).__init__(lang_filter=lang_filter)
- self.coding_sm = []
- if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED:
- self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL))
- self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL))
- if self.lang_filter & LanguageFilter.JAPANESE:
- self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL))
- if self.lang_filter & LanguageFilter.KOREAN:
- self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL))
- self.active_sm_count = None
- self._detected_charset = None
- self._detected_language = None
- self._state = None
- self.reset()
-
- def reset(self):
- super(EscCharSetProber, self).reset()
- for coding_sm in self.coding_sm:
- if not coding_sm:
- continue
- coding_sm.active = True
- coding_sm.reset()
- self.active_sm_count = len(self.coding_sm)
- self._detected_charset = None
- self._detected_language = None
-
- @property
- def charset_name(self):
- return self._detected_charset
-
- @property
- def language(self):
- return self._detected_language
-
- def get_confidence(self):
- if self._detected_charset:
- return 0.99
- else:
- return 0.00
-
- def feed(self, byte_str):
- for c in byte_str:
- for coding_sm in self.coding_sm:
- if not coding_sm or not coding_sm.active:
- continue
- coding_state = coding_sm.next_state(c)
- if coding_state == MachineState.ERROR:
- coding_sm.active = False
- self.active_sm_count -= 1
- if self.active_sm_count <= 0:
- self._state = ProbingState.NOT_ME
- return self.state
- elif coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- self._detected_charset = coding_sm.get_coding_state_machine()
- self._detected_language = coding_sm.language
- return self.state
-
- return self.state
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py b/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py
deleted file mode 100644
index 0069523..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py
+++ /dev/null
@@ -1,246 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .enums import MachineState
-
-HZ_CLS = (
-1,0,0,0,0,0,0,0, # 00 - 07
-0,0,0,0,0,0,0,0, # 08 - 0f
-0,0,0,0,0,0,0,0, # 10 - 17
-0,0,0,1,0,0,0,0, # 18 - 1f
-0,0,0,0,0,0,0,0, # 20 - 27
-0,0,0,0,0,0,0,0, # 28 - 2f
-0,0,0,0,0,0,0,0, # 30 - 37
-0,0,0,0,0,0,0,0, # 38 - 3f
-0,0,0,0,0,0,0,0, # 40 - 47
-0,0,0,0,0,0,0,0, # 48 - 4f
-0,0,0,0,0,0,0,0, # 50 - 57
-0,0,0,0,0,0,0,0, # 58 - 5f
-0,0,0,0,0,0,0,0, # 60 - 67
-0,0,0,0,0,0,0,0, # 68 - 6f
-0,0,0,0,0,0,0,0, # 70 - 77
-0,0,0,4,0,5,2,0, # 78 - 7f
-1,1,1,1,1,1,1,1, # 80 - 87
-1,1,1,1,1,1,1,1, # 88 - 8f
-1,1,1,1,1,1,1,1, # 90 - 97
-1,1,1,1,1,1,1,1, # 98 - 9f
-1,1,1,1,1,1,1,1, # a0 - a7
-1,1,1,1,1,1,1,1, # a8 - af
-1,1,1,1,1,1,1,1, # b0 - b7
-1,1,1,1,1,1,1,1, # b8 - bf
-1,1,1,1,1,1,1,1, # c0 - c7
-1,1,1,1,1,1,1,1, # c8 - cf
-1,1,1,1,1,1,1,1, # d0 - d7
-1,1,1,1,1,1,1,1, # d8 - df
-1,1,1,1,1,1,1,1, # e0 - e7
-1,1,1,1,1,1,1,1, # e8 - ef
-1,1,1,1,1,1,1,1, # f0 - f7
-1,1,1,1,1,1,1,1, # f8 - ff
-)
-
-HZ_ST = (
-MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f
-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17
- 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f
- 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27
- 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f
-)
-
-HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
-
-HZ_SM_MODEL = {'class_table': HZ_CLS,
- 'class_factor': 6,
- 'state_table': HZ_ST,
- 'char_len_table': HZ_CHAR_LEN_TABLE,
- 'name': "HZ-GB-2312",
- 'language': 'Chinese'}
-
-ISO2022CN_CLS = (
-2,0,0,0,0,0,0,0, # 00 - 07
-0,0,0,0,0,0,0,0, # 08 - 0f
-0,0,0,0,0,0,0,0, # 10 - 17
-0,0,0,1,0,0,0,0, # 18 - 1f
-0,0,0,0,0,0,0,0, # 20 - 27
-0,3,0,0,0,0,0,0, # 28 - 2f
-0,0,0,0,0,0,0,0, # 30 - 37
-0,0,0,0,0,0,0,0, # 38 - 3f
-0,0,0,4,0,0,0,0, # 40 - 47
-0,0,0,0,0,0,0,0, # 48 - 4f
-0,0,0,0,0,0,0,0, # 50 - 57
-0,0,0,0,0,0,0,0, # 58 - 5f
-0,0,0,0,0,0,0,0, # 60 - 67
-0,0,0,0,0,0,0,0, # 68 - 6f
-0,0,0,0,0,0,0,0, # 70 - 77
-0,0,0,0,0,0,0,0, # 78 - 7f
-2,2,2,2,2,2,2,2, # 80 - 87
-2,2,2,2,2,2,2,2, # 88 - 8f
-2,2,2,2,2,2,2,2, # 90 - 97
-2,2,2,2,2,2,2,2, # 98 - 9f
-2,2,2,2,2,2,2,2, # a0 - a7
-2,2,2,2,2,2,2,2, # a8 - af
-2,2,2,2,2,2,2,2, # b0 - b7
-2,2,2,2,2,2,2,2, # b8 - bf
-2,2,2,2,2,2,2,2, # c0 - c7
-2,2,2,2,2,2,2,2, # c8 - cf
-2,2,2,2,2,2,2,2, # d0 - d7
-2,2,2,2,2,2,2,2, # d8 - df
-2,2,2,2,2,2,2,2, # e0 - e7
-2,2,2,2,2,2,2,2, # e8 - ef
-2,2,2,2,2,2,2,2, # f0 - f7
-2,2,2,2,2,2,2,2, # f8 - ff
-)
-
-ISO2022CN_ST = (
-MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07
-MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f
-MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17
-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27
- 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f
-)
-
-ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0)
-
-ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS,
- 'class_factor': 9,
- 'state_table': ISO2022CN_ST,
- 'char_len_table': ISO2022CN_CHAR_LEN_TABLE,
- 'name': "ISO-2022-CN",
- 'language': 'Chinese'}
-
-ISO2022JP_CLS = (
-2,0,0,0,0,0,0,0, # 00 - 07
-0,0,0,0,0,0,2,2, # 08 - 0f
-0,0,0,0,0,0,0,0, # 10 - 17
-0,0,0,1,0,0,0,0, # 18 - 1f
-0,0,0,0,7,0,0,0, # 20 - 27
-3,0,0,0,0,0,0,0, # 28 - 2f
-0,0,0,0,0,0,0,0, # 30 - 37
-0,0,0,0,0,0,0,0, # 38 - 3f
-6,0,4,0,8,0,0,0, # 40 - 47
-0,9,5,0,0,0,0,0, # 48 - 4f
-0,0,0,0,0,0,0,0, # 50 - 57
-0,0,0,0,0,0,0,0, # 58 - 5f
-0,0,0,0,0,0,0,0, # 60 - 67
-0,0,0,0,0,0,0,0, # 68 - 6f
-0,0,0,0,0,0,0,0, # 70 - 77
-0,0,0,0,0,0,0,0, # 78 - 7f
-2,2,2,2,2,2,2,2, # 80 - 87
-2,2,2,2,2,2,2,2, # 88 - 8f
-2,2,2,2,2,2,2,2, # 90 - 97
-2,2,2,2,2,2,2,2, # 98 - 9f
-2,2,2,2,2,2,2,2, # a0 - a7
-2,2,2,2,2,2,2,2, # a8 - af
-2,2,2,2,2,2,2,2, # b0 - b7
-2,2,2,2,2,2,2,2, # b8 - bf
-2,2,2,2,2,2,2,2, # c0 - c7
-2,2,2,2,2,2,2,2, # c8 - cf
-2,2,2,2,2,2,2,2, # d0 - d7
-2,2,2,2,2,2,2,2, # d8 - df
-2,2,2,2,2,2,2,2, # e0 - e7
-2,2,2,2,2,2,2,2, # e8 - ef
-2,2,2,2,2,2,2,2, # f0 - f7
-2,2,2,2,2,2,2,2, # f8 - ff
-)
-
-ISO2022JP_ST = (
-MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07
-MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17
-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f
-MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47
-)
-
-ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-
-ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS,
- 'class_factor': 10,
- 'state_table': ISO2022JP_ST,
- 'char_len_table': ISO2022JP_CHAR_LEN_TABLE,
- 'name': "ISO-2022-JP",
- 'language': 'Japanese'}
-
-ISO2022KR_CLS = (
-2,0,0,0,0,0,0,0, # 00 - 07
-0,0,0,0,0,0,0,0, # 08 - 0f
-0,0,0,0,0,0,0,0, # 10 - 17
-0,0,0,1,0,0,0,0, # 18 - 1f
-0,0,0,0,3,0,0,0, # 20 - 27
-0,4,0,0,0,0,0,0, # 28 - 2f
-0,0,0,0,0,0,0,0, # 30 - 37
-0,0,0,0,0,0,0,0, # 38 - 3f
-0,0,0,5,0,0,0,0, # 40 - 47
-0,0,0,0,0,0,0,0, # 48 - 4f
-0,0,0,0,0,0,0,0, # 50 - 57
-0,0,0,0,0,0,0,0, # 58 - 5f
-0,0,0,0,0,0,0,0, # 60 - 67
-0,0,0,0,0,0,0,0, # 68 - 6f
-0,0,0,0,0,0,0,0, # 70 - 77
-0,0,0,0,0,0,0,0, # 78 - 7f
-2,2,2,2,2,2,2,2, # 80 - 87
-2,2,2,2,2,2,2,2, # 88 - 8f
-2,2,2,2,2,2,2,2, # 90 - 97
-2,2,2,2,2,2,2,2, # 98 - 9f
-2,2,2,2,2,2,2,2, # a0 - a7
-2,2,2,2,2,2,2,2, # a8 - af
-2,2,2,2,2,2,2,2, # b0 - b7
-2,2,2,2,2,2,2,2, # b8 - bf
-2,2,2,2,2,2,2,2, # c0 - c7
-2,2,2,2,2,2,2,2, # c8 - cf
-2,2,2,2,2,2,2,2, # d0 - d7
-2,2,2,2,2,2,2,2, # d8 - df
-2,2,2,2,2,2,2,2, # e0 - e7
-2,2,2,2,2,2,2,2, # e8 - ef
-2,2,2,2,2,2,2,2, # f0 - f7
-2,2,2,2,2,2,2,2, # f8 - ff
-)
-
-ISO2022KR_ST = (
-MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f
-MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f
-MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27
-)
-
-ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
-
-ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS,
- 'class_factor': 6,
- 'state_table': ISO2022KR_ST,
- 'char_len_table': ISO2022KR_CHAR_LEN_TABLE,
- 'name': "ISO-2022-KR",
- 'language': 'Korean'}
-
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py
deleted file mode 100644
index 20ce8f7..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py
+++ /dev/null
@@ -1,92 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .enums import ProbingState, MachineState
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import EUCJPDistributionAnalysis
-from .jpcntx import EUCJPContextAnalysis
-from .mbcssm import EUCJP_SM_MODEL
-
-
-class EUCJPProber(MultiByteCharSetProber):
- def __init__(self):
- super(EUCJPProber, self).__init__()
- self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL)
- self.distribution_analyzer = EUCJPDistributionAnalysis()
- self.context_analyzer = EUCJPContextAnalysis()
- self.reset()
-
- def reset(self):
- super(EUCJPProber, self).reset()
- self.context_analyzer.reset()
-
- @property
- def charset_name(self):
- return "EUC-JP"
-
- @property
- def language(self):
- return "Japanese"
-
- def feed(self, byte_str):
- for i in range(len(byte_str)):
- # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte
- coding_state = self.coding_sm.next_state(byte_str[i])
- if coding_state == MachineState.ERROR:
- self.logger.debug('%s %s prober hit error at byte %s',
- self.charset_name, self.language, i)
- self._state = ProbingState.NOT_ME
- break
- elif coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- elif coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte_str[0]
- self.context_analyzer.feed(self._last_char, char_len)
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.context_analyzer.feed(byte_str[i - 1:i + 1],
- char_len)
- self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
- char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if (self.context_analyzer.got_enough_data() and
- (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self):
- context_conf = self.context_analyzer.get_confidence()
- distrib_conf = self.distribution_analyzer.get_confidence()
- return max(context_conf, distrib_conf)
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py
deleted file mode 100644
index b68078c..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py
+++ /dev/null
@@ -1,195 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Sampling from about 20M text materials include literature and computer technology
-
-# 128 --> 0.79
-# 256 --> 0.92
-# 512 --> 0.986
-# 1024 --> 0.99944
-# 2048 --> 0.99999
-#
-# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
-# Random Distribution Ration = 512 / (2350-512) = 0.279.
-#
-# Typical Distribution Ratio
-
-EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
-
-EUCKR_TABLE_SIZE = 2352
-
-# Char to FreqOrder table ,
-EUCKR_CHAR_TO_FREQ_ORDER = (
- 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87,
-1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
-1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734,
- 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
- 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622,
- 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750,
-1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
- 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
- 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
-1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19,
-1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
-1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
-1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
-1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
- 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
-1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
-1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
-1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
-1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
- 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
-1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
- 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
- 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
-1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
- 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
-1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885,
- 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
- 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
-1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
-1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841,
-1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910,
-1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610,
- 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
-1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939,
- 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
- 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934,
-1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
-1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
-1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
-1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
-1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
-1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
- 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
- 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7,
- 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
-1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
- 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
-1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250,
- 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824,
- 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
-2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745,
- 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61,
- 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
-2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032,
-2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
-2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
- 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
- 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
-2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
- 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
-1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
-2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075,
-1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
-2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
-2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
-1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
- 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
-2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
-2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
- 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274,
- 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
-2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721,
-1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
-2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463,
-2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
-2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285,
-2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
-2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10,
-2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350,
-1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
-2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
-2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
-2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
-2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
-2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247,
-1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
-1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
-2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259,
-1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262,
-2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
-1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273,
- 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
-2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117,
- 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
-2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
- 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312,
-2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229,
-2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315,
- 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
-2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170,
-1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
- 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
-1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
-2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
-1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
-2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
- 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
-2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
-1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
-2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
-1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
-2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
-1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
- 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
-2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
-2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
- 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
- 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485,
-1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
-1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
- 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
-2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
-2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
- 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494,
- 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
- 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
-2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
- 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
- 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
-2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
-2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
- 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544,
-2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
-1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
- 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562,
-2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
-2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
-2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
- 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431,
- 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
- 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
-2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406,
-2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
-2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
-1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
-2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
- 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256
-)
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py
deleted file mode 100644
index 345a060..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import EUCKRDistributionAnalysis
-from .mbcssm import EUCKR_SM_MODEL
-
-
-class EUCKRProber(MultiByteCharSetProber):
- def __init__(self):
- super(EUCKRProber, self).__init__()
- self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL)
- self.distribution_analyzer = EUCKRDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self):
- return "EUC-KR"
-
- @property
- def language(self):
- return "Korean"
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py
deleted file mode 100644
index ed7a995..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py
+++ /dev/null
@@ -1,387 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# EUCTW frequency table
-# Converted from big5 work
-# by Taiwan's Mandarin Promotion Council
-#
-
-# 128 --> 0.42261
-# 256 --> 0.57851
-# 512 --> 0.74851
-# 1024 --> 0.89384
-# 2048 --> 0.97583
-#
-# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
-# Random Distribution Ration = 512/(5401-512)=0.105
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
-
-EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
-
-# Char to FreqOrder table ,
-EUCTW_TABLE_SIZE = 5376
-
-EUCTW_CHAR_TO_FREQ_ORDER = (
- 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742
-3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758
-1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774
- 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790
-3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806
-4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822
-7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838
- 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854
- 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870
- 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886
-2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902
-1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918
-3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934
- 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950
-1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966
-3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982
-2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998
- 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014
-3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030
-1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046
-7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062
- 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078
-7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094
-1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110
- 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126
- 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142
-3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158
-3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174
- 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190
-2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206
-2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222
- 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238
- 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254
-3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270
-1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286
-1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302
-1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318
-2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334
- 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350
-4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366
-1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382
-7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398
-2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414
- 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430
- 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446
- 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462
- 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478
-7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494
- 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510
-1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526
- 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542
- 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558
-7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574
-1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590
- 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606
-3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622
-4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638
-3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654
- 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670
- 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686
-1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702
-4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718
-3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734
-3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750
-2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766
-7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782
-3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798
-7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814
-1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830
-2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846
-1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862
- 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878
-1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894
-4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910
-3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926
- 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942
- 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958
- 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974
-2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990
-7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006
-1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022
-2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038
-1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054
-1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070
-7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086
-7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102
-7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118
-3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134
-4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150
-1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166
-7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182
-2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198
-7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214
-3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230
-3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246
-7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262
-2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278
-7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294
- 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310
-4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326
-2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342
-7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358
-3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374
-2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390
-2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406
- 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422
-2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438
-1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454
-1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470
-2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486
-1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502
-7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518
-7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534
-2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550
-4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566
-1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582
-7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598
- 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614
-4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630
- 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646
-2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662
- 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678
-1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694
-1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710
- 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726
-3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742
-3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758
-1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774
-3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790
-7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806
-7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822
-1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838
-2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854
-1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870
-3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886
-2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902
-3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918
-2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934
-4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950
-4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966
-3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982
- 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998
-3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014
- 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030
-3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046
-3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062
-3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078
-1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094
-7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110
- 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126
-7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142
-1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158
- 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174
-4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190
-3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206
- 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222
-2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238
-2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254
-3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270
-1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286
-4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302
-2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318
-1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334
-1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350
-2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366
-3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382
-1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398
-7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414
-1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430
-4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446
-1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462
- 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478
-1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494
-3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510
-3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526
-2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542
-1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558
-4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574
- 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590
-7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606
-2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622
-3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638
-4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654
- 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670
-7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686
-7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702
-1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718
-4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734
-3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750
-2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766
-3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782
-3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798
-2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814
-1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830
-4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846
-3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862
-3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878
-2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894
-4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910
-7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926
-3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942
-2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958
-3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974
-1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990
-2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006
-3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022
-4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038
-2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054
-2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070
-7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086
-1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102
-2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118
-1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134
-3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150
-4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166
-2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182
-3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198
-3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214
-2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230
-4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246
-2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262
-3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278
-4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294
-7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310
-3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326
- 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342
-1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358
-4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374
-1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390
-4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406
-7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422
- 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438
-7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454
-2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470
-1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486
-1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502
-3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518
- 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534
- 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550
- 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566
-3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582
-2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598
- 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614
-7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630
-1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646
-3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662
-7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678
-1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694
-7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710
-4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726
-1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742
-2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758
-2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774
-4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790
- 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806
- 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822
-3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838
-3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854
-1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870
-2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886
-7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902
-1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918
-1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934
-3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950
- 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966
-1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982
-4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998
-7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014
-2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030
-3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046
- 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062
-1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078
-2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094
-2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110
-7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126
-7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142
-7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158
-2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174
-2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190
-1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206
-4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222
-3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238
-3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254
-4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270
-4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286
-2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302
-2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318
-7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334
-4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350
-7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366
-2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382
-1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398
-3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414
-4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430
-2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446
- 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462
-2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478
-1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494
-2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510
-2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526
-4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542
-7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558
-1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574
-3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590
-7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606
-1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622
-8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638
-2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654
-8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670
-2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686
-2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702
-8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718
-8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734
-8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750
- 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766
-8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782
-4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798
-3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814
-8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830
-1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846
-8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862
- 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878
-1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894
- 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910
-4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926
-1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942
-4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958
-1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974
- 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990
-3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006
-4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022
-8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038
- 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054
-3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070
- 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086
-2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102
-)
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py
deleted file mode 100644
index 35669cc..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py
+++ /dev/null
@@ -1,46 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import EUCTWDistributionAnalysis
-from .mbcssm import EUCTW_SM_MODEL
-
-class EUCTWProber(MultiByteCharSetProber):
- def __init__(self):
- super(EUCTWProber, self).__init__()
- self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL)
- self.distribution_analyzer = EUCTWDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self):
- return "EUC-TW"
-
- @property
- def language(self):
- return "Taiwan"
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py b/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py
deleted file mode 100644
index 697837b..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py
+++ /dev/null
@@ -1,283 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# GB2312 most frequently used character table
-#
-# Char to FreqOrder table , from hz6763
-
-# 512 --> 0.79 -- 0.79
-# 1024 --> 0.92 -- 0.13
-# 2048 --> 0.98 -- 0.06
-# 6768 --> 1.00 -- 0.02
-#
-# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
-# Random Distribution Ration = 512 / (3755 - 512) = 0.157
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
-
-GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
-
-GB2312_TABLE_SIZE = 3760
-
-GB2312_CHAR_TO_FREQ_ORDER = (
-1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
-2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
-2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
- 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
-1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
-1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
- 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
-1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575,
-2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
-3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
- 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
-1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
- 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
-2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606,
- 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
-2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
-1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
-3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052,
- 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
-1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
- 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
-2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
-1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26,
-3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
-1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
-2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
-1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
- 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
-3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403,
-3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
- 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
-3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940,
- 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121,
-1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
-3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
-2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233,
-1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
- 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
-1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094,
-4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
- 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
-3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152,
-3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909,
- 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
-1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221,
-2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
-1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
-1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
- 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
-3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
-3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360,
-4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
- 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
-3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243,
-1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
-1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
-4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
- 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
- 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257,
-3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
-1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
- 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781,
-1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
-2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937,
- 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
- 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789,
- 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
-3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
-4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451,
-3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
- 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
-2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
-2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780,
-2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745,
- 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
-2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
- 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657,
- 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
- 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
-3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
-2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
-2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536,
-1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
- 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
-2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
- 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
- 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
-1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
-1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894,
- 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
- 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
-1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
-2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
-3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
-2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
-2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
-2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
-3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
-1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541,
-1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
-2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
-1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
-3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754,
-1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
-1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
-3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
- 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
-2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
-1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
-4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
-1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
-1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
-3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
-1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
- 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
- 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99,
-1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280,
- 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
-1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
-1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
- 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
-3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
-4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
-3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
-2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
-2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
-1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
-3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
-2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
-1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
-1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885,
- 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
-2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
-2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
-3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
-4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
-3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
- 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
-3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
-2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
-1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131,
- 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947,
- 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
-3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814,
-4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
-2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
-1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
-1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
- 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
-1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480,
-3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
- 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
- 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769,
-1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207,
- 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
-1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623,
- 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
-2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
- 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
-2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
-2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
-1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
-1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
-2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
- 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
-1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
-1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
-2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
-2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616,
-3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
-1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
-4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
- 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
- 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
-3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377,
-1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315,
- 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557,
-3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
-1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
-4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
-1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
-2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
-1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
- 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
-1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
-3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503,
- 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
-2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
- 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
-1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
-1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27,
-1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
-3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
-2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
-3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
-3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
-3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
- 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
-2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
- 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
-2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
- 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
-1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31,
- 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
- 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
-1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
-3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
-3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881,
-1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276,
-1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
-3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
-2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
-2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
-1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843,
-3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
- 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
-4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
-1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
-2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770,
-3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
-3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
-1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713,
- 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
- 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
-2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
- 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014,
-1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510,
- 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
-1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459,
-1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
-1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
-1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232,
-1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
- 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
- 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512
-)
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py
deleted file mode 100644
index 8446d2d..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py
+++ /dev/null
@@ -1,46 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import GB2312DistributionAnalysis
-from .mbcssm import GB2312_SM_MODEL
-
-class GB2312Prober(MultiByteCharSetProber):
- def __init__(self):
- super(GB2312Prober, self).__init__()
- self.coding_sm = CodingStateMachine(GB2312_SM_MODEL)
- self.distribution_analyzer = GB2312DistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self):
- return "GB2312"
-
- @property
- def language(self):
- return "Chinese"
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py
deleted file mode 100644
index b0e1bf4..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py
+++ /dev/null
@@ -1,292 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Shy Shalom
-# Portions created by the Initial Developer are Copyright (C) 2005
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-# This prober doesn't actually recognize a language or a charset.
-# It is a helper prober for the use of the Hebrew model probers
-
-### General ideas of the Hebrew charset recognition ###
-#
-# Four main charsets exist in Hebrew:
-# "ISO-8859-8" - Visual Hebrew
-# "windows-1255" - Logical Hebrew
-# "ISO-8859-8-I" - Logical Hebrew
-# "x-mac-hebrew" - ?? Logical Hebrew ??
-#
-# Both "ISO" charsets use a completely identical set of code points, whereas
-# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
-# these code points. windows-1255 defines additional characters in the range
-# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
-# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
-# x-mac-hebrew defines similar additional code points but with a different
-# mapping.
-#
-# As far as an average Hebrew text with no diacritics is concerned, all four
-# charsets are identical with respect to code points. Meaning that for the
-# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
-# (including final letters).
-#
-# The dominant difference between these charsets is their directionality.
-# "Visual" directionality means that the text is ordered as if the renderer is
-# not aware of a BIDI rendering algorithm. The renderer sees the text and
-# draws it from left to right. The text itself when ordered naturally is read
-# backwards. A buffer of Visual Hebrew generally looks like so:
-# "[last word of first line spelled backwards] [whole line ordered backwards
-# and spelled backwards] [first word of first line spelled backwards]
-# [end of line] [last word of second line] ... etc' "
-# adding punctuation marks, numbers and English text to visual text is
-# naturally also "visual" and from left to right.
-#
-# "Logical" directionality means the text is ordered "naturally" according to
-# the order it is read. It is the responsibility of the renderer to display
-# the text from right to left. A BIDI algorithm is used to place general
-# punctuation marks, numbers and English text in the text.
-#
-# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
-# what little evidence I could find, it seems that its general directionality
-# is Logical.
-#
-# To sum up all of the above, the Hebrew probing mechanism knows about two
-# charsets:
-# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
-# backwards while line order is natural. For charset recognition purposes
-# the line order is unimportant (In fact, for this implementation, even
-# word order is unimportant).
-# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
-#
-# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
-# specifically identified.
-# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
-# that contain special punctuation marks or diacritics is displayed with
-# some unconverted characters showing as question marks. This problem might
-# be corrected using another model prober for x-mac-hebrew. Due to the fact
-# that x-mac-hebrew texts are so rare, writing another model prober isn't
-# worth the effort and performance hit.
-#
-#### The Prober ####
-#
-# The prober is divided between two SBCharSetProbers and a HebrewProber,
-# all of which are managed, created, fed data, inquired and deleted by the
-# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
-# fact some kind of Hebrew, Logical or Visual. The final decision about which
-# one is it is made by the HebrewProber by combining final-letter scores
-# with the scores of the two SBCharSetProbers to produce a final answer.
-#
-# The SBCSGroupProber is responsible for stripping the original text of HTML
-# tags, English characters, numbers, low-ASCII punctuation characters, spaces
-# and new lines. It reduces any sequence of such characters to a single space.
-# The buffer fed to each prober in the SBCS group prober is pure text in
-# high-ASCII.
-# The two SBCharSetProbers (model probers) share the same language model:
-# Win1255Model.
-# The first SBCharSetProber uses the model normally as any other
-# SBCharSetProber does, to recognize windows-1255, upon which this model was
-# built. The second SBCharSetProber is told to make the pair-of-letter
-# lookup in the language model backwards. This in practice exactly simulates
-# a visual Hebrew model using the windows-1255 logical Hebrew model.
-#
-# The HebrewProber is not using any language model. All it does is look for
-# final-letter evidence suggesting the text is either logical Hebrew or visual
-# Hebrew. Disjointed from the model probers, the results of the HebrewProber
-# alone are meaningless. HebrewProber always returns 0.00 as confidence
-# since it never identifies a charset by itself. Instead, the pointer to the
-# HebrewProber is passed to the model probers as a helper "Name Prober".
-# When the Group prober receives a positive identification from any prober,
-# it asks for the name of the charset identified. If the prober queried is a
-# Hebrew model prober, the model prober forwards the call to the
-# HebrewProber to make the final decision. In the HebrewProber, the
-# decision is made according to the final-letters scores maintained and Both
-# model probers scores. The answer is returned in the form of the name of the
-# charset identified, either "windows-1255" or "ISO-8859-8".
-
-class HebrewProber(CharSetProber):
- # windows-1255 / ISO-8859-8 code points of interest
- FINAL_KAF = 0xea
- NORMAL_KAF = 0xeb
- FINAL_MEM = 0xed
- NORMAL_MEM = 0xee
- FINAL_NUN = 0xef
- NORMAL_NUN = 0xf0
- FINAL_PE = 0xf3
- NORMAL_PE = 0xf4
- FINAL_TSADI = 0xf5
- NORMAL_TSADI = 0xf6
-
- # Minimum Visual vs Logical final letter score difference.
- # If the difference is below this, don't rely solely on the final letter score
- # distance.
- MIN_FINAL_CHAR_DISTANCE = 5
-
- # Minimum Visual vs Logical model score difference.
- # If the difference is below this, don't rely at all on the model score
- # distance.
- MIN_MODEL_DISTANCE = 0.01
-
- VISUAL_HEBREW_NAME = "ISO-8859-8"
- LOGICAL_HEBREW_NAME = "windows-1255"
-
- def __init__(self):
- super(HebrewProber, self).__init__()
- self._final_char_logical_score = None
- self._final_char_visual_score = None
- self._prev = None
- self._before_prev = None
- self._logical_prober = None
- self._visual_prober = None
- self.reset()
-
- def reset(self):
- self._final_char_logical_score = 0
- self._final_char_visual_score = 0
- # The two last characters seen in the previous buffer,
- # mPrev and mBeforePrev are initialized to space in order to simulate
- # a word delimiter at the beginning of the data
- self._prev = ' '
- self._before_prev = ' '
- # These probers are owned by the group prober.
-
- def set_model_probers(self, logicalProber, visualProber):
- self._logical_prober = logicalProber
- self._visual_prober = visualProber
-
- def is_final(self, c):
- return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN,
- self.FINAL_PE, self.FINAL_TSADI]
-
- def is_non_final(self, c):
- # The normal Tsadi is not a good Non-Final letter due to words like
- # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
- # apostrophe is converted to a space in FilterWithoutEnglishLetters
- # causing the Non-Final tsadi to appear at an end of a word even
- # though this is not the case in the original text.
- # The letters Pe and Kaf rarely display a related behavior of not being
- # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
- # for example legally end with a Non-Final Pe or Kaf. However, the
- # benefit of these letters as Non-Final letters outweighs the damage
- # since these words are quite rare.
- return c in [self.NORMAL_KAF, self.NORMAL_MEM,
- self.NORMAL_NUN, self.NORMAL_PE]
-
- def feed(self, byte_str):
- # Final letter analysis for logical-visual decision.
- # Look for evidence that the received buffer is either logical Hebrew
- # or visual Hebrew.
- # The following cases are checked:
- # 1) A word longer than 1 letter, ending with a final letter. This is
- # an indication that the text is laid out "naturally" since the
- # final letter really appears at the end. +1 for logical score.
- # 2) A word longer than 1 letter, ending with a Non-Final letter. In
- # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
- # should not end with the Non-Final form of that letter. Exceptions
- # to this rule are mentioned above in isNonFinal(). This is an
- # indication that the text is laid out backwards. +1 for visual
- # score
- # 3) A word longer than 1 letter, starting with a final letter. Final
- # letters should not appear at the beginning of a word. This is an
- # indication that the text is laid out backwards. +1 for visual
- # score.
- #
- # The visual score and logical score are accumulated throughout the
- # text and are finally checked against each other in GetCharSetName().
- # No checking for final letters in the middle of words is done since
- # that case is not an indication for either Logical or Visual text.
- #
- # We automatically filter out all 7-bit characters (replace them with
- # spaces) so the word boundary detection works properly. [MAP]
-
- if self.state == ProbingState.NOT_ME:
- # Both model probers say it's not them. No reason to continue.
- return ProbingState.NOT_ME
-
- byte_str = self.filter_high_byte_only(byte_str)
-
- for cur in byte_str:
- if cur == ' ':
- # We stand on a space - a word just ended
- if self._before_prev != ' ':
- # next-to-last char was not a space so self._prev is not a
- # 1 letter word
- if self.is_final(self._prev):
- # case (1) [-2:not space][-1:final letter][cur:space]
- self._final_char_logical_score += 1
- elif self.is_non_final(self._prev):
- # case (2) [-2:not space][-1:Non-Final letter][
- # cur:space]
- self._final_char_visual_score += 1
- else:
- # Not standing on a space
- if ((self._before_prev == ' ') and
- (self.is_final(self._prev)) and (cur != ' ')):
- # case (3) [-2:space][-1:final letter][cur:not space]
- self._final_char_visual_score += 1
- self._before_prev = self._prev
- self._prev = cur
-
- # Forever detecting, till the end or until both model probers return
- # ProbingState.NOT_ME (handled above)
- return ProbingState.DETECTING
-
- @property
- def charset_name(self):
- # Make the decision: is it Logical or Visual?
- # If the final letter score distance is dominant enough, rely on it.
- finalsub = self._final_char_logical_score - self._final_char_visual_score
- if finalsub >= self.MIN_FINAL_CHAR_DISTANCE:
- return self.LOGICAL_HEBREW_NAME
- if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE:
- return self.VISUAL_HEBREW_NAME
-
- # It's not dominant enough, try to rely on the model scores instead.
- modelsub = (self._logical_prober.get_confidence()
- - self._visual_prober.get_confidence())
- if modelsub > self.MIN_MODEL_DISTANCE:
- return self.LOGICAL_HEBREW_NAME
- if modelsub < -self.MIN_MODEL_DISTANCE:
- return self.VISUAL_HEBREW_NAME
-
- # Still no good, back to final letter distance, maybe it'll save the
- # day.
- if finalsub < 0.0:
- return self.VISUAL_HEBREW_NAME
-
- # (finalsub > 0 - Logical) or (don't know what to do) default to
- # Logical.
- return self.LOGICAL_HEBREW_NAME
-
- @property
- def language(self):
- return 'Hebrew'
-
- @property
- def state(self):
- # Remain active as long as any of the model probers are active.
- if (self._logical_prober.state == ProbingState.NOT_ME) and \
- (self._visual_prober.state == ProbingState.NOT_ME):
- return ProbingState.NOT_ME
- return ProbingState.DETECTING
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py
deleted file mode 100644
index 83fc082..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py
+++ /dev/null
@@ -1,325 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Sampling from about 20M text materials include literature and computer technology
-#
-# Japanese frequency table, applied to both S-JIS and EUC-JP
-# They are sorted in order.
-
-# 128 --> 0.77094
-# 256 --> 0.85710
-# 512 --> 0.92635
-# 1024 --> 0.97130
-# 2048 --> 0.99431
-#
-# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
-# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
-#
-# Typical Distribution Ratio, 25% of IDR
-
-JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
-
-# Char to FreqOrder table ,
-JIS_TABLE_SIZE = 4368
-
-JIS_CHAR_TO_FREQ_ORDER = (
- 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16
-3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32
-1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48
-2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64
-2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80
-5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96
-1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112
-5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128
-5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144
-5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160
-5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176
-5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192
-5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208
-1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224
-1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240
-1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256
-2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272
-3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288
-3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304
- 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320
- 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336
-1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352
- 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368
-5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384
- 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400
- 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416
- 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432
- 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448
- 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464
-5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480
-5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496
-5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512
-4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528
-5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544
-5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560
-5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576
-5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592
-5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608
-5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624
-5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640
-5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656
-5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672
-3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688
-5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704
-5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720
-5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736
-5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752
-5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768
-5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784
-5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800
-5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816
-5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832
-5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848
-5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864
-5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880
-5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896
-5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912
-5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928
-5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944
-5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960
-5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976
-5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992
-5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
-5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
-5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
-5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
-5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
-5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
-5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
-5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
-5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
-5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
-5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
-5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
-5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
-5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
-5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
-5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
-5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
-5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
-5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
-6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
-6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
-6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
-6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
-6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
-6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
-6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
-6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
-4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
- 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
- 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
-1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488
-1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
- 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
-3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
-3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
- 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
-3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
-3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
- 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
-2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
- 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
-3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
-1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
- 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
-1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
- 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
-2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
-2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
-2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
-2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
-1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
-1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
-1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
-1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
-2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
-1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
-2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
-1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
-1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
-1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
-1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
-1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
-1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
- 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
- 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
-1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
-2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
-2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
-2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
-3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
-3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
- 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
-3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
-1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176
- 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
-2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
-1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
- 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
-3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
-4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
-2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
-1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
-2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
-1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
- 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
- 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
-1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
-2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
-2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
-2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
-3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
-1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
-2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
- 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
- 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
- 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
-1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544
-2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
- 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
-1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
-1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
- 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
-1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
-1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
-1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
- 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
-2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
- 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
-2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
-3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
-2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
-1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
-6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800
-1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
-2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
-1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
- 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
- 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
-3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
-3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
-1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
-1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
-1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
-1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
- 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
- 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
-2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
- 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
-3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
-2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
- 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
-1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
-2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
- 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
-1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
- 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
-4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
-2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
-1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
- 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
-1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
-2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
- 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
-6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
-1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
-1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
-2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
-3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
- 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
-3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
-1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
- 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
-1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
- 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
-3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
- 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
-2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
- 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
-4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
-2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
-1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
-1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
-1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
- 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
-1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
-3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
-1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
-3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
- 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
- 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
- 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
-2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
-1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
- 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
-1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
- 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
-1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
- 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
- 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
- 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872
-1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
-1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
-2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
-4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
- 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952
-1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
- 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
-1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
-3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
-1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
-2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
-2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
-1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
-1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
-2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
- 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
-2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
-1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
-1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
-1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192
-1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
-3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
-2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
-2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
- 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
-3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
-3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
-1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
-2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
-1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
-2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512
-)
-
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py b/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py
deleted file mode 100644
index 20044e4..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py
+++ /dev/null
@@ -1,233 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-
-# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
-jp2CharContext = (
-(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1),
-(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4),
-(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
-(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
-(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
-(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
-(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4),
-(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4),
-(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3),
-(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3),
-(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3),
-(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4),
-(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3),
-(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4),
-(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3),
-(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5),
-(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3),
-(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5),
-(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4),
-(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4),
-(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3),
-(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3),
-(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3),
-(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5),
-(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4),
-(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5),
-(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3),
-(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4),
-(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4),
-(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4),
-(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1),
-(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
-(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3),
-(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0),
-(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3),
-(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3),
-(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5),
-(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4),
-(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5),
-(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3),
-(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3),
-(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3),
-(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3),
-(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4),
-(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4),
-(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2),
-(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3),
-(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3),
-(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3),
-(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3),
-(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4),
-(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3),
-(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4),
-(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3),
-(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3),
-(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4),
-(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4),
-(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3),
-(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4),
-(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4),
-(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3),
-(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4),
-(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4),
-(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4),
-(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3),
-(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2),
-(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2),
-(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3),
-(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3),
-(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5),
-(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3),
-(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4),
-(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4),
-(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
-(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3),
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1),
-(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2),
-(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3),
-(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1),
-)
-
-class JapaneseContextAnalysis(object):
- NUM_OF_CATEGORY = 6
- DONT_KNOW = -1
- ENOUGH_REL_THRESHOLD = 100
- MAX_REL_THRESHOLD = 1000
- MINIMUM_DATA_THRESHOLD = 4
-
- def __init__(self):
- self._total_rel = None
- self._rel_sample = None
- self._need_to_skip_char_num = None
- self._last_char_order = None
- self._done = None
- self.reset()
-
- def reset(self):
- self._total_rel = 0 # total sequence received
- # category counters, each integer counts sequence in its category
- self._rel_sample = [0] * self.NUM_OF_CATEGORY
- # if last byte in current buffer is not the last byte of a character,
- # we need to know how many bytes to skip in next buffer
- self._need_to_skip_char_num = 0
- self._last_char_order = -1 # The order of previous char
- # If this flag is set to True, detection is done and conclusion has
- # been made
- self._done = False
-
- def feed(self, byte_str, num_bytes):
- if self._done:
- return
-
- # The buffer we got is byte oriented, and a character may span in more than one
- # buffers. In case the last one or two byte in last buffer is not
- # complete, we record how many byte needed to complete that character
- # and skip these bytes here. We can choose to record those bytes as
- # well and analyse the character once it is complete, but since a
- # character will not make much difference, by simply skipping
- # this character will simply our logic and improve performance.
- i = self._need_to_skip_char_num
- while i < num_bytes:
- order, char_len = self.get_order(byte_str[i:i + 2])
- i += char_len
- if i > num_bytes:
- self._need_to_skip_char_num = i - num_bytes
- self._last_char_order = -1
- else:
- if (order != -1) and (self._last_char_order != -1):
- self._total_rel += 1
- if self._total_rel > self.MAX_REL_THRESHOLD:
- self._done = True
- break
- self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1
- self._last_char_order = order
-
- def got_enough_data(self):
- return self._total_rel > self.ENOUGH_REL_THRESHOLD
-
- def get_confidence(self):
- # This is just one way to calculate confidence. It works well for me.
- if self._total_rel > self.MINIMUM_DATA_THRESHOLD:
- return (self._total_rel - self._rel_sample[0]) / self._total_rel
- else:
- return self.DONT_KNOW
-
- def get_order(self, byte_str):
- return -1, 1
-
-class SJISContextAnalysis(JapaneseContextAnalysis):
- def __init__(self):
- super(SJISContextAnalysis, self).__init__()
- self._charset_name = "SHIFT_JIS"
-
- @property
- def charset_name(self):
- return self._charset_name
-
- def get_order(self, byte_str):
- if not byte_str:
- return -1, 1
- # find out current char's byte length
- first_char = byte_str[0]
- if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC):
- char_len = 2
- if (first_char == 0x87) or (0xFA <= first_char <= 0xFC):
- self._charset_name = "CP932"
- else:
- char_len = 1
-
- # return its order if it is hiragana
- if len(byte_str) > 1:
- second_char = byte_str[1]
- if (first_char == 202) and (0x9F <= second_char <= 0xF1):
- return second_char - 0x9F, char_len
-
- return -1, char_len
-
-class EUCJPContextAnalysis(JapaneseContextAnalysis):
- def get_order(self, byte_str):
- if not byte_str:
- return -1, 1
- # find out current char's byte length
- first_char = byte_str[0]
- if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
- char_len = 2
- elif first_char == 0x8F:
- char_len = 3
- else:
- char_len = 1
-
- # return its order if it is hiragana
- if len(byte_str) > 1:
- second_char = byte_str[1]
- if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
- return second_char - 0xA1, char_len
-
- return -1, char_len
-
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
deleted file mode 100644
index e963a50..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
+++ /dev/null
@@ -1,4650 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-BULGARIAN_LANG_MODEL = {
- 63: { # 'e'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 1, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 45: { # '\xad'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 1, # 'М'
- 36: 0, # 'Ð'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Ð '
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 31: { # 'Ð'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'Ð'
- 32: 1, # 'Б'
- 35: 2, # 'Ð’'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 1, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Ð'
- 41: 1, # 'О'
- 30: 2, # 'П'
- 39: 2, # 'Ð '
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 2, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 0, # 'и'
- 26: 2, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 2, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 32: { # 'Б'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 2, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Ð'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Ð '
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 1, # 'Щ'
- 61: 2, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 2, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 35: { # 'Ð’'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Ð '
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 2, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 0, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 2, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 43: { # 'Г'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Ð'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Ð '
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 1, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 37: { # 'Д'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 2, # 'Ð’'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 2, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Ð '
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 44: { # 'Е'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 1, # 'Б'
- 35: 2, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Ð'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Ð '
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 2, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 0, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 55: { # 'Ж'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 0, # 'Б'
- 35: 1, # 'Ð’'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Ð'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 47: { # 'З'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Ð'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Ð '
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 40: { # 'И'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 2, # 'М'
- 36: 2, # 'Ð'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Ð '
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 2, # 'Я'
- 1: 1, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 3, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 59: { # 'Й'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 33: { # 'К'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 2, # 'Ð'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Ð '
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 46: { # 'Л'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 2, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Ð'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 0, # 'Ð '
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 38: { # 'М'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 2, # 'Ð’'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Ð '
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 36: { # 'Ð'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 2, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Ð '
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 2, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 41: { # 'О'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 1, # 'Б'
- 35: 2, # 'Ð’'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 2, # 'М'
- 36: 2, # 'Ð'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Ð '
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 2, # 'ч'
- 27: 0, # 'ш'
- 24: 2, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 30: { # 'П'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 2, # 'Ð '
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 2, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 39: { # 'Ð '
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 2, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Ð '
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 28: { # 'С'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 3, # 'Ð'
- 32: 2, # 'Б'
- 35: 2, # 'Ð’'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Ð '
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 2, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 2, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 34: { # 'Т'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 2, # 'Б'
- 35: 1, # 'Ð’'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Ð '
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 2, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 51: { # 'У'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Ð '
- 28: 1, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 2, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 0, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 48: { # 'Ф'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Ð'
- 41: 1, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Ð '
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 49: { # 'Ð¥'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 0, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 53: { # 'Ц'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 0, # 'Б'
- 35: 1, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Ð '
- 28: 2, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 50: { # 'Ч'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'Ð'
- 32: 1, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Ð'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 54: { # 'Ш'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Ð'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 57: { # 'Щ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 61: { # 'Ъ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Ð '
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Ð¥'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 60: { # 'Ю'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 1, # 'Б'
- 35: 0, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 1, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Ð '
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 0, # 'е'
- 23: 2, # 'ж'
- 15: 1, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 0, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 56: { # 'Я'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 1, # 'Б'
- 35: 1, # 'Ð’'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 1, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 1, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 0, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 1: { # 'а'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 3, # 'Ñ„'
- 25: 3, # 'Ñ…'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 18: { # 'б'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 0, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 3, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 9: { # 'в'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'Ð'
- 32: 1, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 0, # 'в'
- 20: 2, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 20: { # 'г'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 11: { # 'д'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 1, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 3: { # 'е'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 2, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 3, # 'Ñ„'
- 25: 3, # 'Ñ…'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 23: { # 'ж'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 15: { # 'з'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 1, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 2, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 2: { # 'и'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 1, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 3, # 'Ñ„'
- 25: 3, # 'Ñ…'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 26: { # 'й'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 2, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 12: { # 'к'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 1, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 3, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 10: { # 'л'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 1, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 2, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 2, # 'ь'
- 42: 3, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 14: { # 'м'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 2, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 2, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 6: { # 'н'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 2, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 3, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 2, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 4: { # 'о'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 3, # 'Ñ„'
- 25: 3, # 'Ñ…'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 13: { # 'п'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 2, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 7: { # 'Ñ€'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 2, # 'Ñ„'
- 25: 3, # 'Ñ…'
- 22: 3, # 'ц'
- 21: 2, # 'ч'
- 27: 3, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 8: { # 'Ñ'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 2, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 2, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 5: { # 'Ñ‚'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 1, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ÑŠ'
- 52: 2, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 19: { # 'у'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 2, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 2, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 2, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 29: { # 'Ñ„'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 0, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 2, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 25: { # 'Ñ…'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 0, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 22: { # 'ц'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'Ñ€'
- 8: 1, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 2, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 21: { # 'ч'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 27: { # 'ш'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 2, # 'у'
- 29: 1, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ÑŠ'
- 52: 1, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 24: { # 'щ'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 3, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 2, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 17: { # 'ÑŠ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 1, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 1, # 'Ñ„'
- 25: 2, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 3, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 2, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 52: { # 'ь'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 1, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 1, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 42: { # 'ÑŽ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 1, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 1, # 'е'
- 23: 2, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 1, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'Ñ€'
- 8: 2, # 'Ñ'
- 5: 2, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 1, # 'Ñ„'
- 25: 1, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 16: { # 'Ñ'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 1, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'Ñ€'
- 8: 3, # 'Ñ'
- 5: 3, # 'Ñ‚'
- 19: 1, # 'у'
- 29: 1, # 'Ñ„'
- 25: 3, # 'Ñ…'
- 22: 2, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 2, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 58: { # 'Ñ”'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
- 62: { # 'â„–'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'Ð'
- 32: 0, # 'Б'
- 35: 0, # 'Ð’'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Ð'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Ð '
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Ð¥'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'Ñ€'
- 8: 0, # 'Ñ'
- 5: 0, # 'Ñ‚'
- 19: 0, # 'у'
- 29: 0, # 'Ñ„'
- 25: 0, # 'Ñ…'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ÑŠ'
- 52: 0, # 'ь'
- 42: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- 58: 0, # 'Ñ”'
- 62: 0, # 'â„–'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 77, # 'A'
- 66: 90, # 'B'
- 67: 99, # 'C'
- 68: 100, # 'D'
- 69: 72, # 'E'
- 70: 109, # 'F'
- 71: 107, # 'G'
- 72: 101, # 'H'
- 73: 79, # 'I'
- 74: 185, # 'J'
- 75: 81, # 'K'
- 76: 102, # 'L'
- 77: 76, # 'M'
- 78: 94, # 'N'
- 79: 82, # 'O'
- 80: 110, # 'P'
- 81: 186, # 'Q'
- 82: 108, # 'R'
- 83: 91, # 'S'
- 84: 74, # 'T'
- 85: 119, # 'U'
- 86: 84, # 'V'
- 87: 96, # 'W'
- 88: 111, # 'X'
- 89: 187, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 65, # 'a'
- 98: 69, # 'b'
- 99: 70, # 'c'
- 100: 66, # 'd'
- 101: 63, # 'e'
- 102: 68, # 'f'
- 103: 112, # 'g'
- 104: 103, # 'h'
- 105: 92, # 'i'
- 106: 194, # 'j'
- 107: 104, # 'k'
- 108: 95, # 'l'
- 109: 86, # 'm'
- 110: 87, # 'n'
- 111: 71, # 'o'
- 112: 116, # 'p'
- 113: 195, # 'q'
- 114: 85, # 'r'
- 115: 93, # 's'
- 116: 97, # 't'
- 117: 113, # 'u'
- 118: 196, # 'v'
- 119: 197, # 'w'
- 120: 198, # 'x'
- 121: 199, # 'y'
- 122: 200, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 194, # '\x80'
- 129: 195, # '\x81'
- 130: 196, # '\x82'
- 131: 197, # '\x83'
- 132: 198, # '\x84'
- 133: 199, # '\x85'
- 134: 200, # '\x86'
- 135: 201, # '\x87'
- 136: 202, # '\x88'
- 137: 203, # '\x89'
- 138: 204, # '\x8a'
- 139: 205, # '\x8b'
- 140: 206, # '\x8c'
- 141: 207, # '\x8d'
- 142: 208, # '\x8e'
- 143: 209, # '\x8f'
- 144: 210, # '\x90'
- 145: 211, # '\x91'
- 146: 212, # '\x92'
- 147: 213, # '\x93'
- 148: 214, # '\x94'
- 149: 215, # '\x95'
- 150: 216, # '\x96'
- 151: 217, # '\x97'
- 152: 218, # '\x98'
- 153: 219, # '\x99'
- 154: 220, # '\x9a'
- 155: 221, # '\x9b'
- 156: 222, # '\x9c'
- 157: 223, # '\x9d'
- 158: 224, # '\x9e'
- 159: 225, # '\x9f'
- 160: 81, # '\xa0'
- 161: 226, # 'Ð'
- 162: 227, # 'Ђ'
- 163: 228, # 'Ѓ'
- 164: 229, # 'Є'
- 165: 230, # 'Ð…'
- 166: 105, # 'І'
- 167: 231, # 'Ї'
- 168: 232, # 'Ј'
- 169: 233, # 'Љ'
- 170: 234, # 'Њ'
- 171: 235, # 'Ћ'
- 172: 236, # 'Ќ'
- 173: 45, # '\xad'
- 174: 237, # 'ÐŽ'
- 175: 238, # 'Ð'
- 176: 31, # 'Ð'
- 177: 32, # 'Б'
- 178: 35, # 'Ð’'
- 179: 43, # 'Г'
- 180: 37, # 'Д'
- 181: 44, # 'Е'
- 182: 55, # 'Ж'
- 183: 47, # 'З'
- 184: 40, # 'И'
- 185: 59, # 'Й'
- 186: 33, # 'К'
- 187: 46, # 'Л'
- 188: 38, # 'М'
- 189: 36, # 'Ð'
- 190: 41, # 'О'
- 191: 30, # 'П'
- 192: 39, # 'Ð '
- 193: 28, # 'С'
- 194: 34, # 'Т'
- 195: 51, # 'У'
- 196: 48, # 'Ф'
- 197: 49, # 'Ð¥'
- 198: 53, # 'Ц'
- 199: 50, # 'Ч'
- 200: 54, # 'Ш'
- 201: 57, # 'Щ'
- 202: 61, # 'Ъ'
- 203: 239, # 'Ы'
- 204: 67, # 'Ь'
- 205: 240, # 'Ð'
- 206: 60, # 'Ю'
- 207: 56, # 'Я'
- 208: 1, # 'а'
- 209: 18, # 'б'
- 210: 9, # 'в'
- 211: 20, # 'г'
- 212: 11, # 'д'
- 213: 3, # 'е'
- 214: 23, # 'ж'
- 215: 15, # 'з'
- 216: 2, # 'и'
- 217: 26, # 'й'
- 218: 12, # 'к'
- 219: 10, # 'л'
- 220: 14, # 'м'
- 221: 6, # 'н'
- 222: 4, # 'о'
- 223: 13, # 'п'
- 224: 7, # 'Ñ€'
- 225: 8, # 'Ñ'
- 226: 5, # 'Ñ‚'
- 227: 19, # 'у'
- 228: 29, # 'Ñ„'
- 229: 25, # 'Ñ…'
- 230: 22, # 'ц'
- 231: 21, # 'ч'
- 232: 27, # 'ш'
- 233: 24, # 'щ'
- 234: 17, # 'ÑŠ'
- 235: 75, # 'Ñ‹'
- 236: 52, # 'ь'
- 237: 241, # 'Ñ'
- 238: 42, # 'ÑŽ'
- 239: 16, # 'Ñ'
- 240: 62, # 'â„–'
- 241: 242, # 'Ñ‘'
- 242: 243, # 'Ñ’'
- 243: 244, # 'Ñ“'
- 244: 58, # 'Ñ”'
- 245: 245, # 'Ñ•'
- 246: 98, # 'Ñ–'
- 247: 246, # 'Ñ—'
- 248: 247, # 'ј'
- 249: 248, # 'Ñ™'
- 250: 249, # 'Ñš'
- 251: 250, # 'Ñ›'
- 252: 251, # 'ќ'
- 253: 91, # '§'
- 254: 252, # 'Ñž'
- 255: 253, # 'ÑŸ'
-}
-
-ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-5',
- language='Bulgarian',
- char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER,
- language_model=BULGARIAN_LANG_MODEL,
- typical_positive_ratio=0.969392,
- keep_ascii_letters=False,
- alphabet='ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрÑтуфхцчшщъьюÑ')
-
-WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 77, # 'A'
- 66: 90, # 'B'
- 67: 99, # 'C'
- 68: 100, # 'D'
- 69: 72, # 'E'
- 70: 109, # 'F'
- 71: 107, # 'G'
- 72: 101, # 'H'
- 73: 79, # 'I'
- 74: 185, # 'J'
- 75: 81, # 'K'
- 76: 102, # 'L'
- 77: 76, # 'M'
- 78: 94, # 'N'
- 79: 82, # 'O'
- 80: 110, # 'P'
- 81: 186, # 'Q'
- 82: 108, # 'R'
- 83: 91, # 'S'
- 84: 74, # 'T'
- 85: 119, # 'U'
- 86: 84, # 'V'
- 87: 96, # 'W'
- 88: 111, # 'X'
- 89: 187, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 65, # 'a'
- 98: 69, # 'b'
- 99: 70, # 'c'
- 100: 66, # 'd'
- 101: 63, # 'e'
- 102: 68, # 'f'
- 103: 112, # 'g'
- 104: 103, # 'h'
- 105: 92, # 'i'
- 106: 194, # 'j'
- 107: 104, # 'k'
- 108: 95, # 'l'
- 109: 86, # 'm'
- 110: 87, # 'n'
- 111: 71, # 'o'
- 112: 116, # 'p'
- 113: 195, # 'q'
- 114: 85, # 'r'
- 115: 93, # 's'
- 116: 97, # 't'
- 117: 113, # 'u'
- 118: 196, # 'v'
- 119: 197, # 'w'
- 120: 198, # 'x'
- 121: 199, # 'y'
- 122: 200, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 206, # 'Ђ'
- 129: 207, # 'Ѓ'
- 130: 208, # '‚'
- 131: 209, # 'Ñ“'
- 132: 210, # '„'
- 133: 211, # '…'
- 134: 212, # '†'
- 135: 213, # '‡'
- 136: 120, # '€'
- 137: 214, # '‰'
- 138: 215, # 'Љ'
- 139: 216, # '‹'
- 140: 217, # 'Њ'
- 141: 218, # 'Ќ'
- 142: 219, # 'Ћ'
- 143: 220, # 'Ð'
- 144: 221, # 'Ñ’'
- 145: 78, # '‘'
- 146: 64, # '’'
- 147: 83, # '“'
- 148: 121, # 'â€'
- 149: 98, # '•'
- 150: 117, # '–'
- 151: 105, # '—'
- 152: 222, # None
- 153: 223, # 'â„¢'
- 154: 224, # 'Ñ™'
- 155: 225, # '›'
- 156: 226, # 'Ñš'
- 157: 227, # 'ќ'
- 158: 228, # 'Ñ›'
- 159: 229, # 'ÑŸ'
- 160: 88, # '\xa0'
- 161: 230, # 'ÐŽ'
- 162: 231, # 'Ñž'
- 163: 232, # 'Ј'
- 164: 233, # '¤'
- 165: 122, # 'Ò'
- 166: 89, # '¦'
- 167: 106, # '§'
- 168: 234, # 'Ð'
- 169: 235, # '©'
- 170: 236, # 'Є'
- 171: 237, # '«'
- 172: 238, # '¬'
- 173: 45, # '\xad'
- 174: 239, # '®'
- 175: 240, # 'Ї'
- 176: 73, # '°'
- 177: 80, # '±'
- 178: 118, # 'І'
- 179: 114, # 'Ñ–'
- 180: 241, # 'Ò‘'
- 181: 242, # 'µ'
- 182: 243, # '¶'
- 183: 244, # '·'
- 184: 245, # 'Ñ‘'
- 185: 62, # 'â„–'
- 186: 58, # 'Ñ”'
- 187: 246, # '»'
- 188: 247, # 'ј'
- 189: 248, # 'Ð…'
- 190: 249, # 'Ñ•'
- 191: 250, # 'Ñ—'
- 192: 31, # 'Ð'
- 193: 32, # 'Б'
- 194: 35, # 'Ð’'
- 195: 43, # 'Г'
- 196: 37, # 'Д'
- 197: 44, # 'Е'
- 198: 55, # 'Ж'
- 199: 47, # 'З'
- 200: 40, # 'И'
- 201: 59, # 'Й'
- 202: 33, # 'К'
- 203: 46, # 'Л'
- 204: 38, # 'М'
- 205: 36, # 'Ð'
- 206: 41, # 'О'
- 207: 30, # 'П'
- 208: 39, # 'Ð '
- 209: 28, # 'С'
- 210: 34, # 'Т'
- 211: 51, # 'У'
- 212: 48, # 'Ф'
- 213: 49, # 'Ð¥'
- 214: 53, # 'Ц'
- 215: 50, # 'Ч'
- 216: 54, # 'Ш'
- 217: 57, # 'Щ'
- 218: 61, # 'Ъ'
- 219: 251, # 'Ы'
- 220: 67, # 'Ь'
- 221: 252, # 'Ð'
- 222: 60, # 'Ю'
- 223: 56, # 'Я'
- 224: 1, # 'а'
- 225: 18, # 'б'
- 226: 9, # 'в'
- 227: 20, # 'г'
- 228: 11, # 'д'
- 229: 3, # 'е'
- 230: 23, # 'ж'
- 231: 15, # 'з'
- 232: 2, # 'и'
- 233: 26, # 'й'
- 234: 12, # 'к'
- 235: 10, # 'л'
- 236: 14, # 'м'
- 237: 6, # 'н'
- 238: 4, # 'о'
- 239: 13, # 'п'
- 240: 7, # 'Ñ€'
- 241: 8, # 'Ñ'
- 242: 5, # 'Ñ‚'
- 243: 19, # 'у'
- 244: 29, # 'Ñ„'
- 245: 25, # 'Ñ…'
- 246: 22, # 'ц'
- 247: 21, # 'ч'
- 248: 27, # 'ш'
- 249: 24, # 'щ'
- 250: 17, # 'ÑŠ'
- 251: 75, # 'Ñ‹'
- 252: 52, # 'ь'
- 253: 253, # 'Ñ'
- 254: 42, # 'ÑŽ'
- 255: 16, # 'Ñ'
-}
-
-WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1251',
- language='Bulgarian',
- char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER,
- language_model=BULGARIAN_LANG_MODEL,
- typical_positive_ratio=0.969392,
- keep_ascii_letters=False,
- alphabet='ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрÑтуфхцчшщъьюÑ')
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py
deleted file mode 100644
index d99528e..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py
+++ /dev/null
@@ -1,4398 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-GREEK_LANG_MODEL = {
- 60: { # 'e'
- 60: 2, # 'e'
- 55: 1, # 'o'
- 58: 2, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 55: { # 'o'
- 60: 0, # 'e'
- 55: 2, # 'o'
- 58: 2, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 1, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 58: { # 't'
- 60: 2, # 'e'
- 55: 1, # 'o'
- 58: 1, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 1, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 36: { # '·'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 61: { # 'Ά'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 1, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 1, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 46: { # 'Έ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 2, # 'β'
- 20: 2, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 1, # 'σ'
- 2: 2, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 54: { # 'Ό'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 2, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 31: { # 'Α'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 2, # 'Î’'
- 43: 2, # 'Γ'
- 41: 1, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 2, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Î'
- 59: 1, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Î '
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Î¥'
- 56: 2, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 2, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 1, # 'θ'
- 5: 0, # 'ι'
- 11: 2, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 2, # 'Ï‚'
- 7: 2, # 'σ'
- 2: 0, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 51: { # 'Î’'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 1, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'Î'
- 22: 2, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 43: { # 'Γ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Î’'
- 43: 2, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 1, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Î '
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 2, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 41: { # 'Δ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 1, # 'ό'
- 26: 2, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 34: { # 'Ε'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 2, # 'Γ'
- 41: 2, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Î'
- 59: 1, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Î '
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 2, # 'Χ'
- 57: 2, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 1, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 1, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 2, # 'σ'
- 2: 2, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 1, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 40: { # 'Η'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 1, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 2, # 'Θ'
- 47: 0, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Î '
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 1, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 52: { # 'Θ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 1, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 1, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 47: { # 'Ι'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 1, # 'Î’'
- 43: 1, # 'Γ'
- 41: 2, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 2, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 2, # 'σ'
- 2: 1, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 1, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 44: { # 'Κ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 1, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 2, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 1, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 53: { # 'Λ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 2, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 0, # 'Τ'
- 45: 2, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'Î'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 1, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 38: { # 'Μ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 2, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 2, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'Î'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 49: { # 'Î'
- 60: 2, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'Î'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 1, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 1, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 59: { # 'Ξ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 39: { # 'Ο'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 1, # 'Î’'
- 43: 2, # 'Γ'
- 41: 2, # 'Δ'
- 34: 2, # 'Ε'
- 40: 1, # 'Η'
- 52: 2, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Î '
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Î¥'
- 56: 2, # 'Φ'
- 50: 2, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 2, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 1, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 35: { # 'Î '
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 2, # 'Λ'
- 38: 1, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 1, # 'Î'
- 22: 1, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 48: { # 'Ρ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 1, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 2, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 1, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 1, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 1, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 37: { # 'Σ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 2, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 2, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 2, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 2, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 33: { # 'Τ'
- 60: 0, # 'e'
- 55: 1, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 1, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'Î'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 2, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 2, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 45: { # 'Î¥'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 2, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 2, # 'Η'
- 52: 2, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Î '
- 48: 1, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 56: { # 'Φ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 2, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 1, # 'Ï'
- 27: 1, # 'ÏŽ'
- },
- 50: { # 'Χ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 1, # 'Î'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Î '
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 1, # 'Ω'
- 17: 2, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 2, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 57: { # 'Ω'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 1, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 2, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 2, # 'Ï‚'
- 7: 2, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 17: { # 'ά'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 3, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 3, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 18: { # 'Î'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 3, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 22: { # 'ή'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 15: { # 'ί'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 3, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 1, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 1: { # 'α'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'Î'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 2, # 'ε'
- 32: 3, # 'ζ'
- 13: 1, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 29: { # 'β'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 2, # 'Î'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 2, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 3, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 20: { # 'γ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 21: { # 'δ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 3: { # 'ε'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 2, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 2, # 'ε'
- 32: 2, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 3, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 32: { # 'ζ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'Î'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 1, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 13: { # 'η'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 25: { # 'θ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 1, # 'λ'
- 10: 3, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 5: { # 'ι'
- 60: 0, # 'e'
- 55: 1, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 0, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 11: { # 'κ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 2, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 16: { # 'λ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 1, # 'β'
- 20: 2, # 'γ'
- 21: 1, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 10: { # 'μ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 3, # 'φ'
- 23: 0, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 6: { # 'ν'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 1, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 30: { # 'ξ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 3, # 'Ï„'
- 12: 2, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 3, # 'Ï'
- 27: 1, # 'ÏŽ'
- },
- 4: { # 'ο'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 2, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 1, # 'ό'
- 26: 3, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 9: { # 'Ï€'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 3, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 2, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 8: { # 'Ï'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 1, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 3, # 'ο'
- 9: 2, # 'Ï€'
- 8: 2, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 2, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 14: { # 'Ï‚'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 0, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 7: { # 'σ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 2: { # 'Ï„'
- 60: 0, # 'e'
- 55: 2, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 12: { # 'Ï…'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'Î'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 2, # 'ε'
- 32: 2, # 'ζ'
- 13: 2, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 28: { # 'φ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 1, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'Ï'
- 27: 2, # 'ÏŽ'
- },
- 23: { # 'χ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 2, # 'Î'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 3, # 'Ï„'
- 12: 3, # 'Ï…'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'Ï'
- 27: 3, # 'ÏŽ'
- },
- 42: { # 'ψ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'Î'
- 22: 1, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'Ï€'
- 8: 0, # 'Ï'
- 14: 0, # 'Ï‚'
- 7: 0, # 'σ'
- 2: 2, # 'Ï„'
- 12: 1, # 'Ï…'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 24: { # 'ω'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 1, # 'ά'
- 18: 0, # 'Î'
- 22: 2, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 19: { # 'ό'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 1, # 'ε'
- 32: 2, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 1, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 26: { # 'Ï'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 2, # 'β'
- 20: 2, # 'γ'
- 21: 1, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
- 27: { # 'ÏŽ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Î’'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Î'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Î '
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Î¥'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'Î'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 1, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 1, # 'η'
- 25: 2, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 1, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'Ï€'
- 8: 3, # 'Ï'
- 14: 3, # 'Ï‚'
- 7: 3, # 'σ'
- 2: 3, # 'Ï„'
- 12: 0, # 'Ï…'
- 28: 1, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'Ï'
- 27: 0, # 'ÏŽ'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1253_GREEK_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 82, # 'A'
- 66: 100, # 'B'
- 67: 104, # 'C'
- 68: 94, # 'D'
- 69: 98, # 'E'
- 70: 101, # 'F'
- 71: 116, # 'G'
- 72: 102, # 'H'
- 73: 111, # 'I'
- 74: 187, # 'J'
- 75: 117, # 'K'
- 76: 92, # 'L'
- 77: 88, # 'M'
- 78: 113, # 'N'
- 79: 85, # 'O'
- 80: 79, # 'P'
- 81: 118, # 'Q'
- 82: 105, # 'R'
- 83: 83, # 'S'
- 84: 67, # 'T'
- 85: 114, # 'U'
- 86: 119, # 'V'
- 87: 95, # 'W'
- 88: 99, # 'X'
- 89: 109, # 'Y'
- 90: 188, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 72, # 'a'
- 98: 70, # 'b'
- 99: 80, # 'c'
- 100: 81, # 'd'
- 101: 60, # 'e'
- 102: 96, # 'f'
- 103: 93, # 'g'
- 104: 89, # 'h'
- 105: 68, # 'i'
- 106: 120, # 'j'
- 107: 97, # 'k'
- 108: 77, # 'l'
- 109: 86, # 'm'
- 110: 69, # 'n'
- 111: 55, # 'o'
- 112: 78, # 'p'
- 113: 115, # 'q'
- 114: 65, # 'r'
- 115: 66, # 's'
- 116: 58, # 't'
- 117: 76, # 'u'
- 118: 106, # 'v'
- 119: 103, # 'w'
- 120: 87, # 'x'
- 121: 107, # 'y'
- 122: 112, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 255, # '€'
- 129: 255, # None
- 130: 255, # '‚'
- 131: 255, # 'Æ’'
- 132: 255, # '„'
- 133: 255, # '…'
- 134: 255, # '†'
- 135: 255, # '‡'
- 136: 255, # None
- 137: 255, # '‰'
- 138: 255, # None
- 139: 255, # '‹'
- 140: 255, # None
- 141: 255, # None
- 142: 255, # None
- 143: 255, # None
- 144: 255, # None
- 145: 255, # '‘'
- 146: 255, # '’'
- 147: 255, # '“'
- 148: 255, # 'â€'
- 149: 255, # '•'
- 150: 255, # '–'
- 151: 255, # '—'
- 152: 255, # None
- 153: 255, # 'â„¢'
- 154: 255, # None
- 155: 255, # '›'
- 156: 255, # None
- 157: 255, # None
- 158: 255, # None
- 159: 255, # None
- 160: 253, # '\xa0'
- 161: 233, # 'Î…'
- 162: 61, # 'Ά'
- 163: 253, # '£'
- 164: 253, # '¤'
- 165: 253, # 'Â¥'
- 166: 253, # '¦'
- 167: 253, # '§'
- 168: 253, # '¨'
- 169: 253, # '©'
- 170: 253, # None
- 171: 253, # '«'
- 172: 253, # '¬'
- 173: 74, # '\xad'
- 174: 253, # '®'
- 175: 253, # '―'
- 176: 253, # '°'
- 177: 253, # '±'
- 178: 253, # '²'
- 179: 253, # '³'
- 180: 247, # '΄'
- 181: 253, # 'µ'
- 182: 253, # '¶'
- 183: 36, # '·'
- 184: 46, # 'Έ'
- 185: 71, # 'Ή'
- 186: 73, # 'Ί'
- 187: 253, # '»'
- 188: 54, # 'Ό'
- 189: 253, # '½'
- 190: 108, # 'ÎŽ'
- 191: 123, # 'Î'
- 192: 110, # 'Î'
- 193: 31, # 'Α'
- 194: 51, # 'Î’'
- 195: 43, # 'Γ'
- 196: 41, # 'Δ'
- 197: 34, # 'Ε'
- 198: 91, # 'Ζ'
- 199: 40, # 'Η'
- 200: 52, # 'Θ'
- 201: 47, # 'Ι'
- 202: 44, # 'Κ'
- 203: 53, # 'Λ'
- 204: 38, # 'Μ'
- 205: 49, # 'Î'
- 206: 59, # 'Ξ'
- 207: 39, # 'Ο'
- 208: 35, # 'Î '
- 209: 48, # 'Ρ'
- 210: 250, # None
- 211: 37, # 'Σ'
- 212: 33, # 'Τ'
- 213: 45, # 'Î¥'
- 214: 56, # 'Φ'
- 215: 50, # 'Χ'
- 216: 84, # 'Ψ'
- 217: 57, # 'Ω'
- 218: 120, # 'Ϊ'
- 219: 121, # 'Ϋ'
- 220: 17, # 'ά'
- 221: 18, # 'Î'
- 222: 22, # 'ή'
- 223: 15, # 'ί'
- 224: 124, # 'ΰ'
- 225: 1, # 'α'
- 226: 29, # 'β'
- 227: 20, # 'γ'
- 228: 21, # 'δ'
- 229: 3, # 'ε'
- 230: 32, # 'ζ'
- 231: 13, # 'η'
- 232: 25, # 'θ'
- 233: 5, # 'ι'
- 234: 11, # 'κ'
- 235: 16, # 'λ'
- 236: 10, # 'μ'
- 237: 6, # 'ν'
- 238: 30, # 'ξ'
- 239: 4, # 'ο'
- 240: 9, # 'Ï€'
- 241: 8, # 'Ï'
- 242: 14, # 'Ï‚'
- 243: 7, # 'σ'
- 244: 2, # 'Ï„'
- 245: 12, # 'Ï…'
- 246: 28, # 'φ'
- 247: 23, # 'χ'
- 248: 42, # 'ψ'
- 249: 24, # 'ω'
- 250: 64, # 'ÏŠ'
- 251: 75, # 'Ï‹'
- 252: 19, # 'ό'
- 253: 26, # 'Ï'
- 254: 27, # 'ÏŽ'
- 255: 253, # None
-}
-
-WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel(charset_name='windows-1253',
- language='Greek',
- char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER,
- language_model=GREEK_LANG_MODEL,
- typical_positive_ratio=0.982851,
- keep_ascii_letters=False,
- alphabet='ΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάÎήίαβγδεζηθικλμνξοπÏςστυφχψωόÏÏŽ')
-
-ISO_8859_7_GREEK_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 82, # 'A'
- 66: 100, # 'B'
- 67: 104, # 'C'
- 68: 94, # 'D'
- 69: 98, # 'E'
- 70: 101, # 'F'
- 71: 116, # 'G'
- 72: 102, # 'H'
- 73: 111, # 'I'
- 74: 187, # 'J'
- 75: 117, # 'K'
- 76: 92, # 'L'
- 77: 88, # 'M'
- 78: 113, # 'N'
- 79: 85, # 'O'
- 80: 79, # 'P'
- 81: 118, # 'Q'
- 82: 105, # 'R'
- 83: 83, # 'S'
- 84: 67, # 'T'
- 85: 114, # 'U'
- 86: 119, # 'V'
- 87: 95, # 'W'
- 88: 99, # 'X'
- 89: 109, # 'Y'
- 90: 188, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 72, # 'a'
- 98: 70, # 'b'
- 99: 80, # 'c'
- 100: 81, # 'd'
- 101: 60, # 'e'
- 102: 96, # 'f'
- 103: 93, # 'g'
- 104: 89, # 'h'
- 105: 68, # 'i'
- 106: 120, # 'j'
- 107: 97, # 'k'
- 108: 77, # 'l'
- 109: 86, # 'm'
- 110: 69, # 'n'
- 111: 55, # 'o'
- 112: 78, # 'p'
- 113: 115, # 'q'
- 114: 65, # 'r'
- 115: 66, # 's'
- 116: 58, # 't'
- 117: 76, # 'u'
- 118: 106, # 'v'
- 119: 103, # 'w'
- 120: 87, # 'x'
- 121: 107, # 'y'
- 122: 112, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 255, # '\x80'
- 129: 255, # '\x81'
- 130: 255, # '\x82'
- 131: 255, # '\x83'
- 132: 255, # '\x84'
- 133: 255, # '\x85'
- 134: 255, # '\x86'
- 135: 255, # '\x87'
- 136: 255, # '\x88'
- 137: 255, # '\x89'
- 138: 255, # '\x8a'
- 139: 255, # '\x8b'
- 140: 255, # '\x8c'
- 141: 255, # '\x8d'
- 142: 255, # '\x8e'
- 143: 255, # '\x8f'
- 144: 255, # '\x90'
- 145: 255, # '\x91'
- 146: 255, # '\x92'
- 147: 255, # '\x93'
- 148: 255, # '\x94'
- 149: 255, # '\x95'
- 150: 255, # '\x96'
- 151: 255, # '\x97'
- 152: 255, # '\x98'
- 153: 255, # '\x99'
- 154: 255, # '\x9a'
- 155: 255, # '\x9b'
- 156: 255, # '\x9c'
- 157: 255, # '\x9d'
- 158: 255, # '\x9e'
- 159: 255, # '\x9f'
- 160: 253, # '\xa0'
- 161: 233, # '‘'
- 162: 90, # '’'
- 163: 253, # '£'
- 164: 253, # '€'
- 165: 253, # '₯'
- 166: 253, # '¦'
- 167: 253, # '§'
- 168: 253, # '¨'
- 169: 253, # '©'
- 170: 253, # 'ͺ'
- 171: 253, # '«'
- 172: 253, # '¬'
- 173: 74, # '\xad'
- 174: 253, # None
- 175: 253, # '―'
- 176: 253, # '°'
- 177: 253, # '±'
- 178: 253, # '²'
- 179: 253, # '³'
- 180: 247, # '΄'
- 181: 248, # 'Î…'
- 182: 61, # 'Ά'
- 183: 36, # '·'
- 184: 46, # 'Έ'
- 185: 71, # 'Ή'
- 186: 73, # 'Ί'
- 187: 253, # '»'
- 188: 54, # 'Ό'
- 189: 253, # '½'
- 190: 108, # 'ÎŽ'
- 191: 123, # 'Î'
- 192: 110, # 'Î'
- 193: 31, # 'Α'
- 194: 51, # 'Î’'
- 195: 43, # 'Γ'
- 196: 41, # 'Δ'
- 197: 34, # 'Ε'
- 198: 91, # 'Ζ'
- 199: 40, # 'Η'
- 200: 52, # 'Θ'
- 201: 47, # 'Ι'
- 202: 44, # 'Κ'
- 203: 53, # 'Λ'
- 204: 38, # 'Μ'
- 205: 49, # 'Î'
- 206: 59, # 'Ξ'
- 207: 39, # 'Ο'
- 208: 35, # 'Î '
- 209: 48, # 'Ρ'
- 210: 250, # None
- 211: 37, # 'Σ'
- 212: 33, # 'Τ'
- 213: 45, # 'Î¥'
- 214: 56, # 'Φ'
- 215: 50, # 'Χ'
- 216: 84, # 'Ψ'
- 217: 57, # 'Ω'
- 218: 120, # 'Ϊ'
- 219: 121, # 'Ϋ'
- 220: 17, # 'ά'
- 221: 18, # 'Î'
- 222: 22, # 'ή'
- 223: 15, # 'ί'
- 224: 124, # 'ΰ'
- 225: 1, # 'α'
- 226: 29, # 'β'
- 227: 20, # 'γ'
- 228: 21, # 'δ'
- 229: 3, # 'ε'
- 230: 32, # 'ζ'
- 231: 13, # 'η'
- 232: 25, # 'θ'
- 233: 5, # 'ι'
- 234: 11, # 'κ'
- 235: 16, # 'λ'
- 236: 10, # 'μ'
- 237: 6, # 'ν'
- 238: 30, # 'ξ'
- 239: 4, # 'ο'
- 240: 9, # 'Ï€'
- 241: 8, # 'Ï'
- 242: 14, # 'Ï‚'
- 243: 7, # 'σ'
- 244: 2, # 'Ï„'
- 245: 12, # 'Ï…'
- 246: 28, # 'φ'
- 247: 23, # 'χ'
- 248: 42, # 'ψ'
- 249: 24, # 'ω'
- 250: 64, # 'ÏŠ'
- 251: 75, # 'Ï‹'
- 252: 19, # 'ό'
- 253: 26, # 'Ï'
- 254: 27, # 'ÏŽ'
- 255: 253, # None
-}
-
-ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-7',
- language='Greek',
- char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER,
- language_model=GREEK_LANG_MODEL,
- typical_positive_ratio=0.982851,
- keep_ascii_letters=False,
- alphabet='ΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάÎήίαβγδεζηθικλμνξοπÏςστυφχψωόÏÏŽ')
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py
deleted file mode 100644
index 484c652..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-HEBREW_LANG_MODEL = {
- 50: { # 'a'
- 50: 0, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 2, # 'l'
- 54: 2, # 'n'
- 49: 0, # 'o'
- 51: 2, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 1, # '×§'
- 7: 0, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 60: { # 'c'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 61: { # 'd'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 0, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 42: { # 'e'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 2, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 2, # 'l'
- 54: 2, # 'n'
- 49: 1, # 'o'
- 51: 2, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 1, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 53: { # 'i'
- 50: 1, # 'a'
- 60: 2, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 0, # 'i'
- 56: 1, # 'l'
- 54: 2, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 56: { # 'l'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 2, # 'e'
- 53: 2, # 'i'
- 56: 2, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 54: { # 'n'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 49: { # 'o'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 2, # 'n'
- 49: 1, # 'o'
- 51: 2, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 51: { # 'r'
- 50: 2, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 2, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 43: { # 's'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 2, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 2, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 44: { # 't'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 2, # 'e'
- 53: 2, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 63: { # 'u'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 34: { # '\xa0'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 1, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 2, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 1, # 'ב'
- 20: 1, # '×’'
- 16: 1, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 1, # '×—'
- 22: 1, # 'ט'
- 1: 2, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # '× '
- 19: 1, # 'ס'
- 13: 1, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 55: { # '´'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 2, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 1, # 'ן'
- 12: 1, # '× '
- 19: 1, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 48: { # '¼'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 1, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 39: { # '½'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 57: { # '¾'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 30: { # 'Ö°'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 2, # 'ב'
- 20: 2, # '×’'
- 16: 2, # 'ד'
- 3: 2, # '×”'
- 2: 2, # 'ו'
- 24: 2, # '×–'
- 14: 2, # '×—'
- 22: 2, # 'ט'
- 1: 2, # '×™'
- 25: 2, # 'ך'
- 15: 2, # '×›'
- 4: 2, # 'ל'
- 11: 1, # '×'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 2, # '× '
- 19: 2, # 'ס'
- 13: 2, # '×¢'
- 26: 0, # '×£'
- 18: 2, # 'פ'
- 27: 0, # '×¥'
- 21: 2, # 'צ'
- 17: 2, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 59: { # 'Ö±'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 1, # 'ב'
- 20: 1, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 1, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 2, # 'ל'
- 11: 0, # '×'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 41: { # 'Ö²'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 2, # 'ב'
- 20: 1, # '×’'
- 16: 2, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 1, # '×—'
- 22: 1, # 'ט'
- 1: 1, # '×™'
- 25: 1, # 'ך'
- 15: 1, # '×›'
- 4: 2, # 'ל'
- 11: 0, # '×'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 2, # '× '
- 19: 1, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 2, # 'צ'
- 17: 1, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 33: { # 'Ö´'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 1, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 1, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 1, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 2, # 'ב'
- 20: 2, # '×’'
- 16: 2, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 2, # '×–'
- 14: 1, # '×—'
- 22: 1, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 2, # '×›'
- 4: 2, # 'ל'
- 11: 2, # '×'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # '× '
- 19: 2, # 'ס'
- 13: 1, # '×¢'
- 26: 0, # '×£'
- 18: 2, # 'פ'
- 27: 1, # '×¥'
- 21: 2, # 'צ'
- 17: 2, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 37: { # 'Öµ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 1, # 'Ö·'
- 29: 1, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 2, # 'ב'
- 20: 1, # '×’'
- 16: 2, # 'ד'
- 3: 2, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 2, # '×—'
- 22: 1, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 1, # '×›'
- 4: 2, # 'ל'
- 11: 2, # '×'
- 6: 1, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # '× '
- 19: 1, # 'ס'
- 13: 2, # '×¢'
- 26: 1, # '×£'
- 18: 1, # 'פ'
- 27: 1, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 36: { # 'Ö¶'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 1, # 'Ö·'
- 29: 1, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 2, # 'ב'
- 20: 1, # '×’'
- 16: 2, # 'ד'
- 3: 2, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 2, # '×—'
- 22: 1, # 'ט'
- 1: 2, # '×™'
- 25: 2, # 'ך'
- 15: 1, # '×›'
- 4: 2, # 'ל'
- 11: 2, # '×'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # '× '
- 19: 2, # 'ס'
- 13: 1, # '×¢'
- 26: 1, # '×£'
- 18: 1, # 'פ'
- 27: 2, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 31: { # 'Ö·'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 2, # 'ב'
- 20: 2, # '×’'
- 16: 2, # 'ד'
- 3: 2, # '×”'
- 2: 1, # 'ו'
- 24: 2, # '×–'
- 14: 2, # '×—'
- 22: 2, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 2, # '×›'
- 4: 2, # 'ל'
- 11: 2, # '×'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # '× '
- 19: 2, # 'ס'
- 13: 2, # '×¢'
- 26: 2, # '×£'
- 18: 2, # 'פ'
- 27: 1, # '×¥'
- 21: 2, # 'צ'
- 17: 2, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 29: { # 'Ö¸'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 1, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 1, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 2, # 'ב'
- 20: 2, # '×’'
- 16: 2, # 'ד'
- 3: 3, # '×”'
- 2: 2, # 'ו'
- 24: 2, # '×–'
- 14: 2, # '×—'
- 22: 1, # 'ט'
- 1: 2, # '×™'
- 25: 2, # 'ך'
- 15: 2, # '×›'
- 4: 2, # 'ל'
- 11: 2, # '×'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # '× '
- 19: 1, # 'ס'
- 13: 2, # '×¢'
- 26: 1, # '×£'
- 18: 2, # 'פ'
- 27: 1, # '×¥'
- 21: 2, # 'צ'
- 17: 2, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 35: { # 'Ö¹'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 2, # 'ב'
- 20: 1, # '×’'
- 16: 2, # 'ד'
- 3: 2, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 1, # '×—'
- 22: 1, # 'ט'
- 1: 1, # '×™'
- 25: 1, # 'ך'
- 15: 2, # '×›'
- 4: 2, # 'ל'
- 11: 2, # '×'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # '× '
- 19: 2, # 'ס'
- 13: 2, # '×¢'
- 26: 1, # '×£'
- 18: 2, # 'פ'
- 27: 1, # '×¥'
- 21: 2, # 'צ'
- 17: 2, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 62: { # 'Ö»'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 1, # 'ב'
- 20: 1, # '×’'
- 16: 1, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 1, # '×—'
- 22: 0, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 2, # 'ל'
- 11: 1, # '×'
- 6: 1, # 'מ'
- 23: 1, # 'ן'
- 12: 1, # '× '
- 19: 1, # 'ס'
- 13: 1, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 28: { # 'Ö¼'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 3, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 1, # 'Ö²'
- 33: 3, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 3, # 'Ö·'
- 29: 3, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 2, # '×'
- 45: 1, # 'ׂ'
- 9: 2, # '×'
- 8: 2, # 'ב'
- 20: 1, # '×’'
- 16: 2, # 'ד'
- 3: 1, # '×”'
- 2: 2, # 'ו'
- 24: 1, # '×–'
- 14: 1, # '×—'
- 22: 1, # 'ט'
- 1: 2, # '×™'
- 25: 2, # 'ך'
- 15: 2, # '×›'
- 4: 2, # 'ל'
- 11: 1, # '×'
- 6: 2, # 'מ'
- 23: 1, # 'ן'
- 12: 2, # '× '
- 19: 1, # 'ס'
- 13: 2, # '×¢'
- 26: 1, # '×£'
- 18: 1, # 'פ'
- 27: 1, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 38: { # '×'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 2, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 1, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 45: { # 'ׂ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 1, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 1, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 0, # 'ב'
- 20: 1, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 2, # 'ו'
- 24: 0, # '×–'
- 14: 1, # '×—'
- 22: 0, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 1, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # '× '
- 19: 0, # 'ס'
- 13: 1, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 9: { # '×'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 2, # 'Ö±'
- 41: 2, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 3, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 2, # '×¢'
- 26: 3, # '×£'
- 18: 3, # 'פ'
- 27: 1, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 8: { # 'ב'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 3, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 2, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 1, # '×£'
- 18: 3, # 'פ'
- 27: 2, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 20: { # '×’'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 2, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 1, # 'Ö´'
- 37: 1, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 3, # 'ב'
- 20: 2, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 2, # '×—'
- 22: 2, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 1, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 2, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 2, # 'פ'
- 27: 1, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 16: { # 'ד'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 1, # '×–'
- 14: 2, # '×—'
- 22: 2, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 2, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 2, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 0, # '×¥'
- 21: 2, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 3: { # '×”'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'Ö°'
- 59: 1, # 'Ö±'
- 41: 2, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 3, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 0, # '×£'
- 18: 3, # 'פ'
- 27: 1, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 2: { # 'ו'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 1, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 3, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 3, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 3, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 3, # '×£'
- 18: 3, # 'פ'
- 27: 3, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 24: { # '×–'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 1, # 'Ö²'
- 33: 1, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 2, # 'ב'
- 20: 2, # '×’'
- 16: 2, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 2, # '×–'
- 14: 2, # '×—'
- 22: 1, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 2, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # '× '
- 19: 1, # 'ס'
- 13: 2, # '×¢'
- 26: 1, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 2, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 1, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 14: { # '×—'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 1, # 'Ö±'
- 41: 2, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 3, # 'ב'
- 20: 2, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 2, # '×—'
- 22: 2, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 2, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 1, # '×¢'
- 26: 2, # '×£'
- 18: 2, # 'פ'
- 27: 2, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 22: { # 'ט'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 1, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 1, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 1, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 1, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 2, # '×–'
- 14: 3, # '×—'
- 22: 2, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 2, # '×›'
- 4: 3, # 'ל'
- 11: 2, # '×'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 2, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 1, # '×¥'
- 21: 2, # 'צ'
- 17: 2, # '×§'
- 7: 3, # 'ר'
- 10: 2, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 1: { # '×™'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 3, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 3, # '×£'
- 18: 3, # 'פ'
- 27: 3, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 25: { # 'ך'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 1, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 1, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 15: { # '×›'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 3, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 2, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 2, # 'ט'
- 1: 3, # '×™'
- 25: 3, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 2, # '×¢'
- 26: 3, # '×£'
- 18: 3, # 'פ'
- 27: 1, # '×¥'
- 21: 2, # 'צ'
- 17: 2, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 4: { # 'ל'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 3, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 3, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 2, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 11: { # '×'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 1, # 'ב'
- 20: 1, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 1, # '×—'
- 22: 0, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 1, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # '× '
- 19: 0, # 'ס'
- 13: 1, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 1, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 6: { # 'מ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 0, # '×£'
- 18: 3, # 'פ'
- 27: 2, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 23: { # 'ן'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 1, # 'ב'
- 20: 1, # '×’'
- 16: 1, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 0, # '×–'
- 14: 1, # '×—'
- 22: 1, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 1, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # '× '
- 19: 1, # 'ס'
- 13: 1, # '×¢'
- 26: 1, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 1, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 12: { # '× '
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 2, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 19: { # 'ס'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 1, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 1, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 2, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 1, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 2, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 2, # 'ס'
- 13: 3, # '×¢'
- 26: 3, # '×£'
- 18: 3, # 'פ'
- 27: 0, # '×¥'
- 21: 2, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 1, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 13: { # '×¢'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'Ö°'
- 59: 1, # 'Ö±'
- 41: 2, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 1, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 2, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 2, # '×¢'
- 26: 1, # '×£'
- 18: 2, # 'פ'
- 27: 2, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 26: { # '×£'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 1, # 'ו'
- 24: 0, # '×–'
- 14: 1, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 1, # 'ס'
- 13: 0, # '×¢'
- 26: 1, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 1, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 18: { # 'פ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 1, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 1, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 2, # 'ב'
- 20: 3, # '×’'
- 16: 2, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 2, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 2, # '×'
- 6: 2, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 2, # 'פ'
- 27: 2, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 27: { # '×¥'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 1, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 21: { # 'צ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 2, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 1, # '×–'
- 14: 3, # '×—'
- 22: 2, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 1, # '×›'
- 4: 3, # 'ל'
- 11: 2, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 1, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 2, # '×¥'
- 21: 2, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 0, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 17: { # '×§'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 2, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 2, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 1, # 'ך'
- 15: 1, # '×›'
- 4: 3, # 'ל'
- 11: 2, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 2, # '×¥'
- 21: 3, # 'צ'
- 17: 2, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 7: { # 'ר'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 2, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 1, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 2, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 3, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 3, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 3, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 3, # '×¥'
- 21: 3, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 10: { # 'ש'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 1, # 'Ö´'
- 37: 1, # 'Öµ'
- 36: 1, # 'Ö¶'
- 31: 1, # 'Ö·'
- 29: 1, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 3, # '×'
- 45: 2, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 3, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 2, # '×–'
- 14: 3, # '×—'
- 22: 3, # 'ט'
- 1: 3, # '×™'
- 25: 3, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # '× '
- 19: 2, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 1, # '×¥'
- 21: 2, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 5: { # 'ת'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 1, # '½'
- 57: 0, # '¾'
- 30: 2, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 2, # 'Ö´'
- 37: 2, # 'Öµ'
- 36: 2, # 'Ö¶'
- 31: 2, # 'Ö·'
- 29: 2, # 'Ö¸'
- 35: 1, # 'Ö¹'
- 62: 1, # 'Ö»'
- 28: 2, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 3, # '×'
- 8: 3, # 'ב'
- 20: 3, # '×’'
- 16: 2, # 'ד'
- 3: 3, # '×”'
- 2: 3, # 'ו'
- 24: 2, # '×–'
- 14: 3, # '×—'
- 22: 2, # 'ט'
- 1: 3, # '×™'
- 25: 2, # 'ך'
- 15: 3, # '×›'
- 4: 3, # 'ל'
- 11: 3, # '×'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # '× '
- 19: 2, # 'ס'
- 13: 3, # '×¢'
- 26: 2, # '×£'
- 18: 3, # 'פ'
- 27: 1, # '×¥'
- 21: 2, # 'צ'
- 17: 3, # '×§'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 32: { # '–'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 1, # 'ב'
- 20: 1, # '×’'
- 16: 1, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 0, # '×–'
- 14: 1, # '×—'
- 22: 0, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 1, # 'ס'
- 13: 1, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 1, # 'צ'
- 17: 0, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 52: { # '’'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 1, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 47: { # '“'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 2, # '×'
- 8: 1, # 'ב'
- 20: 1, # '×’'
- 16: 1, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 1, # '×—'
- 22: 1, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # '× '
- 19: 1, # 'ס'
- 13: 1, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 1, # 'צ'
- 17: 1, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 46: { # 'â€'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 1, # 'ב'
- 20: 1, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 1, # 'צ'
- 17: 0, # '×§'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 58: { # '†'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 0, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 0, # '×”'
- 2: 0, # 'ו'
- 24: 0, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 0, # '×™'
- 25: 0, # 'ך'
- 15: 0, # '×›'
- 4: 0, # 'ל'
- 11: 0, # '×'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 0, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # 'â€'
- 58: 2, # '†'
- 40: 0, # '…'
- },
- 40: { # '…'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'Ö°'
- 59: 0, # 'Ö±'
- 41: 0, # 'Ö²'
- 33: 0, # 'Ö´'
- 37: 0, # 'Öµ'
- 36: 0, # 'Ö¶'
- 31: 0, # 'Ö·'
- 29: 0, # 'Ö¸'
- 35: 0, # 'Ö¹'
- 62: 0, # 'Ö»'
- 28: 0, # 'Ö¼'
- 38: 0, # '×'
- 45: 0, # 'ׂ'
- 9: 1, # '×'
- 8: 0, # 'ב'
- 20: 0, # '×’'
- 16: 0, # 'ד'
- 3: 1, # '×”'
- 2: 1, # 'ו'
- 24: 1, # '×–'
- 14: 0, # '×—'
- 22: 0, # 'ט'
- 1: 1, # '×™'
- 25: 0, # 'ך'
- 15: 1, # '×›'
- 4: 1, # 'ל'
- 11: 0, # '×'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # '× '
- 19: 0, # 'ס'
- 13: 0, # '×¢'
- 26: 0, # '×£'
- 18: 1, # 'פ'
- 27: 0, # '×¥'
- 21: 0, # 'צ'
- 17: 0, # '×§'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # 'â€'
- 58: 0, # '†'
- 40: 2, # '…'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1255_HEBREW_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 69, # 'A'
- 66: 91, # 'B'
- 67: 79, # 'C'
- 68: 80, # 'D'
- 69: 92, # 'E'
- 70: 89, # 'F'
- 71: 97, # 'G'
- 72: 90, # 'H'
- 73: 68, # 'I'
- 74: 111, # 'J'
- 75: 112, # 'K'
- 76: 82, # 'L'
- 77: 73, # 'M'
- 78: 95, # 'N'
- 79: 85, # 'O'
- 80: 78, # 'P'
- 81: 121, # 'Q'
- 82: 86, # 'R'
- 83: 71, # 'S'
- 84: 67, # 'T'
- 85: 102, # 'U'
- 86: 107, # 'V'
- 87: 84, # 'W'
- 88: 114, # 'X'
- 89: 103, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 50, # 'a'
- 98: 74, # 'b'
- 99: 60, # 'c'
- 100: 61, # 'd'
- 101: 42, # 'e'
- 102: 76, # 'f'
- 103: 70, # 'g'
- 104: 64, # 'h'
- 105: 53, # 'i'
- 106: 105, # 'j'
- 107: 93, # 'k'
- 108: 56, # 'l'
- 109: 65, # 'm'
- 110: 54, # 'n'
- 111: 49, # 'o'
- 112: 66, # 'p'
- 113: 110, # 'q'
- 114: 51, # 'r'
- 115: 43, # 's'
- 116: 44, # 't'
- 117: 63, # 'u'
- 118: 81, # 'v'
- 119: 77, # 'w'
- 120: 98, # 'x'
- 121: 75, # 'y'
- 122: 108, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 124, # '€'
- 129: 202, # None
- 130: 203, # '‚'
- 131: 204, # 'Æ’'
- 132: 205, # '„'
- 133: 40, # '…'
- 134: 58, # '†'
- 135: 206, # '‡'
- 136: 207, # 'ˆ'
- 137: 208, # '‰'
- 138: 209, # None
- 139: 210, # '‹'
- 140: 211, # None
- 141: 212, # None
- 142: 213, # None
- 143: 214, # None
- 144: 215, # None
- 145: 83, # '‘'
- 146: 52, # '’'
- 147: 47, # '“'
- 148: 46, # 'â€'
- 149: 72, # '•'
- 150: 32, # '–'
- 151: 94, # '—'
- 152: 216, # '˜'
- 153: 113, # 'â„¢'
- 154: 217, # None
- 155: 109, # '›'
- 156: 218, # None
- 157: 219, # None
- 158: 220, # None
- 159: 221, # None
- 160: 34, # '\xa0'
- 161: 116, # '¡'
- 162: 222, # '¢'
- 163: 118, # '£'
- 164: 100, # '₪'
- 165: 223, # 'Â¥'
- 166: 224, # '¦'
- 167: 117, # '§'
- 168: 119, # '¨'
- 169: 104, # '©'
- 170: 125, # '×'
- 171: 225, # '«'
- 172: 226, # '¬'
- 173: 87, # '\xad'
- 174: 99, # '®'
- 175: 227, # '¯'
- 176: 106, # '°'
- 177: 122, # '±'
- 178: 123, # '²'
- 179: 228, # '³'
- 180: 55, # '´'
- 181: 229, # 'µ'
- 182: 230, # '¶'
- 183: 101, # '·'
- 184: 231, # '¸'
- 185: 232, # '¹'
- 186: 120, # '÷'
- 187: 233, # '»'
- 188: 48, # '¼'
- 189: 39, # '½'
- 190: 57, # '¾'
- 191: 234, # '¿'
- 192: 30, # 'Ö°'
- 193: 59, # 'Ö±'
- 194: 41, # 'Ö²'
- 195: 88, # 'Ö³'
- 196: 33, # 'Ö´'
- 197: 37, # 'Öµ'
- 198: 36, # 'Ö¶'
- 199: 31, # 'Ö·'
- 200: 29, # 'Ö¸'
- 201: 35, # 'Ö¹'
- 202: 235, # None
- 203: 62, # 'Ö»'
- 204: 28, # 'Ö¼'
- 205: 236, # 'Ö½'
- 206: 126, # 'Ö¾'
- 207: 237, # 'Ö¿'
- 208: 238, # '×€'
- 209: 38, # '×'
- 210: 45, # 'ׂ'
- 211: 239, # '׃'
- 212: 240, # '×°'
- 213: 241, # '×±'
- 214: 242, # 'ײ'
- 215: 243, # '׳'
- 216: 127, # '×´'
- 217: 244, # None
- 218: 245, # None
- 219: 246, # None
- 220: 247, # None
- 221: 248, # None
- 222: 249, # None
- 223: 250, # None
- 224: 9, # '×'
- 225: 8, # 'ב'
- 226: 20, # '×’'
- 227: 16, # 'ד'
- 228: 3, # '×”'
- 229: 2, # 'ו'
- 230: 24, # '×–'
- 231: 14, # '×—'
- 232: 22, # 'ט'
- 233: 1, # '×™'
- 234: 25, # 'ך'
- 235: 15, # '×›'
- 236: 4, # 'ל'
- 237: 11, # '×'
- 238: 6, # 'מ'
- 239: 23, # 'ן'
- 240: 12, # '× '
- 241: 19, # 'ס'
- 242: 13, # '×¢'
- 243: 26, # '×£'
- 244: 18, # 'פ'
- 245: 27, # '×¥'
- 246: 21, # 'צ'
- 247: 17, # '×§'
- 248: 7, # 'ר'
- 249: 10, # 'ש'
- 250: 5, # 'ת'
- 251: 251, # None
- 252: 252, # None
- 253: 128, # '\u200e'
- 254: 96, # '\u200f'
- 255: 253, # None
-}
-
-WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel(charset_name='windows-1255',
- language='Hebrew',
- char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER,
- language_model=HEBREW_LANG_MODEL,
- typical_positive_ratio=0.984004,
- keep_ascii_letters=False,
- alphabet='×בגדהוזחטיךכל××ž×Ÿ× ×¡×¢×£×¤×¥×¦×§×¨×©×ª×°×±×²')
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py
deleted file mode 100644
index bbc5cda..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py
+++ /dev/null
@@ -1,4650 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-HUNGARIAN_LANG_MODEL = {
- 28: { # 'A'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 2, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 2, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 2, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 1, # 'Ã'
- 44: 0, # 'É'
- 61: 1, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 40: { # 'B'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 3, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 54: { # 'C'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 3, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 45: { # 'D'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 0, # 'ű'
- },
- 32: { # 'E'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 2, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 0, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 50: { # 'F'
- 28: 1, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 0, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 0, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 49: { # 'G'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 2, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 0, # 'ű'
- },
- 38: { # 'H'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 0, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 1, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Ã'
- 44: 2, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 2, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 39: { # 'I'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 2, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 0, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 53: { # 'J'
- 28: 2, # 'A'
- 40: 0, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 0, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'Ã'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 0, # 'ü'
- 42: 1, # 'Å‘'
- 56: 0, # 'ű'
- },
- 36: { # 'K'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 2, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'Å‘'
- 56: 0, # 'ű'
- },
- 41: { # 'L'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 34: { # 'M'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 3, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 1, # 'ű'
- },
- 35: { # 'N'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 2, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 2, # 'Y'
- 52: 1, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 1, # 'Å‘'
- 56: 0, # 'ű'
- },
- 47: { # 'O'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 2, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 0, # 'Ã'
- 58: 1, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 46: { # 'P'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 3, # 'á'
- 15: 2, # 'é'
- 30: 0, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 0, # 'ű'
- },
- 43: { # 'R'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 2, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 2, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 33: { # 'S'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 3, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 1, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 2, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 37: { # 'T'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 2, # 'Ã'
- 44: 2, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 57: { # 'U'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 1, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 48: { # 'V'
- 28: 2, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Ã'
- 44: 2, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 55: { # 'Y'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 2, # 'Z'
- 2: 1, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 52: { # 'Z'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 1, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Ã'
- 44: 1, # 'É'
- 61: 1, # 'Ã'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 2: { # 'a'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 18: { # 'b'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 3, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'Å‘'
- 56: 1, # 'ű'
- },
- 26: { # 'c'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 1, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 2, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 2, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 17: { # 'd'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 2, # 'k'
- 6: 1, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'Ã'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'Å‘'
- 56: 1, # 'ű'
- },
- 1: { # 'e'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 2, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 27: { # 'f'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 3, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 3, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 12: { # 'g'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 3, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'Å‘'
- 56: 1, # 'ű'
- },
- 20: { # 'h'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'Ã'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 9: { # 'i'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 3, # 'ó'
- 24: 1, # 'ö'
- 31: 2, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 1, # 'ű'
- },
- 22: { # 'j'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 1, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 1, # 'Ã'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 7: { # 'k'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'Ã'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 1, # 'ú'
- 29: 3, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 6: { # 'l'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'Ã'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 3, # 'Å‘'
- 56: 1, # 'ű'
- },
- 13: { # 'm'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 1, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 3, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'Å‘'
- 56: 2, # 'ű'
- },
- 4: { # 'n'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 1, # 'x'
- 16: 3, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'Å‘'
- 56: 1, # 'ű'
- },
- 8: { # 'o'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 23: { # 'p'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 10: { # 'r'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'Å‘'
- 56: 2, # 'ű'
- },
- 5: { # 's'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'Ã'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'Å‘'
- 56: 1, # 'ű'
- },
- 3: { # 't'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 1, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 3, # 'Å‘'
- 56: 2, # 'ű'
- },
- 21: { # 'u'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 2, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 1, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 1, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 19: { # 'v'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 2, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'Å‘'
- 56: 1, # 'ű'
- },
- 62: { # 'x'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 16: { # 'y'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'Ã'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'Å‘'
- 56: 2, # 'ű'
- },
- 11: { # 'z'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'Ã'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'Å‘'
- 56: 1, # 'ű'
- },
- 51: { # 'Ã'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 1, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 44: { # 'É'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Ã'
- 44: 1, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 61: { # 'Ã'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 0, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 58: { # 'Ó'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 2, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 1, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 59: { # 'Ö'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 60: { # 'Ú'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 2, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 63: { # 'Ü'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 14: { # 'á'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'Ã'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 15: { # 'é'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 30: { # 'Ã'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 25: { # 'ó'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 1, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 24: { # 'ö'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 0, # 'a'
- 18: 3, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 31: { # 'ú'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 3, # 'j'
- 7: 1, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 29: { # 'ü'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 0, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 42: { # 'Å‘'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
- 56: { # 'ű'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Ã'
- 44: 0, # 'É'
- 61: 0, # 'Ã'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'Ã'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'Å‘'
- 56: 0, # 'ű'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 28, # 'A'
- 66: 40, # 'B'
- 67: 54, # 'C'
- 68: 45, # 'D'
- 69: 32, # 'E'
- 70: 50, # 'F'
- 71: 49, # 'G'
- 72: 38, # 'H'
- 73: 39, # 'I'
- 74: 53, # 'J'
- 75: 36, # 'K'
- 76: 41, # 'L'
- 77: 34, # 'M'
- 78: 35, # 'N'
- 79: 47, # 'O'
- 80: 46, # 'P'
- 81: 72, # 'Q'
- 82: 43, # 'R'
- 83: 33, # 'S'
- 84: 37, # 'T'
- 85: 57, # 'U'
- 86: 48, # 'V'
- 87: 64, # 'W'
- 88: 68, # 'X'
- 89: 55, # 'Y'
- 90: 52, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 2, # 'a'
- 98: 18, # 'b'
- 99: 26, # 'c'
- 100: 17, # 'd'
- 101: 1, # 'e'
- 102: 27, # 'f'
- 103: 12, # 'g'
- 104: 20, # 'h'
- 105: 9, # 'i'
- 106: 22, # 'j'
- 107: 7, # 'k'
- 108: 6, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 8, # 'o'
- 112: 23, # 'p'
- 113: 67, # 'q'
- 114: 10, # 'r'
- 115: 5, # 's'
- 116: 3, # 't'
- 117: 21, # 'u'
- 118: 19, # 'v'
- 119: 65, # 'w'
- 120: 62, # 'x'
- 121: 16, # 'y'
- 122: 11, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 161, # '€'
- 129: 162, # None
- 130: 163, # '‚'
- 131: 164, # None
- 132: 165, # '„'
- 133: 166, # '…'
- 134: 167, # '†'
- 135: 168, # '‡'
- 136: 169, # None
- 137: 170, # '‰'
- 138: 171, # 'Å '
- 139: 172, # '‹'
- 140: 173, # 'Åš'
- 141: 174, # 'Ť'
- 142: 175, # 'Ž'
- 143: 176, # 'Ź'
- 144: 177, # None
- 145: 178, # '‘'
- 146: 179, # '’'
- 147: 180, # '“'
- 148: 78, # 'â€'
- 149: 181, # '•'
- 150: 69, # '–'
- 151: 182, # '—'
- 152: 183, # None
- 153: 184, # 'â„¢'
- 154: 185, # 'Å¡'
- 155: 186, # '›'
- 156: 187, # 'Å›'
- 157: 188, # 'Å¥'
- 158: 189, # 'ž'
- 159: 190, # 'ź'
- 160: 191, # '\xa0'
- 161: 192, # 'ˇ'
- 162: 193, # '˘'
- 163: 194, # 'Å'
- 164: 195, # '¤'
- 165: 196, # 'Ä„'
- 166: 197, # '¦'
- 167: 76, # '§'
- 168: 198, # '¨'
- 169: 199, # '©'
- 170: 200, # 'Åž'
- 171: 201, # '«'
- 172: 202, # '¬'
- 173: 203, # '\xad'
- 174: 204, # '®'
- 175: 205, # 'Å»'
- 176: 81, # '°'
- 177: 206, # '±'
- 178: 207, # 'Ë›'
- 179: 208, # 'Å‚'
- 180: 209, # '´'
- 181: 210, # 'µ'
- 182: 211, # '¶'
- 183: 212, # '·'
- 184: 213, # '¸'
- 185: 214, # 'Ä…'
- 186: 215, # 'ÅŸ'
- 187: 216, # '»'
- 188: 217, # 'Ľ'
- 189: 218, # 'Ë'
- 190: 219, # 'ľ'
- 191: 220, # 'ż'
- 192: 221, # 'Å”'
- 193: 51, # 'Ã'
- 194: 83, # 'Â'
- 195: 222, # 'Ä‚'
- 196: 80, # 'Ä'
- 197: 223, # 'Ĺ'
- 198: 224, # 'Ć'
- 199: 225, # 'Ç'
- 200: 226, # 'Č'
- 201: 44, # 'É'
- 202: 227, # 'Ę'
- 203: 228, # 'Ë'
- 204: 229, # 'Äš'
- 205: 61, # 'Ã'
- 206: 230, # 'ÃŽ'
- 207: 231, # 'ÄŽ'
- 208: 232, # 'Ä'
- 209: 233, # 'Ń'
- 210: 234, # 'Ň'
- 211: 58, # 'Ó'
- 212: 235, # 'Ô'
- 213: 66, # 'Å'
- 214: 59, # 'Ö'
- 215: 236, # '×'
- 216: 237, # 'Ř'
- 217: 238, # 'Å®'
- 218: 60, # 'Ú'
- 219: 70, # 'Ű'
- 220: 63, # 'Ü'
- 221: 239, # 'Ã'
- 222: 240, # 'Å¢'
- 223: 241, # 'ß'
- 224: 84, # 'Å•'
- 225: 14, # 'á'
- 226: 75, # 'â'
- 227: 242, # 'ă'
- 228: 71, # 'ä'
- 229: 82, # 'ĺ'
- 230: 243, # 'ć'
- 231: 73, # 'ç'
- 232: 244, # 'Ä'
- 233: 15, # 'é'
- 234: 85, # 'Ä™'
- 235: 79, # 'ë'
- 236: 86, # 'Ä›'
- 237: 30, # 'Ã'
- 238: 77, # 'î'
- 239: 87, # 'Ä'
- 240: 245, # 'Ä‘'
- 241: 246, # 'Å„'
- 242: 247, # 'ň'
- 243: 25, # 'ó'
- 244: 74, # 'ô'
- 245: 42, # 'Å‘'
- 246: 24, # 'ö'
- 247: 248, # '÷'
- 248: 249, # 'Å™'
- 249: 250, # 'ů'
- 250: 31, # 'ú'
- 251: 56, # 'ű'
- 252: 29, # 'ü'
- 253: 251, # 'ý'
- 254: 252, # 'Å£'
- 255: 253, # 'Ë™'
-}
-
-WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1250',
- language='Hungarian',
- char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER,
- language_model=HUNGARIAN_LANG_MODEL,
- typical_positive_ratio=0.947368,
- keep_ascii_letters=True,
- alphabet='ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÃÉÃÓÖÚÜáéÃóöúüÅőŰű')
-
-ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 28, # 'A'
- 66: 40, # 'B'
- 67: 54, # 'C'
- 68: 45, # 'D'
- 69: 32, # 'E'
- 70: 50, # 'F'
- 71: 49, # 'G'
- 72: 38, # 'H'
- 73: 39, # 'I'
- 74: 53, # 'J'
- 75: 36, # 'K'
- 76: 41, # 'L'
- 77: 34, # 'M'
- 78: 35, # 'N'
- 79: 47, # 'O'
- 80: 46, # 'P'
- 81: 71, # 'Q'
- 82: 43, # 'R'
- 83: 33, # 'S'
- 84: 37, # 'T'
- 85: 57, # 'U'
- 86: 48, # 'V'
- 87: 64, # 'W'
- 88: 68, # 'X'
- 89: 55, # 'Y'
- 90: 52, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 2, # 'a'
- 98: 18, # 'b'
- 99: 26, # 'c'
- 100: 17, # 'd'
- 101: 1, # 'e'
- 102: 27, # 'f'
- 103: 12, # 'g'
- 104: 20, # 'h'
- 105: 9, # 'i'
- 106: 22, # 'j'
- 107: 7, # 'k'
- 108: 6, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 8, # 'o'
- 112: 23, # 'p'
- 113: 67, # 'q'
- 114: 10, # 'r'
- 115: 5, # 's'
- 116: 3, # 't'
- 117: 21, # 'u'
- 118: 19, # 'v'
- 119: 65, # 'w'
- 120: 62, # 'x'
- 121: 16, # 'y'
- 122: 11, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 159, # '\x80'
- 129: 160, # '\x81'
- 130: 161, # '\x82'
- 131: 162, # '\x83'
- 132: 163, # '\x84'
- 133: 164, # '\x85'
- 134: 165, # '\x86'
- 135: 166, # '\x87'
- 136: 167, # '\x88'
- 137: 168, # '\x89'
- 138: 169, # '\x8a'
- 139: 170, # '\x8b'
- 140: 171, # '\x8c'
- 141: 172, # '\x8d'
- 142: 173, # '\x8e'
- 143: 174, # '\x8f'
- 144: 175, # '\x90'
- 145: 176, # '\x91'
- 146: 177, # '\x92'
- 147: 178, # '\x93'
- 148: 179, # '\x94'
- 149: 180, # '\x95'
- 150: 181, # '\x96'
- 151: 182, # '\x97'
- 152: 183, # '\x98'
- 153: 184, # '\x99'
- 154: 185, # '\x9a'
- 155: 186, # '\x9b'
- 156: 187, # '\x9c'
- 157: 188, # '\x9d'
- 158: 189, # '\x9e'
- 159: 190, # '\x9f'
- 160: 191, # '\xa0'
- 161: 192, # 'Ä„'
- 162: 193, # '˘'
- 163: 194, # 'Å'
- 164: 195, # '¤'
- 165: 196, # 'Ľ'
- 166: 197, # 'Åš'
- 167: 75, # '§'
- 168: 198, # '¨'
- 169: 199, # 'Å '
- 170: 200, # 'Åž'
- 171: 201, # 'Ť'
- 172: 202, # 'Ź'
- 173: 203, # '\xad'
- 174: 204, # 'Ž'
- 175: 205, # 'Å»'
- 176: 79, # '°'
- 177: 206, # 'Ä…'
- 178: 207, # 'Ë›'
- 179: 208, # 'Å‚'
- 180: 209, # '´'
- 181: 210, # 'ľ'
- 182: 211, # 'Å›'
- 183: 212, # 'ˇ'
- 184: 213, # '¸'
- 185: 214, # 'Å¡'
- 186: 215, # 'ÅŸ'
- 187: 216, # 'Å¥'
- 188: 217, # 'ź'
- 189: 218, # 'Ë'
- 190: 219, # 'ž'
- 191: 220, # 'ż'
- 192: 221, # 'Å”'
- 193: 51, # 'Ã'
- 194: 81, # 'Â'
- 195: 222, # 'Ä‚'
- 196: 78, # 'Ä'
- 197: 223, # 'Ĺ'
- 198: 224, # 'Ć'
- 199: 225, # 'Ç'
- 200: 226, # 'Č'
- 201: 44, # 'É'
- 202: 227, # 'Ę'
- 203: 228, # 'Ë'
- 204: 229, # 'Äš'
- 205: 61, # 'Ã'
- 206: 230, # 'ÃŽ'
- 207: 231, # 'ÄŽ'
- 208: 232, # 'Ä'
- 209: 233, # 'Ń'
- 210: 234, # 'Ň'
- 211: 58, # 'Ó'
- 212: 235, # 'Ô'
- 213: 66, # 'Å'
- 214: 59, # 'Ö'
- 215: 236, # '×'
- 216: 237, # 'Ř'
- 217: 238, # 'Å®'
- 218: 60, # 'Ú'
- 219: 69, # 'Ű'
- 220: 63, # 'Ü'
- 221: 239, # 'Ã'
- 222: 240, # 'Å¢'
- 223: 241, # 'ß'
- 224: 82, # 'Å•'
- 225: 14, # 'á'
- 226: 74, # 'â'
- 227: 242, # 'ă'
- 228: 70, # 'ä'
- 229: 80, # 'ĺ'
- 230: 243, # 'ć'
- 231: 72, # 'ç'
- 232: 244, # 'Ä'
- 233: 15, # 'é'
- 234: 83, # 'Ä™'
- 235: 77, # 'ë'
- 236: 84, # 'Ä›'
- 237: 30, # 'Ã'
- 238: 76, # 'î'
- 239: 85, # 'Ä'
- 240: 245, # 'Ä‘'
- 241: 246, # 'Å„'
- 242: 247, # 'ň'
- 243: 25, # 'ó'
- 244: 73, # 'ô'
- 245: 42, # 'Å‘'
- 246: 24, # 'ö'
- 247: 248, # '÷'
- 248: 249, # 'Å™'
- 249: 250, # 'ů'
- 250: 31, # 'ú'
- 251: 56, # 'ű'
- 252: 29, # 'ü'
- 253: 251, # 'ý'
- 254: 252, # 'Å£'
- 255: 253, # 'Ë™'
-}
-
-ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-2',
- language='Hungarian',
- char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER,
- language_model=HUNGARIAN_LANG_MODEL,
- typical_positive_ratio=0.947368,
- keep_ascii_letters=True,
- alphabet='ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÃÉÃÓÖÚÜáéÃóöúüÅőŰű')
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py
deleted file mode 100644
index 5594452..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py
+++ /dev/null
@@ -1,5718 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-RUSSIAN_LANG_MODEL = {
- 37: { # 'Ð'
- 37: 0, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 2, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 1, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 44: { # 'Б'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 2, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 33: { # 'Ð’'
- 37: 2, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 46: { # 'Г'
- 37: 1, # 'Ð'
- 44: 1, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 41: { # 'Д'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 3, # 'ж'
- 20: 1, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 48: { # 'Е'
- 37: 1, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Ð '
- 32: 2, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 1, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 1, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 56: { # 'Ж'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 1, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 51: { # 'З'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 42: { # 'И'
- 37: 1, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 2, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 1, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 60: { # 'Й'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 36: { # 'К'
- 37: 2, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 2, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 49: { # 'Л'
- 37: 2, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 0, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 0, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Ð'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 38: { # 'М'
- 37: 1, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 1, # 'Ð'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 31: { # 'Ð'
- 37: 2, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 2, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Ð'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 0, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 2, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 34: { # 'О'
- 37: 0, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 2, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 2, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 1, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 35: { # 'П'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 1, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 1, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 2, # 'ь'
- 30: 1, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 2, # 'Ñ'
- },
- 45: { # 'Ð '
- 37: 2, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 2, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 2, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Ð'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 2, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 2, # 'Ñ'
- },
- 32: { # 'С'
- 37: 1, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 2, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Ð'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 1, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 40: { # 'Т'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 2, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Ð'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 52: { # 'У'
- 37: 1, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 1, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 1, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 1, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 1, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 53: { # 'Ф'
- 37: 1, # 'Ð'
- 44: 1, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 1, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 55: { # 'Ð¥'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 1, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 58: { # 'Ц'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 50: { # 'Ч'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 57: { # 'Ш'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 1, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 63: { # 'Щ'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 62: { # 'Ы'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 61: { # 'Ь'
- 37: 0, # 'Ð'
- 44: 1, # 'Б'
- 33: 1, # 'Ð’'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 47: { # 'Ð'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 1, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 59: { # 'Ю'
- 37: 1, # 'Ð'
- 44: 1, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 0, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 0, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 43: { # 'Я'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 1, # 'Ð’'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 1, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 0, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 3: { # 'а'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 2, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 2, # 'Ñ'
- 27: 3, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 21: { # 'б'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 0, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 2, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 2, # 'ь'
- 30: 1, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 10: { # 'в'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 1, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 2, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 19: { # 'г'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 1, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 13: { # 'д'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 1, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 3, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 2, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 1, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 2: { # 'е'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 2, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 1, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 24: { # 'ж'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 1, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 1, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 2, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 20: { # 'з'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 2, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 2, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 4: { # 'и'
- 37: 1, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 2, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 2, # 'Ñ'
- 27: 3, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 23: { # 'й'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 2, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 2, # 'Ñ'
- },
- 11: { # 'к'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 3, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 1, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 1, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 8: { # 'л'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 3, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 2, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 1, # 'Ñ'
- 27: 3, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 12: { # 'м'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 2, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 2, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 5: { # 'н'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 2, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 2, # 'щ'
- 54: 1, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 1, # 'Ñ'
- 27: 3, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 1: { # 'о'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 2, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 2, # 'Ñ'
- 27: 3, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 15: { # 'п'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 1, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 2, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 9: { # 'Ñ€'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 2, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 2, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 7: { # 'Ñ'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 2, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 2, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 2, # 'Ñ'
- 27: 3, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 6: { # 'Ñ‚'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 2, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 2, # 'щ'
- 54: 2, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 2, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 14: { # 'у'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 2, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 2, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 2, # 'Ñ'
- 27: 3, # 'ÑŽ'
- 16: 2, # 'Ñ'
- },
- 39: { # 'Ñ„'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 2, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 2, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 2, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 26: { # 'Ñ…'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 3, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 3, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 1, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 28: { # 'ц'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 1, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 3, # 'Ñ‹'
- 17: 1, # 'ь'
- 30: 0, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 22: { # 'ч'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 1, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 25: { # 'ш'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 1, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 3, # 'у'
- 39: 2, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 3, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 29: { # 'щ'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 2, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 2, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 0, # 'Ñ'
- },
- 54: { # 'ÑŠ'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'Ñ€'
- 7: 0, # 'Ñ'
- 6: 0, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 0, # 'Ñ„'
- 26: 0, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 2, # 'Ñ'
- },
- 18: { # 'Ñ‹'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 1, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 0, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 0, # 'ÑŽ'
- 16: 2, # 'Ñ'
- },
- 17: { # 'ь'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 0, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 2, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 2, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 1, # 'Ñ'
- 27: 3, # 'ÑŽ'
- 16: 3, # 'Ñ'
- },
- 30: { # 'Ñ'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Ð '
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 2, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 2, # 'Ñ„'
- 26: 1, # 'Ñ…'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 1, # 'Ñ'
- 27: 1, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 27: { # 'ÑŽ'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 1, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 0, # 'у'
- 39: 1, # 'Ñ„'
- 26: 2, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 1, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 1, # 'Ñ'
- },
- 16: { # 'Ñ'
- 37: 0, # 'Ð'
- 44: 0, # 'Б'
- 33: 0, # 'Ð’'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Ð'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Ð '
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Ð¥'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Ð'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 2, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'Ñ€'
- 7: 3, # 'Ñ'
- 6: 3, # 'Ñ‚'
- 14: 1, # 'у'
- 39: 1, # 'Ñ„'
- 26: 3, # 'Ñ…'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ÑŠ'
- 18: 0, # 'Ñ‹'
- 17: 0, # 'ь'
- 30: 0, # 'Ñ'
- 27: 2, # 'ÑŽ'
- 16: 2, # 'Ñ'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-IBM866_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 37, # 'Ð'
- 129: 44, # 'Б'
- 130: 33, # 'Ð’'
- 131: 46, # 'Г'
- 132: 41, # 'Д'
- 133: 48, # 'Е'
- 134: 56, # 'Ж'
- 135: 51, # 'З'
- 136: 42, # 'И'
- 137: 60, # 'Й'
- 138: 36, # 'К'
- 139: 49, # 'Л'
- 140: 38, # 'М'
- 141: 31, # 'Ð'
- 142: 34, # 'О'
- 143: 35, # 'П'
- 144: 45, # 'Ð '
- 145: 32, # 'С'
- 146: 40, # 'Т'
- 147: 52, # 'У'
- 148: 53, # 'Ф'
- 149: 55, # 'Ð¥'
- 150: 58, # 'Ц'
- 151: 50, # 'Ч'
- 152: 57, # 'Ш'
- 153: 63, # 'Щ'
- 154: 70, # 'Ъ'
- 155: 62, # 'Ы'
- 156: 61, # 'Ь'
- 157: 47, # 'Ð'
- 158: 59, # 'Ю'
- 159: 43, # 'Я'
- 160: 3, # 'а'
- 161: 21, # 'б'
- 162: 10, # 'в'
- 163: 19, # 'г'
- 164: 13, # 'д'
- 165: 2, # 'е'
- 166: 24, # 'ж'
- 167: 20, # 'з'
- 168: 4, # 'и'
- 169: 23, # 'й'
- 170: 11, # 'к'
- 171: 8, # 'л'
- 172: 12, # 'м'
- 173: 5, # 'н'
- 174: 1, # 'о'
- 175: 15, # 'п'
- 176: 191, # 'â–‘'
- 177: 192, # 'â–’'
- 178: 193, # 'â–“'
- 179: 194, # '│'
- 180: 195, # '┤'
- 181: 196, # 'â•¡'
- 182: 197, # 'â•¢'
- 183: 198, # 'â•–'
- 184: 199, # 'â••'
- 185: 200, # 'â•£'
- 186: 201, # 'â•‘'
- 187: 202, # 'â•—'
- 188: 203, # 'â•'
- 189: 204, # '╜'
- 190: 205, # 'â•›'
- 191: 206, # 'â”'
- 192: 207, # 'â””'
- 193: 208, # 'â”´'
- 194: 209, # '┬'
- 195: 210, # '├'
- 196: 211, # '─'
- 197: 212, # '┼'
- 198: 213, # '╞'
- 199: 214, # '╟'
- 200: 215, # '╚'
- 201: 216, # 'â•”'
- 202: 217, # 'â•©'
- 203: 218, # '╦'
- 204: 219, # 'â• '
- 205: 220, # 'â•'
- 206: 221, # '╬'
- 207: 222, # 'â•§'
- 208: 223, # '╨'
- 209: 224, # '╤'
- 210: 225, # 'â•¥'
- 211: 226, # 'â•™'
- 212: 227, # '╘'
- 213: 228, # 'â•’'
- 214: 229, # 'â•“'
- 215: 230, # 'â•«'
- 216: 231, # '╪'
- 217: 232, # '┘'
- 218: 233, # '┌'
- 219: 234, # 'â–ˆ'
- 220: 235, # 'â–„'
- 221: 236, # '▌'
- 222: 237, # 'â–'
- 223: 238, # 'â–€'
- 224: 9, # 'Ñ€'
- 225: 7, # 'Ñ'
- 226: 6, # 'Ñ‚'
- 227: 14, # 'у'
- 228: 39, # 'Ñ„'
- 229: 26, # 'Ñ…'
- 230: 28, # 'ц'
- 231: 22, # 'ч'
- 232: 25, # 'ш'
- 233: 29, # 'щ'
- 234: 54, # 'ÑŠ'
- 235: 18, # 'Ñ‹'
- 236: 17, # 'ь'
- 237: 30, # 'Ñ'
- 238: 27, # 'ÑŽ'
- 239: 16, # 'Ñ'
- 240: 239, # 'Ð'
- 241: 68, # 'Ñ‘'
- 242: 240, # 'Є'
- 243: 241, # 'Ñ”'
- 244: 242, # 'Ї'
- 245: 243, # 'Ñ—'
- 246: 244, # 'ÐŽ'
- 247: 245, # 'Ñž'
- 248: 246, # '°'
- 249: 247, # '∙'
- 250: 248, # '·'
- 251: 249, # '√'
- 252: 250, # 'â„–'
- 253: 251, # '¤'
- 254: 252, # 'â– '
- 255: 255, # '\xa0'
-}
-
-IBM866_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='IBM866',
- language='Russian',
- char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # 'Ђ'
- 129: 192, # 'Ѓ'
- 130: 193, # '‚'
- 131: 194, # 'Ñ“'
- 132: 195, # '„'
- 133: 196, # '…'
- 134: 197, # '†'
- 135: 198, # '‡'
- 136: 199, # '€'
- 137: 200, # '‰'
- 138: 201, # 'Љ'
- 139: 202, # '‹'
- 140: 203, # 'Њ'
- 141: 204, # 'Ќ'
- 142: 205, # 'Ћ'
- 143: 206, # 'Ð'
- 144: 207, # 'Ñ’'
- 145: 208, # '‘'
- 146: 209, # '’'
- 147: 210, # '“'
- 148: 211, # 'â€'
- 149: 212, # '•'
- 150: 213, # '–'
- 151: 214, # '—'
- 152: 215, # None
- 153: 216, # 'â„¢'
- 154: 217, # 'Ñ™'
- 155: 218, # '›'
- 156: 219, # 'Ñš'
- 157: 220, # 'ќ'
- 158: 221, # 'Ñ›'
- 159: 222, # 'ÑŸ'
- 160: 223, # '\xa0'
- 161: 224, # 'ÐŽ'
- 162: 225, # 'Ñž'
- 163: 226, # 'Ј'
- 164: 227, # '¤'
- 165: 228, # 'Ò'
- 166: 229, # '¦'
- 167: 230, # '§'
- 168: 231, # 'Ð'
- 169: 232, # '©'
- 170: 233, # 'Є'
- 171: 234, # '«'
- 172: 235, # '¬'
- 173: 236, # '\xad'
- 174: 237, # '®'
- 175: 238, # 'Ї'
- 176: 239, # '°'
- 177: 240, # '±'
- 178: 241, # 'І'
- 179: 242, # 'Ñ–'
- 180: 243, # 'Ò‘'
- 181: 244, # 'µ'
- 182: 245, # '¶'
- 183: 246, # '·'
- 184: 68, # 'Ñ‘'
- 185: 247, # 'â„–'
- 186: 248, # 'Ñ”'
- 187: 249, # '»'
- 188: 250, # 'ј'
- 189: 251, # 'Ð…'
- 190: 252, # 'Ñ•'
- 191: 253, # 'Ñ—'
- 192: 37, # 'Ð'
- 193: 44, # 'Б'
- 194: 33, # 'Ð’'
- 195: 46, # 'Г'
- 196: 41, # 'Д'
- 197: 48, # 'Е'
- 198: 56, # 'Ж'
- 199: 51, # 'З'
- 200: 42, # 'И'
- 201: 60, # 'Й'
- 202: 36, # 'К'
- 203: 49, # 'Л'
- 204: 38, # 'М'
- 205: 31, # 'Ð'
- 206: 34, # 'О'
- 207: 35, # 'П'
- 208: 45, # 'Ð '
- 209: 32, # 'С'
- 210: 40, # 'Т'
- 211: 52, # 'У'
- 212: 53, # 'Ф'
- 213: 55, # 'Ð¥'
- 214: 58, # 'Ц'
- 215: 50, # 'Ч'
- 216: 57, # 'Ш'
- 217: 63, # 'Щ'
- 218: 70, # 'Ъ'
- 219: 62, # 'Ы'
- 220: 61, # 'Ь'
- 221: 47, # 'Ð'
- 222: 59, # 'Ю'
- 223: 43, # 'Я'
- 224: 3, # 'а'
- 225: 21, # 'б'
- 226: 10, # 'в'
- 227: 19, # 'г'
- 228: 13, # 'д'
- 229: 2, # 'е'
- 230: 24, # 'ж'
- 231: 20, # 'з'
- 232: 4, # 'и'
- 233: 23, # 'й'
- 234: 11, # 'к'
- 235: 8, # 'л'
- 236: 12, # 'м'
- 237: 5, # 'н'
- 238: 1, # 'о'
- 239: 15, # 'п'
- 240: 9, # 'Ñ€'
- 241: 7, # 'Ñ'
- 242: 6, # 'Ñ‚'
- 243: 14, # 'у'
- 244: 39, # 'Ñ„'
- 245: 26, # 'Ñ…'
- 246: 28, # 'ц'
- 247: 22, # 'ч'
- 248: 25, # 'ш'
- 249: 29, # 'щ'
- 250: 54, # 'ÑŠ'
- 251: 18, # 'Ñ‹'
- 252: 17, # 'ь'
- 253: 30, # 'Ñ'
- 254: 27, # 'ÑŽ'
- 255: 16, # 'Ñ'
-}
-
-WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1251',
- language='Russian',
- char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-IBM855_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # 'Ñ’'
- 129: 192, # 'Ђ'
- 130: 193, # 'Ñ“'
- 131: 194, # 'Ѓ'
- 132: 68, # 'Ñ‘'
- 133: 195, # 'Ð'
- 134: 196, # 'Ñ”'
- 135: 197, # 'Є'
- 136: 198, # 'Ñ•'
- 137: 199, # 'Ð…'
- 138: 200, # 'Ñ–'
- 139: 201, # 'І'
- 140: 202, # 'Ñ—'
- 141: 203, # 'Ї'
- 142: 204, # 'ј'
- 143: 205, # 'Ј'
- 144: 206, # 'Ñ™'
- 145: 207, # 'Љ'
- 146: 208, # 'Ñš'
- 147: 209, # 'Њ'
- 148: 210, # 'Ñ›'
- 149: 211, # 'Ћ'
- 150: 212, # 'ќ'
- 151: 213, # 'Ќ'
- 152: 214, # 'Ñž'
- 153: 215, # 'ÐŽ'
- 154: 216, # 'ÑŸ'
- 155: 217, # 'Ð'
- 156: 27, # 'ÑŽ'
- 157: 59, # 'Ю'
- 158: 54, # 'ÑŠ'
- 159: 70, # 'Ъ'
- 160: 3, # 'а'
- 161: 37, # 'Ð'
- 162: 21, # 'б'
- 163: 44, # 'Б'
- 164: 28, # 'ц'
- 165: 58, # 'Ц'
- 166: 13, # 'д'
- 167: 41, # 'Д'
- 168: 2, # 'е'
- 169: 48, # 'Е'
- 170: 39, # 'Ñ„'
- 171: 53, # 'Ф'
- 172: 19, # 'г'
- 173: 46, # 'Г'
- 174: 218, # '«'
- 175: 219, # '»'
- 176: 220, # 'â–‘'
- 177: 221, # 'â–’'
- 178: 222, # 'â–“'
- 179: 223, # '│'
- 180: 224, # '┤'
- 181: 26, # 'Ñ…'
- 182: 55, # 'Ð¥'
- 183: 4, # 'и'
- 184: 42, # 'И'
- 185: 225, # 'â•£'
- 186: 226, # 'â•‘'
- 187: 227, # 'â•—'
- 188: 228, # 'â•'
- 189: 23, # 'й'
- 190: 60, # 'Й'
- 191: 229, # 'â”'
- 192: 230, # 'â””'
- 193: 231, # 'â”´'
- 194: 232, # '┬'
- 195: 233, # '├'
- 196: 234, # '─'
- 197: 235, # '┼'
- 198: 11, # 'к'
- 199: 36, # 'К'
- 200: 236, # '╚'
- 201: 237, # 'â•”'
- 202: 238, # 'â•©'
- 203: 239, # '╦'
- 204: 240, # 'â• '
- 205: 241, # 'â•'
- 206: 242, # '╬'
- 207: 243, # '¤'
- 208: 8, # 'л'
- 209: 49, # 'Л'
- 210: 12, # 'м'
- 211: 38, # 'М'
- 212: 5, # 'н'
- 213: 31, # 'Ð'
- 214: 1, # 'о'
- 215: 34, # 'О'
- 216: 15, # 'п'
- 217: 244, # '┘'
- 218: 245, # '┌'
- 219: 246, # 'â–ˆ'
- 220: 247, # 'â–„'
- 221: 35, # 'П'
- 222: 16, # 'Ñ'
- 223: 248, # 'â–€'
- 224: 43, # 'Я'
- 225: 9, # 'Ñ€'
- 226: 45, # 'Ð '
- 227: 7, # 'Ñ'
- 228: 32, # 'С'
- 229: 6, # 'Ñ‚'
- 230: 40, # 'Т'
- 231: 14, # 'у'
- 232: 52, # 'У'
- 233: 24, # 'ж'
- 234: 56, # 'Ж'
- 235: 10, # 'в'
- 236: 33, # 'Ð’'
- 237: 17, # 'ь'
- 238: 61, # 'Ь'
- 239: 249, # 'â„–'
- 240: 250, # '\xad'
- 241: 18, # 'Ñ‹'
- 242: 62, # 'Ы'
- 243: 20, # 'з'
- 244: 51, # 'З'
- 245: 25, # 'ш'
- 246: 57, # 'Ш'
- 247: 30, # 'Ñ'
- 248: 47, # 'Ð'
- 249: 29, # 'щ'
- 250: 63, # 'Щ'
- 251: 22, # 'ч'
- 252: 50, # 'Ч'
- 253: 251, # '§'
- 254: 252, # 'â– '
- 255: 255, # '\xa0'
-}
-
-IBM855_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='IBM855',
- language='Russian',
- char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-KOI8_R_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # '─'
- 129: 192, # '│'
- 130: 193, # '┌'
- 131: 194, # 'â”'
- 132: 195, # 'â””'
- 133: 196, # '┘'
- 134: 197, # '├'
- 135: 198, # '┤'
- 136: 199, # '┬'
- 137: 200, # 'â”´'
- 138: 201, # '┼'
- 139: 202, # 'â–€'
- 140: 203, # 'â–„'
- 141: 204, # 'â–ˆ'
- 142: 205, # '▌'
- 143: 206, # 'â–'
- 144: 207, # 'â–‘'
- 145: 208, # 'â–’'
- 146: 209, # 'â–“'
- 147: 210, # '⌠'
- 148: 211, # 'â– '
- 149: 212, # '∙'
- 150: 213, # '√'
- 151: 214, # '≈'
- 152: 215, # '≤'
- 153: 216, # '≥'
- 154: 217, # '\xa0'
- 155: 218, # '⌡'
- 156: 219, # '°'
- 157: 220, # '²'
- 158: 221, # '·'
- 159: 222, # '÷'
- 160: 223, # 'â•'
- 161: 224, # 'â•‘'
- 162: 225, # 'â•’'
- 163: 68, # 'Ñ‘'
- 164: 226, # 'â•“'
- 165: 227, # 'â•”'
- 166: 228, # 'â••'
- 167: 229, # 'â•–'
- 168: 230, # 'â•—'
- 169: 231, # '╘'
- 170: 232, # 'â•™'
- 171: 233, # '╚'
- 172: 234, # 'â•›'
- 173: 235, # '╜'
- 174: 236, # 'â•'
- 175: 237, # '╞'
- 176: 238, # '╟'
- 177: 239, # 'â• '
- 178: 240, # 'â•¡'
- 179: 241, # 'Ð'
- 180: 242, # 'â•¢'
- 181: 243, # 'â•£'
- 182: 244, # '╤'
- 183: 245, # 'â•¥'
- 184: 246, # '╦'
- 185: 247, # 'â•§'
- 186: 248, # '╨'
- 187: 249, # 'â•©'
- 188: 250, # '╪'
- 189: 251, # 'â•«'
- 190: 252, # '╬'
- 191: 253, # '©'
- 192: 27, # 'ÑŽ'
- 193: 3, # 'а'
- 194: 21, # 'б'
- 195: 28, # 'ц'
- 196: 13, # 'д'
- 197: 2, # 'е'
- 198: 39, # 'Ñ„'
- 199: 19, # 'г'
- 200: 26, # 'Ñ…'
- 201: 4, # 'и'
- 202: 23, # 'й'
- 203: 11, # 'к'
- 204: 8, # 'л'
- 205: 12, # 'м'
- 206: 5, # 'н'
- 207: 1, # 'о'
- 208: 15, # 'п'
- 209: 16, # 'Ñ'
- 210: 9, # 'Ñ€'
- 211: 7, # 'Ñ'
- 212: 6, # 'Ñ‚'
- 213: 14, # 'у'
- 214: 24, # 'ж'
- 215: 10, # 'в'
- 216: 17, # 'ь'
- 217: 18, # 'Ñ‹'
- 218: 20, # 'з'
- 219: 25, # 'ш'
- 220: 30, # 'Ñ'
- 221: 29, # 'щ'
- 222: 22, # 'ч'
- 223: 54, # 'ÑŠ'
- 224: 59, # 'Ю'
- 225: 37, # 'Ð'
- 226: 44, # 'Б'
- 227: 58, # 'Ц'
- 228: 41, # 'Д'
- 229: 48, # 'Е'
- 230: 53, # 'Ф'
- 231: 46, # 'Г'
- 232: 55, # 'Ð¥'
- 233: 42, # 'И'
- 234: 60, # 'Й'
- 235: 36, # 'К'
- 236: 49, # 'Л'
- 237: 38, # 'М'
- 238: 31, # 'Ð'
- 239: 34, # 'О'
- 240: 35, # 'П'
- 241: 43, # 'Я'
- 242: 45, # 'Ð '
- 243: 32, # 'С'
- 244: 40, # 'Т'
- 245: 52, # 'У'
- 246: 56, # 'Ж'
- 247: 33, # 'Ð’'
- 248: 61, # 'Ь'
- 249: 62, # 'Ы'
- 250: 51, # 'З'
- 251: 57, # 'Ш'
- 252: 47, # 'Ð'
- 253: 63, # 'Щ'
- 254: 50, # 'Ч'
- 255: 70, # 'Ъ'
-}
-
-KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='KOI8-R',
- language='Russian',
- char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 37, # 'Ð'
- 129: 44, # 'Б'
- 130: 33, # 'Ð’'
- 131: 46, # 'Г'
- 132: 41, # 'Д'
- 133: 48, # 'Е'
- 134: 56, # 'Ж'
- 135: 51, # 'З'
- 136: 42, # 'И'
- 137: 60, # 'Й'
- 138: 36, # 'К'
- 139: 49, # 'Л'
- 140: 38, # 'М'
- 141: 31, # 'Ð'
- 142: 34, # 'О'
- 143: 35, # 'П'
- 144: 45, # 'Ð '
- 145: 32, # 'С'
- 146: 40, # 'Т'
- 147: 52, # 'У'
- 148: 53, # 'Ф'
- 149: 55, # 'Ð¥'
- 150: 58, # 'Ц'
- 151: 50, # 'Ч'
- 152: 57, # 'Ш'
- 153: 63, # 'Щ'
- 154: 70, # 'Ъ'
- 155: 62, # 'Ы'
- 156: 61, # 'Ь'
- 157: 47, # 'Ð'
- 158: 59, # 'Ю'
- 159: 43, # 'Я'
- 160: 191, # '†'
- 161: 192, # '°'
- 162: 193, # 'Ò'
- 163: 194, # '£'
- 164: 195, # '§'
- 165: 196, # '•'
- 166: 197, # '¶'
- 167: 198, # 'І'
- 168: 199, # '®'
- 169: 200, # '©'
- 170: 201, # 'â„¢'
- 171: 202, # 'Ђ'
- 172: 203, # 'Ñ’'
- 173: 204, # '≠'
- 174: 205, # 'Ѓ'
- 175: 206, # 'Ñ“'
- 176: 207, # '∞'
- 177: 208, # '±'
- 178: 209, # '≤'
- 179: 210, # '≥'
- 180: 211, # 'Ñ–'
- 181: 212, # 'µ'
- 182: 213, # 'Ò‘'
- 183: 214, # 'Ј'
- 184: 215, # 'Є'
- 185: 216, # 'Ñ”'
- 186: 217, # 'Ї'
- 187: 218, # 'Ñ—'
- 188: 219, # 'Љ'
- 189: 220, # 'Ñ™'
- 190: 221, # 'Њ'
- 191: 222, # 'Ñš'
- 192: 223, # 'ј'
- 193: 224, # 'Ð…'
- 194: 225, # '¬'
- 195: 226, # '√'
- 196: 227, # 'Æ’'
- 197: 228, # '≈'
- 198: 229, # '∆'
- 199: 230, # '«'
- 200: 231, # '»'
- 201: 232, # '…'
- 202: 233, # '\xa0'
- 203: 234, # 'Ћ'
- 204: 235, # 'Ñ›'
- 205: 236, # 'Ќ'
- 206: 237, # 'ќ'
- 207: 238, # 'Ñ•'
- 208: 239, # '–'
- 209: 240, # '—'
- 210: 241, # '“'
- 211: 242, # 'â€'
- 212: 243, # '‘'
- 213: 244, # '’'
- 214: 245, # '÷'
- 215: 246, # '„'
- 216: 247, # 'ÐŽ'
- 217: 248, # 'Ñž'
- 218: 249, # 'Ð'
- 219: 250, # 'ÑŸ'
- 220: 251, # 'â„–'
- 221: 252, # 'Ð'
- 222: 68, # 'Ñ‘'
- 223: 16, # 'Ñ'
- 224: 3, # 'а'
- 225: 21, # 'б'
- 226: 10, # 'в'
- 227: 19, # 'г'
- 228: 13, # 'д'
- 229: 2, # 'е'
- 230: 24, # 'ж'
- 231: 20, # 'з'
- 232: 4, # 'и'
- 233: 23, # 'й'
- 234: 11, # 'к'
- 235: 8, # 'л'
- 236: 12, # 'м'
- 237: 5, # 'н'
- 238: 1, # 'о'
- 239: 15, # 'п'
- 240: 9, # 'Ñ€'
- 241: 7, # 'Ñ'
- 242: 6, # 'Ñ‚'
- 243: 14, # 'у'
- 244: 39, # 'Ñ„'
- 245: 26, # 'Ñ…'
- 246: 28, # 'ц'
- 247: 22, # 'ч'
- 248: 25, # 'ш'
- 249: 29, # 'щ'
- 250: 54, # 'ÑŠ'
- 251: 18, # 'Ñ‹'
- 252: 17, # 'ь'
- 253: 30, # 'Ñ'
- 254: 27, # 'ÑŽ'
- 255: 255, # '€'
-}
-
-MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='MacCyrillic',
- language='Russian',
- char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
-ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # '\x80'
- 129: 192, # '\x81'
- 130: 193, # '\x82'
- 131: 194, # '\x83'
- 132: 195, # '\x84'
- 133: 196, # '\x85'
- 134: 197, # '\x86'
- 135: 198, # '\x87'
- 136: 199, # '\x88'
- 137: 200, # '\x89'
- 138: 201, # '\x8a'
- 139: 202, # '\x8b'
- 140: 203, # '\x8c'
- 141: 204, # '\x8d'
- 142: 205, # '\x8e'
- 143: 206, # '\x8f'
- 144: 207, # '\x90'
- 145: 208, # '\x91'
- 146: 209, # '\x92'
- 147: 210, # '\x93'
- 148: 211, # '\x94'
- 149: 212, # '\x95'
- 150: 213, # '\x96'
- 151: 214, # '\x97'
- 152: 215, # '\x98'
- 153: 216, # '\x99'
- 154: 217, # '\x9a'
- 155: 218, # '\x9b'
- 156: 219, # '\x9c'
- 157: 220, # '\x9d'
- 158: 221, # '\x9e'
- 159: 222, # '\x9f'
- 160: 223, # '\xa0'
- 161: 224, # 'Ð'
- 162: 225, # 'Ђ'
- 163: 226, # 'Ѓ'
- 164: 227, # 'Є'
- 165: 228, # 'Ð…'
- 166: 229, # 'І'
- 167: 230, # 'Ї'
- 168: 231, # 'Ј'
- 169: 232, # 'Љ'
- 170: 233, # 'Њ'
- 171: 234, # 'Ћ'
- 172: 235, # 'Ќ'
- 173: 236, # '\xad'
- 174: 237, # 'ÐŽ'
- 175: 238, # 'Ð'
- 176: 37, # 'Ð'
- 177: 44, # 'Б'
- 178: 33, # 'Ð’'
- 179: 46, # 'Г'
- 180: 41, # 'Д'
- 181: 48, # 'Е'
- 182: 56, # 'Ж'
- 183: 51, # 'З'
- 184: 42, # 'И'
- 185: 60, # 'Й'
- 186: 36, # 'К'
- 187: 49, # 'Л'
- 188: 38, # 'М'
- 189: 31, # 'Ð'
- 190: 34, # 'О'
- 191: 35, # 'П'
- 192: 45, # 'Ð '
- 193: 32, # 'С'
- 194: 40, # 'Т'
- 195: 52, # 'У'
- 196: 53, # 'Ф'
- 197: 55, # 'Ð¥'
- 198: 58, # 'Ц'
- 199: 50, # 'Ч'
- 200: 57, # 'Ш'
- 201: 63, # 'Щ'
- 202: 70, # 'Ъ'
- 203: 62, # 'Ы'
- 204: 61, # 'Ь'
- 205: 47, # 'Ð'
- 206: 59, # 'Ю'
- 207: 43, # 'Я'
- 208: 3, # 'а'
- 209: 21, # 'б'
- 210: 10, # 'в'
- 211: 19, # 'г'
- 212: 13, # 'д'
- 213: 2, # 'е'
- 214: 24, # 'ж'
- 215: 20, # 'з'
- 216: 4, # 'и'
- 217: 23, # 'й'
- 218: 11, # 'к'
- 219: 8, # 'л'
- 220: 12, # 'м'
- 221: 5, # 'н'
- 222: 1, # 'о'
- 223: 15, # 'п'
- 224: 9, # 'Ñ€'
- 225: 7, # 'Ñ'
- 226: 6, # 'Ñ‚'
- 227: 14, # 'у'
- 228: 39, # 'Ñ„'
- 229: 26, # 'Ñ…'
- 230: 28, # 'ц'
- 231: 22, # 'ч'
- 232: 25, # 'ш'
- 233: 29, # 'щ'
- 234: 54, # 'ÑŠ'
- 235: 18, # 'Ñ‹'
- 236: 17, # 'ь'
- 237: 30, # 'Ñ'
- 238: 27, # 'ÑŽ'
- 239: 16, # 'Ñ'
- 240: 239, # 'â„–'
- 241: 68, # 'Ñ‘'
- 242: 240, # 'Ñ’'
- 243: 241, # 'Ñ“'
- 244: 242, # 'Ñ”'
- 245: 243, # 'Ñ•'
- 246: 244, # 'Ñ–'
- 247: 245, # 'Ñ—'
- 248: 246, # 'ј'
- 249: 247, # 'Ñ™'
- 250: 248, # 'Ñš'
- 251: 249, # 'Ñ›'
- 252: 250, # 'ќ'
- 253: 251, # '§'
- 254: 252, # 'Ñž'
- 255: 255, # 'ÑŸ'
-}
-
-ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-5',
- language='Russian',
- char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘')
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py
deleted file mode 100644
index 9a37db5..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-THAI_LANG_MODEL = {
- 5: { # 'à¸'
- 5: 2, # 'à¸'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 3, # 'ฎ'
- 57: 2, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 2, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 2, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 3, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 1, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 30: { # 'ข'
- 5: 1, # 'à¸'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 0, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 2, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 2, # 'ี'
- 40: 3, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 24: { # 'ค'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 2, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'à¹'
- 41: 3, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 8: { # 'ง'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 1, # 'ฉ'
- 34: 2, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'à¸'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 2, # 'ศ'
- 46: 1, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 3, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 26: { # 'จ'
- 5: 2, # 'à¸'
- 30: 1, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 3, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 52: { # 'ฉ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 3, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 1, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 34: { # 'ช'
- 5: 1, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 1, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 51: { # 'ซ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 3, # 'ึ'
- 27: 2, # 'ื'
- 32: 1, # 'ุ'
- 35: 1, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 1, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 47: { # 'à¸'
- 5: 1, # 'à¸'
- 30: 1, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 3, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 2, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 58: { # 'ฎ'
- 5: 2, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 1, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 57: { # 'à¸'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 49: { # 'à¸'
- 5: 1, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 53: { # 'ฑ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 55: { # 'ฒ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 43: { # 'ณ'
- 5: 1, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 3, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 3, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 20: { # 'ด'
- 5: 2, # 'à¸'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 2, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 1, # 'ึ'
- 27: 2, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 2, # '็'
- 6: 1, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 19: { # 'ต'
- 5: 2, # 'à¸'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 2, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 1, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'à¹'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 2, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 44: { # 'ถ'
- 5: 1, # 'à¸'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 3, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 14: { # 'ท'
- 5: 1, # 'à¸'
- 30: 1, # 'ข'
- 24: 3, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 3, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 1, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 3, # 'ศ'
- 46: 1, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 48: { # 'ธ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 2, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 2, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 3: { # 'น'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 1, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 2, # 'ถ'
- 14: 3, # 'ท'
- 48: 3, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'à¸'
- 31: 2, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 1, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 3, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'à¹'
- 41: 3, # 'โ'
- 29: 3, # 'ใ'
- 33: 3, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 17: { # 'บ'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 1, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 2, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 2, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 2, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 25: { # 'ป'
- 5: 2, # 'à¸'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 1, # 'ฎ'
- 57: 3, # 'à¸'
- 49: 1, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 1, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 2, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 1, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 39: { # 'ผ'
- 5: 1, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 1, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 0, # 'ุ'
- 35: 3, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 1, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 62: { # 'à¸'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 1, # 'ี'
- 40: 2, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 1, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 31: { # 'พ'
- 5: 1, # 'à¸'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 2, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 1, # 'ึ'
- 27: 3, # 'ื'
- 32: 1, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 0, # '่'
- 7: 1, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 54: { # 'ฟ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 45: { # 'ภ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 2, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 9: { # 'ม'
- 5: 2, # 'à¸'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 3, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 2, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 1, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'à¹'
- 41: 2, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 16: { # 'ย'
- 5: 3, # 'à¸'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 2, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 1, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 1, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 2: { # 'ร'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 2, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 3, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 3, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 3, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'à¸'
- 31: 2, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 2, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 3, # 'เ'
- 28: 3, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 61: { # 'ฤ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 2, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 15: { # 'ล'
- 5: 2, # 'à¸'
- 30: 3, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 3, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'à¸'
- 63: 2, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 1, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 2, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 12: { # 'ว'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 2, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 42: { # 'ศ'
- 5: 1, # 'à¸'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 2, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 3, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 2, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'à¹'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 46: { # 'ษ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 2, # 'ฎ'
- 57: 1, # 'à¸'
- 49: 2, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 18: { # 'ส'
- 5: 2, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 3, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 3, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 0, # 'à¹'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 1, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 21: { # 'ห'
- 5: 3, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 4: { # 'à¸'
- 5: 3, # 'à¸'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 1, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 63: { # 'ฯ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 22: { # 'ะ'
- 5: 3, # 'à¸'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 10: { # 'ั'
- 5: 3, # 'à¸'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 3, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 2, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 3, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 1: { # 'า'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 1, # 'ซ'
- 47: 2, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 2, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'à¸'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 3, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 36: { # 'ำ'
- 5: 2, # 'à¸'
- 30: 1, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 1, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 23: { # 'ิ'
- 5: 3, # 'à¸'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 3, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'à¸'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 3, # 'ศ'
- 46: 2, # 'ษ'
- 18: 2, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 1, # 'à¹'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 13: { # 'ี'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'à¸'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 40: { # 'ึ'
- 5: 3, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 3, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 27: { # 'ื'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 32: { # 'ุ'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 3, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 1, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 1, # 'ศ'
- 46: 2, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'à¹'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 35: { # 'ู'
- 5: 3, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'à¹'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 11: { # 'เ'
- 5: 3, # 'à¸'
- 30: 3, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 3, # 'ฉ'
- 34: 3, # 'ช'
- 51: 2, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 3, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'à¸'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 3, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 28: { # 'à¹'
- 5: 3, # 'à¸'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 3, # 'ต'
- 44: 2, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 3, # 'ผ'
- 62: 0, # 'à¸'
- 31: 2, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 41: { # 'โ'
- 5: 2, # 'à¸'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 1, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 29: { # 'ใ'
- 5: 2, # 'à¸'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 33: { # 'ไ'
- 5: 1, # 'à¸'
- 30: 2, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 1, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 2, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 50: { # 'ๆ'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 37: { # '็'
- 5: 2, # 'à¸'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 6: { # '่'
- 5: 2, # 'à¸'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 1, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'à¸'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 7: { # '้'
- 5: 2, # 'à¸'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 38: { # '์'
- 5: 2, # 'à¸'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 1, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'à¸'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'à¹'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 56: { # '๑'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 2, # '๑'
- 59: 1, # '๒'
- 60: 1, # '๕'
- },
- 59: { # '๒'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 1, # '๑'
- 59: 1, # '๒'
- 60: 3, # '๕'
- },
- 60: { # '๕'
- 5: 0, # 'à¸'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'à¸'
- 58: 0, # 'ฎ'
- 57: 0, # 'à¸'
- 49: 0, # 'à¸'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'à¸'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'à¸'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'à¹'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 2, # '๑'
- 59: 1, # '๒'
- 60: 0, # '๕'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-TIS_620_THAI_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 182, # 'A'
- 66: 106, # 'B'
- 67: 107, # 'C'
- 68: 100, # 'D'
- 69: 183, # 'E'
- 70: 184, # 'F'
- 71: 185, # 'G'
- 72: 101, # 'H'
- 73: 94, # 'I'
- 74: 186, # 'J'
- 75: 187, # 'K'
- 76: 108, # 'L'
- 77: 109, # 'M'
- 78: 110, # 'N'
- 79: 111, # 'O'
- 80: 188, # 'P'
- 81: 189, # 'Q'
- 82: 190, # 'R'
- 83: 89, # 'S'
- 84: 95, # 'T'
- 85: 112, # 'U'
- 86: 113, # 'V'
- 87: 191, # 'W'
- 88: 192, # 'X'
- 89: 193, # 'Y'
- 90: 194, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 64, # 'a'
- 98: 72, # 'b'
- 99: 73, # 'c'
- 100: 114, # 'd'
- 101: 74, # 'e'
- 102: 115, # 'f'
- 103: 116, # 'g'
- 104: 102, # 'h'
- 105: 81, # 'i'
- 106: 201, # 'j'
- 107: 117, # 'k'
- 108: 90, # 'l'
- 109: 103, # 'm'
- 110: 78, # 'n'
- 111: 82, # 'o'
- 112: 96, # 'p'
- 113: 202, # 'q'
- 114: 91, # 'r'
- 115: 79, # 's'
- 116: 84, # 't'
- 117: 104, # 'u'
- 118: 105, # 'v'
- 119: 97, # 'w'
- 120: 98, # 'x'
- 121: 92, # 'y'
- 122: 203, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 209, # '\x80'
- 129: 210, # '\x81'
- 130: 211, # '\x82'
- 131: 212, # '\x83'
- 132: 213, # '\x84'
- 133: 88, # '\x85'
- 134: 214, # '\x86'
- 135: 215, # '\x87'
- 136: 216, # '\x88'
- 137: 217, # '\x89'
- 138: 218, # '\x8a'
- 139: 219, # '\x8b'
- 140: 220, # '\x8c'
- 141: 118, # '\x8d'
- 142: 221, # '\x8e'
- 143: 222, # '\x8f'
- 144: 223, # '\x90'
- 145: 224, # '\x91'
- 146: 99, # '\x92'
- 147: 85, # '\x93'
- 148: 83, # '\x94'
- 149: 225, # '\x95'
- 150: 226, # '\x96'
- 151: 227, # '\x97'
- 152: 228, # '\x98'
- 153: 229, # '\x99'
- 154: 230, # '\x9a'
- 155: 231, # '\x9b'
- 156: 232, # '\x9c'
- 157: 233, # '\x9d'
- 158: 234, # '\x9e'
- 159: 235, # '\x9f'
- 160: 236, # None
- 161: 5, # 'à¸'
- 162: 30, # 'ข'
- 163: 237, # 'ฃ'
- 164: 24, # 'ค'
- 165: 238, # 'ฅ'
- 166: 75, # 'ฆ'
- 167: 8, # 'ง'
- 168: 26, # 'จ'
- 169: 52, # 'ฉ'
- 170: 34, # 'ช'
- 171: 51, # 'ซ'
- 172: 119, # 'ฌ'
- 173: 47, # 'à¸'
- 174: 58, # 'ฎ'
- 175: 57, # 'à¸'
- 176: 49, # 'à¸'
- 177: 53, # 'ฑ'
- 178: 55, # 'ฒ'
- 179: 43, # 'ณ'
- 180: 20, # 'ด'
- 181: 19, # 'ต'
- 182: 44, # 'ถ'
- 183: 14, # 'ท'
- 184: 48, # 'ธ'
- 185: 3, # 'น'
- 186: 17, # 'บ'
- 187: 25, # 'ป'
- 188: 39, # 'ผ'
- 189: 62, # 'à¸'
- 190: 31, # 'พ'
- 191: 54, # 'ฟ'
- 192: 45, # 'ภ'
- 193: 9, # 'ม'
- 194: 16, # 'ย'
- 195: 2, # 'ร'
- 196: 61, # 'ฤ'
- 197: 15, # 'ล'
- 198: 239, # 'ฦ'
- 199: 12, # 'ว'
- 200: 42, # 'ศ'
- 201: 46, # 'ษ'
- 202: 18, # 'ส'
- 203: 21, # 'ห'
- 204: 76, # 'ฬ'
- 205: 4, # 'à¸'
- 206: 66, # 'ฮ'
- 207: 63, # 'ฯ'
- 208: 22, # 'ะ'
- 209: 10, # 'ั'
- 210: 1, # 'า'
- 211: 36, # 'ำ'
- 212: 23, # 'ิ'
- 213: 13, # 'ี'
- 214: 40, # 'ึ'
- 215: 27, # 'ื'
- 216: 32, # 'ุ'
- 217: 35, # 'ู'
- 218: 86, # 'ฺ'
- 219: 240, # None
- 220: 241, # None
- 221: 242, # None
- 222: 243, # None
- 223: 244, # '฿'
- 224: 11, # 'เ'
- 225: 28, # 'à¹'
- 226: 41, # 'โ'
- 227: 29, # 'ใ'
- 228: 33, # 'ไ'
- 229: 245, # 'ๅ'
- 230: 50, # 'ๆ'
- 231: 37, # '็'
- 232: 6, # '่'
- 233: 7, # '้'
- 234: 67, # '๊'
- 235: 77, # '๋'
- 236: 38, # '์'
- 237: 93, # 'à¹'
- 238: 246, # '๎'
- 239: 247, # 'à¹'
- 240: 68, # 'à¹'
- 241: 56, # '๑'
- 242: 59, # '๒'
- 243: 65, # '๓'
- 244: 69, # '๔'
- 245: 60, # '๕'
- 246: 70, # '๖'
- 247: 80, # '๗'
- 248: 71, # '๘'
- 249: 87, # '๙'
- 250: 248, # '๚'
- 251: 249, # '๛'
- 252: 250, # None
- 253: 251, # None
- 254: 252, # None
- 255: 253, # None
-}
-
-TIS_620_THAI_MODEL = SingleByteCharSetModel(charset_name='TIS-620',
- language='Thai',
- char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER,
- language_model=THAI_LANG_MODEL,
- typical_positive_ratio=0.926386,
- keep_ascii_letters=False,
- alphabet='à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ มยรฤลฦวศษสหฬà¸à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºà¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛')
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py
deleted file mode 100644
index 43f4230..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-TURKISH_LANG_MODEL = {
- 23: { # 'A'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 37: { # 'B'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 1, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 47: { # 'C'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 39: { # 'D'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 29: { # 'E'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 52: { # 'F'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 1, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 2, # 'ÅŸ'
- },
- 36: { # 'G'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 2, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 1, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 2, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 45: { # 'H'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 2, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 2, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 53: { # 'I'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 1, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 60: { # 'J'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 16: { # 'K'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 1, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 49: { # 'L'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 2, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 20: { # 'M'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 0, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 46: { # 'N'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 42: { # 'O'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 2, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 48: { # 'P'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 44: { # 'R'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 35: { # 'S'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 1, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 2, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 31: { # 'T'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 2, # 't'
- 14: 2, # 'u'
- 32: 1, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 51: { # 'U'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 38: { # 'V'
- 23: 1, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 1, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 62: { # 'W'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 43: { # 'Y'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 0, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 1, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 56: { # 'Z'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 1: { # 'a'
- 23: 3, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 1, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 21: { # 'b'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 3, # 'g'
- 25: 1, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 2, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 28: { # 'c'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 2, # 'T'
- 51: 2, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 3, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 1, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 1, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 2, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 2, # 'ÅŸ'
- },
- 12: { # 'd'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 2: { # 'e'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 18: { # 'f'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 1, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 1, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 27: { # 'g'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 25: { # 'h'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 3: { # 'i'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 1, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 3, # 'g'
- 25: 1, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 24: { # 'j'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 10: { # 'k'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 2, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 5: { # 'l'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 1, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 2, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 13: { # 'm'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 2, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 4: { # 'n'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 15: { # 'o'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 2, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ÄŸ'
- 41: 2, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Åž'
- 19: 2, # 'ÅŸ'
- },
- 26: { # 'p'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 7: { # 'r'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 1, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 8: { # 's'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 9: { # 't'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 14: { # 'u'
- 23: 3, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 2, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 2, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 32: { # 'v'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 57: { # 'w'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 1, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 58: { # 'x'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 11: { # 'y'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 22: { # 'z'
- 23: 2, # 'A'
- 37: 2, # 'B'
- 47: 1, # 'C'
- 39: 2, # 'D'
- 29: 3, # 'E'
- 52: 1, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 2, # 'N'
- 42: 2, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 3, # 'T'
- 51: 2, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 1, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 2, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 2, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 1, # 'Åž'
- 19: 2, # 'ÅŸ'
- },
- 63: { # '·'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 54: { # 'Ç'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 3, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 50: { # 'Ö'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 2, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 1, # 'N'
- 42: 2, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 1, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 1, # 's'
- 9: 2, # 't'
- 14: 0, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 55: { # 'Ü'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 59: { # 'â'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 33: { # 'ç'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 0, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 61: { # 'î'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 1, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 34: { # 'ö'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 1, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 3, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 1, # 'ı'
- 40: 2, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 17: { # 'ü'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 30: { # 'ÄŸ'
- 23: 0, # 'A'
- 37: 2, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 2, # 'N'
- 42: 2, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 3, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 2, # 'İ'
- 6: 2, # 'ı'
- 40: 2, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 41: { # 'İ'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 2, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
- 6: { # 'ı'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Åž'
- 19: 0, # 'ÅŸ'
- },
- 40: { # 'Åž'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 2, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 0, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 3, # 'f'
- 27: 0, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 1, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 1, # 'ü'
- 30: 2, # 'ÄŸ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Åž'
- 19: 2, # 'ÅŸ'
- },
- 19: { # 'ÅŸ'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 2, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 1, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ÄŸ'
- 41: 1, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Åž'
- 19: 1, # 'ÅŸ'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-ISO_8859_9_TURKISH_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 255, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 255, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 255, # ' '
- 33: 255, # '!'
- 34: 255, # '"'
- 35: 255, # '#'
- 36: 255, # '$'
- 37: 255, # '%'
- 38: 255, # '&'
- 39: 255, # "'"
- 40: 255, # '('
- 41: 255, # ')'
- 42: 255, # '*'
- 43: 255, # '+'
- 44: 255, # ','
- 45: 255, # '-'
- 46: 255, # '.'
- 47: 255, # '/'
- 48: 255, # '0'
- 49: 255, # '1'
- 50: 255, # '2'
- 51: 255, # '3'
- 52: 255, # '4'
- 53: 255, # '5'
- 54: 255, # '6'
- 55: 255, # '7'
- 56: 255, # '8'
- 57: 255, # '9'
- 58: 255, # ':'
- 59: 255, # ';'
- 60: 255, # '<'
- 61: 255, # '='
- 62: 255, # '>'
- 63: 255, # '?'
- 64: 255, # '@'
- 65: 23, # 'A'
- 66: 37, # 'B'
- 67: 47, # 'C'
- 68: 39, # 'D'
- 69: 29, # 'E'
- 70: 52, # 'F'
- 71: 36, # 'G'
- 72: 45, # 'H'
- 73: 53, # 'I'
- 74: 60, # 'J'
- 75: 16, # 'K'
- 76: 49, # 'L'
- 77: 20, # 'M'
- 78: 46, # 'N'
- 79: 42, # 'O'
- 80: 48, # 'P'
- 81: 69, # 'Q'
- 82: 44, # 'R'
- 83: 35, # 'S'
- 84: 31, # 'T'
- 85: 51, # 'U'
- 86: 38, # 'V'
- 87: 62, # 'W'
- 88: 65, # 'X'
- 89: 43, # 'Y'
- 90: 56, # 'Z'
- 91: 255, # '['
- 92: 255, # '\\'
- 93: 255, # ']'
- 94: 255, # '^'
- 95: 255, # '_'
- 96: 255, # '`'
- 97: 1, # 'a'
- 98: 21, # 'b'
- 99: 28, # 'c'
- 100: 12, # 'd'
- 101: 2, # 'e'
- 102: 18, # 'f'
- 103: 27, # 'g'
- 104: 25, # 'h'
- 105: 3, # 'i'
- 106: 24, # 'j'
- 107: 10, # 'k'
- 108: 5, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 15, # 'o'
- 112: 26, # 'p'
- 113: 64, # 'q'
- 114: 7, # 'r'
- 115: 8, # 's'
- 116: 9, # 't'
- 117: 14, # 'u'
- 118: 32, # 'v'
- 119: 57, # 'w'
- 120: 58, # 'x'
- 121: 11, # 'y'
- 122: 22, # 'z'
- 123: 255, # '{'
- 124: 255, # '|'
- 125: 255, # '}'
- 126: 255, # '~'
- 127: 255, # '\x7f'
- 128: 180, # '\x80'
- 129: 179, # '\x81'
- 130: 178, # '\x82'
- 131: 177, # '\x83'
- 132: 176, # '\x84'
- 133: 175, # '\x85'
- 134: 174, # '\x86'
- 135: 173, # '\x87'
- 136: 172, # '\x88'
- 137: 171, # '\x89'
- 138: 170, # '\x8a'
- 139: 169, # '\x8b'
- 140: 168, # '\x8c'
- 141: 167, # '\x8d'
- 142: 166, # '\x8e'
- 143: 165, # '\x8f'
- 144: 164, # '\x90'
- 145: 163, # '\x91'
- 146: 162, # '\x92'
- 147: 161, # '\x93'
- 148: 160, # '\x94'
- 149: 159, # '\x95'
- 150: 101, # '\x96'
- 151: 158, # '\x97'
- 152: 157, # '\x98'
- 153: 156, # '\x99'
- 154: 155, # '\x9a'
- 155: 154, # '\x9b'
- 156: 153, # '\x9c'
- 157: 152, # '\x9d'
- 158: 151, # '\x9e'
- 159: 106, # '\x9f'
- 160: 150, # '\xa0'
- 161: 149, # '¡'
- 162: 148, # '¢'
- 163: 147, # '£'
- 164: 146, # '¤'
- 165: 145, # 'Â¥'
- 166: 144, # '¦'
- 167: 100, # '§'
- 168: 143, # '¨'
- 169: 142, # '©'
- 170: 141, # 'ª'
- 171: 140, # '«'
- 172: 139, # '¬'
- 173: 138, # '\xad'
- 174: 137, # '®'
- 175: 136, # '¯'
- 176: 94, # '°'
- 177: 80, # '±'
- 178: 93, # '²'
- 179: 135, # '³'
- 180: 105, # '´'
- 181: 134, # 'µ'
- 182: 133, # '¶'
- 183: 63, # '·'
- 184: 132, # '¸'
- 185: 131, # '¹'
- 186: 130, # 'º'
- 187: 129, # '»'
- 188: 128, # '¼'
- 189: 127, # '½'
- 190: 126, # '¾'
- 191: 125, # '¿'
- 192: 124, # 'À'
- 193: 104, # 'Ã'
- 194: 73, # 'Â'
- 195: 99, # 'Ã'
- 196: 79, # 'Ä'
- 197: 85, # 'Ã…'
- 198: 123, # 'Æ'
- 199: 54, # 'Ç'
- 200: 122, # 'È'
- 201: 98, # 'É'
- 202: 92, # 'Ê'
- 203: 121, # 'Ë'
- 204: 120, # 'Ì'
- 205: 91, # 'Ã'
- 206: 103, # 'ÃŽ'
- 207: 119, # 'Ã'
- 208: 68, # 'Äž'
- 209: 118, # 'Ñ'
- 210: 117, # 'Ã’'
- 211: 97, # 'Ó'
- 212: 116, # 'Ô'
- 213: 115, # 'Õ'
- 214: 50, # 'Ö'
- 215: 90, # '×'
- 216: 114, # 'Ø'
- 217: 113, # 'Ù'
- 218: 112, # 'Ú'
- 219: 111, # 'Û'
- 220: 55, # 'Ü'
- 221: 41, # 'İ'
- 222: 40, # 'Åž'
- 223: 86, # 'ß'
- 224: 89, # 'Ã '
- 225: 70, # 'á'
- 226: 59, # 'â'
- 227: 78, # 'ã'
- 228: 71, # 'ä'
- 229: 82, # 'Ã¥'
- 230: 88, # 'æ'
- 231: 33, # 'ç'
- 232: 77, # 'è'
- 233: 66, # 'é'
- 234: 84, # 'ê'
- 235: 83, # 'ë'
- 236: 110, # 'ì'
- 237: 75, # 'Ã'
- 238: 61, # 'î'
- 239: 96, # 'ï'
- 240: 30, # 'ÄŸ'
- 241: 67, # 'ñ'
- 242: 109, # 'ò'
- 243: 74, # 'ó'
- 244: 87, # 'ô'
- 245: 102, # 'õ'
- 246: 34, # 'ö'
- 247: 95, # '÷'
- 248: 81, # 'ø'
- 249: 108, # 'ù'
- 250: 76, # 'ú'
- 251: 72, # 'û'
- 252: 17, # 'ü'
- 253: 6, # 'ı'
- 254: 19, # 'ÅŸ'
- 255: 107, # 'ÿ'
-}
-
-ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-9',
- language='Turkish',
- char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER,
- language_model=TURKISH_LANG_MODEL,
- typical_positive_ratio=0.97029,
- keep_ascii_letters=True,
- alphabet='ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş')
-
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py
deleted file mode 100644
index 7d1e8c2..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py
+++ /dev/null
@@ -1,145 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-FREQ_CAT_NUM = 4
-
-UDF = 0 # undefined
-OTH = 1 # other
-ASC = 2 # ascii capital letter
-ASS = 3 # ascii small letter
-ACV = 4 # accent capital vowel
-ACO = 5 # accent capital other
-ASV = 6 # accent small vowel
-ASO = 7 # accent small other
-CLASS_NUM = 8 # total classes
-
-Latin1_CharToClass = (
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F
- OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57
- ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F
- OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77
- ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F
- OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87
- OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F
- UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97
- OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF
- ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7
- ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF
- ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7
- ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF
- ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7
- ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF
- ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7
- ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF
-)
-
-# 0 : illegal
-# 1 : very unlikely
-# 2 : normal
-# 3 : very likely
-Latin1ClassModel = (
-# UDF OTH ASC ASS ACV ACO ASV ASO
- 0, 0, 0, 0, 0, 0, 0, 0, # UDF
- 0, 3, 3, 3, 3, 3, 3, 3, # OTH
- 0, 3, 3, 3, 3, 3, 3, 3, # ASC
- 0, 3, 3, 3, 1, 1, 3, 3, # ASS
- 0, 3, 3, 3, 1, 2, 1, 2, # ACV
- 0, 3, 3, 3, 3, 3, 3, 3, # ACO
- 0, 3, 1, 3, 1, 1, 1, 3, # ASV
- 0, 3, 1, 3, 1, 1, 3, 3, # ASO
-)
-
-
-class Latin1Prober(CharSetProber):
- def __init__(self):
- super(Latin1Prober, self).__init__()
- self._last_char_class = None
- self._freq_counter = None
- self.reset()
-
- def reset(self):
- self._last_char_class = OTH
- self._freq_counter = [0] * FREQ_CAT_NUM
- CharSetProber.reset(self)
-
- @property
- def charset_name(self):
- return "ISO-8859-1"
-
- @property
- def language(self):
- return ""
-
- def feed(self, byte_str):
- byte_str = self.filter_with_english_letters(byte_str)
- for c in byte_str:
- char_class = Latin1_CharToClass[c]
- freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM)
- + char_class]
- if freq == 0:
- self._state = ProbingState.NOT_ME
- break
- self._freq_counter[freq] += 1
- self._last_char_class = char_class
-
- return self.state
-
- def get_confidence(self):
- if self.state == ProbingState.NOT_ME:
- return 0.01
-
- total = sum(self._freq_counter)
- if total < 0.01:
- confidence = 0.0
- else:
- confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0)
- / total)
- if confidence < 0.0:
- confidence = 0.0
- # lower the confidence of latin1 so that other more accurate
- # detector can take priority.
- confidence = confidence * 0.73
- return confidence
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py
deleted file mode 100644
index 6256ecf..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py
+++ /dev/null
@@ -1,91 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-# Proofpoint, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState, MachineState
-
-
-class MultiByteCharSetProber(CharSetProber):
- """
- MultiByteCharSetProber
- """
-
- def __init__(self, lang_filter=None):
- super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter)
- self.distribution_analyzer = None
- self.coding_sm = None
- self._last_char = [0, 0]
-
- def reset(self):
- super(MultiByteCharSetProber, self).reset()
- if self.coding_sm:
- self.coding_sm.reset()
- if self.distribution_analyzer:
- self.distribution_analyzer.reset()
- self._last_char = [0, 0]
-
- @property
- def charset_name(self):
- raise NotImplementedError
-
- @property
- def language(self):
- raise NotImplementedError
-
- def feed(self, byte_str):
- for i in range(len(byte_str)):
- coding_state = self.coding_sm.next_state(byte_str[i])
- if coding_state == MachineState.ERROR:
- self.logger.debug('%s %s prober hit error at byte %s',
- self.charset_name, self.language, i)
- self._state = ProbingState.NOT_ME
- break
- elif coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- elif coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte_str[0]
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
- char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if (self.distribution_analyzer.got_enough_data() and
- (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self):
- return self.distribution_analyzer.get_confidence()
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
deleted file mode 100644
index 530abe7..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
+++ /dev/null
@@ -1,54 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-# Proofpoint, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetgroupprober import CharSetGroupProber
-from .utf8prober import UTF8Prober
-from .sjisprober import SJISProber
-from .eucjpprober import EUCJPProber
-from .gb2312prober import GB2312Prober
-from .euckrprober import EUCKRProber
-from .cp949prober import CP949Prober
-from .big5prober import Big5Prober
-from .euctwprober import EUCTWProber
-
-
-class MBCSGroupProber(CharSetGroupProber):
- def __init__(self, lang_filter=None):
- super(MBCSGroupProber, self).__init__(lang_filter=lang_filter)
- self.probers = [
- UTF8Prober(),
- SJISProber(),
- EUCJPProber(),
- GB2312Prober(),
- EUCKRProber(),
- CP949Prober(),
- Big5Prober(),
- EUCTWProber()
- ]
- self.reset()
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py
deleted file mode 100644
index 8360d0f..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py
+++ /dev/null
@@ -1,572 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .enums import MachineState
-
-# BIG5
-
-BIG5_CLS = (
- 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value
- 1,1,1,1,1,1,0,0, # 08 - 0f
- 1,1,1,1,1,1,1,1, # 10 - 17
- 1,1,1,0,1,1,1,1, # 18 - 1f
- 1,1,1,1,1,1,1,1, # 20 - 27
- 1,1,1,1,1,1,1,1, # 28 - 2f
- 1,1,1,1,1,1,1,1, # 30 - 37
- 1,1,1,1,1,1,1,1, # 38 - 3f
- 2,2,2,2,2,2,2,2, # 40 - 47
- 2,2,2,2,2,2,2,2, # 48 - 4f
- 2,2,2,2,2,2,2,2, # 50 - 57
- 2,2,2,2,2,2,2,2, # 58 - 5f
- 2,2,2,2,2,2,2,2, # 60 - 67
- 2,2,2,2,2,2,2,2, # 68 - 6f
- 2,2,2,2,2,2,2,2, # 70 - 77
- 2,2,2,2,2,2,2,1, # 78 - 7f
- 4,4,4,4,4,4,4,4, # 80 - 87
- 4,4,4,4,4,4,4,4, # 88 - 8f
- 4,4,4,4,4,4,4,4, # 90 - 97
- 4,4,4,4,4,4,4,4, # 98 - 9f
- 4,3,3,3,3,3,3,3, # a0 - a7
- 3,3,3,3,3,3,3,3, # a8 - af
- 3,3,3,3,3,3,3,3, # b0 - b7
- 3,3,3,3,3,3,3,3, # b8 - bf
- 3,3,3,3,3,3,3,3, # c0 - c7
- 3,3,3,3,3,3,3,3, # c8 - cf
- 3,3,3,3,3,3,3,3, # d0 - d7
- 3,3,3,3,3,3,3,3, # d8 - df
- 3,3,3,3,3,3,3,3, # e0 - e7
- 3,3,3,3,3,3,3,3, # e8 - ef
- 3,3,3,3,3,3,3,3, # f0 - f7
- 3,3,3,3,3,3,3,0 # f8 - ff
-)
-
-BIG5_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17
-)
-
-BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0)
-
-BIG5_SM_MODEL = {'class_table': BIG5_CLS,
- 'class_factor': 5,
- 'state_table': BIG5_ST,
- 'char_len_table': BIG5_CHAR_LEN_TABLE,
- 'name': 'Big5'}
-
-# CP949
-
-CP949_CLS = (
- 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f
- 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f
- 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f
- 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f
- 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f
- 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f
- 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f
- 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f
- 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f
- 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f
- 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af
- 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf
- 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf
- 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df
- 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef
- 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff
-)
-
-CP949_ST = (
-#cls= 0 1 2 3 4 5 6 7 8 9 # previous state =
- MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6
-)
-
-CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)
-
-CP949_SM_MODEL = {'class_table': CP949_CLS,
- 'class_factor': 10,
- 'state_table': CP949_ST,
- 'char_len_table': CP949_CHAR_LEN_TABLE,
- 'name': 'CP949'}
-
-# EUC-JP
-
-EUCJP_CLS = (
- 4,4,4,4,4,4,4,4, # 00 - 07
- 4,4,4,4,4,4,5,5, # 08 - 0f
- 4,4,4,4,4,4,4,4, # 10 - 17
- 4,4,4,5,4,4,4,4, # 18 - 1f
- 4,4,4,4,4,4,4,4, # 20 - 27
- 4,4,4,4,4,4,4,4, # 28 - 2f
- 4,4,4,4,4,4,4,4, # 30 - 37
- 4,4,4,4,4,4,4,4, # 38 - 3f
- 4,4,4,4,4,4,4,4, # 40 - 47
- 4,4,4,4,4,4,4,4, # 48 - 4f
- 4,4,4,4,4,4,4,4, # 50 - 57
- 4,4,4,4,4,4,4,4, # 58 - 5f
- 4,4,4,4,4,4,4,4, # 60 - 67
- 4,4,4,4,4,4,4,4, # 68 - 6f
- 4,4,4,4,4,4,4,4, # 70 - 77
- 4,4,4,4,4,4,4,4, # 78 - 7f
- 5,5,5,5,5,5,5,5, # 80 - 87
- 5,5,5,5,5,5,1,3, # 88 - 8f
- 5,5,5,5,5,5,5,5, # 90 - 97
- 5,5,5,5,5,5,5,5, # 98 - 9f
- 5,2,2,2,2,2,2,2, # a0 - a7
- 2,2,2,2,2,2,2,2, # a8 - af
- 2,2,2,2,2,2,2,2, # b0 - b7
- 2,2,2,2,2,2,2,2, # b8 - bf
- 2,2,2,2,2,2,2,2, # c0 - c7
- 2,2,2,2,2,2,2,2, # c8 - cf
- 2,2,2,2,2,2,2,2, # d0 - d7
- 2,2,2,2,2,2,2,2, # d8 - df
- 0,0,0,0,0,0,0,0, # e0 - e7
- 0,0,0,0,0,0,0,0, # e8 - ef
- 0,0,0,0,0,0,0,0, # f0 - f7
- 0,0,0,0,0,0,0,5 # f8 - ff
-)
-
-EUCJP_ST = (
- 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f
- 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27
-)
-
-EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0)
-
-EUCJP_SM_MODEL = {'class_table': EUCJP_CLS,
- 'class_factor': 6,
- 'state_table': EUCJP_ST,
- 'char_len_table': EUCJP_CHAR_LEN_TABLE,
- 'name': 'EUC-JP'}
-
-# EUC-KR
-
-EUCKR_CLS = (
- 1,1,1,1,1,1,1,1, # 00 - 07
- 1,1,1,1,1,1,0,0, # 08 - 0f
- 1,1,1,1,1,1,1,1, # 10 - 17
- 1,1,1,0,1,1,1,1, # 18 - 1f
- 1,1,1,1,1,1,1,1, # 20 - 27
- 1,1,1,1,1,1,1,1, # 28 - 2f
- 1,1,1,1,1,1,1,1, # 30 - 37
- 1,1,1,1,1,1,1,1, # 38 - 3f
- 1,1,1,1,1,1,1,1, # 40 - 47
- 1,1,1,1,1,1,1,1, # 48 - 4f
- 1,1,1,1,1,1,1,1, # 50 - 57
- 1,1,1,1,1,1,1,1, # 58 - 5f
- 1,1,1,1,1,1,1,1, # 60 - 67
- 1,1,1,1,1,1,1,1, # 68 - 6f
- 1,1,1,1,1,1,1,1, # 70 - 77
- 1,1,1,1,1,1,1,1, # 78 - 7f
- 0,0,0,0,0,0,0,0, # 80 - 87
- 0,0,0,0,0,0,0,0, # 88 - 8f
- 0,0,0,0,0,0,0,0, # 90 - 97
- 0,0,0,0,0,0,0,0, # 98 - 9f
- 0,2,2,2,2,2,2,2, # a0 - a7
- 2,2,2,2,2,3,3,3, # a8 - af
- 2,2,2,2,2,2,2,2, # b0 - b7
- 2,2,2,2,2,2,2,2, # b8 - bf
- 2,2,2,2,2,2,2,2, # c0 - c7
- 2,3,2,2,2,2,2,2, # c8 - cf
- 2,2,2,2,2,2,2,2, # d0 - d7
- 2,2,2,2,2,2,2,2, # d8 - df
- 2,2,2,2,2,2,2,2, # e0 - e7
- 2,2,2,2,2,2,2,2, # e8 - ef
- 2,2,2,2,2,2,2,2, # f0 - f7
- 2,2,2,2,2,2,2,0 # f8 - ff
-)
-
-EUCKR_ST = (
- MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f
-)
-
-EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0)
-
-EUCKR_SM_MODEL = {'class_table': EUCKR_CLS,
- 'class_factor': 4,
- 'state_table': EUCKR_ST,
- 'char_len_table': EUCKR_CHAR_LEN_TABLE,
- 'name': 'EUC-KR'}
-
-# EUC-TW
-
-EUCTW_CLS = (
- 2,2,2,2,2,2,2,2, # 00 - 07
- 2,2,2,2,2,2,0,0, # 08 - 0f
- 2,2,2,2,2,2,2,2, # 10 - 17
- 2,2,2,0,2,2,2,2, # 18 - 1f
- 2,2,2,2,2,2,2,2, # 20 - 27
- 2,2,2,2,2,2,2,2, # 28 - 2f
- 2,2,2,2,2,2,2,2, # 30 - 37
- 2,2,2,2,2,2,2,2, # 38 - 3f
- 2,2,2,2,2,2,2,2, # 40 - 47
- 2,2,2,2,2,2,2,2, # 48 - 4f
- 2,2,2,2,2,2,2,2, # 50 - 57
- 2,2,2,2,2,2,2,2, # 58 - 5f
- 2,2,2,2,2,2,2,2, # 60 - 67
- 2,2,2,2,2,2,2,2, # 68 - 6f
- 2,2,2,2,2,2,2,2, # 70 - 77
- 2,2,2,2,2,2,2,2, # 78 - 7f
- 0,0,0,0,0,0,0,0, # 80 - 87
- 0,0,0,0,0,0,6,0, # 88 - 8f
- 0,0,0,0,0,0,0,0, # 90 - 97
- 0,0,0,0,0,0,0,0, # 98 - 9f
- 0,3,4,4,4,4,4,4, # a0 - a7
- 5,5,1,1,1,1,1,1, # a8 - af
- 1,1,1,1,1,1,1,1, # b0 - b7
- 1,1,1,1,1,1,1,1, # b8 - bf
- 1,1,3,1,3,3,3,3, # c0 - c7
- 3,3,3,3,3,3,3,3, # c8 - cf
- 3,3,3,3,3,3,3,3, # d0 - d7
- 3,3,3,3,3,3,3,3, # d8 - df
- 3,3,3,3,3,3,3,3, # e0 - e7
- 3,3,3,3,3,3,3,3, # e8 - ef
- 3,3,3,3,3,3,3,3, # f0 - f7
- 3,3,3,3,3,3,3,0 # f8 - ff
-)
-
-EUCTW_ST = (
- MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17
- MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27
- MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
-)
-
-EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3)
-
-EUCTW_SM_MODEL = {'class_table': EUCTW_CLS,
- 'class_factor': 7,
- 'state_table': EUCTW_ST,
- 'char_len_table': EUCTW_CHAR_LEN_TABLE,
- 'name': 'x-euc-tw'}
-
-# GB2312
-
-GB2312_CLS = (
- 1,1,1,1,1,1,1,1, # 00 - 07
- 1,1,1,1,1,1,0,0, # 08 - 0f
- 1,1,1,1,1,1,1,1, # 10 - 17
- 1,1,1,0,1,1,1,1, # 18 - 1f
- 1,1,1,1,1,1,1,1, # 20 - 27
- 1,1,1,1,1,1,1,1, # 28 - 2f
- 3,3,3,3,3,3,3,3, # 30 - 37
- 3,3,1,1,1,1,1,1, # 38 - 3f
- 2,2,2,2,2,2,2,2, # 40 - 47
- 2,2,2,2,2,2,2,2, # 48 - 4f
- 2,2,2,2,2,2,2,2, # 50 - 57
- 2,2,2,2,2,2,2,2, # 58 - 5f
- 2,2,2,2,2,2,2,2, # 60 - 67
- 2,2,2,2,2,2,2,2, # 68 - 6f
- 2,2,2,2,2,2,2,2, # 70 - 77
- 2,2,2,2,2,2,2,4, # 78 - 7f
- 5,6,6,6,6,6,6,6, # 80 - 87
- 6,6,6,6,6,6,6,6, # 88 - 8f
- 6,6,6,6,6,6,6,6, # 90 - 97
- 6,6,6,6,6,6,6,6, # 98 - 9f
- 6,6,6,6,6,6,6,6, # a0 - a7
- 6,6,6,6,6,6,6,6, # a8 - af
- 6,6,6,6,6,6,6,6, # b0 - b7
- 6,6,6,6,6,6,6,6, # b8 - bf
- 6,6,6,6,6,6,6,6, # c0 - c7
- 6,6,6,6,6,6,6,6, # c8 - cf
- 6,6,6,6,6,6,6,6, # d0 - d7
- 6,6,6,6,6,6,6,6, # d8 - df
- 6,6,6,6,6,6,6,6, # e0 - e7
- 6,6,6,6,6,6,6,6, # e8 - ef
- 6,6,6,6,6,6,6,6, # f0 - f7
- 6,6,6,6,6,6,6,0 # f8 - ff
-)
-
-GB2312_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17
- 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
-)
-
-# To be accurate, the length of class 6 can be either 2 or 4.
-# But it is not necessary to discriminate between the two since
-# it is used for frequency analysis only, and we are validating
-# each code range there as well. So it is safe to set it to be
-# 2 here.
-GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2)
-
-GB2312_SM_MODEL = {'class_table': GB2312_CLS,
- 'class_factor': 7,
- 'state_table': GB2312_ST,
- 'char_len_table': GB2312_CHAR_LEN_TABLE,
- 'name': 'GB2312'}
-
-# Shift_JIS
-
-SJIS_CLS = (
- 1,1,1,1,1,1,1,1, # 00 - 07
- 1,1,1,1,1,1,0,0, # 08 - 0f
- 1,1,1,1,1,1,1,1, # 10 - 17
- 1,1,1,0,1,1,1,1, # 18 - 1f
- 1,1,1,1,1,1,1,1, # 20 - 27
- 1,1,1,1,1,1,1,1, # 28 - 2f
- 1,1,1,1,1,1,1,1, # 30 - 37
- 1,1,1,1,1,1,1,1, # 38 - 3f
- 2,2,2,2,2,2,2,2, # 40 - 47
- 2,2,2,2,2,2,2,2, # 48 - 4f
- 2,2,2,2,2,2,2,2, # 50 - 57
- 2,2,2,2,2,2,2,2, # 58 - 5f
- 2,2,2,2,2,2,2,2, # 60 - 67
- 2,2,2,2,2,2,2,2, # 68 - 6f
- 2,2,2,2,2,2,2,2, # 70 - 77
- 2,2,2,2,2,2,2,1, # 78 - 7f
- 3,3,3,3,3,2,2,3, # 80 - 87
- 3,3,3,3,3,3,3,3, # 88 - 8f
- 3,3,3,3,3,3,3,3, # 90 - 97
- 3,3,3,3,3,3,3,3, # 98 - 9f
- #0xa0 is illegal in sjis encoding, but some pages does
- #contain such byte. We need to be more error forgiven.
- 2,2,2,2,2,2,2,2, # a0 - a7
- 2,2,2,2,2,2,2,2, # a8 - af
- 2,2,2,2,2,2,2,2, # b0 - b7
- 2,2,2,2,2,2,2,2, # b8 - bf
- 2,2,2,2,2,2,2,2, # c0 - c7
- 2,2,2,2,2,2,2,2, # c8 - cf
- 2,2,2,2,2,2,2,2, # d0 - d7
- 2,2,2,2,2,2,2,2, # d8 - df
- 3,3,3,3,3,3,3,3, # e0 - e7
- 3,3,3,3,3,4,4,4, # e8 - ef
- 3,3,3,3,3,3,3,3, # f0 - f7
- 3,3,3,3,3,0,0,0) # f8 - ff
-
-
-SJIS_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17
-)
-
-SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0)
-
-SJIS_SM_MODEL = {'class_table': SJIS_CLS,
- 'class_factor': 6,
- 'state_table': SJIS_ST,
- 'char_len_table': SJIS_CHAR_LEN_TABLE,
- 'name': 'Shift_JIS'}
-
-# UCS2-BE
-
-UCS2BE_CLS = (
- 0,0,0,0,0,0,0,0, # 00 - 07
- 0,0,1,0,0,2,0,0, # 08 - 0f
- 0,0,0,0,0,0,0,0, # 10 - 17
- 0,0,0,3,0,0,0,0, # 18 - 1f
- 0,0,0,0,0,0,0,0, # 20 - 27
- 0,3,3,3,3,3,0,0, # 28 - 2f
- 0,0,0,0,0,0,0,0, # 30 - 37
- 0,0,0,0,0,0,0,0, # 38 - 3f
- 0,0,0,0,0,0,0,0, # 40 - 47
- 0,0,0,0,0,0,0,0, # 48 - 4f
- 0,0,0,0,0,0,0,0, # 50 - 57
- 0,0,0,0,0,0,0,0, # 58 - 5f
- 0,0,0,0,0,0,0,0, # 60 - 67
- 0,0,0,0,0,0,0,0, # 68 - 6f
- 0,0,0,0,0,0,0,0, # 70 - 77
- 0,0,0,0,0,0,0,0, # 78 - 7f
- 0,0,0,0,0,0,0,0, # 80 - 87
- 0,0,0,0,0,0,0,0, # 88 - 8f
- 0,0,0,0,0,0,0,0, # 90 - 97
- 0,0,0,0,0,0,0,0, # 98 - 9f
- 0,0,0,0,0,0,0,0, # a0 - a7
- 0,0,0,0,0,0,0,0, # a8 - af
- 0,0,0,0,0,0,0,0, # b0 - b7
- 0,0,0,0,0,0,0,0, # b8 - bf
- 0,0,0,0,0,0,0,0, # c0 - c7
- 0,0,0,0,0,0,0,0, # c8 - cf
- 0,0,0,0,0,0,0,0, # d0 - d7
- 0,0,0,0,0,0,0,0, # d8 - df
- 0,0,0,0,0,0,0,0, # e0 - e7
- 0,0,0,0,0,0,0,0, # e8 - ef
- 0,0,0,0,0,0,0,0, # f0 - f7
- 0,0,0,0,0,0,4,5 # f8 - ff
-)
-
-UCS2BE_ST = (
- 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17
- 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f
- 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27
- 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f
- 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37
-)
-
-UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2)
-
-UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS,
- 'class_factor': 6,
- 'state_table': UCS2BE_ST,
- 'char_len_table': UCS2BE_CHAR_LEN_TABLE,
- 'name': 'UTF-16BE'}
-
-# UCS2-LE
-
-UCS2LE_CLS = (
- 0,0,0,0,0,0,0,0, # 00 - 07
- 0,0,1,0,0,2,0,0, # 08 - 0f
- 0,0,0,0,0,0,0,0, # 10 - 17
- 0,0,0,3,0,0,0,0, # 18 - 1f
- 0,0,0,0,0,0,0,0, # 20 - 27
- 0,3,3,3,3,3,0,0, # 28 - 2f
- 0,0,0,0,0,0,0,0, # 30 - 37
- 0,0,0,0,0,0,0,0, # 38 - 3f
- 0,0,0,0,0,0,0,0, # 40 - 47
- 0,0,0,0,0,0,0,0, # 48 - 4f
- 0,0,0,0,0,0,0,0, # 50 - 57
- 0,0,0,0,0,0,0,0, # 58 - 5f
- 0,0,0,0,0,0,0,0, # 60 - 67
- 0,0,0,0,0,0,0,0, # 68 - 6f
- 0,0,0,0,0,0,0,0, # 70 - 77
- 0,0,0,0,0,0,0,0, # 78 - 7f
- 0,0,0,0,0,0,0,0, # 80 - 87
- 0,0,0,0,0,0,0,0, # 88 - 8f
- 0,0,0,0,0,0,0,0, # 90 - 97
- 0,0,0,0,0,0,0,0, # 98 - 9f
- 0,0,0,0,0,0,0,0, # a0 - a7
- 0,0,0,0,0,0,0,0, # a8 - af
- 0,0,0,0,0,0,0,0, # b0 - b7
- 0,0,0,0,0,0,0,0, # b8 - bf
- 0,0,0,0,0,0,0,0, # c0 - c7
- 0,0,0,0,0,0,0,0, # c8 - cf
- 0,0,0,0,0,0,0,0, # d0 - d7
- 0,0,0,0,0,0,0,0, # d8 - df
- 0,0,0,0,0,0,0,0, # e0 - e7
- 0,0,0,0,0,0,0,0, # e8 - ef
- 0,0,0,0,0,0,0,0, # f0 - f7
- 0,0,0,0,0,0,4,5 # f8 - ff
-)
-
-UCS2LE_ST = (
- 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17
- 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f
- 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27
- 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f
- 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37
-)
-
-UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2)
-
-UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS,
- 'class_factor': 6,
- 'state_table': UCS2LE_ST,
- 'char_len_table': UCS2LE_CHAR_LEN_TABLE,
- 'name': 'UTF-16LE'}
-
-# UTF-8
-
-UTF8_CLS = (
- 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value
- 1,1,1,1,1,1,0,0, # 08 - 0f
- 1,1,1,1,1,1,1,1, # 10 - 17
- 1,1,1,0,1,1,1,1, # 18 - 1f
- 1,1,1,1,1,1,1,1, # 20 - 27
- 1,1,1,1,1,1,1,1, # 28 - 2f
- 1,1,1,1,1,1,1,1, # 30 - 37
- 1,1,1,1,1,1,1,1, # 38 - 3f
- 1,1,1,1,1,1,1,1, # 40 - 47
- 1,1,1,1,1,1,1,1, # 48 - 4f
- 1,1,1,1,1,1,1,1, # 50 - 57
- 1,1,1,1,1,1,1,1, # 58 - 5f
- 1,1,1,1,1,1,1,1, # 60 - 67
- 1,1,1,1,1,1,1,1, # 68 - 6f
- 1,1,1,1,1,1,1,1, # 70 - 77
- 1,1,1,1,1,1,1,1, # 78 - 7f
- 2,2,2,2,3,3,3,3, # 80 - 87
- 4,4,4,4,4,4,4,4, # 88 - 8f
- 4,4,4,4,4,4,4,4, # 90 - 97
- 4,4,4,4,4,4,4,4, # 98 - 9f
- 5,5,5,5,5,5,5,5, # a0 - a7
- 5,5,5,5,5,5,5,5, # a8 - af
- 5,5,5,5,5,5,5,5, # b0 - b7
- 5,5,5,5,5,5,5,5, # b8 - bf
- 0,0,6,6,6,6,6,6, # c0 - c7
- 6,6,6,6,6,6,6,6, # c8 - cf
- 6,6,6,6,6,6,6,6, # d0 - d7
- 6,6,6,6,6,6,6,6, # d8 - df
- 7,8,8,8,8,8,8,8, # e0 - e7
- 8,8,8,8,8,9,8,8, # e8 - ef
- 10,11,11,11,11,11,11,11, # f0 - f7
- 12,13,13,13,14,15,0,0 # f8 - ff
-)
-
-UTF8_ST = (
- MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07
- 9, 11, 8, 7, 6, 5, 4, 3,#08-0f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f
- MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f
- MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f
- MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f
- MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af
- MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf
-)
-
-UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
-
-UTF8_SM_MODEL = {'class_table': UTF8_CLS,
- 'class_factor': 16,
- 'state_table': UTF8_ST,
- 'char_len_table': UTF8_CHAR_LEN_TABLE,
- 'name': 'UTF-8'}
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py b/venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py b/venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py
deleted file mode 100644
index 3237d5a..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-Metadata about languages used by our model training code for our
-SingleByteCharSetProbers. Could be used for other things in the future.
-
-This code is based on the language metadata from the uchardet project.
-"""
-from __future__ import absolute_import, print_function
-
-from string import ascii_letters
-
-
-# TODO: Add Ukranian (KOI8-U)
-
-class Language(object):
- """Metadata about a language useful for training models
-
- :ivar name: The human name for the language, in English.
- :type name: str
- :ivar iso_code: 2-letter ISO 639-1 if possible, 3-letter ISO code otherwise,
- or use another catalog as a last resort.
- :type iso_code: str
- :ivar use_ascii: Whether or not ASCII letters should be included in trained
- models.
- :type use_ascii: bool
- :ivar charsets: The charsets we want to support and create data for.
- :type charsets: list of str
- :ivar alphabet: The characters in the language's alphabet. If `use_ascii` is
- `True`, you only need to add those not in the ASCII set.
- :type alphabet: str
- :ivar wiki_start_pages: The Wikipedia pages to start from if we're crawling
- Wikipedia for training data.
- :type wiki_start_pages: list of str
- """
- def __init__(self, name=None, iso_code=None, use_ascii=True, charsets=None,
- alphabet=None, wiki_start_pages=None):
- super(Language, self).__init__()
- self.name = name
- self.iso_code = iso_code
- self.use_ascii = use_ascii
- self.charsets = charsets
- if self.use_ascii:
- if alphabet:
- alphabet += ascii_letters
- else:
- alphabet = ascii_letters
- elif not alphabet:
- raise ValueError('Must supply alphabet if use_ascii is False')
- self.alphabet = ''.join(sorted(set(alphabet))) if alphabet else None
- self.wiki_start_pages = wiki_start_pages
-
- def __repr__(self):
- return '{}({})'.format(self.__class__.__name__,
- ', '.join('{}={!r}'.format(k, v)
- for k, v in self.__dict__.items()
- if not k.startswith('_')))
-
-
-LANGUAGES = {'Arabic': Language(name='Arabic',
- iso_code='ar',
- use_ascii=False,
- # We only support encodings that use isolated
- # forms, because the current recommendation is
- # that the rendering system handles presentation
- # forms. This means we purposefully skip IBM864.
- charsets=['ISO-8859-6', 'WINDOWS-1256',
- 'CP720', 'CP864'],
- alphabet=u'Ø¡Ø¢Ø£Ø¤Ø¥Ø¦Ø§Ø¨Ø©ØªØ«Ø¬ØØ®Ø¯Ø°Ø±Ø²Ø³Ø´ØµØ¶Ø·Ø¸Ø¹ØºØ»Ø¼Ø½Ø¾Ø¿Ù€ÙقكلمنهوىيًٌÙÙŽÙÙÙ‘',
- wiki_start_pages=[u'Ø§Ù„ØµÙØØ©_الرئيسية']),
- 'Belarusian': Language(name='Belarusian',
- iso_code='be',
- use_ascii=False,
- charsets=['ISO-8859-5', 'WINDOWS-1251',
- 'IBM866', 'MacCyrillic'],
- alphabet=(u'ÐБВГДЕÐЖЗІЙКЛМÐОПРСТУЎФХЦЧШЫЬÐЮЯ'
- u'абвгдеёжзійклмнопрÑтуўфхцчшыьÑÑŽÑʼ'),
- wiki_start_pages=[u'ГалоўнаÑ_Ñтаронка']),
- 'Bulgarian': Language(name='Bulgarian',
- iso_code='bg',
- use_ascii=False,
- charsets=['ISO-8859-5', 'WINDOWS-1251',
- 'IBM855'],
- alphabet=(u'ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯ'
- u'абвгдежзийклмнопрÑтуфхцчшщъьюÑ'),
- wiki_start_pages=[u'Ðачална_Ñтраница']),
- 'Czech': Language(name='Czech',
- iso_code='cz',
- use_ascii=True,
- charsets=['ISO-8859-2', 'WINDOWS-1250'],
- alphabet=u'áÄÄéěÃňóřšťúůýžÃČĎÉĚÃŇÓŘŠŤÚŮÃŽ',
- wiki_start_pages=[u'HlavnÃ_strana']),
- 'Danish': Language(name='Danish',
- iso_code='da',
- use_ascii=True,
- charsets=['ISO-8859-1', 'ISO-8859-15',
- 'WINDOWS-1252'],
- alphabet=u'æøåÆØÅ',
- wiki_start_pages=[u'Forside']),
- 'German': Language(name='German',
- iso_code='de',
- use_ascii=True,
- charsets=['ISO-8859-1', 'WINDOWS-1252'],
- alphabet=u'äöüßÄÖÜ',
- wiki_start_pages=[u'Wikipedia:Hauptseite']),
- 'Greek': Language(name='Greek',
- iso_code='el',
- use_ascii=False,
- charsets=['ISO-8859-7', 'WINDOWS-1253'],
- alphabet=(u'αβγδεζηθικλμνξοπÏσςτυφχψωάÎήίόÏÏŽ'
- u'ΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎÎ'),
- wiki_start_pages=[u'Î Ïλη:ΚÏÏια']),
- 'English': Language(name='English',
- iso_code='en',
- use_ascii=True,
- charsets=['ISO-8859-1', 'WINDOWS-1252'],
- wiki_start_pages=[u'Main_Page']),
- 'Esperanto': Language(name='Esperanto',
- iso_code='eo',
- # Q, W, X, and Y not used at all
- use_ascii=False,
- charsets=['ISO-8859-3'],
- alphabet=(u'abcĉdefgÄhÄ¥ijĵklmnoprsÅtuÅvz'
- u'ABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ'),
- wiki_start_pages=[u'Vikipedio:ĈefpaÄo']),
- 'Spanish': Language(name='Spanish',
- iso_code='es',
- use_ascii=True,
- charsets=['ISO-8859-1', 'ISO-8859-15',
- 'WINDOWS-1252'],
- alphabet=u'ñáéÃóúüÑÃÉÃÓÚÜ',
- wiki_start_pages=[u'Wikipedia:Portada']),
- 'Estonian': Language(name='Estonian',
- iso_code='et',
- use_ascii=False,
- charsets=['ISO-8859-4', 'ISO-8859-13',
- 'WINDOWS-1257'],
- # C, F, Š, Q, W, X, Y, Z, Ž are only for
- # loanwords
- alphabet=(u'ABDEGHIJKLMNOPRSTUVÕÄÖÜ'
- u'abdeghijklmnoprstuvõäöü'),
- wiki_start_pages=[u'Esileht']),
- 'Finnish': Language(name='Finnish',
- iso_code='fi',
- use_ascii=True,
- charsets=['ISO-8859-1', 'ISO-8859-15',
- 'WINDOWS-1252'],
- alphabet=u'ÅÄÖŠŽåäöšž',
- wiki_start_pages=[u'Wikipedia:Etusivu']),
- 'French': Language(name='French',
- iso_code='fr',
- use_ascii=True,
- charsets=['ISO-8859-1', 'ISO-8859-15',
- 'WINDOWS-1252'],
- alphabet=u'œà âçèéîïùûêŒÀÂÇÈÉÎÃÙÛÊ',
- wiki_start_pages=[u'Wikipédia:Accueil_principal',
- u'Bœuf (animal)']),
- 'Hebrew': Language(name='Hebrew',
- iso_code='he',
- use_ascii=False,
- charsets=['ISO-8859-8', 'WINDOWS-1255'],
- alphabet=u'×בגדהוזחטיךכל××ž×Ÿ× ×¡×¢×£×¤×¥×¦×§×¨×©×ª×°×±×²',
- wiki_start_pages=[u'עמוד_ר×שי']),
- 'Croatian': Language(name='Croatian',
- iso_code='hr',
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=['ISO-8859-2', 'WINDOWS-1250'],
- alphabet=(u'abcÄćdÄ‘efghijklmnoprsÅ¡tuvzž'
- u'ABCČĆDÄEFGHIJKLMNOPRSÅ TUVZŽ'),
- wiki_start_pages=[u'Glavna_stranica']),
- 'Hungarian': Language(name='Hungarian',
- iso_code='hu',
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=['ISO-8859-2', 'WINDOWS-1250'],
- alphabet=(u'abcdefghijklmnoprstuvzáéÃóöőúüű'
- u'ABCDEFGHIJKLMNOPRSTUVZÃÉÃÓÖÅÚÜŰ'),
- wiki_start_pages=[u'Kezdőlap']),
- 'Italian': Language(name='Italian',
- iso_code='it',
- use_ascii=True,
- charsets=['ISO-8859-1', 'ISO-8859-15',
- 'WINDOWS-1252'],
- alphabet=u'ÀÈÉÌÒÓÙà èéìòóù',
- wiki_start_pages=[u'Pagina_principale']),
- 'Lithuanian': Language(name='Lithuanian',
- iso_code='lt',
- use_ascii=False,
- charsets=['ISO-8859-13', 'WINDOWS-1257',
- 'ISO-8859-4'],
- # Q, W, and X not used at all
- alphabet=(u'AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ'
- u'aÄ…bcÄdeęėfghiįyjklmnoprsÅ¡tuųūvzž'),
- wiki_start_pages=[u'Pagrindinis_puslapis']),
- 'Latvian': Language(name='Latvian',
- iso_code='lv',
- use_ascii=False,
- charsets=['ISO-8859-13', 'WINDOWS-1257',
- 'ISO-8859-4'],
- # Q, W, X, Y are only for loanwords
- alphabet=(u'AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ'
- u'aÄbcÄdeÄ“fgÄ£hiÄ«jkÄ·lļmnņoprsÅ¡tuÅ«vzž'),
- wiki_start_pages=[u'SÄkumlapa']),
- 'Macedonian': Language(name='Macedonian',
- iso_code='mk',
- use_ascii=False,
- charsets=['ISO-8859-5', 'WINDOWS-1251',
- 'MacCyrillic', 'IBM855'],
- alphabet=(u'ÐБВГДЃЕЖЗЅИЈКЛЉМÐЊОПРСТЌУФХЦЧÐШ'
- u'абвгдѓежзѕијклљмнњопрÑтќуфхцчџш'),
- wiki_start_pages=[u'Главна_Ñтраница']),
- 'Dutch': Language(name='Dutch',
- iso_code='nl',
- use_ascii=True,
- charsets=['ISO-8859-1', 'WINDOWS-1252'],
- wiki_start_pages=[u'Hoofdpagina']),
- 'Polish': Language(name='Polish',
- iso_code='pl',
- # Q and X are only used for foreign words.
- use_ascii=False,
- charsets=['ISO-8859-2', 'WINDOWS-1250'],
- alphabet=(u'AÄ„BCĆDEĘFGHIJKLÅMNŃOÓPRSÅšTUWYZŹŻ'
- u'aąbcćdeęfghijklłmnńoóprsśtuwyzźż'),
- wiki_start_pages=[u'Wikipedia:Strona_główna']),
- 'Portuguese': Language(name='Portuguese',
- iso_code='pt',
- use_ascii=True,
- charsets=['ISO-8859-1', 'ISO-8859-15',
- 'WINDOWS-1252'],
- alphabet=u'ÃÂÃÀÇÉÊÃÓÔÕÚáâãà çéêÃóôõú',
- wiki_start_pages=[u'Wikipédia:Página_principal']),
- 'Romanian': Language(name='Romanian',
- iso_code='ro',
- use_ascii=True,
- charsets=['ISO-8859-2', 'WINDOWS-1250'],
- alphabet=u'ăâîșțĂÂÎȘȚ',
- wiki_start_pages=[u'Pagina_principală']),
- 'Russian': Language(name='Russian',
- iso_code='ru',
- use_ascii=False,
- charsets=['ISO-8859-5', 'WINDOWS-1251',
- 'KOI8-R', 'MacCyrillic', 'IBM866',
- 'IBM855'],
- alphabet=(u'абвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑ'
- u'ÐБВГДЕÐЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯ'),
- wiki_start_pages=[u'ЗаглавнаÑ_Ñтраница']),
- 'Slovak': Language(name='Slovak',
- iso_code='sk',
- use_ascii=True,
- charsets=['ISO-8859-2', 'WINDOWS-1250'],
- alphabet=u'áäÄÄéÃĺľňóôŕšťúýžÃÄČĎÉÃĹĽŇÓÔŔŠŤÚÃŽ',
- wiki_start_pages=[u'Hlavná_stránka']),
- 'Slovene': Language(name='Slovene',
- iso_code='sl',
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=['ISO-8859-2', 'WINDOWS-1250'],
- alphabet=(u'abcÄdefghijklmnoprsÅ¡tuvzž'
- u'ABCČDEFGHIJKLMNOPRSŠTUVZŽ'),
- wiki_start_pages=[u'Glavna_stran']),
- # Serbian can be written in both Latin and Cyrillic, but there's no
- # simple way to get the Latin alphabet pages from Wikipedia through
- # the API, so for now we just support Cyrillic.
- 'Serbian': Language(name='Serbian',
- iso_code='sr',
- alphabet=(u'ÐБВГДЂЕЖЗИЈКЛЉМÐЊОПРСТЋУФХЦЧÐШ'
- u'абвгдђежзијклљмнњопрÑтћуфхцчџш'),
- charsets=['ISO-8859-5', 'WINDOWS-1251',
- 'MacCyrillic', 'IBM855'],
- wiki_start_pages=[u'Главна_Ñтрана']),
- 'Thai': Language(name='Thai',
- iso_code='th',
- use_ascii=False,
- charsets=['ISO-8859-11', 'TIS-620', 'CP874'],
- alphabet=u'à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ มยรฤลฦวศษสหฬà¸à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸ºà¸¸à¸¹à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛',
- wiki_start_pages=[u'หน้าหลัà¸']),
- 'Turkish': Language(name='Turkish',
- iso_code='tr',
- # Q, W, and X are not used by Turkish
- use_ascii=False,
- charsets=['ISO-8859-3', 'ISO-8859-9',
- 'WINDOWS-1254'],
- alphabet=(u'abcçdefgğhıijklmnoöprsştuüvyzâîû'
- u'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZÂÎÛ'),
- wiki_start_pages=[u'Ana_Sayfa']),
- 'Vietnamese': Language(name='Vietnamese',
- iso_code='vi',
- use_ascii=False,
- # Windows-1258 is the only common 8-bit
- # Vietnamese encoding supported by Python.
- # From Wikipedia:
- # For systems that lack support for Unicode,
- # dozens of 8-bit Vietnamese code pages are
- # available.[1] The most common are VISCII
- # (TCVN 5712:1993), VPS, and Windows-1258.[3]
- # Where ASCII is required, such as when
- # ensuring readability in plain text e-mail,
- # Vietnamese letters are often encoded
- # according to Vietnamese Quoted-Readable
- # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4]
- # though usage of either variable-width
- # scheme has declined dramatically following
- # the adoption of Unicode on the World Wide
- # Web.
- charsets=['WINDOWS-1258'],
- alphabet=(u'aăâbcdđeêghiklmnoôơpqrstuưvxy'
- u'AĂÂBCDÄEÊGHIKLMNOÃ”Æ PQRSTUƯVXY'),
- wiki_start_pages=[u'Chữ_Quốc_ngữ']),
- }
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py
deleted file mode 100644
index 46ba835..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py
+++ /dev/null
@@ -1,145 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from collections import namedtuple
-
-from .charsetprober import CharSetProber
-from .enums import CharacterCategory, ProbingState, SequenceLikelihood
-
-
-SingleByteCharSetModel = namedtuple('SingleByteCharSetModel',
- ['charset_name',
- 'language',
- 'char_to_order_map',
- 'language_model',
- 'typical_positive_ratio',
- 'keep_ascii_letters',
- 'alphabet'])
-
-
-class SingleByteCharSetProber(CharSetProber):
- SAMPLE_SIZE = 64
- SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2
- POSITIVE_SHORTCUT_THRESHOLD = 0.95
- NEGATIVE_SHORTCUT_THRESHOLD = 0.05
-
- def __init__(self, model, reversed=False, name_prober=None):
- super(SingleByteCharSetProber, self).__init__()
- self._model = model
- # TRUE if we need to reverse every pair in the model lookup
- self._reversed = reversed
- # Optional auxiliary prober for name decision
- self._name_prober = name_prober
- self._last_order = None
- self._seq_counters = None
- self._total_seqs = None
- self._total_char = None
- self._freq_char = None
- self.reset()
-
- def reset(self):
- super(SingleByteCharSetProber, self).reset()
- # char order of last character
- self._last_order = 255
- self._seq_counters = [0] * SequenceLikelihood.get_num_categories()
- self._total_seqs = 0
- self._total_char = 0
- # characters that fall in our sampling range
- self._freq_char = 0
-
- @property
- def charset_name(self):
- if self._name_prober:
- return self._name_prober.charset_name
- else:
- return self._model.charset_name
-
- @property
- def language(self):
- if self._name_prober:
- return self._name_prober.language
- else:
- return self._model.language
-
- def feed(self, byte_str):
- # TODO: Make filter_international_words keep things in self.alphabet
- if not self._model.keep_ascii_letters:
- byte_str = self.filter_international_words(byte_str)
- if not byte_str:
- return self.state
- char_to_order_map = self._model.char_to_order_map
- language_model = self._model.language_model
- for char in byte_str:
- order = char_to_order_map.get(char, CharacterCategory.UNDEFINED)
- # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but
- # CharacterCategory.SYMBOL is actually 253, so we use CONTROL
- # to make it closer to the original intent. The only difference
- # is whether or not we count digits and control characters for
- # _total_char purposes.
- if order < CharacterCategory.CONTROL:
- self._total_char += 1
- # TODO: Follow uchardet's lead and discount confidence for frequent
- # control characters.
- # See https://github.com/BYVoid/uchardet/commit/55b4f23971db61
- if order < self.SAMPLE_SIZE:
- self._freq_char += 1
- if self._last_order < self.SAMPLE_SIZE:
- self._total_seqs += 1
- if not self._reversed:
- lm_cat = language_model[self._last_order][order]
- else:
- lm_cat = language_model[order][self._last_order]
- self._seq_counters[lm_cat] += 1
- self._last_order = order
-
- charset_name = self._model.charset_name
- if self.state == ProbingState.DETECTING:
- if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD:
- confidence = self.get_confidence()
- if confidence > self.POSITIVE_SHORTCUT_THRESHOLD:
- self.logger.debug('%s confidence = %s, we have a winner',
- charset_name, confidence)
- self._state = ProbingState.FOUND_IT
- elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD:
- self.logger.debug('%s confidence = %s, below negative '
- 'shortcut threshhold %s', charset_name,
- confidence,
- self.NEGATIVE_SHORTCUT_THRESHOLD)
- self._state = ProbingState.NOT_ME
-
- return self.state
-
- def get_confidence(self):
- r = 0.01
- if self._total_seqs > 0:
- r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) /
- self._total_seqs / self._model.typical_positive_ratio)
- r = r * self._freq_char / self._total_char
- if r >= 1.0:
- r = 0.99
- return r
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
deleted file mode 100644
index bdeef4e..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
+++ /dev/null
@@ -1,83 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetgroupprober import CharSetGroupProber
-from .hebrewprober import HebrewProber
-from .langbulgarianmodel import (ISO_8859_5_BULGARIAN_MODEL,
- WINDOWS_1251_BULGARIAN_MODEL)
-from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL
-from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL
-# from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL,
-# WINDOWS_1250_HUNGARIAN_MODEL)
-from .langrussianmodel import (IBM855_RUSSIAN_MODEL, IBM866_RUSSIAN_MODEL,
- ISO_8859_5_RUSSIAN_MODEL, KOI8_R_RUSSIAN_MODEL,
- MACCYRILLIC_RUSSIAN_MODEL,
- WINDOWS_1251_RUSSIAN_MODEL)
-from .langthaimodel import TIS_620_THAI_MODEL
-from .langturkishmodel import ISO_8859_9_TURKISH_MODEL
-from .sbcharsetprober import SingleByteCharSetProber
-
-
-class SBCSGroupProber(CharSetGroupProber):
- def __init__(self):
- super(SBCSGroupProber, self).__init__()
- hebrew_prober = HebrewProber()
- logical_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL,
- False, hebrew_prober)
- # TODO: See if using ISO-8859-8 Hebrew model works better here, since
- # it's actually the visual one
- visual_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL,
- True, hebrew_prober)
- hebrew_prober.set_model_probers(logical_hebrew_prober,
- visual_hebrew_prober)
- # TODO: ORDER MATTERS HERE. I changed the order vs what was in master
- # and several tests failed that did not before. Some thought
- # should be put into the ordering, and we should consider making
- # order not matter here, because that is very counter-intuitive.
- self.probers = [
- SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL),
- SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL),
- SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL),
- SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL),
- SingleByteCharSetProber(IBM866_RUSSIAN_MODEL),
- SingleByteCharSetProber(IBM855_RUSSIAN_MODEL),
- SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL),
- SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL),
- SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL),
- SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL),
- # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250)
- # after we retrain model.
- # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL),
- # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL),
- SingleByteCharSetProber(TIS_620_THAI_MODEL),
- SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL),
- hebrew_prober,
- logical_hebrew_prober,
- visual_hebrew_prober,
- ]
- self.reset()
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py
deleted file mode 100644
index 9e29623..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py
+++ /dev/null
@@ -1,92 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .mbcharsetprober import MultiByteCharSetProber
-from .codingstatemachine import CodingStateMachine
-from .chardistribution import SJISDistributionAnalysis
-from .jpcntx import SJISContextAnalysis
-from .mbcssm import SJIS_SM_MODEL
-from .enums import ProbingState, MachineState
-
-
-class SJISProber(MultiByteCharSetProber):
- def __init__(self):
- super(SJISProber, self).__init__()
- self.coding_sm = CodingStateMachine(SJIS_SM_MODEL)
- self.distribution_analyzer = SJISDistributionAnalysis()
- self.context_analyzer = SJISContextAnalysis()
- self.reset()
-
- def reset(self):
- super(SJISProber, self).reset()
- self.context_analyzer.reset()
-
- @property
- def charset_name(self):
- return self.context_analyzer.charset_name
-
- @property
- def language(self):
- return "Japanese"
-
- def feed(self, byte_str):
- for i in range(len(byte_str)):
- coding_state = self.coding_sm.next_state(byte_str[i])
- if coding_state == MachineState.ERROR:
- self.logger.debug('%s %s prober hit error at byte %s',
- self.charset_name, self.language, i)
- self._state = ProbingState.NOT_ME
- break
- elif coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- elif coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte_str[0]
- self.context_analyzer.feed(self._last_char[2 - char_len:],
- char_len)
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3
- - char_len], char_len)
- self.distribution_analyzer.feed(byte_str[i - 1:i + 1],
- char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if (self.context_analyzer.got_enough_data() and
- (self.get_confidence() > self.SHORTCUT_THRESHOLD)):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self):
- context_conf = self.context_analyzer.get_confidence()
- distrib_conf = self.distribution_analyzer.get_confidence()
- return max(context_conf, distrib_conf)
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py b/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py
deleted file mode 100644
index 055a8ac..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py
+++ /dev/null
@@ -1,286 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-"""
-Module containing the UniversalDetector detector class, which is the primary
-class a user of ``chardet`` should use.
-
-:author: Mark Pilgrim (initial port to Python)
-:author: Shy Shalom (original C code)
-:author: Dan Blanchard (major refactoring for 3.0)
-:author: Ian Cordasco
-"""
-
-
-import codecs
-import logging
-import re
-
-from .charsetgroupprober import CharSetGroupProber
-from .enums import InputState, LanguageFilter, ProbingState
-from .escprober import EscCharSetProber
-from .latin1prober import Latin1Prober
-from .mbcsgroupprober import MBCSGroupProber
-from .sbcsgroupprober import SBCSGroupProber
-
-
-class UniversalDetector(object):
- """
- The ``UniversalDetector`` class underlies the ``chardet.detect`` function
- and coordinates all of the different charset probers.
-
- To get a ``dict`` containing an encoding and its confidence, you can simply
- run:
-
- .. code::
-
- u = UniversalDetector()
- u.feed(some_bytes)
- u.close()
- detected = u.result
-
- """
-
- MINIMUM_THRESHOLD = 0.20
- HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]')
- ESC_DETECTOR = re.compile(b'(\033|~{)')
- WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]')
- ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252',
- 'iso-8859-2': 'Windows-1250',
- 'iso-8859-5': 'Windows-1251',
- 'iso-8859-6': 'Windows-1256',
- 'iso-8859-7': 'Windows-1253',
- 'iso-8859-8': 'Windows-1255',
- 'iso-8859-9': 'Windows-1254',
- 'iso-8859-13': 'Windows-1257'}
-
- def __init__(self, lang_filter=LanguageFilter.ALL):
- self._esc_charset_prober = None
- self._charset_probers = []
- self.result = None
- self.done = None
- self._got_data = None
- self._input_state = None
- self._last_char = None
- self.lang_filter = lang_filter
- self.logger = logging.getLogger(__name__)
- self._has_win_bytes = None
- self.reset()
-
- def reset(self):
- """
- Reset the UniversalDetector and all of its probers back to their
- initial states. This is called by ``__init__``, so you only need to
- call this directly in between analyses of different documents.
- """
- self.result = {'encoding': None, 'confidence': 0.0, 'language': None}
- self.done = False
- self._got_data = False
- self._has_win_bytes = False
- self._input_state = InputState.PURE_ASCII
- self._last_char = b''
- if self._esc_charset_prober:
- self._esc_charset_prober.reset()
- for prober in self._charset_probers:
- prober.reset()
-
- def feed(self, byte_str):
- """
- Takes a chunk of a document and feeds it through all of the relevant
- charset probers.
-
- After calling ``feed``, you can check the value of the ``done``
- attribute to see if you need to continue feeding the
- ``UniversalDetector`` more data, or if it has made a prediction
- (in the ``result`` attribute).
-
- .. note::
- You should always call ``close`` when you're done feeding in your
- document if ``done`` is not already ``True``.
- """
- if self.done:
- return
-
- if not len(byte_str):
- return
-
- if not isinstance(byte_str, bytearray):
- byte_str = bytearray(byte_str)
-
- # First check for known BOMs, since these are guaranteed to be correct
- if not self._got_data:
- # If the data starts with BOM, we know it is UTF
- if byte_str.startswith(codecs.BOM_UTF8):
- # EF BB BF UTF-8 with BOM
- self.result = {'encoding': "UTF-8-SIG",
- 'confidence': 1.0,
- 'language': ''}
- elif byte_str.startswith((codecs.BOM_UTF32_LE,
- codecs.BOM_UTF32_BE)):
- # FF FE 00 00 UTF-32, little-endian BOM
- # 00 00 FE FF UTF-32, big-endian BOM
- self.result = {'encoding': "UTF-32",
- 'confidence': 1.0,
- 'language': ''}
- elif byte_str.startswith(b'\xFE\xFF\x00\x00'):
- # FE FF 00 00 UCS-4, unusual octet order BOM (3412)
- self.result = {'encoding': "X-ISO-10646-UCS-4-3412",
- 'confidence': 1.0,
- 'language': ''}
- elif byte_str.startswith(b'\x00\x00\xFF\xFE'):
- # 00 00 FF FE UCS-4, unusual octet order BOM (2143)
- self.result = {'encoding': "X-ISO-10646-UCS-4-2143",
- 'confidence': 1.0,
- 'language': ''}
- elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)):
- # FF FE UTF-16, little endian BOM
- # FE FF UTF-16, big endian BOM
- self.result = {'encoding': "UTF-16",
- 'confidence': 1.0,
- 'language': ''}
-
- self._got_data = True
- if self.result['encoding'] is not None:
- self.done = True
- return
-
- # If none of those matched and we've only see ASCII so far, check
- # for high bytes and escape sequences
- if self._input_state == InputState.PURE_ASCII:
- if self.HIGH_BYTE_DETECTOR.search(byte_str):
- self._input_state = InputState.HIGH_BYTE
- elif self._input_state == InputState.PURE_ASCII and \
- self.ESC_DETECTOR.search(self._last_char + byte_str):
- self._input_state = InputState.ESC_ASCII
-
- self._last_char = byte_str[-1:]
-
- # If we've seen escape sequences, use the EscCharSetProber, which
- # uses a simple state machine to check for known escape sequences in
- # HZ and ISO-2022 encodings, since those are the only encodings that
- # use such sequences.
- if self._input_state == InputState.ESC_ASCII:
- if not self._esc_charset_prober:
- self._esc_charset_prober = EscCharSetProber(self.lang_filter)
- if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT:
- self.result = {'encoding':
- self._esc_charset_prober.charset_name,
- 'confidence':
- self._esc_charset_prober.get_confidence(),
- 'language':
- self._esc_charset_prober.language}
- self.done = True
- # If we've seen high bytes (i.e., those with values greater than 127),
- # we need to do more complicated checks using all our multi-byte and
- # single-byte probers that are left. The single-byte probers
- # use character bigram distributions to determine the encoding, whereas
- # the multi-byte probers use a combination of character unigram and
- # bigram distributions.
- elif self._input_state == InputState.HIGH_BYTE:
- if not self._charset_probers:
- self._charset_probers = [MBCSGroupProber(self.lang_filter)]
- # If we're checking non-CJK encodings, use single-byte prober
- if self.lang_filter & LanguageFilter.NON_CJK:
- self._charset_probers.append(SBCSGroupProber())
- self._charset_probers.append(Latin1Prober())
- for prober in self._charset_probers:
- if prober.feed(byte_str) == ProbingState.FOUND_IT:
- self.result = {'encoding': prober.charset_name,
- 'confidence': prober.get_confidence(),
- 'language': prober.language}
- self.done = True
- break
- if self.WIN_BYTE_DETECTOR.search(byte_str):
- self._has_win_bytes = True
-
- def close(self):
- """
- Stop analyzing the current document and come up with a final
- prediction.
-
- :returns: The ``result`` attribute, a ``dict`` with the keys
- `encoding`, `confidence`, and `language`.
- """
- # Don't bother with checks if we're already done
- if self.done:
- return self.result
- self.done = True
-
- if not self._got_data:
- self.logger.debug('no data received!')
-
- # Default to ASCII if it is all we've seen so far
- elif self._input_state == InputState.PURE_ASCII:
- self.result = {'encoding': 'ascii',
- 'confidence': 1.0,
- 'language': ''}
-
- # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD
- elif self._input_state == InputState.HIGH_BYTE:
- prober_confidence = None
- max_prober_confidence = 0.0
- max_prober = None
- for prober in self._charset_probers:
- if not prober:
- continue
- prober_confidence = prober.get_confidence()
- if prober_confidence > max_prober_confidence:
- max_prober_confidence = prober_confidence
- max_prober = prober
- if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD):
- charset_name = max_prober.charset_name
- lower_charset_name = max_prober.charset_name.lower()
- confidence = max_prober.get_confidence()
- # Use Windows encoding name instead of ISO-8859 if we saw any
- # extra Windows-specific bytes
- if lower_charset_name.startswith('iso-8859'):
- if self._has_win_bytes:
- charset_name = self.ISO_WIN_MAP.get(lower_charset_name,
- charset_name)
- self.result = {'encoding': charset_name,
- 'confidence': confidence,
- 'language': max_prober.language}
-
- # Log all prober confidences if none met MINIMUM_THRESHOLD
- if self.logger.getEffectiveLevel() <= logging.DEBUG:
- if self.result['encoding'] is None:
- self.logger.debug('no probers hit minimum threshold')
- for group_prober in self._charset_probers:
- if not group_prober:
- continue
- if isinstance(group_prober, CharSetGroupProber):
- for prober in group_prober.probers:
- self.logger.debug('%s %s confidence = %s',
- prober.charset_name,
- prober.language,
- prober.get_confidence())
- else:
- self.logger.debug('%s %s confidence = %s',
- group_prober.charset_name,
- group_prober.language,
- group_prober.get_confidence())
- return self.result
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py
deleted file mode 100644
index 6c3196c..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py
+++ /dev/null
@@ -1,82 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState, MachineState
-from .codingstatemachine import CodingStateMachine
-from .mbcssm import UTF8_SM_MODEL
-
-
-
-class UTF8Prober(CharSetProber):
- ONE_CHAR_PROB = 0.5
-
- def __init__(self):
- super(UTF8Prober, self).__init__()
- self.coding_sm = CodingStateMachine(UTF8_SM_MODEL)
- self._num_mb_chars = None
- self.reset()
-
- def reset(self):
- super(UTF8Prober, self).reset()
- self.coding_sm.reset()
- self._num_mb_chars = 0
-
- @property
- def charset_name(self):
- return "utf-8"
-
- @property
- def language(self):
- return ""
-
- def feed(self, byte_str):
- for c in byte_str:
- coding_state = self.coding_sm.next_state(c)
- if coding_state == MachineState.ERROR:
- self._state = ProbingState.NOT_ME
- break
- elif coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- elif coding_state == MachineState.START:
- if self.coding_sm.get_current_charlen() >= 2:
- self._num_mb_chars += 1
-
- if self.state == ProbingState.DETECTING:
- if self.get_confidence() > self.SHORTCUT_THRESHOLD:
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self):
- unlike = 0.99
- if self._num_mb_chars < 6:
- unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars
- return 1.0 - unlike
- else:
- return unlike
diff --git a/venv/Lib/site-packages/pip/_vendor/chardet/version.py b/venv/Lib/site-packages/pip/_vendor/chardet/version.py
deleted file mode 100644
index 70369b9..0000000
--- a/venv/Lib/site-packages/pip/_vendor/chardet/version.py
+++ /dev/null
@@ -1,9 +0,0 @@
-"""
-This module exists only to simplify retrieving the version number of chardet
-from within setup.py and from chardet subpackages.
-
-:author: Dan Blanchard (dan.blanchard@gmail.com)
-"""
-
-__version__ = "4.0.0"
-VERSION = __version__.split('.')
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py b/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py
deleted file mode 100644
index b149ed7..0000000
--- a/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-from .initialise import init, deinit, reinit, colorama_text
-from .ansi import Fore, Back, Style, Cursor
-from .ansitowin32 import AnsiToWin32
-
-__version__ = '0.4.4'
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index e060744..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc
deleted file mode 100644
index 8a4dba0..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc
deleted file mode 100644
index 9207b97..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc
deleted file mode 100644
index 525c0cb..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-39.pyc
deleted file mode 100644
index 2634142..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc
deleted file mode 100644
index 36f934c..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py b/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py
deleted file mode 100644
index 11ec695..0000000
--- a/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-'''
-This module generates ANSI character codes to printing colors to terminals.
-See: http://en.wikipedia.org/wiki/ANSI_escape_code
-'''
-
-CSI = '\033['
-OSC = '\033]'
-BEL = '\a'
-
-
-def code_to_chars(code):
- return CSI + str(code) + 'm'
-
-def set_title(title):
- return OSC + '2;' + title + BEL
-
-def clear_screen(mode=2):
- return CSI + str(mode) + 'J'
-
-def clear_line(mode=2):
- return CSI + str(mode) + 'K'
-
-
-class AnsiCodes(object):
- def __init__(self):
- # the subclasses declare class attributes which are numbers.
- # Upon instantiation we define instance attributes, which are the same
- # as the class attributes but wrapped with the ANSI escape sequence
- for name in dir(self):
- if not name.startswith('_'):
- value = getattr(self, name)
- setattr(self, name, code_to_chars(value))
-
-
-class AnsiCursor(object):
- def UP(self, n=1):
- return CSI + str(n) + 'A'
- def DOWN(self, n=1):
- return CSI + str(n) + 'B'
- def FORWARD(self, n=1):
- return CSI + str(n) + 'C'
- def BACK(self, n=1):
- return CSI + str(n) + 'D'
- def POS(self, x=1, y=1):
- return CSI + str(y) + ';' + str(x) + 'H'
-
-
-class AnsiFore(AnsiCodes):
- BLACK = 30
- RED = 31
- GREEN = 32
- YELLOW = 33
- BLUE = 34
- MAGENTA = 35
- CYAN = 36
- WHITE = 37
- RESET = 39
-
- # These are fairly well supported, but not part of the standard.
- LIGHTBLACK_EX = 90
- LIGHTRED_EX = 91
- LIGHTGREEN_EX = 92
- LIGHTYELLOW_EX = 93
- LIGHTBLUE_EX = 94
- LIGHTMAGENTA_EX = 95
- LIGHTCYAN_EX = 96
- LIGHTWHITE_EX = 97
-
-
-class AnsiBack(AnsiCodes):
- BLACK = 40
- RED = 41
- GREEN = 42
- YELLOW = 43
- BLUE = 44
- MAGENTA = 45
- CYAN = 46
- WHITE = 47
- RESET = 49
-
- # These are fairly well supported, but not part of the standard.
- LIGHTBLACK_EX = 100
- LIGHTRED_EX = 101
- LIGHTGREEN_EX = 102
- LIGHTYELLOW_EX = 103
- LIGHTBLUE_EX = 104
- LIGHTMAGENTA_EX = 105
- LIGHTCYAN_EX = 106
- LIGHTWHITE_EX = 107
-
-
-class AnsiStyle(AnsiCodes):
- BRIGHT = 1
- DIM = 2
- NORMAL = 22
- RESET_ALL = 0
-
-Fore = AnsiFore()
-Back = AnsiBack()
-Style = AnsiStyle()
-Cursor = AnsiCursor()
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py b/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py
deleted file mode 100644
index 6039a05..0000000
--- a/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py
+++ /dev/null
@@ -1,258 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import re
-import sys
-import os
-
-from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL
-from .winterm import WinTerm, WinColor, WinStyle
-from .win32 import windll, winapi_test
-
-
-winterm = None
-if windll is not None:
- winterm = WinTerm()
-
-
-class StreamWrapper(object):
- '''
- Wraps a stream (such as stdout), acting as a transparent proxy for all
- attribute access apart from method 'write()', which is delegated to our
- Converter instance.
- '''
- def __init__(self, wrapped, converter):
- # double-underscore everything to prevent clashes with names of
- # attributes on the wrapped stream object.
- self.__wrapped = wrapped
- self.__convertor = converter
-
- def __getattr__(self, name):
- return getattr(self.__wrapped, name)
-
- def __enter__(self, *args, **kwargs):
- # special method lookup bypasses __getattr__/__getattribute__, see
- # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit
- # thus, contextlib magic methods are not proxied via __getattr__
- return self.__wrapped.__enter__(*args, **kwargs)
-
- def __exit__(self, *args, **kwargs):
- return self.__wrapped.__exit__(*args, **kwargs)
-
- def write(self, text):
- self.__convertor.write(text)
-
- def isatty(self):
- stream = self.__wrapped
- if 'PYCHARM_HOSTED' in os.environ:
- if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__):
- return True
- try:
- stream_isatty = stream.isatty
- except AttributeError:
- return False
- else:
- return stream_isatty()
-
- @property
- def closed(self):
- stream = self.__wrapped
- try:
- return stream.closed
- except AttributeError:
- return True
-
-
-class AnsiToWin32(object):
- '''
- Implements a 'write()' method which, on Windows, will strip ANSI character
- sequences from the text, and if outputting to a tty, will convert them into
- win32 function calls.
- '''
- ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer
- ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command
-
- def __init__(self, wrapped, convert=None, strip=None, autoreset=False):
- # The wrapped stream (normally sys.stdout or sys.stderr)
- self.wrapped = wrapped
-
- # should we reset colors to defaults after every .write()
- self.autoreset = autoreset
-
- # create the proxy wrapping our output stream
- self.stream = StreamWrapper(wrapped, self)
-
- on_windows = os.name == 'nt'
- # We test if the WinAPI works, because even if we are on Windows
- # we may be using a terminal that doesn't support the WinAPI
- # (e.g. Cygwin Terminal). In this case it's up to the terminal
- # to support the ANSI codes.
- conversion_supported = on_windows and winapi_test()
-
- # should we strip ANSI sequences from our output?
- if strip is None:
- strip = conversion_supported or (not self.stream.closed and not self.stream.isatty())
- self.strip = strip
-
- # should we should convert ANSI sequences into win32 calls?
- if convert is None:
- convert = conversion_supported and not self.stream.closed and self.stream.isatty()
- self.convert = convert
-
- # dict of ansi codes to win32 functions and parameters
- self.win32_calls = self.get_win32_calls()
-
- # are we wrapping stderr?
- self.on_stderr = self.wrapped is sys.stderr
-
- def should_wrap(self):
- '''
- True if this class is actually needed. If false, then the output
- stream will not be affected, nor will win32 calls be issued, so
- wrapping stdout is not actually required. This will generally be
- False on non-Windows platforms, unless optional functionality like
- autoreset has been requested using kwargs to init()
- '''
- return self.convert or self.strip or self.autoreset
-
- def get_win32_calls(self):
- if self.convert and winterm:
- return {
- AnsiStyle.RESET_ALL: (winterm.reset_all, ),
- AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),
- AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),
- AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),
- AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),
- AnsiFore.RED: (winterm.fore, WinColor.RED),
- AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),
- AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),
- AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),
- AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),
- AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),
- AnsiFore.WHITE: (winterm.fore, WinColor.GREY),
- AnsiFore.RESET: (winterm.fore, ),
- AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True),
- AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True),
- AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True),
- AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True),
- AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True),
- AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True),
- AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True),
- AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True),
- AnsiBack.BLACK: (winterm.back, WinColor.BLACK),
- AnsiBack.RED: (winterm.back, WinColor.RED),
- AnsiBack.GREEN: (winterm.back, WinColor.GREEN),
- AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),
- AnsiBack.BLUE: (winterm.back, WinColor.BLUE),
- AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),
- AnsiBack.CYAN: (winterm.back, WinColor.CYAN),
- AnsiBack.WHITE: (winterm.back, WinColor.GREY),
- AnsiBack.RESET: (winterm.back, ),
- AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True),
- AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True),
- AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True),
- AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True),
- AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True),
- AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True),
- AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True),
- AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True),
- }
- return dict()
-
- def write(self, text):
- if self.strip or self.convert:
- self.write_and_convert(text)
- else:
- self.wrapped.write(text)
- self.wrapped.flush()
- if self.autoreset:
- self.reset_all()
-
-
- def reset_all(self):
- if self.convert:
- self.call_win32('m', (0,))
- elif not self.strip and not self.stream.closed:
- self.wrapped.write(Style.RESET_ALL)
-
-
- def write_and_convert(self, text):
- '''
- Write the given text to our wrapped stream, stripping any ANSI
- sequences from the text, and optionally converting them into win32
- calls.
- '''
- cursor = 0
- text = self.convert_osc(text)
- for match in self.ANSI_CSI_RE.finditer(text):
- start, end = match.span()
- self.write_plain_text(text, cursor, start)
- self.convert_ansi(*match.groups())
- cursor = end
- self.write_plain_text(text, cursor, len(text))
-
-
- def write_plain_text(self, text, start, end):
- if start < end:
- self.wrapped.write(text[start:end])
- self.wrapped.flush()
-
-
- def convert_ansi(self, paramstring, command):
- if self.convert:
- params = self.extract_params(command, paramstring)
- self.call_win32(command, params)
-
-
- def extract_params(self, command, paramstring):
- if command in 'Hf':
- params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';'))
- while len(params) < 2:
- # defaults:
- params = params + (1,)
- else:
- params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0)
- if len(params) == 0:
- # defaults:
- if command in 'JKm':
- params = (0,)
- elif command in 'ABCD':
- params = (1,)
-
- return params
-
-
- def call_win32(self, command, params):
- if command == 'm':
- for param in params:
- if param in self.win32_calls:
- func_args = self.win32_calls[param]
- func = func_args[0]
- args = func_args[1:]
- kwargs = dict(on_stderr=self.on_stderr)
- func(*args, **kwargs)
- elif command in 'J':
- winterm.erase_screen(params[0], on_stderr=self.on_stderr)
- elif command in 'K':
- winterm.erase_line(params[0], on_stderr=self.on_stderr)
- elif command in 'Hf': # cursor position - absolute
- winterm.set_cursor_position(params, on_stderr=self.on_stderr)
- elif command in 'ABCD': # cursor position - relative
- n = params[0]
- # A - up, B - down, C - forward, D - back
- x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command]
- winterm.cursor_adjust(x, y, on_stderr=self.on_stderr)
-
-
- def convert_osc(self, text):
- for match in self.ANSI_OSC_RE.finditer(text):
- start, end = match.span()
- text = text[:start] + text[end:]
- paramstring, command = match.groups()
- if command == BEL:
- if paramstring.count(";") == 1:
- params = paramstring.split(";")
- # 0 - change title and icon (we will only change title)
- # 1 - change icon (we don't support this)
- # 2 - change title
- if params[0] in '02':
- winterm.set_title(params[1])
- return text
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py b/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py
deleted file mode 100644
index 430d066..0000000
--- a/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import atexit
-import contextlib
-import sys
-
-from .ansitowin32 import AnsiToWin32
-
-
-orig_stdout = None
-orig_stderr = None
-
-wrapped_stdout = None
-wrapped_stderr = None
-
-atexit_done = False
-
-
-def reset_all():
- if AnsiToWin32 is not None: # Issue #74: objects might become None at exit
- AnsiToWin32(orig_stdout).reset_all()
-
-
-def init(autoreset=False, convert=None, strip=None, wrap=True):
-
- if not wrap and any([autoreset, convert, strip]):
- raise ValueError('wrap=False conflicts with any other arg=True')
-
- global wrapped_stdout, wrapped_stderr
- global orig_stdout, orig_stderr
-
- orig_stdout = sys.stdout
- orig_stderr = sys.stderr
-
- if sys.stdout is None:
- wrapped_stdout = None
- else:
- sys.stdout = wrapped_stdout = \
- wrap_stream(orig_stdout, convert, strip, autoreset, wrap)
- if sys.stderr is None:
- wrapped_stderr = None
- else:
- sys.stderr = wrapped_stderr = \
- wrap_stream(orig_stderr, convert, strip, autoreset, wrap)
-
- global atexit_done
- if not atexit_done:
- atexit.register(reset_all)
- atexit_done = True
-
-
-def deinit():
- if orig_stdout is not None:
- sys.stdout = orig_stdout
- if orig_stderr is not None:
- sys.stderr = orig_stderr
-
-
-@contextlib.contextmanager
-def colorama_text(*args, **kwargs):
- init(*args, **kwargs)
- try:
- yield
- finally:
- deinit()
-
-
-def reinit():
- if wrapped_stdout is not None:
- sys.stdout = wrapped_stdout
- if wrapped_stderr is not None:
- sys.stderr = wrapped_stderr
-
-
-def wrap_stream(stream, convert, strip, autoreset, wrap):
- if wrap:
- wrapper = AnsiToWin32(stream,
- convert=convert, strip=strip, autoreset=autoreset)
- if wrapper.should_wrap():
- stream = wrapper.stream
- return stream
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/win32.py b/venv/Lib/site-packages/pip/_vendor/colorama/win32.py
deleted file mode 100644
index c2d8360..0000000
--- a/venv/Lib/site-packages/pip/_vendor/colorama/win32.py
+++ /dev/null
@@ -1,152 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-
-# from winbase.h
-STDOUT = -11
-STDERR = -12
-
-try:
- import ctypes
- from ctypes import LibraryLoader
- windll = LibraryLoader(ctypes.WinDLL)
- from ctypes import wintypes
-except (AttributeError, ImportError):
- windll = None
- SetConsoleTextAttribute = lambda *_: None
- winapi_test = lambda *_: None
-else:
- from ctypes import byref, Structure, c_char, POINTER
-
- COORD = wintypes._COORD
-
- class CONSOLE_SCREEN_BUFFER_INFO(Structure):
- """struct in wincon.h."""
- _fields_ = [
- ("dwSize", COORD),
- ("dwCursorPosition", COORD),
- ("wAttributes", wintypes.WORD),
- ("srWindow", wintypes.SMALL_RECT),
- ("dwMaximumWindowSize", COORD),
- ]
- def __str__(self):
- return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (
- self.dwSize.Y, self.dwSize.X
- , self.dwCursorPosition.Y, self.dwCursorPosition.X
- , self.wAttributes
- , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right
- , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X
- )
-
- _GetStdHandle = windll.kernel32.GetStdHandle
- _GetStdHandle.argtypes = [
- wintypes.DWORD,
- ]
- _GetStdHandle.restype = wintypes.HANDLE
-
- _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo
- _GetConsoleScreenBufferInfo.argtypes = [
- wintypes.HANDLE,
- POINTER(CONSOLE_SCREEN_BUFFER_INFO),
- ]
- _GetConsoleScreenBufferInfo.restype = wintypes.BOOL
-
- _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
- _SetConsoleTextAttribute.argtypes = [
- wintypes.HANDLE,
- wintypes.WORD,
- ]
- _SetConsoleTextAttribute.restype = wintypes.BOOL
-
- _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition
- _SetConsoleCursorPosition.argtypes = [
- wintypes.HANDLE,
- COORD,
- ]
- _SetConsoleCursorPosition.restype = wintypes.BOOL
-
- _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA
- _FillConsoleOutputCharacterA.argtypes = [
- wintypes.HANDLE,
- c_char,
- wintypes.DWORD,
- COORD,
- POINTER(wintypes.DWORD),
- ]
- _FillConsoleOutputCharacterA.restype = wintypes.BOOL
-
- _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute
- _FillConsoleOutputAttribute.argtypes = [
- wintypes.HANDLE,
- wintypes.WORD,
- wintypes.DWORD,
- COORD,
- POINTER(wintypes.DWORD),
- ]
- _FillConsoleOutputAttribute.restype = wintypes.BOOL
-
- _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW
- _SetConsoleTitleW.argtypes = [
- wintypes.LPCWSTR
- ]
- _SetConsoleTitleW.restype = wintypes.BOOL
-
- def _winapi_test(handle):
- csbi = CONSOLE_SCREEN_BUFFER_INFO()
- success = _GetConsoleScreenBufferInfo(
- handle, byref(csbi))
- return bool(success)
-
- def winapi_test():
- return any(_winapi_test(h) for h in
- (_GetStdHandle(STDOUT), _GetStdHandle(STDERR)))
-
- def GetConsoleScreenBufferInfo(stream_id=STDOUT):
- handle = _GetStdHandle(stream_id)
- csbi = CONSOLE_SCREEN_BUFFER_INFO()
- success = _GetConsoleScreenBufferInfo(
- handle, byref(csbi))
- return csbi
-
- def SetConsoleTextAttribute(stream_id, attrs):
- handle = _GetStdHandle(stream_id)
- return _SetConsoleTextAttribute(handle, attrs)
-
- def SetConsoleCursorPosition(stream_id, position, adjust=True):
- position = COORD(*position)
- # If the position is out of range, do nothing.
- if position.Y <= 0 or position.X <= 0:
- return
- # Adjust for Windows' SetConsoleCursorPosition:
- # 1. being 0-based, while ANSI is 1-based.
- # 2. expecting (x,y), while ANSI uses (y,x).
- adjusted_position = COORD(position.Y - 1, position.X - 1)
- if adjust:
- # Adjust for viewport's scroll position
- sr = GetConsoleScreenBufferInfo(STDOUT).srWindow
- adjusted_position.Y += sr.Top
- adjusted_position.X += sr.Left
- # Resume normal processing
- handle = _GetStdHandle(stream_id)
- return _SetConsoleCursorPosition(handle, adjusted_position)
-
- def FillConsoleOutputCharacter(stream_id, char, length, start):
- handle = _GetStdHandle(stream_id)
- char = c_char(char.encode())
- length = wintypes.DWORD(length)
- num_written = wintypes.DWORD(0)
- # Note that this is hard-coded for ANSI (vs wide) bytes.
- success = _FillConsoleOutputCharacterA(
- handle, char, length, start, byref(num_written))
- return num_written.value
-
- def FillConsoleOutputAttribute(stream_id, attr, length, start):
- ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )'''
- handle = _GetStdHandle(stream_id)
- attribute = wintypes.WORD(attr)
- length = wintypes.DWORD(length)
- num_written = wintypes.DWORD(0)
- # Note that this is hard-coded for ANSI (vs wide) bytes.
- return _FillConsoleOutputAttribute(
- handle, attribute, length, start, byref(num_written))
-
- def SetConsoleTitle(title):
- return _SetConsoleTitleW(title)
diff --git a/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py b/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py
deleted file mode 100644
index 0fdb4ec..0000000
--- a/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py
+++ /dev/null
@@ -1,169 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-from . import win32
-
-
-# from wincon.h
-class WinColor(object):
- BLACK = 0
- BLUE = 1
- GREEN = 2
- CYAN = 3
- RED = 4
- MAGENTA = 5
- YELLOW = 6
- GREY = 7
-
-# from wincon.h
-class WinStyle(object):
- NORMAL = 0x00 # dim text, dim background
- BRIGHT = 0x08 # bright text, dim background
- BRIGHT_BACKGROUND = 0x80 # dim text, bright background
-
-class WinTerm(object):
-
- def __init__(self):
- self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes
- self.set_attrs(self._default)
- self._default_fore = self._fore
- self._default_back = self._back
- self._default_style = self._style
- # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style.
- # So that LIGHT_EX colors and BRIGHT style do not clobber each other,
- # we track them separately, since LIGHT_EX is overwritten by Fore/Back
- # and BRIGHT is overwritten by Style codes.
- self._light = 0
-
- def get_attrs(self):
- return self._fore + self._back * 16 + (self._style | self._light)
-
- def set_attrs(self, value):
- self._fore = value & 7
- self._back = (value >> 4) & 7
- self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND)
-
- def reset_all(self, on_stderr=None):
- self.set_attrs(self._default)
- self.set_console(attrs=self._default)
- self._light = 0
-
- def fore(self, fore=None, light=False, on_stderr=False):
- if fore is None:
- fore = self._default_fore
- self._fore = fore
- # Emulate LIGHT_EX with BRIGHT Style
- if light:
- self._light |= WinStyle.BRIGHT
- else:
- self._light &= ~WinStyle.BRIGHT
- self.set_console(on_stderr=on_stderr)
-
- def back(self, back=None, light=False, on_stderr=False):
- if back is None:
- back = self._default_back
- self._back = back
- # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style
- if light:
- self._light |= WinStyle.BRIGHT_BACKGROUND
- else:
- self._light &= ~WinStyle.BRIGHT_BACKGROUND
- self.set_console(on_stderr=on_stderr)
-
- def style(self, style=None, on_stderr=False):
- if style is None:
- style = self._default_style
- self._style = style
- self.set_console(on_stderr=on_stderr)
-
- def set_console(self, attrs=None, on_stderr=False):
- if attrs is None:
- attrs = self.get_attrs()
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- win32.SetConsoleTextAttribute(handle, attrs)
-
- def get_position(self, handle):
- position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition
- # Because Windows coordinates are 0-based,
- # and win32.SetConsoleCursorPosition expects 1-based.
- position.X += 1
- position.Y += 1
- return position
-
- def set_cursor_position(self, position=None, on_stderr=False):
- if position is None:
- # I'm not currently tracking the position, so there is no default.
- # position = self.get_position()
- return
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- win32.SetConsoleCursorPosition(handle, position)
-
- def cursor_adjust(self, x, y, on_stderr=False):
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- position = self.get_position(handle)
- adjusted_position = (position.Y + y, position.X + x)
- win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False)
-
- def erase_screen(self, mode=0, on_stderr=False):
- # 0 should clear from the cursor to the end of the screen.
- # 1 should clear from the cursor to the beginning of the screen.
- # 2 should clear the entire screen, and move cursor to (1,1)
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- csbi = win32.GetConsoleScreenBufferInfo(handle)
- # get the number of character cells in the current buffer
- cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y
- # get number of character cells before current cursor position
- cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X
- if mode == 0:
- from_coord = csbi.dwCursorPosition
- cells_to_erase = cells_in_screen - cells_before_cursor
- elif mode == 1:
- from_coord = win32.COORD(0, 0)
- cells_to_erase = cells_before_cursor
- elif mode == 2:
- from_coord = win32.COORD(0, 0)
- cells_to_erase = cells_in_screen
- else:
- # invalid mode
- return
- # fill the entire screen with blanks
- win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
- # now set the buffer's attributes accordingly
- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
- if mode == 2:
- # put the cursor where needed
- win32.SetConsoleCursorPosition(handle, (1, 1))
-
- def erase_line(self, mode=0, on_stderr=False):
- # 0 should clear from the cursor to the end of the line.
- # 1 should clear from the cursor to the beginning of the line.
- # 2 should clear the entire line.
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- csbi = win32.GetConsoleScreenBufferInfo(handle)
- if mode == 0:
- from_coord = csbi.dwCursorPosition
- cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X
- elif mode == 1:
- from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
- cells_to_erase = csbi.dwCursorPosition.X
- elif mode == 2:
- from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
- cells_to_erase = csbi.dwSize.X
- else:
- # invalid mode
- return
- # fill the entire screen with blanks
- win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
- # now set the buffer's attributes accordingly
- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
-
- def set_title(self, title):
- win32.SetConsoleTitle(title)
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py b/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py
deleted file mode 100644
index 63d916e..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2019 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-import logging
-
-__version__ = '0.3.1'
-
-class DistlibException(Exception):
- pass
-
-try:
- from logging import NullHandler
-except ImportError: # pragma: no cover
- class NullHandler(logging.Handler):
- def handle(self, record): pass
- def emit(self, record): pass
- def createLock(self): self.lock = None
-
-logger = logging.getLogger(__name__)
-logger.addHandler(NullHandler())
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc
deleted file mode 100644
index 497cc7e..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-39.pyc
deleted file mode 100644
index e30425f..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc
deleted file mode 100644
index bed39a5..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc
deleted file mode 100644
index daf8584..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc b/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc
deleted file mode 100644
index 883e292..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py
deleted file mode 100644
index f7dbf4c..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-"""Modules copied from Python 3 standard libraries, for internal use only.
-
-Individual classes and functions are found in d2._backport.misc. Intended
-usage is to always import things missing from 3.1 from that module: the
-built-in/stdlib objects will be used if found.
-"""
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py
deleted file mode 100644
index cfb318d..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""Backports for individual classes and functions."""
-
-import os
-import sys
-
-__all__ = ['cache_from_source', 'callable', 'fsencode']
-
-
-try:
- from imp import cache_from_source
-except ImportError:
- def cache_from_source(py_file, debug=__debug__):
- ext = debug and 'c' or 'o'
- return py_file + ext
-
-
-try:
- callable = callable
-except NameError:
- from collections import Callable
-
- def callable(obj):
- return isinstance(obj, Callable)
-
-
-try:
- fsencode = os.fsencode
-except AttributeError:
- def fsencode(filename):
- if isinstance(filename, bytes):
- return filename
- elif isinstance(filename, str):
- return filename.encode(sys.getfilesystemencoding())
- else:
- raise TypeError("expect bytes or str, not %s" %
- type(filename).__name__)
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py
deleted file mode 100644
index 10ed362..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py
+++ /dev/null
@@ -1,764 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""Utility functions for copying and archiving files and directory trees.
-
-XXX The functions here don't copy the resource fork or other metadata on Mac.
-
-"""
-
-import os
-import sys
-import stat
-from os.path import abspath
-import fnmatch
-try:
- from collections.abc import Callable
-except ImportError:
- from collections import Callable
-import errno
-from . import tarfile
-
-try:
- import bz2
- _BZ2_SUPPORTED = True
-except ImportError:
- _BZ2_SUPPORTED = False
-
-try:
- from pwd import getpwnam
-except ImportError:
- getpwnam = None
-
-try:
- from grp import getgrnam
-except ImportError:
- getgrnam = None
-
-__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2",
- "copytree", "move", "rmtree", "Error", "SpecialFileError",
- "ExecError", "make_archive", "get_archive_formats",
- "register_archive_format", "unregister_archive_format",
- "get_unpack_formats", "register_unpack_format",
- "unregister_unpack_format", "unpack_archive", "ignore_patterns"]
-
-class Error(EnvironmentError):
- pass
-
-class SpecialFileError(EnvironmentError):
- """Raised when trying to do a kind of operation (e.g. copying) which is
- not supported on a special file (e.g. a named pipe)"""
-
-class ExecError(EnvironmentError):
- """Raised when a command could not be executed"""
-
-class ReadError(EnvironmentError):
- """Raised when an archive cannot be read"""
-
-class RegistryError(Exception):
- """Raised when a registry operation with the archiving
- and unpacking registries fails"""
-
-
-try:
- WindowsError
-except NameError:
- WindowsError = None
-
-def copyfileobj(fsrc, fdst, length=16*1024):
- """copy data from file-like object fsrc to file-like object fdst"""
- while 1:
- buf = fsrc.read(length)
- if not buf:
- break
- fdst.write(buf)
-
-def _samefile(src, dst):
- # Macintosh, Unix.
- if hasattr(os.path, 'samefile'):
- try:
- return os.path.samefile(src, dst)
- except OSError:
- return False
-
- # All other platforms: check for same pathname.
- return (os.path.normcase(os.path.abspath(src)) ==
- os.path.normcase(os.path.abspath(dst)))
-
-def copyfile(src, dst):
- """Copy data from src to dst"""
- if _samefile(src, dst):
- raise Error("`%s` and `%s` are the same file" % (src, dst))
-
- for fn in [src, dst]:
- try:
- st = os.stat(fn)
- except OSError:
- # File most likely does not exist
- pass
- else:
- # XXX What about other special files? (sockets, devices...)
- if stat.S_ISFIFO(st.st_mode):
- raise SpecialFileError("`%s` is a named pipe" % fn)
-
- with open(src, 'rb') as fsrc:
- with open(dst, 'wb') as fdst:
- copyfileobj(fsrc, fdst)
-
-def copymode(src, dst):
- """Copy mode bits from src to dst"""
- if hasattr(os, 'chmod'):
- st = os.stat(src)
- mode = stat.S_IMODE(st.st_mode)
- os.chmod(dst, mode)
-
-def copystat(src, dst):
- """Copy all stat info (mode bits, atime, mtime, flags) from src to dst"""
- st = os.stat(src)
- mode = stat.S_IMODE(st.st_mode)
- if hasattr(os, 'utime'):
- os.utime(dst, (st.st_atime, st.st_mtime))
- if hasattr(os, 'chmod'):
- os.chmod(dst, mode)
- if hasattr(os, 'chflags') and hasattr(st, 'st_flags'):
- try:
- os.chflags(dst, st.st_flags)
- except OSError as why:
- if (not hasattr(errno, 'EOPNOTSUPP') or
- why.errno != errno.EOPNOTSUPP):
- raise
-
-def copy(src, dst):
- """Copy data and mode bits ("cp src dst").
-
- The destination may be a directory.
-
- """
- if os.path.isdir(dst):
- dst = os.path.join(dst, os.path.basename(src))
- copyfile(src, dst)
- copymode(src, dst)
-
-def copy2(src, dst):
- """Copy data and all stat info ("cp -p src dst").
-
- The destination may be a directory.
-
- """
- if os.path.isdir(dst):
- dst = os.path.join(dst, os.path.basename(src))
- copyfile(src, dst)
- copystat(src, dst)
-
-def ignore_patterns(*patterns):
- """Function that can be used as copytree() ignore parameter.
-
- Patterns is a sequence of glob-style patterns
- that are used to exclude files"""
- def _ignore_patterns(path, names):
- ignored_names = []
- for pattern in patterns:
- ignored_names.extend(fnmatch.filter(names, pattern))
- return set(ignored_names)
- return _ignore_patterns
-
-def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
- ignore_dangling_symlinks=False):
- """Recursively copy a directory tree.
-
- The destination directory must not already exist.
- If exception(s) occur, an Error is raised with a list of reasons.
-
- If the optional symlinks flag is true, symbolic links in the
- source tree result in symbolic links in the destination tree; if
- it is false, the contents of the files pointed to by symbolic
- links are copied. If the file pointed by the symlink doesn't
- exist, an exception will be added in the list of errors raised in
- an Error exception at the end of the copy process.
-
- You can set the optional ignore_dangling_symlinks flag to true if you
- want to silence this exception. Notice that this has no effect on
- platforms that don't support os.symlink.
-
- The optional ignore argument is a callable. If given, it
- is called with the `src` parameter, which is the directory
- being visited by copytree(), and `names` which is the list of
- `src` contents, as returned by os.listdir():
-
- callable(src, names) -> ignored_names
-
- Since copytree() is called recursively, the callable will be
- called once for each directory that is copied. It returns a
- list of names relative to the `src` directory that should
- not be copied.
-
- The optional copy_function argument is a callable that will be used
- to copy each file. It will be called with the source path and the
- destination path as arguments. By default, copy2() is used, but any
- function that supports the same signature (like copy()) can be used.
-
- """
- names = os.listdir(src)
- if ignore is not None:
- ignored_names = ignore(src, names)
- else:
- ignored_names = set()
-
- os.makedirs(dst)
- errors = []
- for name in names:
- if name in ignored_names:
- continue
- srcname = os.path.join(src, name)
- dstname = os.path.join(dst, name)
- try:
- if os.path.islink(srcname):
- linkto = os.readlink(srcname)
- if symlinks:
- os.symlink(linkto, dstname)
- else:
- # ignore dangling symlink if the flag is on
- if not os.path.exists(linkto) and ignore_dangling_symlinks:
- continue
- # otherwise let the copy occurs. copy2 will raise an error
- copy_function(srcname, dstname)
- elif os.path.isdir(srcname):
- copytree(srcname, dstname, symlinks, ignore, copy_function)
- else:
- # Will raise a SpecialFileError for unsupported file types
- copy_function(srcname, dstname)
- # catch the Error from the recursive copytree so that we can
- # continue with other files
- except Error as err:
- errors.extend(err.args[0])
- except EnvironmentError as why:
- errors.append((srcname, dstname, str(why)))
- try:
- copystat(src, dst)
- except OSError as why:
- if WindowsError is not None and isinstance(why, WindowsError):
- # Copying file access times may fail on Windows
- pass
- else:
- errors.extend((src, dst, str(why)))
- if errors:
- raise Error(errors)
-
-def rmtree(path, ignore_errors=False, onerror=None):
- """Recursively delete a directory tree.
-
- If ignore_errors is set, errors are ignored; otherwise, if onerror
- is set, it is called to handle the error with arguments (func,
- path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
- path is the argument to that function that caused it to fail; and
- exc_info is a tuple returned by sys.exc_info(). If ignore_errors
- is false and onerror is None, an exception is raised.
-
- """
- if ignore_errors:
- def onerror(*args):
- pass
- elif onerror is None:
- def onerror(*args):
- raise
- try:
- if os.path.islink(path):
- # symlinks to directories are forbidden, see bug #1669
- raise OSError("Cannot call rmtree on a symbolic link")
- except OSError:
- onerror(os.path.islink, path, sys.exc_info())
- # can't continue even if onerror hook returns
- return
- names = []
- try:
- names = os.listdir(path)
- except os.error:
- onerror(os.listdir, path, sys.exc_info())
- for name in names:
- fullname = os.path.join(path, name)
- try:
- mode = os.lstat(fullname).st_mode
- except os.error:
- mode = 0
- if stat.S_ISDIR(mode):
- rmtree(fullname, ignore_errors, onerror)
- else:
- try:
- os.remove(fullname)
- except os.error:
- onerror(os.remove, fullname, sys.exc_info())
- try:
- os.rmdir(path)
- except os.error:
- onerror(os.rmdir, path, sys.exc_info())
-
-
-def _basename(path):
- # A basename() variant which first strips the trailing slash, if present.
- # Thus we always get the last component of the path, even for directories.
- return os.path.basename(path.rstrip(os.path.sep))
-
-def move(src, dst):
- """Recursively move a file or directory to another location. This is
- similar to the Unix "mv" command.
-
- If the destination is a directory or a symlink to a directory, the source
- is moved inside the directory. The destination path must not already
- exist.
-
- If the destination already exists but is not a directory, it may be
- overwritten depending on os.rename() semantics.
-
- If the destination is on our current filesystem, then rename() is used.
- Otherwise, src is copied to the destination and then removed.
- A lot more could be done here... A look at a mv.c shows a lot of
- the issues this implementation glosses over.
-
- """
- real_dst = dst
- if os.path.isdir(dst):
- if _samefile(src, dst):
- # We might be on a case insensitive filesystem,
- # perform the rename anyway.
- os.rename(src, dst)
- return
-
- real_dst = os.path.join(dst, _basename(src))
- if os.path.exists(real_dst):
- raise Error("Destination path '%s' already exists" % real_dst)
- try:
- os.rename(src, real_dst)
- except OSError:
- if os.path.isdir(src):
- if _destinsrc(src, dst):
- raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst))
- copytree(src, real_dst, symlinks=True)
- rmtree(src)
- else:
- copy2(src, real_dst)
- os.unlink(src)
-
-def _destinsrc(src, dst):
- src = abspath(src)
- dst = abspath(dst)
- if not src.endswith(os.path.sep):
- src += os.path.sep
- if not dst.endswith(os.path.sep):
- dst += os.path.sep
- return dst.startswith(src)
-
-def _get_gid(name):
- """Returns a gid, given a group name."""
- if getgrnam is None or name is None:
- return None
- try:
- result = getgrnam(name)
- except KeyError:
- result = None
- if result is not None:
- return result[2]
- return None
-
-def _get_uid(name):
- """Returns an uid, given a user name."""
- if getpwnam is None or name is None:
- return None
- try:
- result = getpwnam(name)
- except KeyError:
- result = None
- if result is not None:
- return result[2]
- return None
-
-def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0,
- owner=None, group=None, logger=None):
- """Create a (possibly compressed) tar file from all the files under
- 'base_dir'.
-
- 'compress' must be "gzip" (the default), "bzip2", or None.
-
- 'owner' and 'group' can be used to define an owner and a group for the
- archive that is being built. If not provided, the current owner and group
- will be used.
-
- The output tar file will be named 'base_name' + ".tar", possibly plus
- the appropriate compression extension (".gz", or ".bz2").
-
- Returns the output filename.
- """
- tar_compression = {'gzip': 'gz', None: ''}
- compress_ext = {'gzip': '.gz'}
-
- if _BZ2_SUPPORTED:
- tar_compression['bzip2'] = 'bz2'
- compress_ext['bzip2'] = '.bz2'
-
- # flags for compression program, each element of list will be an argument
- if compress is not None and compress not in compress_ext:
- raise ValueError("bad value for 'compress', or compression format not "
- "supported : {0}".format(compress))
-
- archive_name = base_name + '.tar' + compress_ext.get(compress, '')
- archive_dir = os.path.dirname(archive_name)
-
- if not os.path.exists(archive_dir):
- if logger is not None:
- logger.info("creating %s", archive_dir)
- if not dry_run:
- os.makedirs(archive_dir)
-
- # creating the tarball
- if logger is not None:
- logger.info('Creating tar archive')
-
- uid = _get_uid(owner)
- gid = _get_gid(group)
-
- def _set_uid_gid(tarinfo):
- if gid is not None:
- tarinfo.gid = gid
- tarinfo.gname = group
- if uid is not None:
- tarinfo.uid = uid
- tarinfo.uname = owner
- return tarinfo
-
- if not dry_run:
- tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress])
- try:
- tar.add(base_dir, filter=_set_uid_gid)
- finally:
- tar.close()
-
- return archive_name
-
-def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False):
- # XXX see if we want to keep an external call here
- if verbose:
- zipoptions = "-r"
- else:
- zipoptions = "-rq"
- from distutils.errors import DistutilsExecError
- from distutils.spawn import spawn
- try:
- spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run)
- except DistutilsExecError:
- # XXX really should distinguish between "couldn't find
- # external 'zip' command" and "zip failed".
- raise ExecError("unable to create zip file '%s': "
- "could neither import the 'zipfile' module nor "
- "find a standalone zip utility") % zip_filename
-
-def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None):
- """Create a zip file from all the files under 'base_dir'.
-
- The output zip file will be named 'base_name' + ".zip". Uses either the
- "zipfile" Python module (if available) or the InfoZIP "zip" utility
- (if installed and found on the default search path). If neither tool is
- available, raises ExecError. Returns the name of the output zip
- file.
- """
- zip_filename = base_name + ".zip"
- archive_dir = os.path.dirname(base_name)
-
- if not os.path.exists(archive_dir):
- if logger is not None:
- logger.info("creating %s", archive_dir)
- if not dry_run:
- os.makedirs(archive_dir)
-
- # If zipfile module is not available, try spawning an external 'zip'
- # command.
- try:
- import zipfile
- except ImportError:
- zipfile = None
-
- if zipfile is None:
- _call_external_zip(base_dir, zip_filename, verbose, dry_run)
- else:
- if logger is not None:
- logger.info("creating '%s' and adding '%s' to it",
- zip_filename, base_dir)
-
- if not dry_run:
- zip = zipfile.ZipFile(zip_filename, "w",
- compression=zipfile.ZIP_DEFLATED)
-
- for dirpath, dirnames, filenames in os.walk(base_dir):
- for name in filenames:
- path = os.path.normpath(os.path.join(dirpath, name))
- if os.path.isfile(path):
- zip.write(path, path)
- if logger is not None:
- logger.info("adding '%s'", path)
- zip.close()
-
- return zip_filename
-
-_ARCHIVE_FORMATS = {
- 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"),
- 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"),
- 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"),
- 'zip': (_make_zipfile, [], "ZIP file"),
- }
-
-if _BZ2_SUPPORTED:
- _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')],
- "bzip2'ed tar-file")
-
-def get_archive_formats():
- """Returns a list of supported formats for archiving and unarchiving.
-
- Each element of the returned sequence is a tuple (name, description)
- """
- formats = [(name, registry[2]) for name, registry in
- _ARCHIVE_FORMATS.items()]
- formats.sort()
- return formats
-
-def register_archive_format(name, function, extra_args=None, description=''):
- """Registers an archive format.
-
- name is the name of the format. function is the callable that will be
- used to create archives. If provided, extra_args is a sequence of
- (name, value) tuples that will be passed as arguments to the callable.
- description can be provided to describe the format, and will be returned
- by the get_archive_formats() function.
- """
- if extra_args is None:
- extra_args = []
- if not isinstance(function, Callable):
- raise TypeError('The %s object is not callable' % function)
- if not isinstance(extra_args, (tuple, list)):
- raise TypeError('extra_args needs to be a sequence')
- for element in extra_args:
- if not isinstance(element, (tuple, list)) or len(element) !=2:
- raise TypeError('extra_args elements are : (arg_name, value)')
-
- _ARCHIVE_FORMATS[name] = (function, extra_args, description)
-
-def unregister_archive_format(name):
- del _ARCHIVE_FORMATS[name]
-
-def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,
- dry_run=0, owner=None, group=None, logger=None):
- """Create an archive file (eg. zip or tar).
-
- 'base_name' is the name of the file to create, minus any format-specific
- extension; 'format' is the archive format: one of "zip", "tar", "bztar"
- or "gztar".
-
- 'root_dir' is a directory that will be the root directory of the
- archive; ie. we typically chdir into 'root_dir' before creating the
- archive. 'base_dir' is the directory where we start archiving from;
- ie. 'base_dir' will be the common prefix of all files and
- directories in the archive. 'root_dir' and 'base_dir' both default
- to the current directory. Returns the name of the archive file.
-
- 'owner' and 'group' are used when creating a tar archive. By default,
- uses the current owner and group.
- """
- save_cwd = os.getcwd()
- if root_dir is not None:
- if logger is not None:
- logger.debug("changing into '%s'", root_dir)
- base_name = os.path.abspath(base_name)
- if not dry_run:
- os.chdir(root_dir)
-
- if base_dir is None:
- base_dir = os.curdir
-
- kwargs = {'dry_run': dry_run, 'logger': logger}
-
- try:
- format_info = _ARCHIVE_FORMATS[format]
- except KeyError:
- raise ValueError("unknown archive format '%s'" % format)
-
- func = format_info[0]
- for arg, val in format_info[1]:
- kwargs[arg] = val
-
- if format != 'zip':
- kwargs['owner'] = owner
- kwargs['group'] = group
-
- try:
- filename = func(base_name, base_dir, **kwargs)
- finally:
- if root_dir is not None:
- if logger is not None:
- logger.debug("changing back to '%s'", save_cwd)
- os.chdir(save_cwd)
-
- return filename
-
-
-def get_unpack_formats():
- """Returns a list of supported formats for unpacking.
-
- Each element of the returned sequence is a tuple
- (name, extensions, description)
- """
- formats = [(name, info[0], info[3]) for name, info in
- _UNPACK_FORMATS.items()]
- formats.sort()
- return formats
-
-def _check_unpack_options(extensions, function, extra_args):
- """Checks what gets registered as an unpacker."""
- # first make sure no other unpacker is registered for this extension
- existing_extensions = {}
- for name, info in _UNPACK_FORMATS.items():
- for ext in info[0]:
- existing_extensions[ext] = name
-
- for extension in extensions:
- if extension in existing_extensions:
- msg = '%s is already registered for "%s"'
- raise RegistryError(msg % (extension,
- existing_extensions[extension]))
-
- if not isinstance(function, Callable):
- raise TypeError('The registered function must be a callable')
-
-
-def register_unpack_format(name, extensions, function, extra_args=None,
- description=''):
- """Registers an unpack format.
-
- `name` is the name of the format. `extensions` is a list of extensions
- corresponding to the format.
-
- `function` is the callable that will be
- used to unpack archives. The callable will receive archives to unpack.
- If it's unable to handle an archive, it needs to raise a ReadError
- exception.
-
- If provided, `extra_args` is a sequence of
- (name, value) tuples that will be passed as arguments to the callable.
- description can be provided to describe the format, and will be returned
- by the get_unpack_formats() function.
- """
- if extra_args is None:
- extra_args = []
- _check_unpack_options(extensions, function, extra_args)
- _UNPACK_FORMATS[name] = extensions, function, extra_args, description
-
-def unregister_unpack_format(name):
- """Removes the pack format from the registry."""
- del _UNPACK_FORMATS[name]
-
-def _ensure_directory(path):
- """Ensure that the parent directory of `path` exists"""
- dirname = os.path.dirname(path)
- if not os.path.isdir(dirname):
- os.makedirs(dirname)
-
-def _unpack_zipfile(filename, extract_dir):
- """Unpack zip `filename` to `extract_dir`
- """
- try:
- import zipfile
- except ImportError:
- raise ReadError('zlib not supported, cannot unpack this archive.')
-
- if not zipfile.is_zipfile(filename):
- raise ReadError("%s is not a zip file" % filename)
-
- zip = zipfile.ZipFile(filename)
- try:
- for info in zip.infolist():
- name = info.filename
-
- # don't extract absolute paths or ones with .. in them
- if name.startswith('/') or '..' in name:
- continue
-
- target = os.path.join(extract_dir, *name.split('/'))
- if not target:
- continue
-
- _ensure_directory(target)
- if not name.endswith('/'):
- # file
- data = zip.read(info.filename)
- f = open(target, 'wb')
- try:
- f.write(data)
- finally:
- f.close()
- del data
- finally:
- zip.close()
-
-def _unpack_tarfile(filename, extract_dir):
- """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`
- """
- try:
- tarobj = tarfile.open(filename)
- except tarfile.TarError:
- raise ReadError(
- "%s is not a compressed or uncompressed tar file" % filename)
- try:
- tarobj.extractall(extract_dir)
- finally:
- tarobj.close()
-
-_UNPACK_FORMATS = {
- 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"),
- 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"),
- 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file")
- }
-
-if _BZ2_SUPPORTED:
- _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [],
- "bzip2'ed tar-file")
-
-def _find_unpack_format(filename):
- for name, info in _UNPACK_FORMATS.items():
- for extension in info[0]:
- if filename.endswith(extension):
- return name
- return None
-
-def unpack_archive(filename, extract_dir=None, format=None):
- """Unpack an archive.
-
- `filename` is the name of the archive.
-
- `extract_dir` is the name of the target directory, where the archive
- is unpacked. If not provided, the current working directory is used.
-
- `format` is the archive format: one of "zip", "tar", or "gztar". Or any
- other registered format. If not provided, unpack_archive will use the
- filename extension and see if an unpacker was registered for that
- extension.
-
- In case none is found, a ValueError is raised.
- """
- if extract_dir is None:
- extract_dir = os.getcwd()
-
- if format is not None:
- try:
- format_info = _UNPACK_FORMATS[format]
- except KeyError:
- raise ValueError("Unknown unpack format '{0}'".format(format))
-
- func = format_info[1]
- func(filename, extract_dir, **dict(format_info[2]))
- else:
- # we need to look at the registered unpackers supported extensions
- format = _find_unpack_format(filename)
- if format is None:
- raise ReadError("Unknown archive format '{0}'".format(filename))
-
- func = _UNPACK_FORMATS[format][1]
- kwargs = dict(_UNPACK_FORMATS[format][2])
- func(filename, extract_dir, **kwargs)
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg
deleted file mode 100644
index 1746bd0..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg
+++ /dev/null
@@ -1,84 +0,0 @@
-[posix_prefix]
-# Configuration directories. Some of these come straight out of the
-# configure script. They are for implementing the other variables, not to
-# be used directly in [resource_locations].
-confdir = /etc
-datadir = /usr/share
-libdir = /usr/lib
-statedir = /var
-# User resource directory
-local = ~/.local/{distribution.name}
-
-stdlib = {base}/lib/python{py_version_short}
-platstdlib = {platbase}/lib/python{py_version_short}
-purelib = {base}/lib/python{py_version_short}/site-packages
-platlib = {platbase}/lib/python{py_version_short}/site-packages
-include = {base}/include/python{py_version_short}{abiflags}
-platinclude = {platbase}/include/python{py_version_short}{abiflags}
-data = {base}
-
-[posix_home]
-stdlib = {base}/lib/python
-platstdlib = {base}/lib/python
-purelib = {base}/lib/python
-platlib = {base}/lib/python
-include = {base}/include/python
-platinclude = {base}/include/python
-scripts = {base}/bin
-data = {base}
-
-[nt]
-stdlib = {base}/Lib
-platstdlib = {base}/Lib
-purelib = {base}/Lib/site-packages
-platlib = {base}/Lib/site-packages
-include = {base}/Include
-platinclude = {base}/Include
-scripts = {base}/Scripts
-data = {base}
-
-[os2]
-stdlib = {base}/Lib
-platstdlib = {base}/Lib
-purelib = {base}/Lib/site-packages
-platlib = {base}/Lib/site-packages
-include = {base}/Include
-platinclude = {base}/Include
-scripts = {base}/Scripts
-data = {base}
-
-[os2_home]
-stdlib = {userbase}/lib/python{py_version_short}
-platstdlib = {userbase}/lib/python{py_version_short}
-purelib = {userbase}/lib/python{py_version_short}/site-packages
-platlib = {userbase}/lib/python{py_version_short}/site-packages
-include = {userbase}/include/python{py_version_short}
-scripts = {userbase}/bin
-data = {userbase}
-
-[nt_user]
-stdlib = {userbase}/Python{py_version_nodot}
-platstdlib = {userbase}/Python{py_version_nodot}
-purelib = {userbase}/Python{py_version_nodot}/site-packages
-platlib = {userbase}/Python{py_version_nodot}/site-packages
-include = {userbase}/Python{py_version_nodot}/Include
-scripts = {userbase}/Scripts
-data = {userbase}
-
-[posix_user]
-stdlib = {userbase}/lib/python{py_version_short}
-platstdlib = {userbase}/lib/python{py_version_short}
-purelib = {userbase}/lib/python{py_version_short}/site-packages
-platlib = {userbase}/lib/python{py_version_short}/site-packages
-include = {userbase}/include/python{py_version_short}
-scripts = {userbase}/bin
-data = {userbase}
-
-[osx_framework_user]
-stdlib = {userbase}/lib/python
-platstdlib = {userbase}/lib/python
-purelib = {userbase}/lib/python/site-packages
-platlib = {userbase}/lib/python/site-packages
-include = {userbase}/include
-scripts = {userbase}/bin
-data = {userbase}
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py
deleted file mode 100644
index b470a37..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py
+++ /dev/null
@@ -1,786 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""Access to Python's configuration information."""
-
-import codecs
-import os
-import re
-import sys
-from os.path import pardir, realpath
-try:
- import configparser
-except ImportError:
- import ConfigParser as configparser
-
-
-__all__ = [
- 'get_config_h_filename',
- 'get_config_var',
- 'get_config_vars',
- 'get_makefile_filename',
- 'get_path',
- 'get_path_names',
- 'get_paths',
- 'get_platform',
- 'get_python_version',
- 'get_scheme_names',
- 'parse_config_h',
-]
-
-
-def _safe_realpath(path):
- try:
- return realpath(path)
- except OSError:
- return path
-
-
-if sys.executable:
- _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable))
-else:
- # sys.executable can be empty if argv[0] has been changed and Python is
- # unable to retrieve the real program name
- _PROJECT_BASE = _safe_realpath(os.getcwd())
-
-if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower():
- _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir))
-# PC/VS7.1
-if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower():
- _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
-# PC/AMD64
-if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower():
- _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir))
-
-
-def is_python_build():
- for fn in ("Setup.dist", "Setup.local"):
- if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)):
- return True
- return False
-
-_PYTHON_BUILD = is_python_build()
-
-_cfg_read = False
-
-def _ensure_cfg_read():
- global _cfg_read
- if not _cfg_read:
- from ..resources import finder
- backport_package = __name__.rsplit('.', 1)[0]
- _finder = finder(backport_package)
- _cfgfile = _finder.find('sysconfig.cfg')
- assert _cfgfile, 'sysconfig.cfg exists'
- with _cfgfile.as_stream() as s:
- _SCHEMES.readfp(s)
- if _PYTHON_BUILD:
- for scheme in ('posix_prefix', 'posix_home'):
- _SCHEMES.set(scheme, 'include', '{srcdir}/Include')
- _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.')
-
- _cfg_read = True
-
-
-_SCHEMES = configparser.RawConfigParser()
-_VAR_REPL = re.compile(r'\{([^{]*?)\}')
-
-def _expand_globals(config):
- _ensure_cfg_read()
- if config.has_section('globals'):
- globals = config.items('globals')
- else:
- globals = tuple()
-
- sections = config.sections()
- for section in sections:
- if section == 'globals':
- continue
- for option, value in globals:
- if config.has_option(section, option):
- continue
- config.set(section, option, value)
- config.remove_section('globals')
-
- # now expanding local variables defined in the cfg file
- #
- for section in config.sections():
- variables = dict(config.items(section))
-
- def _replacer(matchobj):
- name = matchobj.group(1)
- if name in variables:
- return variables[name]
- return matchobj.group(0)
-
- for option, value in config.items(section):
- config.set(section, option, _VAR_REPL.sub(_replacer, value))
-
-#_expand_globals(_SCHEMES)
-
-_PY_VERSION = '%s.%s.%s' % sys.version_info[:3]
-_PY_VERSION_SHORT = '%s.%s' % sys.version_info[:2]
-_PY_VERSION_SHORT_NO_DOT = '%s%s' % sys.version_info[:2]
-_PREFIX = os.path.normpath(sys.prefix)
-_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
-_CONFIG_VARS = None
-_USER_BASE = None
-
-
-def _subst_vars(path, local_vars):
- """In the string `path`, replace tokens like {some.thing} with the
- corresponding value from the map `local_vars`.
-
- If there is no corresponding value, leave the token unchanged.
- """
- def _replacer(matchobj):
- name = matchobj.group(1)
- if name in local_vars:
- return local_vars[name]
- elif name in os.environ:
- return os.environ[name]
- return matchobj.group(0)
- return _VAR_REPL.sub(_replacer, path)
-
-
-def _extend_dict(target_dict, other_dict):
- target_keys = target_dict.keys()
- for key, value in other_dict.items():
- if key in target_keys:
- continue
- target_dict[key] = value
-
-
-def _expand_vars(scheme, vars):
- res = {}
- if vars is None:
- vars = {}
- _extend_dict(vars, get_config_vars())
-
- for key, value in _SCHEMES.items(scheme):
- if os.name in ('posix', 'nt'):
- value = os.path.expanduser(value)
- res[key] = os.path.normpath(_subst_vars(value, vars))
- return res
-
-
-def format_value(value, vars):
- def _replacer(matchobj):
- name = matchobj.group(1)
- if name in vars:
- return vars[name]
- return matchobj.group(0)
- return _VAR_REPL.sub(_replacer, value)
-
-
-def _get_default_scheme():
- if os.name == 'posix':
- # the default scheme for posix is posix_prefix
- return 'posix_prefix'
- return os.name
-
-
-def _getuserbase():
- env_base = os.environ.get("PYTHONUSERBASE", None)
-
- def joinuser(*args):
- return os.path.expanduser(os.path.join(*args))
-
- # what about 'os2emx', 'riscos' ?
- if os.name == "nt":
- base = os.environ.get("APPDATA") or "~"
- if env_base:
- return env_base
- else:
- return joinuser(base, "Python")
-
- if sys.platform == "darwin":
- framework = get_config_var("PYTHONFRAMEWORK")
- if framework:
- if env_base:
- return env_base
- else:
- return joinuser("~", "Library", framework, "%d.%d" %
- sys.version_info[:2])
-
- if env_base:
- return env_base
- else:
- return joinuser("~", ".local")
-
-
-def _parse_makefile(filename, vars=None):
- """Parse a Makefile-style file.
-
- A dictionary containing name/value pairs is returned. If an
- optional dictionary is passed in as the second argument, it is
- used instead of a new dictionary.
- """
- # Regexes needed for parsing Makefile (and similar syntaxes,
- # like old-style Setup files).
- _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
- _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
- _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
-
- if vars is None:
- vars = {}
- done = {}
- notdone = {}
-
- with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f:
- lines = f.readlines()
-
- for line in lines:
- if line.startswith('#') or line.strip() == '':
- continue
- m = _variable_rx.match(line)
- if m:
- n, v = m.group(1, 2)
- v = v.strip()
- # `$$' is a literal `$' in make
- tmpv = v.replace('$$', '')
-
- if "$" in tmpv:
- notdone[n] = v
- else:
- try:
- v = int(v)
- except ValueError:
- # insert literal `$'
- done[n] = v.replace('$$', '$')
- else:
- done[n] = v
-
- # do variable interpolation here
- variables = list(notdone.keys())
-
- # Variables with a 'PY_' prefix in the makefile. These need to
- # be made available without that prefix through sysconfig.
- # Special care is needed to ensure that variable expansion works, even
- # if the expansion uses the name without a prefix.
- renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS')
-
- while len(variables) > 0:
- for name in tuple(variables):
- value = notdone[name]
- m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
- if m is not None:
- n = m.group(1)
- found = True
- if n in done:
- item = str(done[n])
- elif n in notdone:
- # get it on a subsequent round
- found = False
- elif n in os.environ:
- # do it like make: fall back to environment
- item = os.environ[n]
-
- elif n in renamed_variables:
- if (name.startswith('PY_') and
- name[3:] in renamed_variables):
- item = ""
-
- elif 'PY_' + n in notdone:
- found = False
-
- else:
- item = str(done['PY_' + n])
-
- else:
- done[n] = item = ""
-
- if found:
- after = value[m.end():]
- value = value[:m.start()] + item + after
- if "$" in after:
- notdone[name] = value
- else:
- try:
- value = int(value)
- except ValueError:
- done[name] = value.strip()
- else:
- done[name] = value
- variables.remove(name)
-
- if (name.startswith('PY_') and
- name[3:] in renamed_variables):
-
- name = name[3:]
- if name not in done:
- done[name] = value
-
- else:
- # bogus variable reference (e.g. "prefix=$/opt/python");
- # just drop it since we can't deal
- done[name] = value
- variables.remove(name)
-
- # strip spurious spaces
- for k, v in done.items():
- if isinstance(v, str):
- done[k] = v.strip()
-
- # save the results in the global dictionary
- vars.update(done)
- return vars
-
-
-def get_makefile_filename():
- """Return the path of the Makefile."""
- if _PYTHON_BUILD:
- return os.path.join(_PROJECT_BASE, "Makefile")
- if hasattr(sys, 'abiflags'):
- config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags)
- else:
- config_dir_name = 'config'
- return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile')
-
-
-def _init_posix(vars):
- """Initialize the module as appropriate for POSIX systems."""
- # load the installed Makefile:
- makefile = get_makefile_filename()
- try:
- _parse_makefile(makefile, vars)
- except IOError as e:
- msg = "invalid Python installation: unable to open %s" % makefile
- if hasattr(e, "strerror"):
- msg = msg + " (%s)" % e.strerror
- raise IOError(msg)
- # load the installed pyconfig.h:
- config_h = get_config_h_filename()
- try:
- with open(config_h) as f:
- parse_config_h(f, vars)
- except IOError as e:
- msg = "invalid Python installation: unable to open %s" % config_h
- if hasattr(e, "strerror"):
- msg = msg + " (%s)" % e.strerror
- raise IOError(msg)
- # On AIX, there are wrong paths to the linker scripts in the Makefile
- # -- these paths are relative to the Python source, but when installed
- # the scripts are in another directory.
- if _PYTHON_BUILD:
- vars['LDSHARED'] = vars['BLDSHARED']
-
-
-def _init_non_posix(vars):
- """Initialize the module as appropriate for NT"""
- # set basic install directories
- vars['LIBDEST'] = get_path('stdlib')
- vars['BINLIBDEST'] = get_path('platstdlib')
- vars['INCLUDEPY'] = get_path('include')
- vars['SO'] = '.pyd'
- vars['EXE'] = '.exe'
- vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT
- vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable))
-
-#
-# public APIs
-#
-
-
-def parse_config_h(fp, vars=None):
- """Parse a config.h-style file.
-
- A dictionary containing name/value pairs is returned. If an
- optional dictionary is passed in as the second argument, it is
- used instead of a new dictionary.
- """
- if vars is None:
- vars = {}
- define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
- undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
-
- while True:
- line = fp.readline()
- if not line:
- break
- m = define_rx.match(line)
- if m:
- n, v = m.group(1, 2)
- try:
- v = int(v)
- except ValueError:
- pass
- vars[n] = v
- else:
- m = undef_rx.match(line)
- if m:
- vars[m.group(1)] = 0
- return vars
-
-
-def get_config_h_filename():
- """Return the path of pyconfig.h."""
- if _PYTHON_BUILD:
- if os.name == "nt":
- inc_dir = os.path.join(_PROJECT_BASE, "PC")
- else:
- inc_dir = _PROJECT_BASE
- else:
- inc_dir = get_path('platinclude')
- return os.path.join(inc_dir, 'pyconfig.h')
-
-
-def get_scheme_names():
- """Return a tuple containing the schemes names."""
- return tuple(sorted(_SCHEMES.sections()))
-
-
-def get_path_names():
- """Return a tuple containing the paths names."""
- # xxx see if we want a static list
- return _SCHEMES.options('posix_prefix')
-
-
-def get_paths(scheme=_get_default_scheme(), vars=None, expand=True):
- """Return a mapping containing an install scheme.
-
- ``scheme`` is the install scheme name. If not provided, it will
- return the default scheme for the current platform.
- """
- _ensure_cfg_read()
- if expand:
- return _expand_vars(scheme, vars)
- else:
- return dict(_SCHEMES.items(scheme))
-
-
-def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True):
- """Return a path corresponding to the scheme.
-
- ``scheme`` is the install scheme name.
- """
- return get_paths(scheme, vars, expand)[name]
-
-
-def get_config_vars(*args):
- """With no arguments, return a dictionary of all configuration
- variables relevant for the current platform.
-
- On Unix, this means every variable defined in Python's installed Makefile;
- On Windows and Mac OS it's a much smaller set.
-
- With arguments, return a list of values that result from looking up
- each argument in the configuration variable dictionary.
- """
- global _CONFIG_VARS
- if _CONFIG_VARS is None:
- _CONFIG_VARS = {}
- # Normalized versions of prefix and exec_prefix are handy to have;
- # in fact, these are the standard versions used most places in the
- # distutils2 module.
- _CONFIG_VARS['prefix'] = _PREFIX
- _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX
- _CONFIG_VARS['py_version'] = _PY_VERSION
- _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT
- _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2]
- _CONFIG_VARS['base'] = _PREFIX
- _CONFIG_VARS['platbase'] = _EXEC_PREFIX
- _CONFIG_VARS['projectbase'] = _PROJECT_BASE
- try:
- _CONFIG_VARS['abiflags'] = sys.abiflags
- except AttributeError:
- # sys.abiflags may not be defined on all platforms.
- _CONFIG_VARS['abiflags'] = ''
-
- if os.name in ('nt', 'os2'):
- _init_non_posix(_CONFIG_VARS)
- if os.name == 'posix':
- _init_posix(_CONFIG_VARS)
- # Setting 'userbase' is done below the call to the
- # init function to enable using 'get_config_var' in
- # the init-function.
- if sys.version >= '2.6':
- _CONFIG_VARS['userbase'] = _getuserbase()
-
- if 'srcdir' not in _CONFIG_VARS:
- _CONFIG_VARS['srcdir'] = _PROJECT_BASE
- else:
- _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir'])
-
- # Convert srcdir into an absolute path if it appears necessary.
- # Normally it is relative to the build directory. However, during
- # testing, for example, we might be running a non-installed python
- # from a different directory.
- if _PYTHON_BUILD and os.name == "posix":
- base = _PROJECT_BASE
- try:
- cwd = os.getcwd()
- except OSError:
- cwd = None
- if (not os.path.isabs(_CONFIG_VARS['srcdir']) and
- base != cwd):
- # srcdir is relative and we are not in the same directory
- # as the executable. Assume executable is in the build
- # directory and make srcdir absolute.
- srcdir = os.path.join(base, _CONFIG_VARS['srcdir'])
- _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir)
-
- if sys.platform == 'darwin':
- kernel_version = os.uname()[2] # Kernel version (8.4.3)
- major_version = int(kernel_version.split('.')[0])
-
- if major_version < 8:
- # On Mac OS X before 10.4, check if -arch and -isysroot
- # are in CFLAGS or LDFLAGS and remove them if they are.
- # This is needed when building extensions on a 10.3 system
- # using a universal build of python.
- for key in ('LDFLAGS', 'BASECFLAGS',
- # a number of derived variables. These need to be
- # patched up as well.
- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
- flags = _CONFIG_VARS[key]
- flags = re.sub(r'-arch\s+\w+\s', ' ', flags)
- flags = re.sub('-isysroot [^ \t]*', ' ', flags)
- _CONFIG_VARS[key] = flags
- else:
- # Allow the user to override the architecture flags using
- # an environment variable.
- # NOTE: This name was introduced by Apple in OSX 10.5 and
- # is used by several scripting languages distributed with
- # that OS release.
- if 'ARCHFLAGS' in os.environ:
- arch = os.environ['ARCHFLAGS']
- for key in ('LDFLAGS', 'BASECFLAGS',
- # a number of derived variables. These need to be
- # patched up as well.
- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
-
- flags = _CONFIG_VARS[key]
- flags = re.sub(r'-arch\s+\w+\s', ' ', flags)
- flags = flags + ' ' + arch
- _CONFIG_VARS[key] = flags
-
- # If we're on OSX 10.5 or later and the user tries to
- # compiles an extension using an SDK that is not present
- # on the current machine it is better to not use an SDK
- # than to fail.
- #
- # The major usecase for this is users using a Python.org
- # binary installer on OSX 10.6: that installer uses
- # the 10.4u SDK, but that SDK is not installed by default
- # when you install Xcode.
- #
- CFLAGS = _CONFIG_VARS.get('CFLAGS', '')
- m = re.search(r'-isysroot\s+(\S+)', CFLAGS)
- if m is not None:
- sdk = m.group(1)
- if not os.path.exists(sdk):
- for key in ('LDFLAGS', 'BASECFLAGS',
- # a number of derived variables. These need to be
- # patched up as well.
- 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
-
- flags = _CONFIG_VARS[key]
- flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags)
- _CONFIG_VARS[key] = flags
-
- if args:
- vals = []
- for name in args:
- vals.append(_CONFIG_VARS.get(name))
- return vals
- else:
- return _CONFIG_VARS
-
-
-def get_config_var(name):
- """Return the value of a single variable using the dictionary returned by
- 'get_config_vars()'.
-
- Equivalent to get_config_vars().get(name)
- """
- return get_config_vars().get(name)
-
-
-def get_platform():
- """Return a string that identifies the current platform.
-
- This is used mainly to distinguish platform-specific build directories and
- platform-specific built distributions. Typically includes the OS name
- and version and the architecture (as supplied by 'os.uname()'),
- although the exact information included depends on the OS; eg. for IRIX
- the architecture isn't particularly important (IRIX only runs on SGI
- hardware), but for Linux the kernel version isn't particularly
- important.
-
- Examples of returned values:
- linux-i586
- linux-alpha (?)
- solaris-2.6-sun4u
- irix-5.3
- irix64-6.2
-
- Windows will return one of:
- win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc)
- win-ia64 (64bit Windows on Itanium)
- win32 (all others - specifically, sys.platform is returned)
-
- For other non-POSIX platforms, currently just returns 'sys.platform'.
- """
- if os.name == 'nt':
- # sniff sys.version for architecture.
- prefix = " bit ("
- i = sys.version.find(prefix)
- if i == -1:
- return sys.platform
- j = sys.version.find(")", i)
- look = sys.version[i+len(prefix):j].lower()
- if look == 'amd64':
- return 'win-amd64'
- if look == 'itanium':
- return 'win-ia64'
- return sys.platform
-
- if os.name != "posix" or not hasattr(os, 'uname'):
- # XXX what about the architecture? NT is Intel or Alpha,
- # Mac OS is M68k or PPC, etc.
- return sys.platform
-
- # Try to distinguish various flavours of Unix
- osname, host, release, version, machine = os.uname()
-
- # Convert the OS name to lowercase, remove '/' characters
- # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh")
- osname = osname.lower().replace('/', '')
- machine = machine.replace(' ', '_')
- machine = machine.replace('/', '-')
-
- if osname[:5] == "linux":
- # At least on Linux/Intel, 'machine' is the processor --
- # i386, etc.
- # XXX what about Alpha, SPARC, etc?
- return "%s-%s" % (osname, machine)
- elif osname[:5] == "sunos":
- if release[0] >= "5": # SunOS 5 == Solaris 2
- osname = "solaris"
- release = "%d.%s" % (int(release[0]) - 3, release[2:])
- # fall through to standard osname-release-machine representation
- elif osname[:4] == "irix": # could be "irix64"!
- return "%s-%s" % (osname, release)
- elif osname[:3] == "aix":
- return "%s-%s.%s" % (osname, version, release)
- elif osname[:6] == "cygwin":
- osname = "cygwin"
- rel_re = re.compile(r'[\d.]+')
- m = rel_re.match(release)
- if m:
- release = m.group()
- elif osname[:6] == "darwin":
- #
- # For our purposes, we'll assume that the system version from
- # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set
- # to. This makes the compatibility story a bit more sane because the
- # machine is going to compile and link as if it were
- # MACOSX_DEPLOYMENT_TARGET.
- cfgvars = get_config_vars()
- macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET')
-
- if True:
- # Always calculate the release of the running machine,
- # needed to determine if we can build fat binaries or not.
-
- macrelease = macver
- # Get the system version. Reading this plist is a documented
- # way to get the system version (see the documentation for
- # the Gestalt Manager)
- try:
- f = open('/System/Library/CoreServices/SystemVersion.plist')
- except IOError:
- # We're on a plain darwin box, fall back to the default
- # behaviour.
- pass
- else:
- try:
- m = re.search(r'ProductUserVisibleVersion \s*'
- r'(.*?) ', f.read())
- finally:
- f.close()
- if m is not None:
- macrelease = '.'.join(m.group(1).split('.')[:2])
- # else: fall back to the default behaviour
-
- if not macver:
- macver = macrelease
-
- if macver:
- release = macver
- osname = "macosx"
-
- if ((macrelease + '.') >= '10.4.' and
- '-arch' in get_config_vars().get('CFLAGS', '').strip()):
- # The universal build will build fat binaries, but not on
- # systems before 10.4
- #
- # Try to detect 4-way universal builds, those have machine-type
- # 'universal' instead of 'fat'.
-
- machine = 'fat'
- cflags = get_config_vars().get('CFLAGS')
-
- archs = re.findall(r'-arch\s+(\S+)', cflags)
- archs = tuple(sorted(set(archs)))
-
- if len(archs) == 1:
- machine = archs[0]
- elif archs == ('i386', 'ppc'):
- machine = 'fat'
- elif archs == ('i386', 'x86_64'):
- machine = 'intel'
- elif archs == ('i386', 'ppc', 'x86_64'):
- machine = 'fat3'
- elif archs == ('ppc64', 'x86_64'):
- machine = 'fat64'
- elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'):
- machine = 'universal'
- else:
- raise ValueError(
- "Don't know machine value for archs=%r" % (archs,))
-
- elif machine == 'i386':
- # On OSX the machine type returned by uname is always the
- # 32-bit variant, even if the executable architecture is
- # the 64-bit variant
- if sys.maxsize >= 2**32:
- machine = 'x86_64'
-
- elif machine in ('PowerPC', 'Power_Macintosh'):
- # Pick a sane name for the PPC architecture.
- # See 'i386' case
- if sys.maxsize >= 2**32:
- machine = 'ppc64'
- else:
- machine = 'ppc'
-
- return "%s-%s-%s" % (osname, release, machine)
-
-
-def get_python_version():
- return _PY_VERSION_SHORT
-
-
-def _print_dict(title, data):
- for index, (key, value) in enumerate(sorted(data.items())):
- if index == 0:
- print('%s: ' % (title))
- print('\t%s = "%s"' % (key, value))
-
-
-def _main():
- """Display all information sysconfig detains."""
- print('Platform: "%s"' % get_platform())
- print('Python version: "%s"' % get_python_version())
- print('Current installation scheme: "%s"' % _get_default_scheme())
- print()
- _print_dict('Paths', get_paths())
- print()
- _print_dict('Variables', get_config_vars())
-
-
-if __name__ == '__main__':
- _main()
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py
deleted file mode 100644
index d66d856..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py
+++ /dev/null
@@ -1,2607 +0,0 @@
-#-------------------------------------------------------------------
-# tarfile.py
-#-------------------------------------------------------------------
-# Copyright (C) 2002 Lars Gustaebel
-# All rights reserved.
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation
-# files (the "Software"), to deal in the Software without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following
-# conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-from __future__ import print_function
-
-"""Read from and write to tar format archives.
-"""
-
-__version__ = "$Revision$"
-
-version = "0.9.0"
-__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)"
-__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $"
-__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $"
-__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend."
-
-#---------
-# Imports
-#---------
-import sys
-import os
-import stat
-import errno
-import time
-import struct
-import copy
-import re
-
-try:
- import grp, pwd
-except ImportError:
- grp = pwd = None
-
-# os.symlink on Windows prior to 6.0 raises NotImplementedError
-symlink_exception = (AttributeError, NotImplementedError)
-try:
- # WindowsError (1314) will be raised if the caller does not hold the
- # SeCreateSymbolicLinkPrivilege privilege
- symlink_exception += (WindowsError,)
-except NameError:
- pass
-
-# from tarfile import *
-__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"]
-
-if sys.version_info[0] < 3:
- import __builtin__ as builtins
-else:
- import builtins
-
-_open = builtins.open # Since 'open' is TarFile.open
-
-#---------------------------------------------------------
-# tar constants
-#---------------------------------------------------------
-NUL = b"\0" # the null character
-BLOCKSIZE = 512 # length of processing blocks
-RECORDSIZE = BLOCKSIZE * 20 # length of records
-GNU_MAGIC = b"ustar \0" # magic gnu tar string
-POSIX_MAGIC = b"ustar\x0000" # magic posix tar string
-
-LENGTH_NAME = 100 # maximum length of a filename
-LENGTH_LINK = 100 # maximum length of a linkname
-LENGTH_PREFIX = 155 # maximum length of the prefix field
-
-REGTYPE = b"0" # regular file
-AREGTYPE = b"\0" # regular file
-LNKTYPE = b"1" # link (inside tarfile)
-SYMTYPE = b"2" # symbolic link
-CHRTYPE = b"3" # character special device
-BLKTYPE = b"4" # block special device
-DIRTYPE = b"5" # directory
-FIFOTYPE = b"6" # fifo special device
-CONTTYPE = b"7" # contiguous file
-
-GNUTYPE_LONGNAME = b"L" # GNU tar longname
-GNUTYPE_LONGLINK = b"K" # GNU tar longlink
-GNUTYPE_SPARSE = b"S" # GNU tar sparse file
-
-XHDTYPE = b"x" # POSIX.1-2001 extended header
-XGLTYPE = b"g" # POSIX.1-2001 global header
-SOLARIS_XHDTYPE = b"X" # Solaris extended header
-
-USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format
-GNU_FORMAT = 1 # GNU tar format
-PAX_FORMAT = 2 # POSIX.1-2001 (pax) format
-DEFAULT_FORMAT = GNU_FORMAT
-
-#---------------------------------------------------------
-# tarfile constants
-#---------------------------------------------------------
-# File types that tarfile supports:
-SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE,
- SYMTYPE, DIRTYPE, FIFOTYPE,
- CONTTYPE, CHRTYPE, BLKTYPE,
- GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
- GNUTYPE_SPARSE)
-
-# File types that will be treated as a regular file.
-REGULAR_TYPES = (REGTYPE, AREGTYPE,
- CONTTYPE, GNUTYPE_SPARSE)
-
-# File types that are part of the GNU tar format.
-GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK,
- GNUTYPE_SPARSE)
-
-# Fields from a pax header that override a TarInfo attribute.
-PAX_FIELDS = ("path", "linkpath", "size", "mtime",
- "uid", "gid", "uname", "gname")
-
-# Fields from a pax header that are affected by hdrcharset.
-PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname"))
-
-# Fields in a pax header that are numbers, all other fields
-# are treated as strings.
-PAX_NUMBER_FIELDS = {
- "atime": float,
- "ctime": float,
- "mtime": float,
- "uid": int,
- "gid": int,
- "size": int
-}
-
-#---------------------------------------------------------
-# Bits used in the mode field, values in octal.
-#---------------------------------------------------------
-S_IFLNK = 0o120000 # symbolic link
-S_IFREG = 0o100000 # regular file
-S_IFBLK = 0o060000 # block device
-S_IFDIR = 0o040000 # directory
-S_IFCHR = 0o020000 # character device
-S_IFIFO = 0o010000 # fifo
-
-TSUID = 0o4000 # set UID on execution
-TSGID = 0o2000 # set GID on execution
-TSVTX = 0o1000 # reserved
-
-TUREAD = 0o400 # read by owner
-TUWRITE = 0o200 # write by owner
-TUEXEC = 0o100 # execute/search by owner
-TGREAD = 0o040 # read by group
-TGWRITE = 0o020 # write by group
-TGEXEC = 0o010 # execute/search by group
-TOREAD = 0o004 # read by other
-TOWRITE = 0o002 # write by other
-TOEXEC = 0o001 # execute/search by other
-
-#---------------------------------------------------------
-# initialization
-#---------------------------------------------------------
-if os.name in ("nt", "ce"):
- ENCODING = "utf-8"
-else:
- ENCODING = sys.getfilesystemencoding()
-
-#---------------------------------------------------------
-# Some useful functions
-#---------------------------------------------------------
-
-def stn(s, length, encoding, errors):
- """Convert a string to a null-terminated bytes object.
- """
- s = s.encode(encoding, errors)
- return s[:length] + (length - len(s)) * NUL
-
-def nts(s, encoding, errors):
- """Convert a null-terminated bytes object to a string.
- """
- p = s.find(b"\0")
- if p != -1:
- s = s[:p]
- return s.decode(encoding, errors)
-
-def nti(s):
- """Convert a number field to a python number.
- """
- # There are two possible encodings for a number field, see
- # itn() below.
- if s[0] != chr(0o200):
- try:
- n = int(nts(s, "ascii", "strict") or "0", 8)
- except ValueError:
- raise InvalidHeaderError("invalid header")
- else:
- n = 0
- for i in range(len(s) - 1):
- n <<= 8
- n += ord(s[i + 1])
- return n
-
-def itn(n, digits=8, format=DEFAULT_FORMAT):
- """Convert a python number to a number field.
- """
- # POSIX 1003.1-1988 requires numbers to be encoded as a string of
- # octal digits followed by a null-byte, this allows values up to
- # (8**(digits-1))-1. GNU tar allows storing numbers greater than
- # that if necessary. A leading 0o200 byte indicates this particular
- # encoding, the following digits-1 bytes are a big-endian
- # representation. This allows values up to (256**(digits-1))-1.
- if 0 <= n < 8 ** (digits - 1):
- s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL
- else:
- if format != GNU_FORMAT or n >= 256 ** (digits - 1):
- raise ValueError("overflow in number field")
-
- if n < 0:
- # XXX We mimic GNU tar's behaviour with negative numbers,
- # this could raise OverflowError.
- n = struct.unpack("L", struct.pack("l", n))[0]
-
- s = bytearray()
- for i in range(digits - 1):
- s.insert(0, n & 0o377)
- n >>= 8
- s.insert(0, 0o200)
- return s
-
-def calc_chksums(buf):
- """Calculate the checksum for a member's header by summing up all
- characters except for the chksum field which is treated as if
- it was filled with spaces. According to the GNU tar sources,
- some tars (Sun and NeXT) calculate chksum with signed char,
- which will be different if there are chars in the buffer with
- the high bit set. So we calculate two checksums, unsigned and
- signed.
- """
- unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512]))
- signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512]))
- return unsigned_chksum, signed_chksum
-
-def copyfileobj(src, dst, length=None):
- """Copy length bytes from fileobj src to fileobj dst.
- If length is None, copy the entire content.
- """
- if length == 0:
- return
- if length is None:
- while True:
- buf = src.read(16*1024)
- if not buf:
- break
- dst.write(buf)
- return
-
- BUFSIZE = 16 * 1024
- blocks, remainder = divmod(length, BUFSIZE)
- for b in range(blocks):
- buf = src.read(BUFSIZE)
- if len(buf) < BUFSIZE:
- raise IOError("end of file reached")
- dst.write(buf)
-
- if remainder != 0:
- buf = src.read(remainder)
- if len(buf) < remainder:
- raise IOError("end of file reached")
- dst.write(buf)
- return
-
-filemode_table = (
- ((S_IFLNK, "l"),
- (S_IFREG, "-"),
- (S_IFBLK, "b"),
- (S_IFDIR, "d"),
- (S_IFCHR, "c"),
- (S_IFIFO, "p")),
-
- ((TUREAD, "r"),),
- ((TUWRITE, "w"),),
- ((TUEXEC|TSUID, "s"),
- (TSUID, "S"),
- (TUEXEC, "x")),
-
- ((TGREAD, "r"),),
- ((TGWRITE, "w"),),
- ((TGEXEC|TSGID, "s"),
- (TSGID, "S"),
- (TGEXEC, "x")),
-
- ((TOREAD, "r"),),
- ((TOWRITE, "w"),),
- ((TOEXEC|TSVTX, "t"),
- (TSVTX, "T"),
- (TOEXEC, "x"))
-)
-
-def filemode(mode):
- """Convert a file's mode to a string of the form
- -rwxrwxrwx.
- Used by TarFile.list()
- """
- perm = []
- for table in filemode_table:
- for bit, char in table:
- if mode & bit == bit:
- perm.append(char)
- break
- else:
- perm.append("-")
- return "".join(perm)
-
-class TarError(Exception):
- """Base exception."""
- pass
-class ExtractError(TarError):
- """General exception for extract errors."""
- pass
-class ReadError(TarError):
- """Exception for unreadable tar archives."""
- pass
-class CompressionError(TarError):
- """Exception for unavailable compression methods."""
- pass
-class StreamError(TarError):
- """Exception for unsupported operations on stream-like TarFiles."""
- pass
-class HeaderError(TarError):
- """Base exception for header errors."""
- pass
-class EmptyHeaderError(HeaderError):
- """Exception for empty headers."""
- pass
-class TruncatedHeaderError(HeaderError):
- """Exception for truncated headers."""
- pass
-class EOFHeaderError(HeaderError):
- """Exception for end of file headers."""
- pass
-class InvalidHeaderError(HeaderError):
- """Exception for invalid headers."""
- pass
-class SubsequentHeaderError(HeaderError):
- """Exception for missing and invalid extended headers."""
- pass
-
-#---------------------------
-# internal stream interface
-#---------------------------
-class _LowLevelFile(object):
- """Low-level file object. Supports reading and writing.
- It is used instead of a regular file object for streaming
- access.
- """
-
- def __init__(self, name, mode):
- mode = {
- "r": os.O_RDONLY,
- "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC,
- }[mode]
- if hasattr(os, "O_BINARY"):
- mode |= os.O_BINARY
- self.fd = os.open(name, mode, 0o666)
-
- def close(self):
- os.close(self.fd)
-
- def read(self, size):
- return os.read(self.fd, size)
-
- def write(self, s):
- os.write(self.fd, s)
-
-class _Stream(object):
- """Class that serves as an adapter between TarFile and
- a stream-like object. The stream-like object only
- needs to have a read() or write() method and is accessed
- blockwise. Use of gzip or bzip2 compression is possible.
- A stream-like object could be for example: sys.stdin,
- sys.stdout, a socket, a tape device etc.
-
- _Stream is intended to be used only internally.
- """
-
- def __init__(self, name, mode, comptype, fileobj, bufsize):
- """Construct a _Stream object.
- """
- self._extfileobj = True
- if fileobj is None:
- fileobj = _LowLevelFile(name, mode)
- self._extfileobj = False
-
- if comptype == '*':
- # Enable transparent compression detection for the
- # stream interface
- fileobj = _StreamProxy(fileobj)
- comptype = fileobj.getcomptype()
-
- self.name = name or ""
- self.mode = mode
- self.comptype = comptype
- self.fileobj = fileobj
- self.bufsize = bufsize
- self.buf = b""
- self.pos = 0
- self.closed = False
-
- try:
- if comptype == "gz":
- try:
- import zlib
- except ImportError:
- raise CompressionError("zlib module is not available")
- self.zlib = zlib
- self.crc = zlib.crc32(b"")
- if mode == "r":
- self._init_read_gz()
- else:
- self._init_write_gz()
-
- if comptype == "bz2":
- try:
- import bz2
- except ImportError:
- raise CompressionError("bz2 module is not available")
- if mode == "r":
- self.dbuf = b""
- self.cmp = bz2.BZ2Decompressor()
- else:
- self.cmp = bz2.BZ2Compressor()
- except:
- if not self._extfileobj:
- self.fileobj.close()
- self.closed = True
- raise
-
- def __del__(self):
- if hasattr(self, "closed") and not self.closed:
- self.close()
-
- def _init_write_gz(self):
- """Initialize for writing with gzip compression.
- """
- self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED,
- -self.zlib.MAX_WBITS,
- self.zlib.DEF_MEM_LEVEL,
- 0)
- timestamp = struct.pack(" self.bufsize:
- self.fileobj.write(self.buf[:self.bufsize])
- self.buf = self.buf[self.bufsize:]
-
- def close(self):
- """Close the _Stream object. No operation should be
- done on it afterwards.
- """
- if self.closed:
- return
-
- if self.mode == "w" and self.comptype != "tar":
- self.buf += self.cmp.flush()
-
- if self.mode == "w" and self.buf:
- self.fileobj.write(self.buf)
- self.buf = b""
- if self.comptype == "gz":
- # The native zlib crc is an unsigned 32-bit integer, but
- # the Python wrapper implicitly casts that to a signed C
- # long. So, on a 32-bit box self.crc may "look negative",
- # while the same crc on a 64-bit box may "look positive".
- # To avoid irksome warnings from the `struct` module, force
- # it to look positive on all boxes.
- self.fileobj.write(struct.pack("= 0:
- blocks, remainder = divmod(pos - self.pos, self.bufsize)
- for i in range(blocks):
- self.read(self.bufsize)
- self.read(remainder)
- else:
- raise StreamError("seeking backwards is not allowed")
- return self.pos
-
- def read(self, size=None):
- """Return the next size number of bytes from the stream.
- If size is not defined, return all bytes of the stream
- up to EOF.
- """
- if size is None:
- t = []
- while True:
- buf = self._read(self.bufsize)
- if not buf:
- break
- t.append(buf)
- buf = "".join(t)
- else:
- buf = self._read(size)
- self.pos += len(buf)
- return buf
-
- def _read(self, size):
- """Return size bytes from the stream.
- """
- if self.comptype == "tar":
- return self.__read(size)
-
- c = len(self.dbuf)
- while c < size:
- buf = self.__read(self.bufsize)
- if not buf:
- break
- try:
- buf = self.cmp.decompress(buf)
- except IOError:
- raise ReadError("invalid compressed data")
- self.dbuf += buf
- c += len(buf)
- buf = self.dbuf[:size]
- self.dbuf = self.dbuf[size:]
- return buf
-
- def __read(self, size):
- """Return size bytes from stream. If internal buffer is empty,
- read another block from the stream.
- """
- c = len(self.buf)
- while c < size:
- buf = self.fileobj.read(self.bufsize)
- if not buf:
- break
- self.buf += buf
- c += len(buf)
- buf = self.buf[:size]
- self.buf = self.buf[size:]
- return buf
-# class _Stream
-
-class _StreamProxy(object):
- """Small proxy class that enables transparent compression
- detection for the Stream interface (mode 'r|*').
- """
-
- def __init__(self, fileobj):
- self.fileobj = fileobj
- self.buf = self.fileobj.read(BLOCKSIZE)
-
- def read(self, size):
- self.read = self.fileobj.read
- return self.buf
-
- def getcomptype(self):
- if self.buf.startswith(b"\037\213\010"):
- return "gz"
- if self.buf.startswith(b"BZh91"):
- return "bz2"
- return "tar"
-
- def close(self):
- self.fileobj.close()
-# class StreamProxy
-
-class _BZ2Proxy(object):
- """Small proxy class that enables external file object
- support for "r:bz2" and "w:bz2" modes. This is actually
- a workaround for a limitation in bz2 module's BZ2File
- class which (unlike gzip.GzipFile) has no support for
- a file object argument.
- """
-
- blocksize = 16 * 1024
-
- def __init__(self, fileobj, mode):
- self.fileobj = fileobj
- self.mode = mode
- self.name = getattr(self.fileobj, "name", None)
- self.init()
-
- def init(self):
- import bz2
- self.pos = 0
- if self.mode == "r":
- self.bz2obj = bz2.BZ2Decompressor()
- self.fileobj.seek(0)
- self.buf = b""
- else:
- self.bz2obj = bz2.BZ2Compressor()
-
- def read(self, size):
- x = len(self.buf)
- while x < size:
- raw = self.fileobj.read(self.blocksize)
- if not raw:
- break
- data = self.bz2obj.decompress(raw)
- self.buf += data
- x += len(data)
-
- buf = self.buf[:size]
- self.buf = self.buf[size:]
- self.pos += len(buf)
- return buf
-
- def seek(self, pos):
- if pos < self.pos:
- self.init()
- self.read(pos - self.pos)
-
- def tell(self):
- return self.pos
-
- def write(self, data):
- self.pos += len(data)
- raw = self.bz2obj.compress(data)
- self.fileobj.write(raw)
-
- def close(self):
- if self.mode == "w":
- raw = self.bz2obj.flush()
- self.fileobj.write(raw)
-# class _BZ2Proxy
-
-#------------------------
-# Extraction file object
-#------------------------
-class _FileInFile(object):
- """A thin wrapper around an existing file object that
- provides a part of its data as an individual file
- object.
- """
-
- def __init__(self, fileobj, offset, size, blockinfo=None):
- self.fileobj = fileobj
- self.offset = offset
- self.size = size
- self.position = 0
-
- if blockinfo is None:
- blockinfo = [(0, size)]
-
- # Construct a map with data and zero blocks.
- self.map_index = 0
- self.map = []
- lastpos = 0
- realpos = self.offset
- for offset, size in blockinfo:
- if offset > lastpos:
- self.map.append((False, lastpos, offset, None))
- self.map.append((True, offset, offset + size, realpos))
- realpos += size
- lastpos = offset + size
- if lastpos < self.size:
- self.map.append((False, lastpos, self.size, None))
-
- def seekable(self):
- if not hasattr(self.fileobj, "seekable"):
- # XXX gzip.GzipFile and bz2.BZ2File
- return True
- return self.fileobj.seekable()
-
- def tell(self):
- """Return the current file position.
- """
- return self.position
-
- def seek(self, position):
- """Seek to a position in the file.
- """
- self.position = position
-
- def read(self, size=None):
- """Read data from the file.
- """
- if size is None:
- size = self.size - self.position
- else:
- size = min(size, self.size - self.position)
-
- buf = b""
- while size > 0:
- while True:
- data, start, stop, offset = self.map[self.map_index]
- if start <= self.position < stop:
- break
- else:
- self.map_index += 1
- if self.map_index == len(self.map):
- self.map_index = 0
- length = min(size, stop - self.position)
- if data:
- self.fileobj.seek(offset + (self.position - start))
- buf += self.fileobj.read(length)
- else:
- buf += NUL * length
- size -= length
- self.position += length
- return buf
-#class _FileInFile
-
-
-class ExFileObject(object):
- """File-like object for reading an archive member.
- Is returned by TarFile.extractfile().
- """
- blocksize = 1024
-
- def __init__(self, tarfile, tarinfo):
- self.fileobj = _FileInFile(tarfile.fileobj,
- tarinfo.offset_data,
- tarinfo.size,
- tarinfo.sparse)
- self.name = tarinfo.name
- self.mode = "r"
- self.closed = False
- self.size = tarinfo.size
-
- self.position = 0
- self.buffer = b""
-
- def readable(self):
- return True
-
- def writable(self):
- return False
-
- def seekable(self):
- return self.fileobj.seekable()
-
- def read(self, size=None):
- """Read at most size bytes from the file. If size is not
- present or None, read all data until EOF is reached.
- """
- if self.closed:
- raise ValueError("I/O operation on closed file")
-
- buf = b""
- if self.buffer:
- if size is None:
- buf = self.buffer
- self.buffer = b""
- else:
- buf = self.buffer[:size]
- self.buffer = self.buffer[size:]
-
- if size is None:
- buf += self.fileobj.read()
- else:
- buf += self.fileobj.read(size - len(buf))
-
- self.position += len(buf)
- return buf
-
- # XXX TextIOWrapper uses the read1() method.
- read1 = read
-
- def readline(self, size=-1):
- """Read one entire line from the file. If size is present
- and non-negative, return a string with at most that
- size, which may be an incomplete line.
- """
- if self.closed:
- raise ValueError("I/O operation on closed file")
-
- pos = self.buffer.find(b"\n") + 1
- if pos == 0:
- # no newline found.
- while True:
- buf = self.fileobj.read(self.blocksize)
- self.buffer += buf
- if not buf or b"\n" in buf:
- pos = self.buffer.find(b"\n") + 1
- if pos == 0:
- # no newline found.
- pos = len(self.buffer)
- break
-
- if size != -1:
- pos = min(size, pos)
-
- buf = self.buffer[:pos]
- self.buffer = self.buffer[pos:]
- self.position += len(buf)
- return buf
-
- def readlines(self):
- """Return a list with all remaining lines.
- """
- result = []
- while True:
- line = self.readline()
- if not line: break
- result.append(line)
- return result
-
- def tell(self):
- """Return the current file position.
- """
- if self.closed:
- raise ValueError("I/O operation on closed file")
-
- return self.position
-
- def seek(self, pos, whence=os.SEEK_SET):
- """Seek to a position in the file.
- """
- if self.closed:
- raise ValueError("I/O operation on closed file")
-
- if whence == os.SEEK_SET:
- self.position = min(max(pos, 0), self.size)
- elif whence == os.SEEK_CUR:
- if pos < 0:
- self.position = max(self.position + pos, 0)
- else:
- self.position = min(self.position + pos, self.size)
- elif whence == os.SEEK_END:
- self.position = max(min(self.size + pos, self.size), 0)
- else:
- raise ValueError("Invalid argument")
-
- self.buffer = b""
- self.fileobj.seek(self.position)
-
- def close(self):
- """Close the file object.
- """
- self.closed = True
-
- def __iter__(self):
- """Get an iterator over the file's lines.
- """
- while True:
- line = self.readline()
- if not line:
- break
- yield line
-#class ExFileObject
-
-#------------------
-# Exported Classes
-#------------------
-class TarInfo(object):
- """Informational class which holds the details about an
- archive member given by a tar header block.
- TarInfo objects are returned by TarFile.getmember(),
- TarFile.getmembers() and TarFile.gettarinfo() and are
- usually created internally.
- """
-
- __slots__ = ("name", "mode", "uid", "gid", "size", "mtime",
- "chksum", "type", "linkname", "uname", "gname",
- "devmajor", "devminor",
- "offset", "offset_data", "pax_headers", "sparse",
- "tarfile", "_sparse_structs", "_link_target")
-
- def __init__(self, name=""):
- """Construct a TarInfo object. name is the optional name
- of the member.
- """
- self.name = name # member name
- self.mode = 0o644 # file permissions
- self.uid = 0 # user id
- self.gid = 0 # group id
- self.size = 0 # file size
- self.mtime = 0 # modification time
- self.chksum = 0 # header checksum
- self.type = REGTYPE # member type
- self.linkname = "" # link name
- self.uname = "" # user name
- self.gname = "" # group name
- self.devmajor = 0 # device major number
- self.devminor = 0 # device minor number
-
- self.offset = 0 # the tar header starts here
- self.offset_data = 0 # the file's data starts here
-
- self.sparse = None # sparse member information
- self.pax_headers = {} # pax header information
-
- # In pax headers the "name" and "linkname" field are called
- # "path" and "linkpath".
- def _getpath(self):
- return self.name
- def _setpath(self, name):
- self.name = name
- path = property(_getpath, _setpath)
-
- def _getlinkpath(self):
- return self.linkname
- def _setlinkpath(self, linkname):
- self.linkname = linkname
- linkpath = property(_getlinkpath, _setlinkpath)
-
- def __repr__(self):
- return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self))
-
- def get_info(self):
- """Return the TarInfo's attributes as a dictionary.
- """
- info = {
- "name": self.name,
- "mode": self.mode & 0o7777,
- "uid": self.uid,
- "gid": self.gid,
- "size": self.size,
- "mtime": self.mtime,
- "chksum": self.chksum,
- "type": self.type,
- "linkname": self.linkname,
- "uname": self.uname,
- "gname": self.gname,
- "devmajor": self.devmajor,
- "devminor": self.devminor
- }
-
- if info["type"] == DIRTYPE and not info["name"].endswith("/"):
- info["name"] += "/"
-
- return info
-
- def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"):
- """Return a tar header as a string of 512 byte blocks.
- """
- info = self.get_info()
-
- if format == USTAR_FORMAT:
- return self.create_ustar_header(info, encoding, errors)
- elif format == GNU_FORMAT:
- return self.create_gnu_header(info, encoding, errors)
- elif format == PAX_FORMAT:
- return self.create_pax_header(info, encoding)
- else:
- raise ValueError("invalid format")
-
- def create_ustar_header(self, info, encoding, errors):
- """Return the object as a ustar header block.
- """
- info["magic"] = POSIX_MAGIC
-
- if len(info["linkname"]) > LENGTH_LINK:
- raise ValueError("linkname is too long")
-
- if len(info["name"]) > LENGTH_NAME:
- info["prefix"], info["name"] = self._posix_split_name(info["name"])
-
- return self._create_header(info, USTAR_FORMAT, encoding, errors)
-
- def create_gnu_header(self, info, encoding, errors):
- """Return the object as a GNU header block sequence.
- """
- info["magic"] = GNU_MAGIC
-
- buf = b""
- if len(info["linkname"]) > LENGTH_LINK:
- buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors)
-
- if len(info["name"]) > LENGTH_NAME:
- buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors)
-
- return buf + self._create_header(info, GNU_FORMAT, encoding, errors)
-
- def create_pax_header(self, info, encoding):
- """Return the object as a ustar header block. If it cannot be
- represented this way, prepend a pax extended header sequence
- with supplement information.
- """
- info["magic"] = POSIX_MAGIC
- pax_headers = self.pax_headers.copy()
-
- # Test string fields for values that exceed the field length or cannot
- # be represented in ASCII encoding.
- for name, hname, length in (
- ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK),
- ("uname", "uname", 32), ("gname", "gname", 32)):
-
- if hname in pax_headers:
- # The pax header has priority.
- continue
-
- # Try to encode the string as ASCII.
- try:
- info[name].encode("ascii", "strict")
- except UnicodeEncodeError:
- pax_headers[hname] = info[name]
- continue
-
- if len(info[name]) > length:
- pax_headers[hname] = info[name]
-
- # Test number fields for values that exceed the field limit or values
- # that like to be stored as float.
- for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)):
- if name in pax_headers:
- # The pax header has priority. Avoid overflow.
- info[name] = 0
- continue
-
- val = info[name]
- if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float):
- pax_headers[name] = str(val)
- info[name] = 0
-
- # Create a pax extended header if necessary.
- if pax_headers:
- buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding)
- else:
- buf = b""
-
- return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace")
-
- @classmethod
- def create_pax_global_header(cls, pax_headers):
- """Return the object as a pax global header block sequence.
- """
- return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8")
-
- def _posix_split_name(self, name):
- """Split a name longer than 100 chars into a prefix
- and a name part.
- """
- prefix = name[:LENGTH_PREFIX + 1]
- while prefix and prefix[-1] != "/":
- prefix = prefix[:-1]
-
- name = name[len(prefix):]
- prefix = prefix[:-1]
-
- if not prefix or len(name) > LENGTH_NAME:
- raise ValueError("name is too long")
- return prefix, name
-
- @staticmethod
- def _create_header(info, format, encoding, errors):
- """Return a header block. info is a dictionary with file
- information, format must be one of the *_FORMAT constants.
- """
- parts = [
- stn(info.get("name", ""), 100, encoding, errors),
- itn(info.get("mode", 0) & 0o7777, 8, format),
- itn(info.get("uid", 0), 8, format),
- itn(info.get("gid", 0), 8, format),
- itn(info.get("size", 0), 12, format),
- itn(info.get("mtime", 0), 12, format),
- b" ", # checksum field
- info.get("type", REGTYPE),
- stn(info.get("linkname", ""), 100, encoding, errors),
- info.get("magic", POSIX_MAGIC),
- stn(info.get("uname", ""), 32, encoding, errors),
- stn(info.get("gname", ""), 32, encoding, errors),
- itn(info.get("devmajor", 0), 8, format),
- itn(info.get("devminor", 0), 8, format),
- stn(info.get("prefix", ""), 155, encoding, errors)
- ]
-
- buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts))
- chksum = calc_chksums(buf[-BLOCKSIZE:])[0]
- buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:]
- return buf
-
- @staticmethod
- def _create_payload(payload):
- """Return the string payload filled with zero bytes
- up to the next 512 byte border.
- """
- blocks, remainder = divmod(len(payload), BLOCKSIZE)
- if remainder > 0:
- payload += (BLOCKSIZE - remainder) * NUL
- return payload
-
- @classmethod
- def _create_gnu_long_header(cls, name, type, encoding, errors):
- """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence
- for name.
- """
- name = name.encode(encoding, errors) + NUL
-
- info = {}
- info["name"] = "././@LongLink"
- info["type"] = type
- info["size"] = len(name)
- info["magic"] = GNU_MAGIC
-
- # create extended header + name blocks.
- return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \
- cls._create_payload(name)
-
- @classmethod
- def _create_pax_generic_header(cls, pax_headers, type, encoding):
- """Return a POSIX.1-2008 extended or global header sequence
- that contains a list of keyword, value pairs. The values
- must be strings.
- """
- # Check if one of the fields contains surrogate characters and thereby
- # forces hdrcharset=BINARY, see _proc_pax() for more information.
- binary = False
- for keyword, value in pax_headers.items():
- try:
- value.encode("utf8", "strict")
- except UnicodeEncodeError:
- binary = True
- break
-
- records = b""
- if binary:
- # Put the hdrcharset field at the beginning of the header.
- records += b"21 hdrcharset=BINARY\n"
-
- for keyword, value in pax_headers.items():
- keyword = keyword.encode("utf8")
- if binary:
- # Try to restore the original byte representation of `value'.
- # Needless to say, that the encoding must match the string.
- value = value.encode(encoding, "surrogateescape")
- else:
- value = value.encode("utf8")
-
- l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n'
- n = p = 0
- while True:
- n = l + len(str(p))
- if n == p:
- break
- p = n
- records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n"
-
- # We use a hardcoded "././@PaxHeader" name like star does
- # instead of the one that POSIX recommends.
- info = {}
- info["name"] = "././@PaxHeader"
- info["type"] = type
- info["size"] = len(records)
- info["magic"] = POSIX_MAGIC
-
- # Create pax header + record blocks.
- return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \
- cls._create_payload(records)
-
- @classmethod
- def frombuf(cls, buf, encoding, errors):
- """Construct a TarInfo object from a 512 byte bytes object.
- """
- if len(buf) == 0:
- raise EmptyHeaderError("empty header")
- if len(buf) != BLOCKSIZE:
- raise TruncatedHeaderError("truncated header")
- if buf.count(NUL) == BLOCKSIZE:
- raise EOFHeaderError("end of file header")
-
- chksum = nti(buf[148:156])
- if chksum not in calc_chksums(buf):
- raise InvalidHeaderError("bad checksum")
-
- obj = cls()
- obj.name = nts(buf[0:100], encoding, errors)
- obj.mode = nti(buf[100:108])
- obj.uid = nti(buf[108:116])
- obj.gid = nti(buf[116:124])
- obj.size = nti(buf[124:136])
- obj.mtime = nti(buf[136:148])
- obj.chksum = chksum
- obj.type = buf[156:157]
- obj.linkname = nts(buf[157:257], encoding, errors)
- obj.uname = nts(buf[265:297], encoding, errors)
- obj.gname = nts(buf[297:329], encoding, errors)
- obj.devmajor = nti(buf[329:337])
- obj.devminor = nti(buf[337:345])
- prefix = nts(buf[345:500], encoding, errors)
-
- # Old V7 tar format represents a directory as a regular
- # file with a trailing slash.
- if obj.type == AREGTYPE and obj.name.endswith("/"):
- obj.type = DIRTYPE
-
- # The old GNU sparse format occupies some of the unused
- # space in the buffer for up to 4 sparse structures.
- # Save the them for later processing in _proc_sparse().
- if obj.type == GNUTYPE_SPARSE:
- pos = 386
- structs = []
- for i in range(4):
- try:
- offset = nti(buf[pos:pos + 12])
- numbytes = nti(buf[pos + 12:pos + 24])
- except ValueError:
- break
- structs.append((offset, numbytes))
- pos += 24
- isextended = bool(buf[482])
- origsize = nti(buf[483:495])
- obj._sparse_structs = (structs, isextended, origsize)
-
- # Remove redundant slashes from directories.
- if obj.isdir():
- obj.name = obj.name.rstrip("/")
-
- # Reconstruct a ustar longname.
- if prefix and obj.type not in GNU_TYPES:
- obj.name = prefix + "/" + obj.name
- return obj
-
- @classmethod
- def fromtarfile(cls, tarfile):
- """Return the next TarInfo object from TarFile object
- tarfile.
- """
- buf = tarfile.fileobj.read(BLOCKSIZE)
- obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors)
- obj.offset = tarfile.fileobj.tell() - BLOCKSIZE
- return obj._proc_member(tarfile)
-
- #--------------------------------------------------------------------------
- # The following are methods that are called depending on the type of a
- # member. The entry point is _proc_member() which can be overridden in a
- # subclass to add custom _proc_*() methods. A _proc_*() method MUST
- # implement the following
- # operations:
- # 1. Set self.offset_data to the position where the data blocks begin,
- # if there is data that follows.
- # 2. Set tarfile.offset to the position where the next member's header will
- # begin.
- # 3. Return self or another valid TarInfo object.
- def _proc_member(self, tarfile):
- """Choose the right processing method depending on
- the type and call it.
- """
- if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK):
- return self._proc_gnulong(tarfile)
- elif self.type == GNUTYPE_SPARSE:
- return self._proc_sparse(tarfile)
- elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE):
- return self._proc_pax(tarfile)
- else:
- return self._proc_builtin(tarfile)
-
- def _proc_builtin(self, tarfile):
- """Process a builtin type or an unknown type which
- will be treated as a regular file.
- """
- self.offset_data = tarfile.fileobj.tell()
- offset = self.offset_data
- if self.isreg() or self.type not in SUPPORTED_TYPES:
- # Skip the following data blocks.
- offset += self._block(self.size)
- tarfile.offset = offset
-
- # Patch the TarInfo object with saved global
- # header information.
- self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors)
-
- return self
-
- def _proc_gnulong(self, tarfile):
- """Process the blocks that hold a GNU longname
- or longlink member.
- """
- buf = tarfile.fileobj.read(self._block(self.size))
-
- # Fetch the next header and process it.
- try:
- next = self.fromtarfile(tarfile)
- except HeaderError:
- raise SubsequentHeaderError("missing or bad subsequent header")
-
- # Patch the TarInfo object from the next header with
- # the longname information.
- next.offset = self.offset
- if self.type == GNUTYPE_LONGNAME:
- next.name = nts(buf, tarfile.encoding, tarfile.errors)
- elif self.type == GNUTYPE_LONGLINK:
- next.linkname = nts(buf, tarfile.encoding, tarfile.errors)
-
- return next
-
- def _proc_sparse(self, tarfile):
- """Process a GNU sparse header plus extra headers.
- """
- # We already collected some sparse structures in frombuf().
- structs, isextended, origsize = self._sparse_structs
- del self._sparse_structs
-
- # Collect sparse structures from extended header blocks.
- while isextended:
- buf = tarfile.fileobj.read(BLOCKSIZE)
- pos = 0
- for i in range(21):
- try:
- offset = nti(buf[pos:pos + 12])
- numbytes = nti(buf[pos + 12:pos + 24])
- except ValueError:
- break
- if offset and numbytes:
- structs.append((offset, numbytes))
- pos += 24
- isextended = bool(buf[504])
- self.sparse = structs
-
- self.offset_data = tarfile.fileobj.tell()
- tarfile.offset = self.offset_data + self._block(self.size)
- self.size = origsize
- return self
-
- def _proc_pax(self, tarfile):
- """Process an extended or global header as described in
- POSIX.1-2008.
- """
- # Read the header information.
- buf = tarfile.fileobj.read(self._block(self.size))
-
- # A pax header stores supplemental information for either
- # the following file (extended) or all following files
- # (global).
- if self.type == XGLTYPE:
- pax_headers = tarfile.pax_headers
- else:
- pax_headers = tarfile.pax_headers.copy()
-
- # Check if the pax header contains a hdrcharset field. This tells us
- # the encoding of the path, linkpath, uname and gname fields. Normally,
- # these fields are UTF-8 encoded but since POSIX.1-2008 tar
- # implementations are allowed to store them as raw binary strings if
- # the translation to UTF-8 fails.
- match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf)
- if match is not None:
- pax_headers["hdrcharset"] = match.group(1).decode("utf8")
-
- # For the time being, we don't care about anything other than "BINARY".
- # The only other value that is currently allowed by the standard is
- # "ISO-IR 10646 2000 UTF-8" in other words UTF-8.
- hdrcharset = pax_headers.get("hdrcharset")
- if hdrcharset == "BINARY":
- encoding = tarfile.encoding
- else:
- encoding = "utf8"
-
- # Parse pax header information. A record looks like that:
- # "%d %s=%s\n" % (length, keyword, value). length is the size
- # of the complete record including the length field itself and
- # the newline. keyword and value are both UTF-8 encoded strings.
- regex = re.compile(br"(\d+) ([^=]+)=")
- pos = 0
- while True:
- match = regex.match(buf, pos)
- if not match:
- break
-
- length, keyword = match.groups()
- length = int(length)
- value = buf[match.end(2) + 1:match.start(1) + length - 1]
-
- # Normally, we could just use "utf8" as the encoding and "strict"
- # as the error handler, but we better not take the risk. For
- # example, GNU tar <= 1.23 is known to store filenames it cannot
- # translate to UTF-8 as raw strings (unfortunately without a
- # hdrcharset=BINARY header).
- # We first try the strict standard encoding, and if that fails we
- # fall back on the user's encoding and error handler.
- keyword = self._decode_pax_field(keyword, "utf8", "utf8",
- tarfile.errors)
- if keyword in PAX_NAME_FIELDS:
- value = self._decode_pax_field(value, encoding, tarfile.encoding,
- tarfile.errors)
- else:
- value = self._decode_pax_field(value, "utf8", "utf8",
- tarfile.errors)
-
- pax_headers[keyword] = value
- pos += length
-
- # Fetch the next header.
- try:
- next = self.fromtarfile(tarfile)
- except HeaderError:
- raise SubsequentHeaderError("missing or bad subsequent header")
-
- # Process GNU sparse information.
- if "GNU.sparse.map" in pax_headers:
- # GNU extended sparse format version 0.1.
- self._proc_gnusparse_01(next, pax_headers)
-
- elif "GNU.sparse.size" in pax_headers:
- # GNU extended sparse format version 0.0.
- self._proc_gnusparse_00(next, pax_headers, buf)
-
- elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0":
- # GNU extended sparse format version 1.0.
- self._proc_gnusparse_10(next, pax_headers, tarfile)
-
- if self.type in (XHDTYPE, SOLARIS_XHDTYPE):
- # Patch the TarInfo object with the extended header info.
- next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors)
- next.offset = self.offset
-
- if "size" in pax_headers:
- # If the extended header replaces the size field,
- # we need to recalculate the offset where the next
- # header starts.
- offset = next.offset_data
- if next.isreg() or next.type not in SUPPORTED_TYPES:
- offset += next._block(next.size)
- tarfile.offset = offset
-
- return next
-
- def _proc_gnusparse_00(self, next, pax_headers, buf):
- """Process a GNU tar extended sparse header, version 0.0.
- """
- offsets = []
- for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf):
- offsets.append(int(match.group(1)))
- numbytes = []
- for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf):
- numbytes.append(int(match.group(1)))
- next.sparse = list(zip(offsets, numbytes))
-
- def _proc_gnusparse_01(self, next, pax_headers):
- """Process a GNU tar extended sparse header, version 0.1.
- """
- sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")]
- next.sparse = list(zip(sparse[::2], sparse[1::2]))
-
- def _proc_gnusparse_10(self, next, pax_headers, tarfile):
- """Process a GNU tar extended sparse header, version 1.0.
- """
- fields = None
- sparse = []
- buf = tarfile.fileobj.read(BLOCKSIZE)
- fields, buf = buf.split(b"\n", 1)
- fields = int(fields)
- while len(sparse) < fields * 2:
- if b"\n" not in buf:
- buf += tarfile.fileobj.read(BLOCKSIZE)
- number, buf = buf.split(b"\n", 1)
- sparse.append(int(number))
- next.offset_data = tarfile.fileobj.tell()
- next.sparse = list(zip(sparse[::2], sparse[1::2]))
-
- def _apply_pax_info(self, pax_headers, encoding, errors):
- """Replace fields with supplemental information from a previous
- pax extended or global header.
- """
- for keyword, value in pax_headers.items():
- if keyword == "GNU.sparse.name":
- setattr(self, "path", value)
- elif keyword == "GNU.sparse.size":
- setattr(self, "size", int(value))
- elif keyword == "GNU.sparse.realsize":
- setattr(self, "size", int(value))
- elif keyword in PAX_FIELDS:
- if keyword in PAX_NUMBER_FIELDS:
- try:
- value = PAX_NUMBER_FIELDS[keyword](value)
- except ValueError:
- value = 0
- if keyword == "path":
- value = value.rstrip("/")
- setattr(self, keyword, value)
-
- self.pax_headers = pax_headers.copy()
-
- def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors):
- """Decode a single field from a pax record.
- """
- try:
- return value.decode(encoding, "strict")
- except UnicodeDecodeError:
- return value.decode(fallback_encoding, fallback_errors)
-
- def _block(self, count):
- """Round up a byte count by BLOCKSIZE and return it,
- e.g. _block(834) => 1024.
- """
- blocks, remainder = divmod(count, BLOCKSIZE)
- if remainder:
- blocks += 1
- return blocks * BLOCKSIZE
-
- def isreg(self):
- return self.type in REGULAR_TYPES
- def isfile(self):
- return self.isreg()
- def isdir(self):
- return self.type == DIRTYPE
- def issym(self):
- return self.type == SYMTYPE
- def islnk(self):
- return self.type == LNKTYPE
- def ischr(self):
- return self.type == CHRTYPE
- def isblk(self):
- return self.type == BLKTYPE
- def isfifo(self):
- return self.type == FIFOTYPE
- def issparse(self):
- return self.sparse is not None
- def isdev(self):
- return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE)
-# class TarInfo
-
-class TarFile(object):
- """The TarFile Class provides an interface to tar archives.
- """
-
- debug = 0 # May be set from 0 (no msgs) to 3 (all msgs)
-
- dereference = False # If true, add content of linked file to the
- # tar file, else the link.
-
- ignore_zeros = False # If true, skips empty or invalid blocks and
- # continues processing.
-
- errorlevel = 1 # If 0, fatal errors only appear in debug
- # messages (if debug >= 0). If > 0, errors
- # are passed to the caller as exceptions.
-
- format = DEFAULT_FORMAT # The format to use when creating an archive.
-
- encoding = ENCODING # Encoding for 8-bit character strings.
-
- errors = None # Error handler for unicode conversion.
-
- tarinfo = TarInfo # The default TarInfo class to use.
-
- fileobject = ExFileObject # The default ExFileObject class to use.
-
- def __init__(self, name=None, mode="r", fileobj=None, format=None,
- tarinfo=None, dereference=None, ignore_zeros=None, encoding=None,
- errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None):
- """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to
- read from an existing archive, 'a' to append data to an existing
- file or 'w' to create a new file overwriting an existing one. `mode'
- defaults to 'r'.
- If `fileobj' is given, it is used for reading or writing data. If it
- can be determined, `mode' is overridden by `fileobj's mode.
- `fileobj' is not closed, when TarFile is closed.
- """
- if len(mode) > 1 or mode not in "raw":
- raise ValueError("mode must be 'r', 'a' or 'w'")
- self.mode = mode
- self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode]
-
- if not fileobj:
- if self.mode == "a" and not os.path.exists(name):
- # Create nonexistent files in append mode.
- self.mode = "w"
- self._mode = "wb"
- fileobj = bltn_open(name, self._mode)
- self._extfileobj = False
- else:
- if name is None and hasattr(fileobj, "name"):
- name = fileobj.name
- if hasattr(fileobj, "mode"):
- self._mode = fileobj.mode
- self._extfileobj = True
- self.name = os.path.abspath(name) if name else None
- self.fileobj = fileobj
-
- # Init attributes.
- if format is not None:
- self.format = format
- if tarinfo is not None:
- self.tarinfo = tarinfo
- if dereference is not None:
- self.dereference = dereference
- if ignore_zeros is not None:
- self.ignore_zeros = ignore_zeros
- if encoding is not None:
- self.encoding = encoding
- self.errors = errors
-
- if pax_headers is not None and self.format == PAX_FORMAT:
- self.pax_headers = pax_headers
- else:
- self.pax_headers = {}
-
- if debug is not None:
- self.debug = debug
- if errorlevel is not None:
- self.errorlevel = errorlevel
-
- # Init datastructures.
- self.closed = False
- self.members = [] # list of members as TarInfo objects
- self._loaded = False # flag if all members have been read
- self.offset = self.fileobj.tell()
- # current position in the archive file
- self.inodes = {} # dictionary caching the inodes of
- # archive members already added
-
- try:
- if self.mode == "r":
- self.firstmember = None
- self.firstmember = self.next()
-
- if self.mode == "a":
- # Move to the end of the archive,
- # before the first empty block.
- while True:
- self.fileobj.seek(self.offset)
- try:
- tarinfo = self.tarinfo.fromtarfile(self)
- self.members.append(tarinfo)
- except EOFHeaderError:
- self.fileobj.seek(self.offset)
- break
- except HeaderError as e:
- raise ReadError(str(e))
-
- if self.mode in "aw":
- self._loaded = True
-
- if self.pax_headers:
- buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy())
- self.fileobj.write(buf)
- self.offset += len(buf)
- except:
- if not self._extfileobj:
- self.fileobj.close()
- self.closed = True
- raise
-
- #--------------------------------------------------------------------------
- # Below are the classmethods which act as alternate constructors to the
- # TarFile class. The open() method is the only one that is needed for
- # public use; it is the "super"-constructor and is able to select an
- # adequate "sub"-constructor for a particular compression using the mapping
- # from OPEN_METH.
- #
- # This concept allows one to subclass TarFile without losing the comfort of
- # the super-constructor. A sub-constructor is registered and made available
- # by adding it to the mapping in OPEN_METH.
-
- @classmethod
- def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs):
- """Open a tar archive for reading, writing or appending. Return
- an appropriate TarFile class.
-
- mode:
- 'r' or 'r:*' open for reading with transparent compression
- 'r:' open for reading exclusively uncompressed
- 'r:gz' open for reading with gzip compression
- 'r:bz2' open for reading with bzip2 compression
- 'a' or 'a:' open for appending, creating the file if necessary
- 'w' or 'w:' open for writing without compression
- 'w:gz' open for writing with gzip compression
- 'w:bz2' open for writing with bzip2 compression
-
- 'r|*' open a stream of tar blocks with transparent compression
- 'r|' open an uncompressed stream of tar blocks for reading
- 'r|gz' open a gzip compressed stream of tar blocks
- 'r|bz2' open a bzip2 compressed stream of tar blocks
- 'w|' open an uncompressed stream for writing
- 'w|gz' open a gzip compressed stream for writing
- 'w|bz2' open a bzip2 compressed stream for writing
- """
-
- if not name and not fileobj:
- raise ValueError("nothing to open")
-
- if mode in ("r", "r:*"):
- # Find out which *open() is appropriate for opening the file.
- for comptype in cls.OPEN_METH:
- func = getattr(cls, cls.OPEN_METH[comptype])
- if fileobj is not None:
- saved_pos = fileobj.tell()
- try:
- return func(name, "r", fileobj, **kwargs)
- except (ReadError, CompressionError) as e:
- if fileobj is not None:
- fileobj.seek(saved_pos)
- continue
- raise ReadError("file could not be opened successfully")
-
- elif ":" in mode:
- filemode, comptype = mode.split(":", 1)
- filemode = filemode or "r"
- comptype = comptype or "tar"
-
- # Select the *open() function according to
- # given compression.
- if comptype in cls.OPEN_METH:
- func = getattr(cls, cls.OPEN_METH[comptype])
- else:
- raise CompressionError("unknown compression type %r" % comptype)
- return func(name, filemode, fileobj, **kwargs)
-
- elif "|" in mode:
- filemode, comptype = mode.split("|", 1)
- filemode = filemode or "r"
- comptype = comptype or "tar"
-
- if filemode not in "rw":
- raise ValueError("mode must be 'r' or 'w'")
-
- stream = _Stream(name, filemode, comptype, fileobj, bufsize)
- try:
- t = cls(name, filemode, stream, **kwargs)
- except:
- stream.close()
- raise
- t._extfileobj = False
- return t
-
- elif mode in "aw":
- return cls.taropen(name, mode, fileobj, **kwargs)
-
- raise ValueError("undiscernible mode")
-
- @classmethod
- def taropen(cls, name, mode="r", fileobj=None, **kwargs):
- """Open uncompressed tar archive name for reading or writing.
- """
- if len(mode) > 1 or mode not in "raw":
- raise ValueError("mode must be 'r', 'a' or 'w'")
- return cls(name, mode, fileobj, **kwargs)
-
- @classmethod
- def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
- """Open gzip compressed tar archive name for reading or writing.
- Appending is not allowed.
- """
- if len(mode) > 1 or mode not in "rw":
- raise ValueError("mode must be 'r' or 'w'")
-
- try:
- import gzip
- gzip.GzipFile
- except (ImportError, AttributeError):
- raise CompressionError("gzip module is not available")
-
- extfileobj = fileobj is not None
- try:
- fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj)
- t = cls.taropen(name, mode, fileobj, **kwargs)
- except IOError:
- if not extfileobj and fileobj is not None:
- fileobj.close()
- if fileobj is None:
- raise
- raise ReadError("not a gzip file")
- except:
- if not extfileobj and fileobj is not None:
- fileobj.close()
- raise
- t._extfileobj = extfileobj
- return t
-
- @classmethod
- def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
- """Open bzip2 compressed tar archive name for reading or writing.
- Appending is not allowed.
- """
- if len(mode) > 1 or mode not in "rw":
- raise ValueError("mode must be 'r' or 'w'.")
-
- try:
- import bz2
- except ImportError:
- raise CompressionError("bz2 module is not available")
-
- if fileobj is not None:
- fileobj = _BZ2Proxy(fileobj, mode)
- else:
- fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel)
-
- try:
- t = cls.taropen(name, mode, fileobj, **kwargs)
- except (IOError, EOFError):
- fileobj.close()
- raise ReadError("not a bzip2 file")
- t._extfileobj = False
- return t
-
- # All *open() methods are registered here.
- OPEN_METH = {
- "tar": "taropen", # uncompressed tar
- "gz": "gzopen", # gzip compressed tar
- "bz2": "bz2open" # bzip2 compressed tar
- }
-
- #--------------------------------------------------------------------------
- # The public methods which TarFile provides:
-
- def close(self):
- """Close the TarFile. In write-mode, two finishing zero blocks are
- appended to the archive.
- """
- if self.closed:
- return
-
- if self.mode in "aw":
- self.fileobj.write(NUL * (BLOCKSIZE * 2))
- self.offset += (BLOCKSIZE * 2)
- # fill up the end with zero-blocks
- # (like option -b20 for tar does)
- blocks, remainder = divmod(self.offset, RECORDSIZE)
- if remainder > 0:
- self.fileobj.write(NUL * (RECORDSIZE - remainder))
-
- if not self._extfileobj:
- self.fileobj.close()
- self.closed = True
-
- def getmember(self, name):
- """Return a TarInfo object for member `name'. If `name' can not be
- found in the archive, KeyError is raised. If a member occurs more
- than once in the archive, its last occurrence is assumed to be the
- most up-to-date version.
- """
- tarinfo = self._getmember(name)
- if tarinfo is None:
- raise KeyError("filename %r not found" % name)
- return tarinfo
-
- def getmembers(self):
- """Return the members of the archive as a list of TarInfo objects. The
- list has the same order as the members in the archive.
- """
- self._check()
- if not self._loaded: # if we want to obtain a list of
- self._load() # all members, we first have to
- # scan the whole archive.
- return self.members
-
- def getnames(self):
- """Return the members of the archive as a list of their names. It has
- the same order as the list returned by getmembers().
- """
- return [tarinfo.name for tarinfo in self.getmembers()]
-
- def gettarinfo(self, name=None, arcname=None, fileobj=None):
- """Create a TarInfo object for either the file `name' or the file
- object `fileobj' (using os.fstat on its file descriptor). You can
- modify some of the TarInfo's attributes before you add it using
- addfile(). If given, `arcname' specifies an alternative name for the
- file in the archive.
- """
- self._check("aw")
-
- # When fileobj is given, replace name by
- # fileobj's real name.
- if fileobj is not None:
- name = fileobj.name
-
- # Building the name of the member in the archive.
- # Backward slashes are converted to forward slashes,
- # Absolute paths are turned to relative paths.
- if arcname is None:
- arcname = name
- drv, arcname = os.path.splitdrive(arcname)
- arcname = arcname.replace(os.sep, "/")
- arcname = arcname.lstrip("/")
-
- # Now, fill the TarInfo object with
- # information specific for the file.
- tarinfo = self.tarinfo()
- tarinfo.tarfile = self
-
- # Use os.stat or os.lstat, depending on platform
- # and if symlinks shall be resolved.
- if fileobj is None:
- if hasattr(os, "lstat") and not self.dereference:
- statres = os.lstat(name)
- else:
- statres = os.stat(name)
- else:
- statres = os.fstat(fileobj.fileno())
- linkname = ""
-
- stmd = statres.st_mode
- if stat.S_ISREG(stmd):
- inode = (statres.st_ino, statres.st_dev)
- if not self.dereference and statres.st_nlink > 1 and \
- inode in self.inodes and arcname != self.inodes[inode]:
- # Is it a hardlink to an already
- # archived file?
- type = LNKTYPE
- linkname = self.inodes[inode]
- else:
- # The inode is added only if its valid.
- # For win32 it is always 0.
- type = REGTYPE
- if inode[0]:
- self.inodes[inode] = arcname
- elif stat.S_ISDIR(stmd):
- type = DIRTYPE
- elif stat.S_ISFIFO(stmd):
- type = FIFOTYPE
- elif stat.S_ISLNK(stmd):
- type = SYMTYPE
- linkname = os.readlink(name)
- elif stat.S_ISCHR(stmd):
- type = CHRTYPE
- elif stat.S_ISBLK(stmd):
- type = BLKTYPE
- else:
- return None
-
- # Fill the TarInfo object with all
- # information we can get.
- tarinfo.name = arcname
- tarinfo.mode = stmd
- tarinfo.uid = statres.st_uid
- tarinfo.gid = statres.st_gid
- if type == REGTYPE:
- tarinfo.size = statres.st_size
- else:
- tarinfo.size = 0
- tarinfo.mtime = statres.st_mtime
- tarinfo.type = type
- tarinfo.linkname = linkname
- if pwd:
- try:
- tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0]
- except KeyError:
- pass
- if grp:
- try:
- tarinfo.gname = grp.getgrgid(tarinfo.gid)[0]
- except KeyError:
- pass
-
- if type in (CHRTYPE, BLKTYPE):
- if hasattr(os, "major") and hasattr(os, "minor"):
- tarinfo.devmajor = os.major(statres.st_rdev)
- tarinfo.devminor = os.minor(statres.st_rdev)
- return tarinfo
-
- def list(self, verbose=True):
- """Print a table of contents to sys.stdout. If `verbose' is False, only
- the names of the members are printed. If it is True, an `ls -l'-like
- output is produced.
- """
- self._check()
-
- for tarinfo in self:
- if verbose:
- print(filemode(tarinfo.mode), end=' ')
- print("%s/%s" % (tarinfo.uname or tarinfo.uid,
- tarinfo.gname or tarinfo.gid), end=' ')
- if tarinfo.ischr() or tarinfo.isblk():
- print("%10s" % ("%d,%d" \
- % (tarinfo.devmajor, tarinfo.devminor)), end=' ')
- else:
- print("%10d" % tarinfo.size, end=' ')
- print("%d-%02d-%02d %02d:%02d:%02d" \
- % time.localtime(tarinfo.mtime)[:6], end=' ')
-
- print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ')
-
- if verbose:
- if tarinfo.issym():
- print("->", tarinfo.linkname, end=' ')
- if tarinfo.islnk():
- print("link to", tarinfo.linkname, end=' ')
- print()
-
- def add(self, name, arcname=None, recursive=True, exclude=None, filter=None):
- """Add the file `name' to the archive. `name' may be any type of file
- (directory, fifo, symbolic link, etc.). If given, `arcname'
- specifies an alternative name for the file in the archive.
- Directories are added recursively by default. This can be avoided by
- setting `recursive' to False. `exclude' is a function that should
- return True for each filename to be excluded. `filter' is a function
- that expects a TarInfo object argument and returns the changed
- TarInfo object, if it returns None the TarInfo object will be
- excluded from the archive.
- """
- self._check("aw")
-
- if arcname is None:
- arcname = name
-
- # Exclude pathnames.
- if exclude is not None:
- import warnings
- warnings.warn("use the filter argument instead",
- DeprecationWarning, 2)
- if exclude(name):
- self._dbg(2, "tarfile: Excluded %r" % name)
- return
-
- # Skip if somebody tries to archive the archive...
- if self.name is not None and os.path.abspath(name) == self.name:
- self._dbg(2, "tarfile: Skipped %r" % name)
- return
-
- self._dbg(1, name)
-
- # Create a TarInfo object from the file.
- tarinfo = self.gettarinfo(name, arcname)
-
- if tarinfo is None:
- self._dbg(1, "tarfile: Unsupported type %r" % name)
- return
-
- # Change or exclude the TarInfo object.
- if filter is not None:
- tarinfo = filter(tarinfo)
- if tarinfo is None:
- self._dbg(2, "tarfile: Excluded %r" % name)
- return
-
- # Append the tar header and data to the archive.
- if tarinfo.isreg():
- f = bltn_open(name, "rb")
- self.addfile(tarinfo, f)
- f.close()
-
- elif tarinfo.isdir():
- self.addfile(tarinfo)
- if recursive:
- for f in os.listdir(name):
- self.add(os.path.join(name, f), os.path.join(arcname, f),
- recursive, exclude, filter=filter)
-
- else:
- self.addfile(tarinfo)
-
- def addfile(self, tarinfo, fileobj=None):
- """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
- given, tarinfo.size bytes are read from it and added to the archive.
- You can create TarInfo objects using gettarinfo().
- On Windows platforms, `fileobj' should always be opened with mode
- 'rb' to avoid irritation about the file size.
- """
- self._check("aw")
-
- tarinfo = copy.copy(tarinfo)
-
- buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
- self.fileobj.write(buf)
- self.offset += len(buf)
-
- # If there's data to follow, append it.
- if fileobj is not None:
- copyfileobj(fileobj, self.fileobj, tarinfo.size)
- blocks, remainder = divmod(tarinfo.size, BLOCKSIZE)
- if remainder > 0:
- self.fileobj.write(NUL * (BLOCKSIZE - remainder))
- blocks += 1
- self.offset += blocks * BLOCKSIZE
-
- self.members.append(tarinfo)
-
- def extractall(self, path=".", members=None):
- """Extract all members from the archive to the current working
- directory and set owner, modification time and permissions on
- directories afterwards. `path' specifies a different directory
- to extract to. `members' is optional and must be a subset of the
- list returned by getmembers().
- """
- directories = []
-
- if members is None:
- members = self
-
- for tarinfo in members:
- if tarinfo.isdir():
- # Extract directories with a safe mode.
- directories.append(tarinfo)
- tarinfo = copy.copy(tarinfo)
- tarinfo.mode = 0o700
- # Do not set_attrs directories, as we will do that further down
- self.extract(tarinfo, path, set_attrs=not tarinfo.isdir())
-
- # Reverse sort directories.
- directories.sort(key=lambda a: a.name)
- directories.reverse()
-
- # Set correct owner, mtime and filemode on directories.
- for tarinfo in directories:
- dirpath = os.path.join(path, tarinfo.name)
- try:
- self.chown(tarinfo, dirpath)
- self.utime(tarinfo, dirpath)
- self.chmod(tarinfo, dirpath)
- except ExtractError as e:
- if self.errorlevel > 1:
- raise
- else:
- self._dbg(1, "tarfile: %s" % e)
-
- def extract(self, member, path="", set_attrs=True):
- """Extract a member from the archive to the current working directory,
- using its full name. Its file information is extracted as accurately
- as possible. `member' may be a filename or a TarInfo object. You can
- specify a different directory using `path'. File attributes (owner,
- mtime, mode) are set unless `set_attrs' is False.
- """
- self._check("r")
-
- if isinstance(member, str):
- tarinfo = self.getmember(member)
- else:
- tarinfo = member
-
- # Prepare the link target for makelink().
- if tarinfo.islnk():
- tarinfo._link_target = os.path.join(path, tarinfo.linkname)
-
- try:
- self._extract_member(tarinfo, os.path.join(path, tarinfo.name),
- set_attrs=set_attrs)
- except EnvironmentError as e:
- if self.errorlevel > 0:
- raise
- else:
- if e.filename is None:
- self._dbg(1, "tarfile: %s" % e.strerror)
- else:
- self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename))
- except ExtractError as e:
- if self.errorlevel > 1:
- raise
- else:
- self._dbg(1, "tarfile: %s" % e)
-
- def extractfile(self, member):
- """Extract a member from the archive as a file object. `member' may be
- a filename or a TarInfo object. If `member' is a regular file, a
- file-like object is returned. If `member' is a link, a file-like
- object is constructed from the link's target. If `member' is none of
- the above, None is returned.
- The file-like object is read-only and provides the following
- methods: read(), readline(), readlines(), seek() and tell()
- """
- self._check("r")
-
- if isinstance(member, str):
- tarinfo = self.getmember(member)
- else:
- tarinfo = member
-
- if tarinfo.isreg():
- return self.fileobject(self, tarinfo)
-
- elif tarinfo.type not in SUPPORTED_TYPES:
- # If a member's type is unknown, it is treated as a
- # regular file.
- return self.fileobject(self, tarinfo)
-
- elif tarinfo.islnk() or tarinfo.issym():
- if isinstance(self.fileobj, _Stream):
- # A small but ugly workaround for the case that someone tries
- # to extract a (sym)link as a file-object from a non-seekable
- # stream of tar blocks.
- raise StreamError("cannot extract (sym)link as file object")
- else:
- # A (sym)link's file object is its target's file object.
- return self.extractfile(self._find_link_target(tarinfo))
- else:
- # If there's no data associated with the member (directory, chrdev,
- # blkdev, etc.), return None instead of a file object.
- return None
-
- def _extract_member(self, tarinfo, targetpath, set_attrs=True):
- """Extract the TarInfo object tarinfo to a physical
- file called targetpath.
- """
- # Fetch the TarInfo object for the given name
- # and build the destination pathname, replacing
- # forward slashes to platform specific separators.
- targetpath = targetpath.rstrip("/")
- targetpath = targetpath.replace("/", os.sep)
-
- # Create all upper directories.
- upperdirs = os.path.dirname(targetpath)
- if upperdirs and not os.path.exists(upperdirs):
- # Create directories that are not part of the archive with
- # default permissions.
- os.makedirs(upperdirs)
-
- if tarinfo.islnk() or tarinfo.issym():
- self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname))
- else:
- self._dbg(1, tarinfo.name)
-
- if tarinfo.isreg():
- self.makefile(tarinfo, targetpath)
- elif tarinfo.isdir():
- self.makedir(tarinfo, targetpath)
- elif tarinfo.isfifo():
- self.makefifo(tarinfo, targetpath)
- elif tarinfo.ischr() or tarinfo.isblk():
- self.makedev(tarinfo, targetpath)
- elif tarinfo.islnk() or tarinfo.issym():
- self.makelink(tarinfo, targetpath)
- elif tarinfo.type not in SUPPORTED_TYPES:
- self.makeunknown(tarinfo, targetpath)
- else:
- self.makefile(tarinfo, targetpath)
-
- if set_attrs:
- self.chown(tarinfo, targetpath)
- if not tarinfo.issym():
- self.chmod(tarinfo, targetpath)
- self.utime(tarinfo, targetpath)
-
- #--------------------------------------------------------------------------
- # Below are the different file methods. They are called via
- # _extract_member() when extract() is called. They can be replaced in a
- # subclass to implement other functionality.
-
- def makedir(self, tarinfo, targetpath):
- """Make a directory called targetpath.
- """
- try:
- # Use a safe mode for the directory, the real mode is set
- # later in _extract_member().
- os.mkdir(targetpath, 0o700)
- except EnvironmentError as e:
- if e.errno != errno.EEXIST:
- raise
-
- def makefile(self, tarinfo, targetpath):
- """Make a file called targetpath.
- """
- source = self.fileobj
- source.seek(tarinfo.offset_data)
- target = bltn_open(targetpath, "wb")
- if tarinfo.sparse is not None:
- for offset, size in tarinfo.sparse:
- target.seek(offset)
- copyfileobj(source, target, size)
- else:
- copyfileobj(source, target, tarinfo.size)
- target.seek(tarinfo.size)
- target.truncate()
- target.close()
-
- def makeunknown(self, tarinfo, targetpath):
- """Make a file from a TarInfo object with an unknown type
- at targetpath.
- """
- self.makefile(tarinfo, targetpath)
- self._dbg(1, "tarfile: Unknown file type %r, " \
- "extracted as regular file." % tarinfo.type)
-
- def makefifo(self, tarinfo, targetpath):
- """Make a fifo called targetpath.
- """
- if hasattr(os, "mkfifo"):
- os.mkfifo(targetpath)
- else:
- raise ExtractError("fifo not supported by system")
-
- def makedev(self, tarinfo, targetpath):
- """Make a character or block device called targetpath.
- """
- if not hasattr(os, "mknod") or not hasattr(os, "makedev"):
- raise ExtractError("special devices not supported by system")
-
- mode = tarinfo.mode
- if tarinfo.isblk():
- mode |= stat.S_IFBLK
- else:
- mode |= stat.S_IFCHR
-
- os.mknod(targetpath, mode,
- os.makedev(tarinfo.devmajor, tarinfo.devminor))
-
- def makelink(self, tarinfo, targetpath):
- """Make a (symbolic) link called targetpath. If it cannot be created
- (platform limitation), we try to make a copy of the referenced file
- instead of a link.
- """
- try:
- # For systems that support symbolic and hard links.
- if tarinfo.issym():
- os.symlink(tarinfo.linkname, targetpath)
- else:
- # See extract().
- if os.path.exists(tarinfo._link_target):
- os.link(tarinfo._link_target, targetpath)
- else:
- self._extract_member(self._find_link_target(tarinfo),
- targetpath)
- except symlink_exception:
- if tarinfo.issym():
- linkpath = os.path.join(os.path.dirname(tarinfo.name),
- tarinfo.linkname)
- else:
- linkpath = tarinfo.linkname
- else:
- try:
- self._extract_member(self._find_link_target(tarinfo),
- targetpath)
- except KeyError:
- raise ExtractError("unable to resolve link inside archive")
-
- def chown(self, tarinfo, targetpath):
- """Set owner of targetpath according to tarinfo.
- """
- if pwd and hasattr(os, "geteuid") and os.geteuid() == 0:
- # We have to be root to do so.
- try:
- g = grp.getgrnam(tarinfo.gname)[2]
- except KeyError:
- g = tarinfo.gid
- try:
- u = pwd.getpwnam(tarinfo.uname)[2]
- except KeyError:
- u = tarinfo.uid
- try:
- if tarinfo.issym() and hasattr(os, "lchown"):
- os.lchown(targetpath, u, g)
- else:
- if sys.platform != "os2emx":
- os.chown(targetpath, u, g)
- except EnvironmentError as e:
- raise ExtractError("could not change owner")
-
- def chmod(self, tarinfo, targetpath):
- """Set file permissions of targetpath according to tarinfo.
- """
- if hasattr(os, 'chmod'):
- try:
- os.chmod(targetpath, tarinfo.mode)
- except EnvironmentError as e:
- raise ExtractError("could not change mode")
-
- def utime(self, tarinfo, targetpath):
- """Set modification time of targetpath according to tarinfo.
- """
- if not hasattr(os, 'utime'):
- return
- try:
- os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
- except EnvironmentError as e:
- raise ExtractError("could not change modification time")
-
- #--------------------------------------------------------------------------
- def next(self):
- """Return the next member of the archive as a TarInfo object, when
- TarFile is opened for reading. Return None if there is no more
- available.
- """
- self._check("ra")
- if self.firstmember is not None:
- m = self.firstmember
- self.firstmember = None
- return m
-
- # Read the next block.
- self.fileobj.seek(self.offset)
- tarinfo = None
- while True:
- try:
- tarinfo = self.tarinfo.fromtarfile(self)
- except EOFHeaderError as e:
- if self.ignore_zeros:
- self._dbg(2, "0x%X: %s" % (self.offset, e))
- self.offset += BLOCKSIZE
- continue
- except InvalidHeaderError as e:
- if self.ignore_zeros:
- self._dbg(2, "0x%X: %s" % (self.offset, e))
- self.offset += BLOCKSIZE
- continue
- elif self.offset == 0:
- raise ReadError(str(e))
- except EmptyHeaderError:
- if self.offset == 0:
- raise ReadError("empty file")
- except TruncatedHeaderError as e:
- if self.offset == 0:
- raise ReadError(str(e))
- except SubsequentHeaderError as e:
- raise ReadError(str(e))
- break
-
- if tarinfo is not None:
- self.members.append(tarinfo)
- else:
- self._loaded = True
-
- return tarinfo
-
- #--------------------------------------------------------------------------
- # Little helper methods:
-
- def _getmember(self, name, tarinfo=None, normalize=False):
- """Find an archive member by name from bottom to top.
- If tarinfo is given, it is used as the starting point.
- """
- # Ensure that all members have been loaded.
- members = self.getmembers()
-
- # Limit the member search list up to tarinfo.
- if tarinfo is not None:
- members = members[:members.index(tarinfo)]
-
- if normalize:
- name = os.path.normpath(name)
-
- for member in reversed(members):
- if normalize:
- member_name = os.path.normpath(member.name)
- else:
- member_name = member.name
-
- if name == member_name:
- return member
-
- def _load(self):
- """Read through the entire archive file and look for readable
- members.
- """
- while True:
- tarinfo = self.next()
- if tarinfo is None:
- break
- self._loaded = True
-
- def _check(self, mode=None):
- """Check if TarFile is still open, and if the operation's mode
- corresponds to TarFile's mode.
- """
- if self.closed:
- raise IOError("%s is closed" % self.__class__.__name__)
- if mode is not None and self.mode not in mode:
- raise IOError("bad operation for mode %r" % self.mode)
-
- def _find_link_target(self, tarinfo):
- """Find the target member of a symlink or hardlink member in the
- archive.
- """
- if tarinfo.issym():
- # Always search the entire archive.
- linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname
- limit = None
- else:
- # Search the archive before the link, because a hard link is
- # just a reference to an already archived file.
- linkname = tarinfo.linkname
- limit = tarinfo
-
- member = self._getmember(linkname, tarinfo=limit, normalize=True)
- if member is None:
- raise KeyError("linkname %r not found" % linkname)
- return member
-
- def __iter__(self):
- """Provide an iterator object.
- """
- if self._loaded:
- return iter(self.members)
- else:
- return TarIter(self)
-
- def _dbg(self, level, msg):
- """Write debugging output to sys.stderr.
- """
- if level <= self.debug:
- print(msg, file=sys.stderr)
-
- def __enter__(self):
- self._check()
- return self
-
- def __exit__(self, type, value, traceback):
- if type is None:
- self.close()
- else:
- # An exception occurred. We must not call close() because
- # it would try to write end-of-archive blocks and padding.
- if not self._extfileobj:
- self.fileobj.close()
- self.closed = True
-# class TarFile
-
-class TarIter(object):
- """Iterator Class.
-
- for tarinfo in TarFile(...):
- suite...
- """
-
- def __init__(self, tarfile):
- """Construct a TarIter object.
- """
- self.tarfile = tarfile
- self.index = 0
- def __iter__(self):
- """Return iterator object.
- """
- return self
-
- def __next__(self):
- """Return the next item using TarFile's next() method.
- When all members have been read, set TarFile as _loaded.
- """
- # Fix for SF #1100429: Under rare circumstances it can
- # happen that getmembers() is called during iteration,
- # which will cause TarIter to stop prematurely.
- if not self.tarfile._loaded:
- tarinfo = self.tarfile.next()
- if not tarinfo:
- self.tarfile._loaded = True
- raise StopIteration
- else:
- try:
- tarinfo = self.tarfile.members[self.index]
- except IndexError:
- raise StopIteration
- self.index += 1
- return tarinfo
-
- next = __next__ # for Python 2.x
-
-#--------------------
-# exported functions
-#--------------------
-def is_tarfile(name):
- """Return True if name points to a tar archive that we
- are able to handle, else return False.
- """
- try:
- t = open(name)
- t.close()
- return True
- except TarError:
- return False
-
-bltn_open = open
-open = TarFile.open
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/compat.py b/venv/Lib/site-packages/pip/_vendor/distlib/compat.py
deleted file mode 100644
index c316fd9..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/compat.py
+++ /dev/null
@@ -1,1120 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013-2017 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-from __future__ import absolute_import
-
-import os
-import re
-import sys
-
-try:
- import ssl
-except ImportError: # pragma: no cover
- ssl = None
-
-if sys.version_info[0] < 3: # pragma: no cover
- from StringIO import StringIO
- string_types = basestring,
- text_type = unicode
- from types import FileType as file_type
- import __builtin__ as builtins
- import ConfigParser as configparser
- from ._backport import shutil
- from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit
- from urllib import (urlretrieve, quote as _quote, unquote, url2pathname,
- pathname2url, ContentTooShortError, splittype)
-
- def quote(s):
- if isinstance(s, unicode):
- s = s.encode('utf-8')
- return _quote(s)
-
- import urllib2
- from urllib2 import (Request, urlopen, URLError, HTTPError,
- HTTPBasicAuthHandler, HTTPPasswordMgr,
- HTTPHandler, HTTPRedirectHandler,
- build_opener)
- if ssl:
- from urllib2 import HTTPSHandler
- import httplib
- import xmlrpclib
- import Queue as queue
- from HTMLParser import HTMLParser
- import htmlentitydefs
- raw_input = raw_input
- from itertools import ifilter as filter
- from itertools import ifilterfalse as filterfalse
-
- _userprog = None
- def splituser(host):
- """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
- global _userprog
- if _userprog is None:
- import re
- _userprog = re.compile('^(.*)@(.*)$')
-
- match = _userprog.match(host)
- if match: return match.group(1, 2)
- return None, host
-
-else: # pragma: no cover
- from io import StringIO
- string_types = str,
- text_type = str
- from io import TextIOWrapper as file_type
- import builtins
- import configparser
- import shutil
- from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote,
- unquote, urlsplit, urlunsplit, splittype)
- from urllib.request import (urlopen, urlretrieve, Request, url2pathname,
- pathname2url,
- HTTPBasicAuthHandler, HTTPPasswordMgr,
- HTTPHandler, HTTPRedirectHandler,
- build_opener)
- if ssl:
- from urllib.request import HTTPSHandler
- from urllib.error import HTTPError, URLError, ContentTooShortError
- import http.client as httplib
- import urllib.request as urllib2
- import xmlrpc.client as xmlrpclib
- import queue
- from html.parser import HTMLParser
- import html.entities as htmlentitydefs
- raw_input = input
- from itertools import filterfalse
- filter = filter
-
-try:
- from ssl import match_hostname, CertificateError
-except ImportError: # pragma: no cover
- class CertificateError(ValueError):
- pass
-
-
- def _dnsname_match(dn, hostname, max_wildcards=1):
- """Matching according to RFC 6125, section 6.4.3
-
- http://tools.ietf.org/html/rfc6125#section-6.4.3
- """
- pats = []
- if not dn:
- return False
-
- parts = dn.split('.')
- leftmost, remainder = parts[0], parts[1:]
-
- wildcards = leftmost.count('*')
- if wildcards > max_wildcards:
- # Issue #17980: avoid denials of service by refusing more
- # than one wildcard per fragment. A survey of established
- # policy among SSL implementations showed it to be a
- # reasonable choice.
- raise CertificateError(
- "too many wildcards in certificate DNS name: " + repr(dn))
-
- # speed up common case w/o wildcards
- if not wildcards:
- return dn.lower() == hostname.lower()
-
- # RFC 6125, section 6.4.3, subitem 1.
- # The client SHOULD NOT attempt to match a presented identifier in which
- # the wildcard character comprises a label other than the left-most label.
- if leftmost == '*':
- # When '*' is a fragment by itself, it matches a non-empty dotless
- # fragment.
- pats.append('[^.]+')
- elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
- # RFC 6125, section 6.4.3, subitem 3.
- # The client SHOULD NOT attempt to match a presented identifier
- # where the wildcard character is embedded within an A-label or
- # U-label of an internationalized domain name.
- pats.append(re.escape(leftmost))
- else:
- # Otherwise, '*' matches any dotless string, e.g. www*
- pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
-
- # add the remaining fragments, ignore any wildcards
- for frag in remainder:
- pats.append(re.escape(frag))
-
- pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
- return pat.match(hostname)
-
-
- def match_hostname(cert, hostname):
- """Verify that *cert* (in decoded format as returned by
- SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125
- rules are followed, but IP addresses are not accepted for *hostname*.
-
- CertificateError is raised on failure. On success, the function
- returns nothing.
- """
- if not cert:
- raise ValueError("empty or no certificate, match_hostname needs a "
- "SSL socket or SSL context with either "
- "CERT_OPTIONAL or CERT_REQUIRED")
- dnsnames = []
- san = cert.get('subjectAltName', ())
- for key, value in san:
- if key == 'DNS':
- if _dnsname_match(value, hostname):
- return
- dnsnames.append(value)
- if not dnsnames:
- # The subject is only checked when there is no dNSName entry
- # in subjectAltName
- for sub in cert.get('subject', ()):
- for key, value in sub:
- # XXX according to RFC 2818, the most specific Common Name
- # must be used.
- if key == 'commonName':
- if _dnsname_match(value, hostname):
- return
- dnsnames.append(value)
- if len(dnsnames) > 1:
- raise CertificateError("hostname %r "
- "doesn't match either of %s"
- % (hostname, ', '.join(map(repr, dnsnames))))
- elif len(dnsnames) == 1:
- raise CertificateError("hostname %r "
- "doesn't match %r"
- % (hostname, dnsnames[0]))
- else:
- raise CertificateError("no appropriate commonName or "
- "subjectAltName fields were found")
-
-
-try:
- from types import SimpleNamespace as Container
-except ImportError: # pragma: no cover
- class Container(object):
- """
- A generic container for when multiple values need to be returned
- """
- def __init__(self, **kwargs):
- self.__dict__.update(kwargs)
-
-
-try:
- from shutil import which
-except ImportError: # pragma: no cover
- # Implementation from Python 3.3
- def which(cmd, mode=os.F_OK | os.X_OK, path=None):
- """Given a command, mode, and a PATH string, return the path which
- conforms to the given mode on the PATH, or None if there is no such
- file.
-
- `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
- of os.environ.get("PATH"), or can be overridden with a custom search
- path.
-
- """
- # Check that a given file can be accessed with the correct mode.
- # Additionally check that `file` is not a directory, as on Windows
- # directories pass the os.access check.
- def _access_check(fn, mode):
- return (os.path.exists(fn) and os.access(fn, mode)
- and not os.path.isdir(fn))
-
- # If we're given a path with a directory part, look it up directly rather
- # than referring to PATH directories. This includes checking relative to the
- # current directory, e.g. ./script
- if os.path.dirname(cmd):
- if _access_check(cmd, mode):
- return cmd
- return None
-
- if path is None:
- path = os.environ.get("PATH", os.defpath)
- if not path:
- return None
- path = path.split(os.pathsep)
-
- if sys.platform == "win32":
- # The current directory takes precedence on Windows.
- if not os.curdir in path:
- path.insert(0, os.curdir)
-
- # PATHEXT is necessary to check on Windows.
- pathext = os.environ.get("PATHEXT", "").split(os.pathsep)
- # See if the given file matches any of the expected path extensions.
- # This will allow us to short circuit when given "python.exe".
- # If it does match, only test that one, otherwise we have to try
- # others.
- if any(cmd.lower().endswith(ext.lower()) for ext in pathext):
- files = [cmd]
- else:
- files = [cmd + ext for ext in pathext]
- else:
- # On other platforms you don't have things like PATHEXT to tell you
- # what file suffixes are executable, so just pass on cmd as-is.
- files = [cmd]
-
- seen = set()
- for dir in path:
- normdir = os.path.normcase(dir)
- if not normdir in seen:
- seen.add(normdir)
- for thefile in files:
- name = os.path.join(dir, thefile)
- if _access_check(name, mode):
- return name
- return None
-
-
-# ZipFile is a context manager in 2.7, but not in 2.6
-
-from zipfile import ZipFile as BaseZipFile
-
-if hasattr(BaseZipFile, '__enter__'): # pragma: no cover
- ZipFile = BaseZipFile
-else: # pragma: no cover
- from zipfile import ZipExtFile as BaseZipExtFile
-
- class ZipExtFile(BaseZipExtFile):
- def __init__(self, base):
- self.__dict__.update(base.__dict__)
-
- def __enter__(self):
- return self
-
- def __exit__(self, *exc_info):
- self.close()
- # return None, so if an exception occurred, it will propagate
-
- class ZipFile(BaseZipFile):
- def __enter__(self):
- return self
-
- def __exit__(self, *exc_info):
- self.close()
- # return None, so if an exception occurred, it will propagate
-
- def open(self, *args, **kwargs):
- base = BaseZipFile.open(self, *args, **kwargs)
- return ZipExtFile(base)
-
-try:
- from platform import python_implementation
-except ImportError: # pragma: no cover
- def python_implementation():
- """Return a string identifying the Python implementation."""
- if 'PyPy' in sys.version:
- return 'PyPy'
- if os.name == 'java':
- return 'Jython'
- if sys.version.startswith('IronPython'):
- return 'IronPython'
- return 'CPython'
-
-try:
- import sysconfig
-except ImportError: # pragma: no cover
- from ._backport import sysconfig
-
-try:
- callable = callable
-except NameError: # pragma: no cover
- from collections.abc import Callable
-
- def callable(obj):
- return isinstance(obj, Callable)
-
-
-try:
- fsencode = os.fsencode
- fsdecode = os.fsdecode
-except AttributeError: # pragma: no cover
- # Issue #99: on some systems (e.g. containerised),
- # sys.getfilesystemencoding() returns None, and we need a real value,
- # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and
- # sys.getfilesystemencoding(): the return value is "the user’s preference
- # according to the result of nl_langinfo(CODESET), or None if the
- # nl_langinfo(CODESET) failed."
- _fsencoding = sys.getfilesystemencoding() or 'utf-8'
- if _fsencoding == 'mbcs':
- _fserrors = 'strict'
- else:
- _fserrors = 'surrogateescape'
-
- def fsencode(filename):
- if isinstance(filename, bytes):
- return filename
- elif isinstance(filename, text_type):
- return filename.encode(_fsencoding, _fserrors)
- else:
- raise TypeError("expect bytes or str, not %s" %
- type(filename).__name__)
-
- def fsdecode(filename):
- if isinstance(filename, text_type):
- return filename
- elif isinstance(filename, bytes):
- return filename.decode(_fsencoding, _fserrors)
- else:
- raise TypeError("expect bytes or str, not %s" %
- type(filename).__name__)
-
-try:
- from tokenize import detect_encoding
-except ImportError: # pragma: no cover
- from codecs import BOM_UTF8, lookup
- import re
-
- cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)")
-
- def _get_normal_name(orig_enc):
- """Imitates get_normal_name in tokenizer.c."""
- # Only care about the first 12 characters.
- enc = orig_enc[:12].lower().replace("_", "-")
- if enc == "utf-8" or enc.startswith("utf-8-"):
- return "utf-8"
- if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \
- enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")):
- return "iso-8859-1"
- return orig_enc
-
- def detect_encoding(readline):
- """
- The detect_encoding() function is used to detect the encoding that should
- be used to decode a Python source file. It requires one argument, readline,
- in the same way as the tokenize() generator.
-
- It will call readline a maximum of twice, and return the encoding used
- (as a string) and a list of any lines (left as bytes) it has read in.
-
- It detects the encoding from the presence of a utf-8 bom or an encoding
- cookie as specified in pep-0263. If both a bom and a cookie are present,
- but disagree, a SyntaxError will be raised. If the encoding cookie is an
- invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found,
- 'utf-8-sig' is returned.
-
- If no encoding is specified, then the default of 'utf-8' will be returned.
- """
- try:
- filename = readline.__self__.name
- except AttributeError:
- filename = None
- bom_found = False
- encoding = None
- default = 'utf-8'
- def read_or_stop():
- try:
- return readline()
- except StopIteration:
- return b''
-
- def find_cookie(line):
- try:
- # Decode as UTF-8. Either the line is an encoding declaration,
- # in which case it should be pure ASCII, or it must be UTF-8
- # per default encoding.
- line_string = line.decode('utf-8')
- except UnicodeDecodeError:
- msg = "invalid or missing encoding declaration"
- if filename is not None:
- msg = '{} for {!r}'.format(msg, filename)
- raise SyntaxError(msg)
-
- matches = cookie_re.findall(line_string)
- if not matches:
- return None
- encoding = _get_normal_name(matches[0])
- try:
- codec = lookup(encoding)
- except LookupError:
- # This behaviour mimics the Python interpreter
- if filename is None:
- msg = "unknown encoding: " + encoding
- else:
- msg = "unknown encoding for {!r}: {}".format(filename,
- encoding)
- raise SyntaxError(msg)
-
- if bom_found:
- if codec.name != 'utf-8':
- # This behaviour mimics the Python interpreter
- if filename is None:
- msg = 'encoding problem: utf-8'
- else:
- msg = 'encoding problem for {!r}: utf-8'.format(filename)
- raise SyntaxError(msg)
- encoding += '-sig'
- return encoding
-
- first = read_or_stop()
- if first.startswith(BOM_UTF8):
- bom_found = True
- first = first[3:]
- default = 'utf-8-sig'
- if not first:
- return default, []
-
- encoding = find_cookie(first)
- if encoding:
- return encoding, [first]
-
- second = read_or_stop()
- if not second:
- return default, [first]
-
- encoding = find_cookie(second)
- if encoding:
- return encoding, [first, second]
-
- return default, [first, second]
-
-# For converting & <-> & etc.
-try:
- from html import escape
-except ImportError:
- from cgi import escape
-if sys.version_info[:2] < (3, 4):
- unescape = HTMLParser().unescape
-else:
- from html import unescape
-
-try:
- from collections import ChainMap
-except ImportError: # pragma: no cover
- from collections import MutableMapping
-
- try:
- from reprlib import recursive_repr as _recursive_repr
- except ImportError:
- def _recursive_repr(fillvalue='...'):
- '''
- Decorator to make a repr function return fillvalue for a recursive
- call
- '''
-
- def decorating_function(user_function):
- repr_running = set()
-
- def wrapper(self):
- key = id(self), get_ident()
- if key in repr_running:
- return fillvalue
- repr_running.add(key)
- try:
- result = user_function(self)
- finally:
- repr_running.discard(key)
- return result
-
- # Can't use functools.wraps() here because of bootstrap issues
- wrapper.__module__ = getattr(user_function, '__module__')
- wrapper.__doc__ = getattr(user_function, '__doc__')
- wrapper.__name__ = getattr(user_function, '__name__')
- wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
- return wrapper
-
- return decorating_function
-
- class ChainMap(MutableMapping):
- ''' A ChainMap groups multiple dicts (or other mappings) together
- to create a single, updateable view.
-
- The underlying mappings are stored in a list. That list is public and can
- accessed or updated using the *maps* attribute. There is no other state.
-
- Lookups search the underlying mappings successively until a key is found.
- In contrast, writes, updates, and deletions only operate on the first
- mapping.
-
- '''
-
- def __init__(self, *maps):
- '''Initialize a ChainMap by setting *maps* to the given mappings.
- If no mappings are provided, a single empty dictionary is used.
-
- '''
- self.maps = list(maps) or [{}] # always at least one map
-
- def __missing__(self, key):
- raise KeyError(key)
-
- def __getitem__(self, key):
- for mapping in self.maps:
- try:
- return mapping[key] # can't use 'key in mapping' with defaultdict
- except KeyError:
- pass
- return self.__missing__(key) # support subclasses that define __missing__
-
- def get(self, key, default=None):
- return self[key] if key in self else default
-
- def __len__(self):
- return len(set().union(*self.maps)) # reuses stored hash values if possible
-
- def __iter__(self):
- return iter(set().union(*self.maps))
-
- def __contains__(self, key):
- return any(key in m for m in self.maps)
-
- def __bool__(self):
- return any(self.maps)
-
- @_recursive_repr()
- def __repr__(self):
- return '{0.__class__.__name__}({1})'.format(
- self, ', '.join(map(repr, self.maps)))
-
- @classmethod
- def fromkeys(cls, iterable, *args):
- 'Create a ChainMap with a single dict created from the iterable.'
- return cls(dict.fromkeys(iterable, *args))
-
- def copy(self):
- 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]'
- return self.__class__(self.maps[0].copy(), *self.maps[1:])
-
- __copy__ = copy
-
- def new_child(self): # like Django's Context.push()
- 'New ChainMap with a new dict followed by all previous maps.'
- return self.__class__({}, *self.maps)
-
- @property
- def parents(self): # like Django's Context.pop()
- 'New ChainMap from maps[1:].'
- return self.__class__(*self.maps[1:])
-
- def __setitem__(self, key, value):
- self.maps[0][key] = value
-
- def __delitem__(self, key):
- try:
- del self.maps[0][key]
- except KeyError:
- raise KeyError('Key not found in the first mapping: {!r}'.format(key))
-
- def popitem(self):
- 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.'
- try:
- return self.maps[0].popitem()
- except KeyError:
- raise KeyError('No keys found in the first mapping.')
-
- def pop(self, key, *args):
- 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].'
- try:
- return self.maps[0].pop(key, *args)
- except KeyError:
- raise KeyError('Key not found in the first mapping: {!r}'.format(key))
-
- def clear(self):
- 'Clear maps[0], leaving maps[1:] intact.'
- self.maps[0].clear()
-
-try:
- from importlib.util import cache_from_source # Python >= 3.4
-except ImportError: # pragma: no cover
- try:
- from imp import cache_from_source
- except ImportError: # pragma: no cover
- def cache_from_source(path, debug_override=None):
- assert path.endswith('.py')
- if debug_override is None:
- debug_override = __debug__
- if debug_override:
- suffix = 'c'
- else:
- suffix = 'o'
- return path + suffix
-
-try:
- from collections import OrderedDict
-except ImportError: # pragma: no cover
-## {{{ http://code.activestate.com/recipes/576693/ (r9)
-# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
-# Passes Python2.7's test suite and incorporates all the latest updates.
- try:
- from thread import get_ident as _get_ident
- except ImportError:
- from dummy_thread import get_ident as _get_ident
-
- try:
- from _abcoll import KeysView, ValuesView, ItemsView
- except ImportError:
- pass
-
-
- class OrderedDict(dict):
- 'Dictionary that remembers insertion order'
- # An inherited dict maps keys to values.
- # The inherited dict provides __getitem__, __len__, __contains__, and get.
- # The remaining methods are order-aware.
- # Big-O running times for all methods are the same as for regular dictionaries.
-
- # The internal self.__map dictionary maps keys to links in a doubly linked list.
- # The circular doubly linked list starts and ends with a sentinel element.
- # The sentinel element never gets deleted (this simplifies the algorithm).
- # Each link is stored as a list of length three: [PREV, NEXT, KEY].
-
- def __init__(self, *args, **kwds):
- '''Initialize an ordered dictionary. Signature is the same as for
- regular dictionaries, but keyword arguments are not recommended
- because their insertion order is arbitrary.
-
- '''
- if len(args) > 1:
- raise TypeError('expected at most 1 arguments, got %d' % len(args))
- try:
- self.__root
- except AttributeError:
- self.__root = root = [] # sentinel node
- root[:] = [root, root, None]
- self.__map = {}
- self.__update(*args, **kwds)
-
- def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
- 'od.__setitem__(i, y) <==> od[i]=y'
- # Setting a new item creates a new link which goes at the end of the linked
- # list, and the inherited dictionary is updated with the new key/value pair.
- if key not in self:
- root = self.__root
- last = root[0]
- last[1] = root[0] = self.__map[key] = [last, root, key]
- dict_setitem(self, key, value)
-
- def __delitem__(self, key, dict_delitem=dict.__delitem__):
- 'od.__delitem__(y) <==> del od[y]'
- # Deleting an existing item uses self.__map to find the link which is
- # then removed by updating the links in the predecessor and successor nodes.
- dict_delitem(self, key)
- link_prev, link_next, key = self.__map.pop(key)
- link_prev[1] = link_next
- link_next[0] = link_prev
-
- def __iter__(self):
- 'od.__iter__() <==> iter(od)'
- root = self.__root
- curr = root[1]
- while curr is not root:
- yield curr[2]
- curr = curr[1]
-
- def __reversed__(self):
- 'od.__reversed__() <==> reversed(od)'
- root = self.__root
- curr = root[0]
- while curr is not root:
- yield curr[2]
- curr = curr[0]
-
- def clear(self):
- 'od.clear() -> None. Remove all items from od.'
- try:
- for node in self.__map.itervalues():
- del node[:]
- root = self.__root
- root[:] = [root, root, None]
- self.__map.clear()
- except AttributeError:
- pass
- dict.clear(self)
-
- def popitem(self, last=True):
- '''od.popitem() -> (k, v), return and remove a (key, value) pair.
- Pairs are returned in LIFO order if last is true or FIFO order if false.
-
- '''
- if not self:
- raise KeyError('dictionary is empty')
- root = self.__root
- if last:
- link = root[0]
- link_prev = link[0]
- link_prev[1] = root
- root[0] = link_prev
- else:
- link = root[1]
- link_next = link[1]
- root[1] = link_next
- link_next[0] = root
- key = link[2]
- del self.__map[key]
- value = dict.pop(self, key)
- return key, value
-
- # -- the following methods do not depend on the internal structure --
-
- def keys(self):
- 'od.keys() -> list of keys in od'
- return list(self)
-
- def values(self):
- 'od.values() -> list of values in od'
- return [self[key] for key in self]
-
- def items(self):
- 'od.items() -> list of (key, value) pairs in od'
- return [(key, self[key]) for key in self]
-
- def iterkeys(self):
- 'od.iterkeys() -> an iterator over the keys in od'
- return iter(self)
-
- def itervalues(self):
- 'od.itervalues -> an iterator over the values in od'
- for k in self:
- yield self[k]
-
- def iteritems(self):
- 'od.iteritems -> an iterator over the (key, value) items in od'
- for k in self:
- yield (k, self[k])
-
- def update(*args, **kwds):
- '''od.update(E, **F) -> None. Update od from dict/iterable E and F.
-
- If E is a dict instance, does: for k in E: od[k] = E[k]
- If E has a .keys() method, does: for k in E.keys(): od[k] = E[k]
- Or if E is an iterable of items, does: for k, v in E: od[k] = v
- In either case, this is followed by: for k, v in F.items(): od[k] = v
-
- '''
- if len(args) > 2:
- raise TypeError('update() takes at most 2 positional '
- 'arguments (%d given)' % (len(args),))
- elif not args:
- raise TypeError('update() takes at least 1 argument (0 given)')
- self = args[0]
- # Make progressively weaker assumptions about "other"
- other = ()
- if len(args) == 2:
- other = args[1]
- if isinstance(other, dict):
- for key in other:
- self[key] = other[key]
- elif hasattr(other, 'keys'):
- for key in other.keys():
- self[key] = other[key]
- else:
- for key, value in other:
- self[key] = value
- for key, value in kwds.items():
- self[key] = value
-
- __update = update # let subclasses override update without breaking __init__
-
- __marker = object()
-
- def pop(self, key, default=__marker):
- '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
- If key is not found, d is returned if given, otherwise KeyError is raised.
-
- '''
- if key in self:
- result = self[key]
- del self[key]
- return result
- if default is self.__marker:
- raise KeyError(key)
- return default
-
- def setdefault(self, key, default=None):
- 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
- if key in self:
- return self[key]
- self[key] = default
- return default
-
- def __repr__(self, _repr_running=None):
- 'od.__repr__() <==> repr(od)'
- if not _repr_running: _repr_running = {}
- call_key = id(self), _get_ident()
- if call_key in _repr_running:
- return '...'
- _repr_running[call_key] = 1
- try:
- if not self:
- return '%s()' % (self.__class__.__name__,)
- return '%s(%r)' % (self.__class__.__name__, self.items())
- finally:
- del _repr_running[call_key]
-
- def __reduce__(self):
- 'Return state information for pickling'
- items = [[k, self[k]] for k in self]
- inst_dict = vars(self).copy()
- for k in vars(OrderedDict()):
- inst_dict.pop(k, None)
- if inst_dict:
- return (self.__class__, (items,), inst_dict)
- return self.__class__, (items,)
-
- def copy(self):
- 'od.copy() -> a shallow copy of od'
- return self.__class__(self)
-
- @classmethod
- def fromkeys(cls, iterable, value=None):
- '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
- and values equal to v (which defaults to None).
-
- '''
- d = cls()
- for key in iterable:
- d[key] = value
- return d
-
- def __eq__(self, other):
- '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
- while comparison to a regular mapping is order-insensitive.
-
- '''
- if isinstance(other, OrderedDict):
- return len(self)==len(other) and self.items() == other.items()
- return dict.__eq__(self, other)
-
- def __ne__(self, other):
- return not self == other
-
- # -- the following methods are only used in Python 2.7 --
-
- def viewkeys(self):
- "od.viewkeys() -> a set-like object providing a view on od's keys"
- return KeysView(self)
-
- def viewvalues(self):
- "od.viewvalues() -> an object providing a view on od's values"
- return ValuesView(self)
-
- def viewitems(self):
- "od.viewitems() -> a set-like object providing a view on od's items"
- return ItemsView(self)
-
-try:
- from logging.config import BaseConfigurator, valid_ident
-except ImportError: # pragma: no cover
- IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)
-
-
- def valid_ident(s):
- m = IDENTIFIER.match(s)
- if not m:
- raise ValueError('Not a valid Python identifier: %r' % s)
- return True
-
-
- # The ConvertingXXX classes are wrappers around standard Python containers,
- # and they serve to convert any suitable values in the container. The
- # conversion converts base dicts, lists and tuples to their wrapped
- # equivalents, whereas strings which match a conversion format are converted
- # appropriately.
- #
- # Each wrapper should have a configurator attribute holding the actual
- # configurator to use for conversion.
-
- class ConvertingDict(dict):
- """A converting dictionary wrapper."""
-
- def __getitem__(self, key):
- value = dict.__getitem__(self, key)
- result = self.configurator.convert(value)
- #If the converted value is different, save for next time
- if value is not result:
- self[key] = result
- if type(result) in (ConvertingDict, ConvertingList,
- ConvertingTuple):
- result.parent = self
- result.key = key
- return result
-
- def get(self, key, default=None):
- value = dict.get(self, key, default)
- result = self.configurator.convert(value)
- #If the converted value is different, save for next time
- if value is not result:
- self[key] = result
- if type(result) in (ConvertingDict, ConvertingList,
- ConvertingTuple):
- result.parent = self
- result.key = key
- return result
-
- def pop(self, key, default=None):
- value = dict.pop(self, key, default)
- result = self.configurator.convert(value)
- if value is not result:
- if type(result) in (ConvertingDict, ConvertingList,
- ConvertingTuple):
- result.parent = self
- result.key = key
- return result
-
- class ConvertingList(list):
- """A converting list wrapper."""
- def __getitem__(self, key):
- value = list.__getitem__(self, key)
- result = self.configurator.convert(value)
- #If the converted value is different, save for next time
- if value is not result:
- self[key] = result
- if type(result) in (ConvertingDict, ConvertingList,
- ConvertingTuple):
- result.parent = self
- result.key = key
- return result
-
- def pop(self, idx=-1):
- value = list.pop(self, idx)
- result = self.configurator.convert(value)
- if value is not result:
- if type(result) in (ConvertingDict, ConvertingList,
- ConvertingTuple):
- result.parent = self
- return result
-
- class ConvertingTuple(tuple):
- """A converting tuple wrapper."""
- def __getitem__(self, key):
- value = tuple.__getitem__(self, key)
- result = self.configurator.convert(value)
- if value is not result:
- if type(result) in (ConvertingDict, ConvertingList,
- ConvertingTuple):
- result.parent = self
- result.key = key
- return result
-
- class BaseConfigurator(object):
- """
- The configurator base class which defines some useful defaults.
- """
-
- CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$')
-
- WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
- DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
- INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
- DIGIT_PATTERN = re.compile(r'^\d+$')
-
- value_converters = {
- 'ext' : 'ext_convert',
- 'cfg' : 'cfg_convert',
- }
-
- # We might want to use a different one, e.g. importlib
- importer = staticmethod(__import__)
-
- def __init__(self, config):
- self.config = ConvertingDict(config)
- self.config.configurator = self
-
- def resolve(self, s):
- """
- Resolve strings to objects using standard import and attribute
- syntax.
- """
- name = s.split('.')
- used = name.pop(0)
- try:
- found = self.importer(used)
- for frag in name:
- used += '.' + frag
- try:
- found = getattr(found, frag)
- except AttributeError:
- self.importer(used)
- found = getattr(found, frag)
- return found
- except ImportError:
- e, tb = sys.exc_info()[1:]
- v = ValueError('Cannot resolve %r: %s' % (s, e))
- v.__cause__, v.__traceback__ = e, tb
- raise v
-
- def ext_convert(self, value):
- """Default converter for the ext:// protocol."""
- return self.resolve(value)
-
- def cfg_convert(self, value):
- """Default converter for the cfg:// protocol."""
- rest = value
- m = self.WORD_PATTERN.match(rest)
- if m is None:
- raise ValueError("Unable to convert %r" % value)
- else:
- rest = rest[m.end():]
- d = self.config[m.groups()[0]]
- #print d, rest
- while rest:
- m = self.DOT_PATTERN.match(rest)
- if m:
- d = d[m.groups()[0]]
- else:
- m = self.INDEX_PATTERN.match(rest)
- if m:
- idx = m.groups()[0]
- if not self.DIGIT_PATTERN.match(idx):
- d = d[idx]
- else:
- try:
- n = int(idx) # try as number first (most likely)
- d = d[n]
- except TypeError:
- d = d[idx]
- if m:
- rest = rest[m.end():]
- else:
- raise ValueError('Unable to convert '
- '%r at %r' % (value, rest))
- #rest should be empty
- return d
-
- def convert(self, value):
- """
- Convert values to an appropriate type. dicts, lists and tuples are
- replaced by their converting alternatives. Strings are checked to
- see if they have a conversion format and are converted if they do.
- """
- if not isinstance(value, ConvertingDict) and isinstance(value, dict):
- value = ConvertingDict(value)
- value.configurator = self
- elif not isinstance(value, ConvertingList) and isinstance(value, list):
- value = ConvertingList(value)
- value.configurator = self
- elif not isinstance(value, ConvertingTuple) and\
- isinstance(value, tuple):
- value = ConvertingTuple(value)
- value.configurator = self
- elif isinstance(value, string_types):
- m = self.CONVERT_PATTERN.match(value)
- if m:
- d = m.groupdict()
- prefix = d['prefix']
- converter = self.value_converters.get(prefix, None)
- if converter:
- suffix = d['suffix']
- converter = getattr(self, converter)
- value = converter(suffix)
- return value
-
- def configure_custom(self, config):
- """Configure an object with a user-supplied factory."""
- c = config.pop('()')
- if not callable(c):
- c = self.resolve(c)
- props = config.pop('.', None)
- # Check for valid identifiers
- kwargs = dict([(k, config[k]) for k in config if valid_ident(k)])
- result = c(**kwargs)
- if props:
- for name, value in props.items():
- setattr(result, name, value)
- return result
-
- def as_tuple(self, value):
- """Utility function which converts lists to tuples."""
- if isinstance(value, list):
- value = tuple(value)
- return value
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/database.py b/venv/Lib/site-packages/pip/_vendor/distlib/database.py
deleted file mode 100644
index 0a90c30..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/database.py
+++ /dev/null
@@ -1,1339 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2017 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""PEP 376 implementation."""
-
-from __future__ import unicode_literals
-
-import base64
-import codecs
-import contextlib
-import hashlib
-import logging
-import os
-import posixpath
-import sys
-import zipimport
-
-from . import DistlibException, resources
-from .compat import StringIO
-from .version import get_scheme, UnsupportedVersionError
-from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME,
- LEGACY_METADATA_FILENAME)
-from .util import (parse_requirement, cached_property, parse_name_and_version,
- read_exports, write_exports, CSVReader, CSVWriter)
-
-
-__all__ = ['Distribution', 'BaseInstalledDistribution',
- 'InstalledDistribution', 'EggInfoDistribution',
- 'DistributionPath']
-
-
-logger = logging.getLogger(__name__)
-
-EXPORTS_FILENAME = 'pydist-exports.json'
-COMMANDS_FILENAME = 'pydist-commands.json'
-
-DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED',
- 'RESOURCES', EXPORTS_FILENAME, 'SHARED')
-
-DISTINFO_EXT = '.dist-info'
-
-
-class _Cache(object):
- """
- A simple cache mapping names and .dist-info paths to distributions
- """
- def __init__(self):
- """
- Initialise an instance. There is normally one for each DistributionPath.
- """
- self.name = {}
- self.path = {}
- self.generated = False
-
- def clear(self):
- """
- Clear the cache, setting it to its initial state.
- """
- self.name.clear()
- self.path.clear()
- self.generated = False
-
- def add(self, dist):
- """
- Add a distribution to the cache.
- :param dist: The distribution to add.
- """
- if dist.path not in self.path:
- self.path[dist.path] = dist
- self.name.setdefault(dist.key, []).append(dist)
-
-
-class DistributionPath(object):
- """
- Represents a set of distributions installed on a path (typically sys.path).
- """
- def __init__(self, path=None, include_egg=False):
- """
- Create an instance from a path, optionally including legacy (distutils/
- setuptools/distribute) distributions.
- :param path: The path to use, as a list of directories. If not specified,
- sys.path is used.
- :param include_egg: If True, this instance will look for and return legacy
- distributions as well as those based on PEP 376.
- """
- if path is None:
- path = sys.path
- self.path = path
- self._include_dist = True
- self._include_egg = include_egg
-
- self._cache = _Cache()
- self._cache_egg = _Cache()
- self._cache_enabled = True
- self._scheme = get_scheme('default')
-
- def _get_cache_enabled(self):
- return self._cache_enabled
-
- def _set_cache_enabled(self, value):
- self._cache_enabled = value
-
- cache_enabled = property(_get_cache_enabled, _set_cache_enabled)
-
- def clear_cache(self):
- """
- Clears the internal cache.
- """
- self._cache.clear()
- self._cache_egg.clear()
-
-
- def _yield_distributions(self):
- """
- Yield .dist-info and/or .egg(-info) distributions.
- """
- # We need to check if we've seen some resources already, because on
- # some Linux systems (e.g. some Debian/Ubuntu variants) there are
- # symlinks which alias other files in the environment.
- seen = set()
- for path in self.path:
- finder = resources.finder_for_path(path)
- if finder is None:
- continue
- r = finder.find('')
- if not r or not r.is_container:
- continue
- rset = sorted(r.resources)
- for entry in rset:
- r = finder.find(entry)
- if not r or r.path in seen:
- continue
- if self._include_dist and entry.endswith(DISTINFO_EXT):
- possible_filenames = [METADATA_FILENAME,
- WHEEL_METADATA_FILENAME,
- LEGACY_METADATA_FILENAME]
- for metadata_filename in possible_filenames:
- metadata_path = posixpath.join(entry, metadata_filename)
- pydist = finder.find(metadata_path)
- if pydist:
- break
- else:
- continue
-
- with contextlib.closing(pydist.as_stream()) as stream:
- metadata = Metadata(fileobj=stream, scheme='legacy')
- logger.debug('Found %s', r.path)
- seen.add(r.path)
- yield new_dist_class(r.path, metadata=metadata,
- env=self)
- elif self._include_egg and entry.endswith(('.egg-info',
- '.egg')):
- logger.debug('Found %s', r.path)
- seen.add(r.path)
- yield old_dist_class(r.path, self)
-
- def _generate_cache(self):
- """
- Scan the path for distributions and populate the cache with
- those that are found.
- """
- gen_dist = not self._cache.generated
- gen_egg = self._include_egg and not self._cache_egg.generated
- if gen_dist or gen_egg:
- for dist in self._yield_distributions():
- if isinstance(dist, InstalledDistribution):
- self._cache.add(dist)
- else:
- self._cache_egg.add(dist)
-
- if gen_dist:
- self._cache.generated = True
- if gen_egg:
- self._cache_egg.generated = True
-
- @classmethod
- def distinfo_dirname(cls, name, version):
- """
- The *name* and *version* parameters are converted into their
- filename-escaped form, i.e. any ``'-'`` characters are replaced
- with ``'_'`` other than the one in ``'dist-info'`` and the one
- separating the name from the version number.
-
- :parameter name: is converted to a standard distribution name by replacing
- any runs of non- alphanumeric characters with a single
- ``'-'``.
- :type name: string
- :parameter version: is converted to a standard version string. Spaces
- become dots, and all other non-alphanumeric characters
- (except dots) become dashes, with runs of multiple
- dashes condensed to a single dash.
- :type version: string
- :returns: directory name
- :rtype: string"""
- name = name.replace('-', '_')
- return '-'.join([name, version]) + DISTINFO_EXT
-
- def get_distributions(self):
- """
- Provides an iterator that looks for distributions and returns
- :class:`InstalledDistribution` or
- :class:`EggInfoDistribution` instances for each one of them.
-
- :rtype: iterator of :class:`InstalledDistribution` and
- :class:`EggInfoDistribution` instances
- """
- if not self._cache_enabled:
- for dist in self._yield_distributions():
- yield dist
- else:
- self._generate_cache()
-
- for dist in self._cache.path.values():
- yield dist
-
- if self._include_egg:
- for dist in self._cache_egg.path.values():
- yield dist
-
- def get_distribution(self, name):
- """
- Looks for a named distribution on the path.
-
- This function only returns the first result found, as no more than one
- value is expected. If nothing is found, ``None`` is returned.
-
- :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution`
- or ``None``
- """
- result = None
- name = name.lower()
- if not self._cache_enabled:
- for dist in self._yield_distributions():
- if dist.key == name:
- result = dist
- break
- else:
- self._generate_cache()
-
- if name in self._cache.name:
- result = self._cache.name[name][0]
- elif self._include_egg and name in self._cache_egg.name:
- result = self._cache_egg.name[name][0]
- return result
-
- def provides_distribution(self, name, version=None):
- """
- Iterates over all distributions to find which distributions provide *name*.
- If a *version* is provided, it will be used to filter the results.
-
- This function only returns the first result found, since no more than
- one values are expected. If the directory is not found, returns ``None``.
-
- :parameter version: a version specifier that indicates the version
- required, conforming to the format in ``PEP-345``
-
- :type name: string
- :type version: string
- """
- matcher = None
- if version is not None:
- try:
- matcher = self._scheme.matcher('%s (%s)' % (name, version))
- except ValueError:
- raise DistlibException('invalid name or version: %r, %r' %
- (name, version))
-
- for dist in self.get_distributions():
- # We hit a problem on Travis where enum34 was installed and doesn't
- # have a provides attribute ...
- if not hasattr(dist, 'provides'):
- logger.debug('No "provides": %s', dist)
- else:
- provided = dist.provides
-
- for p in provided:
- p_name, p_ver = parse_name_and_version(p)
- if matcher is None:
- if p_name == name:
- yield dist
- break
- else:
- if p_name == name and matcher.match(p_ver):
- yield dist
- break
-
- def get_file_path(self, name, relative_path):
- """
- Return the path to a resource file.
- """
- dist = self.get_distribution(name)
- if dist is None:
- raise LookupError('no distribution named %r found' % name)
- return dist.get_resource_path(relative_path)
-
- def get_exported_entries(self, category, name=None):
- """
- Return all of the exported entries in a particular category.
-
- :param category: The category to search for entries.
- :param name: If specified, only entries with that name are returned.
- """
- for dist in self.get_distributions():
- r = dist.exports
- if category in r:
- d = r[category]
- if name is not None:
- if name in d:
- yield d[name]
- else:
- for v in d.values():
- yield v
-
-
-class Distribution(object):
- """
- A base class for distributions, whether installed or from indexes.
- Either way, it must have some metadata, so that's all that's needed
- for construction.
- """
-
- build_time_dependency = False
- """
- Set to True if it's known to be only a build-time dependency (i.e.
- not needed after installation).
- """
-
- requested = False
- """A boolean that indicates whether the ``REQUESTED`` metadata file is
- present (in other words, whether the package was installed by user
- request or it was installed as a dependency)."""
-
- def __init__(self, metadata):
- """
- Initialise an instance.
- :param metadata: The instance of :class:`Metadata` describing this
- distribution.
- """
- self.metadata = metadata
- self.name = metadata.name
- self.key = self.name.lower() # for case-insensitive comparisons
- self.version = metadata.version
- self.locator = None
- self.digest = None
- self.extras = None # additional features requested
- self.context = None # environment marker overrides
- self.download_urls = set()
- self.digests = {}
-
- @property
- def source_url(self):
- """
- The source archive download URL for this distribution.
- """
- return self.metadata.source_url
-
- download_url = source_url # Backward compatibility
-
- @property
- def name_and_version(self):
- """
- A utility property which displays the name and version in parentheses.
- """
- return '%s (%s)' % (self.name, self.version)
-
- @property
- def provides(self):
- """
- A set of distribution names and versions provided by this distribution.
- :return: A set of "name (version)" strings.
- """
- plist = self.metadata.provides
- s = '%s (%s)' % (self.name, self.version)
- if s not in plist:
- plist.append(s)
- return plist
-
- def _get_requirements(self, req_attr):
- md = self.metadata
- logger.debug('Getting requirements from metadata %r', md.todict())
- reqts = getattr(md, req_attr)
- return set(md.get_requirements(reqts, extras=self.extras,
- env=self.context))
-
- @property
- def run_requires(self):
- return self._get_requirements('run_requires')
-
- @property
- def meta_requires(self):
- return self._get_requirements('meta_requires')
-
- @property
- def build_requires(self):
- return self._get_requirements('build_requires')
-
- @property
- def test_requires(self):
- return self._get_requirements('test_requires')
-
- @property
- def dev_requires(self):
- return self._get_requirements('dev_requires')
-
- def matches_requirement(self, req):
- """
- Say if this instance matches (fulfills) a requirement.
- :param req: The requirement to match.
- :rtype req: str
- :return: True if it matches, else False.
- """
- # Requirement may contain extras - parse to lose those
- # from what's passed to the matcher
- r = parse_requirement(req)
- scheme = get_scheme(self.metadata.scheme)
- try:
- matcher = scheme.matcher(r.requirement)
- except UnsupportedVersionError:
- # XXX compat-mode if cannot read the version
- logger.warning('could not read version %r - using name only',
- req)
- name = req.split()[0]
- matcher = scheme.matcher(name)
-
- name = matcher.key # case-insensitive
-
- result = False
- for p in self.provides:
- p_name, p_ver = parse_name_and_version(p)
- if p_name != name:
- continue
- try:
- result = matcher.match(p_ver)
- break
- except UnsupportedVersionError:
- pass
- return result
-
- def __repr__(self):
- """
- Return a textual representation of this instance,
- """
- if self.source_url:
- suffix = ' [%s]' % self.source_url
- else:
- suffix = ''
- return '' % (self.name, self.version, suffix)
-
- def __eq__(self, other):
- """
- See if this distribution is the same as another.
- :param other: The distribution to compare with. To be equal to one
- another. distributions must have the same type, name,
- version and source_url.
- :return: True if it is the same, else False.
- """
- if type(other) is not type(self):
- result = False
- else:
- result = (self.name == other.name and
- self.version == other.version and
- self.source_url == other.source_url)
- return result
-
- def __hash__(self):
- """
- Compute hash in a way which matches the equality test.
- """
- return hash(self.name) + hash(self.version) + hash(self.source_url)
-
-
-class BaseInstalledDistribution(Distribution):
- """
- This is the base class for installed distributions (whether PEP 376 or
- legacy).
- """
-
- hasher = None
-
- def __init__(self, metadata, path, env=None):
- """
- Initialise an instance.
- :param metadata: An instance of :class:`Metadata` which describes the
- distribution. This will normally have been initialised
- from a metadata file in the ``path``.
- :param path: The path of the ``.dist-info`` or ``.egg-info``
- directory for the distribution.
- :param env: This is normally the :class:`DistributionPath`
- instance where this distribution was found.
- """
- super(BaseInstalledDistribution, self).__init__(metadata)
- self.path = path
- self.dist_path = env
-
- def get_hash(self, data, hasher=None):
- """
- Get the hash of some data, using a particular hash algorithm, if
- specified.
-
- :param data: The data to be hashed.
- :type data: bytes
- :param hasher: The name of a hash implementation, supported by hashlib,
- or ``None``. Examples of valid values are ``'sha1'``,
- ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and
- ``'sha512'``. If no hasher is specified, the ``hasher``
- attribute of the :class:`InstalledDistribution` instance
- is used. If the hasher is determined to be ``None``, MD5
- is used as the hashing algorithm.
- :returns: The hash of the data. If a hasher was explicitly specified,
- the returned hash will be prefixed with the specified hasher
- followed by '='.
- :rtype: str
- """
- if hasher is None:
- hasher = self.hasher
- if hasher is None:
- hasher = hashlib.md5
- prefix = ''
- else:
- hasher = getattr(hashlib, hasher)
- prefix = '%s=' % self.hasher
- digest = hasher(data).digest()
- digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii')
- return '%s%s' % (prefix, digest)
-
-
-class InstalledDistribution(BaseInstalledDistribution):
- """
- Created with the *path* of the ``.dist-info`` directory provided to the
- constructor. It reads the metadata contained in ``pydist.json`` when it is
- instantiated., or uses a passed in Metadata instance (useful for when
- dry-run mode is being used).
- """
-
- hasher = 'sha256'
-
- def __init__(self, path, metadata=None, env=None):
- self.modules = []
- self.finder = finder = resources.finder_for_path(path)
- if finder is None:
- raise ValueError('finder unavailable for %s' % path)
- if env and env._cache_enabled and path in env._cache.path:
- metadata = env._cache.path[path].metadata
- elif metadata is None:
- r = finder.find(METADATA_FILENAME)
- # Temporary - for Wheel 0.23 support
- if r is None:
- r = finder.find(WHEEL_METADATA_FILENAME)
- # Temporary - for legacy support
- if r is None:
- r = finder.find(LEGACY_METADATA_FILENAME)
- if r is None:
- raise ValueError('no %s found in %s' % (METADATA_FILENAME,
- path))
- with contextlib.closing(r.as_stream()) as stream:
- metadata = Metadata(fileobj=stream, scheme='legacy')
-
- super(InstalledDistribution, self).__init__(metadata, path, env)
-
- if env and env._cache_enabled:
- env._cache.add(self)
-
- r = finder.find('REQUESTED')
- self.requested = r is not None
- p = os.path.join(path, 'top_level.txt')
- if os.path.exists(p):
- with open(p, 'rb') as f:
- data = f.read().decode('utf-8')
- self.modules = data.splitlines()
-
- def __repr__(self):
- return '' % (
- self.name, self.version, self.path)
-
- def __str__(self):
- return "%s %s" % (self.name, self.version)
-
- def _get_records(self):
- """
- Get the list of installed files for the distribution
- :return: A list of tuples of path, hash and size. Note that hash and
- size might be ``None`` for some entries. The path is exactly
- as stored in the file (which is as in PEP 376).
- """
- results = []
- r = self.get_distinfo_resource('RECORD')
- with contextlib.closing(r.as_stream()) as stream:
- with CSVReader(stream=stream) as record_reader:
- # Base location is parent dir of .dist-info dir
- #base_location = os.path.dirname(self.path)
- #base_location = os.path.abspath(base_location)
- for row in record_reader:
- missing = [None for i in range(len(row), 3)]
- path, checksum, size = row + missing
- #if not os.path.isabs(path):
- # path = path.replace('/', os.sep)
- # path = os.path.join(base_location, path)
- results.append((path, checksum, size))
- return results
-
- @cached_property
- def exports(self):
- """
- Return the information exported by this distribution.
- :return: A dictionary of exports, mapping an export category to a dict
- of :class:`ExportEntry` instances describing the individual
- export entries, and keyed by name.
- """
- result = {}
- r = self.get_distinfo_resource(EXPORTS_FILENAME)
- if r:
- result = self.read_exports()
- return result
-
- def read_exports(self):
- """
- Read exports data from a file in .ini format.
-
- :return: A dictionary of exports, mapping an export category to a list
- of :class:`ExportEntry` instances describing the individual
- export entries.
- """
- result = {}
- r = self.get_distinfo_resource(EXPORTS_FILENAME)
- if r:
- with contextlib.closing(r.as_stream()) as stream:
- result = read_exports(stream)
- return result
-
- def write_exports(self, exports):
- """
- Write a dictionary of exports to a file in .ini format.
- :param exports: A dictionary of exports, mapping an export category to
- a list of :class:`ExportEntry` instances describing the
- individual export entries.
- """
- rf = self.get_distinfo_file(EXPORTS_FILENAME)
- with open(rf, 'w') as f:
- write_exports(exports, f)
-
- def get_resource_path(self, relative_path):
- """
- NOTE: This API may change in the future.
-
- Return the absolute path to a resource file with the given relative
- path.
-
- :param relative_path: The path, relative to .dist-info, of the resource
- of interest.
- :return: The absolute path where the resource is to be found.
- """
- r = self.get_distinfo_resource('RESOURCES')
- with contextlib.closing(r.as_stream()) as stream:
- with CSVReader(stream=stream) as resources_reader:
- for relative, destination in resources_reader:
- if relative == relative_path:
- return destination
- raise KeyError('no resource file with relative path %r '
- 'is installed' % relative_path)
-
- def list_installed_files(self):
- """
- Iterates over the ``RECORD`` entries and returns a tuple
- ``(path, hash, size)`` for each line.
-
- :returns: iterator of (path, hash, size)
- """
- for result in self._get_records():
- yield result
-
- def write_installed_files(self, paths, prefix, dry_run=False):
- """
- Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any
- existing ``RECORD`` file is silently overwritten.
-
- prefix is used to determine when to write absolute paths.
- """
- prefix = os.path.join(prefix, '')
- base = os.path.dirname(self.path)
- base_under_prefix = base.startswith(prefix)
- base = os.path.join(base, '')
- record_path = self.get_distinfo_file('RECORD')
- logger.info('creating %s', record_path)
- if dry_run:
- return None
- with CSVWriter(record_path) as writer:
- for path in paths:
- if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')):
- # do not put size and hash, as in PEP-376
- hash_value = size = ''
- else:
- size = '%d' % os.path.getsize(path)
- with open(path, 'rb') as fp:
- hash_value = self.get_hash(fp.read())
- if path.startswith(base) or (base_under_prefix and
- path.startswith(prefix)):
- path = os.path.relpath(path, base)
- writer.writerow((path, hash_value, size))
-
- # add the RECORD file itself
- if record_path.startswith(base):
- record_path = os.path.relpath(record_path, base)
- writer.writerow((record_path, '', ''))
- return record_path
-
- def check_installed_files(self):
- """
- Checks that the hashes and sizes of the files in ``RECORD`` are
- matched by the files themselves. Returns a (possibly empty) list of
- mismatches. Each entry in the mismatch list will be a tuple consisting
- of the path, 'exists', 'size' or 'hash' according to what didn't match
- (existence is checked first, then size, then hash), the expected
- value and the actual value.
- """
- mismatches = []
- base = os.path.dirname(self.path)
- record_path = self.get_distinfo_file('RECORD')
- for path, hash_value, size in self.list_installed_files():
- if not os.path.isabs(path):
- path = os.path.join(base, path)
- if path == record_path:
- continue
- if not os.path.exists(path):
- mismatches.append((path, 'exists', True, False))
- elif os.path.isfile(path):
- actual_size = str(os.path.getsize(path))
- if size and actual_size != size:
- mismatches.append((path, 'size', size, actual_size))
- elif hash_value:
- if '=' in hash_value:
- hasher = hash_value.split('=', 1)[0]
- else:
- hasher = None
-
- with open(path, 'rb') as f:
- actual_hash = self.get_hash(f.read(), hasher)
- if actual_hash != hash_value:
- mismatches.append((path, 'hash', hash_value, actual_hash))
- return mismatches
-
- @cached_property
- def shared_locations(self):
- """
- A dictionary of shared locations whose keys are in the set 'prefix',
- 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'.
- The corresponding value is the absolute path of that category for
- this distribution, and takes into account any paths selected by the
- user at installation time (e.g. via command-line arguments). In the
- case of the 'namespace' key, this would be a list of absolute paths
- for the roots of namespace packages in this distribution.
-
- The first time this property is accessed, the relevant information is
- read from the SHARED file in the .dist-info directory.
- """
- result = {}
- shared_path = os.path.join(self.path, 'SHARED')
- if os.path.isfile(shared_path):
- with codecs.open(shared_path, 'r', encoding='utf-8') as f:
- lines = f.read().splitlines()
- for line in lines:
- key, value = line.split('=', 1)
- if key == 'namespace':
- result.setdefault(key, []).append(value)
- else:
- result[key] = value
- return result
-
- def write_shared_locations(self, paths, dry_run=False):
- """
- Write shared location information to the SHARED file in .dist-info.
- :param paths: A dictionary as described in the documentation for
- :meth:`shared_locations`.
- :param dry_run: If True, the action is logged but no file is actually
- written.
- :return: The path of the file written to.
- """
- shared_path = os.path.join(self.path, 'SHARED')
- logger.info('creating %s', shared_path)
- if dry_run:
- return None
- lines = []
- for key in ('prefix', 'lib', 'headers', 'scripts', 'data'):
- path = paths[key]
- if os.path.isdir(paths[key]):
- lines.append('%s=%s' % (key, path))
- for ns in paths.get('namespace', ()):
- lines.append('namespace=%s' % ns)
-
- with codecs.open(shared_path, 'w', encoding='utf-8') as f:
- f.write('\n'.join(lines))
- return shared_path
-
- def get_distinfo_resource(self, path):
- if path not in DIST_FILES:
- raise DistlibException('invalid path for a dist-info file: '
- '%r at %r' % (path, self.path))
- finder = resources.finder_for_path(self.path)
- if finder is None:
- raise DistlibException('Unable to get a finder for %s' % self.path)
- return finder.find(path)
-
- def get_distinfo_file(self, path):
- """
- Returns a path located under the ``.dist-info`` directory. Returns a
- string representing the path.
-
- :parameter path: a ``'/'``-separated path relative to the
- ``.dist-info`` directory or an absolute path;
- If *path* is an absolute path and doesn't start
- with the ``.dist-info`` directory path,
- a :class:`DistlibException` is raised
- :type path: str
- :rtype: str
- """
- # Check if it is an absolute path # XXX use relpath, add tests
- if path.find(os.sep) >= 0:
- # it's an absolute path?
- distinfo_dirname, path = path.split(os.sep)[-2:]
- if distinfo_dirname != self.path.split(os.sep)[-1]:
- raise DistlibException(
- 'dist-info file %r does not belong to the %r %s '
- 'distribution' % (path, self.name, self.version))
-
- # The file must be relative
- if path not in DIST_FILES:
- raise DistlibException('invalid path for a dist-info file: '
- '%r at %r' % (path, self.path))
-
- return os.path.join(self.path, path)
-
- def list_distinfo_files(self):
- """
- Iterates over the ``RECORD`` entries and returns paths for each line if
- the path is pointing to a file located in the ``.dist-info`` directory
- or one of its subdirectories.
-
- :returns: iterator of paths
- """
- base = os.path.dirname(self.path)
- for path, checksum, size in self._get_records():
- # XXX add separator or use real relpath algo
- if not os.path.isabs(path):
- path = os.path.join(base, path)
- if path.startswith(self.path):
- yield path
-
- def __eq__(self, other):
- return (isinstance(other, InstalledDistribution) and
- self.path == other.path)
-
- # See http://docs.python.org/reference/datamodel#object.__hash__
- __hash__ = object.__hash__
-
-
-class EggInfoDistribution(BaseInstalledDistribution):
- """Created with the *path* of the ``.egg-info`` directory or file provided
- to the constructor. It reads the metadata contained in the file itself, or
- if the given path happens to be a directory, the metadata is read from the
- file ``PKG-INFO`` under that directory."""
-
- requested = True # as we have no way of knowing, assume it was
- shared_locations = {}
-
- def __init__(self, path, env=None):
- def set_name_and_version(s, n, v):
- s.name = n
- s.key = n.lower() # for case-insensitive comparisons
- s.version = v
-
- self.path = path
- self.dist_path = env
- if env and env._cache_enabled and path in env._cache_egg.path:
- metadata = env._cache_egg.path[path].metadata
- set_name_and_version(self, metadata.name, metadata.version)
- else:
- metadata = self._get_metadata(path)
-
- # Need to be set before caching
- set_name_and_version(self, metadata.name, metadata.version)
-
- if env and env._cache_enabled:
- env._cache_egg.add(self)
- super(EggInfoDistribution, self).__init__(metadata, path, env)
-
- def _get_metadata(self, path):
- requires = None
-
- def parse_requires_data(data):
- """Create a list of dependencies from a requires.txt file.
-
- *data*: the contents of a setuptools-produced requires.txt file.
- """
- reqs = []
- lines = data.splitlines()
- for line in lines:
- line = line.strip()
- if line.startswith('['):
- logger.warning('Unexpected line: quitting requirement scan: %r',
- line)
- break
- r = parse_requirement(line)
- if not r:
- logger.warning('Not recognised as a requirement: %r', line)
- continue
- if r.extras:
- logger.warning('extra requirements in requires.txt are '
- 'not supported')
- if not r.constraints:
- reqs.append(r.name)
- else:
- cons = ', '.join('%s%s' % c for c in r.constraints)
- reqs.append('%s (%s)' % (r.name, cons))
- return reqs
-
- def parse_requires_path(req_path):
- """Create a list of dependencies from a requires.txt file.
-
- *req_path*: the path to a setuptools-produced requires.txt file.
- """
-
- reqs = []
- try:
- with codecs.open(req_path, 'r', 'utf-8') as fp:
- reqs = parse_requires_data(fp.read())
- except IOError:
- pass
- return reqs
-
- tl_path = tl_data = None
- if path.endswith('.egg'):
- if os.path.isdir(path):
- p = os.path.join(path, 'EGG-INFO')
- meta_path = os.path.join(p, 'PKG-INFO')
- metadata = Metadata(path=meta_path, scheme='legacy')
- req_path = os.path.join(p, 'requires.txt')
- tl_path = os.path.join(p, 'top_level.txt')
- requires = parse_requires_path(req_path)
- else:
- # FIXME handle the case where zipfile is not available
- zipf = zipimport.zipimporter(path)
- fileobj = StringIO(
- zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8'))
- metadata = Metadata(fileobj=fileobj, scheme='legacy')
- try:
- data = zipf.get_data('EGG-INFO/requires.txt')
- tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8')
- requires = parse_requires_data(data.decode('utf-8'))
- except IOError:
- requires = None
- elif path.endswith('.egg-info'):
- if os.path.isdir(path):
- req_path = os.path.join(path, 'requires.txt')
- requires = parse_requires_path(req_path)
- path = os.path.join(path, 'PKG-INFO')
- tl_path = os.path.join(path, 'top_level.txt')
- metadata = Metadata(path=path, scheme='legacy')
- else:
- raise DistlibException('path must end with .egg-info or .egg, '
- 'got %r' % path)
-
- if requires:
- metadata.add_requirements(requires)
- # look for top-level modules in top_level.txt, if present
- if tl_data is None:
- if tl_path is not None and os.path.exists(tl_path):
- with open(tl_path, 'rb') as f:
- tl_data = f.read().decode('utf-8')
- if not tl_data:
- tl_data = []
- else:
- tl_data = tl_data.splitlines()
- self.modules = tl_data
- return metadata
-
- def __repr__(self):
- return '' % (
- self.name, self.version, self.path)
-
- def __str__(self):
- return "%s %s" % (self.name, self.version)
-
- def check_installed_files(self):
- """
- Checks that the hashes and sizes of the files in ``RECORD`` are
- matched by the files themselves. Returns a (possibly empty) list of
- mismatches. Each entry in the mismatch list will be a tuple consisting
- of the path, 'exists', 'size' or 'hash' according to what didn't match
- (existence is checked first, then size, then hash), the expected
- value and the actual value.
- """
- mismatches = []
- record_path = os.path.join(self.path, 'installed-files.txt')
- if os.path.exists(record_path):
- for path, _, _ in self.list_installed_files():
- if path == record_path:
- continue
- if not os.path.exists(path):
- mismatches.append((path, 'exists', True, False))
- return mismatches
-
- def list_installed_files(self):
- """
- Iterates over the ``installed-files.txt`` entries and returns a tuple
- ``(path, hash, size)`` for each line.
-
- :returns: a list of (path, hash, size)
- """
-
- def _md5(path):
- f = open(path, 'rb')
- try:
- content = f.read()
- finally:
- f.close()
- return hashlib.md5(content).hexdigest()
-
- def _size(path):
- return os.stat(path).st_size
-
- record_path = os.path.join(self.path, 'installed-files.txt')
- result = []
- if os.path.exists(record_path):
- with codecs.open(record_path, 'r', encoding='utf-8') as f:
- for line in f:
- line = line.strip()
- p = os.path.normpath(os.path.join(self.path, line))
- # "./" is present as a marker between installed files
- # and installation metadata files
- if not os.path.exists(p):
- logger.warning('Non-existent file: %s', p)
- if p.endswith(('.pyc', '.pyo')):
- continue
- #otherwise fall through and fail
- if not os.path.isdir(p):
- result.append((p, _md5(p), _size(p)))
- result.append((record_path, None, None))
- return result
-
- def list_distinfo_files(self, absolute=False):
- """
- Iterates over the ``installed-files.txt`` entries and returns paths for
- each line if the path is pointing to a file located in the
- ``.egg-info`` directory or one of its subdirectories.
-
- :parameter absolute: If *absolute* is ``True``, each returned path is
- transformed into a local absolute path. Otherwise the
- raw value from ``installed-files.txt`` is returned.
- :type absolute: boolean
- :returns: iterator of paths
- """
- record_path = os.path.join(self.path, 'installed-files.txt')
- if os.path.exists(record_path):
- skip = True
- with codecs.open(record_path, 'r', encoding='utf-8') as f:
- for line in f:
- line = line.strip()
- if line == './':
- skip = False
- continue
- if not skip:
- p = os.path.normpath(os.path.join(self.path, line))
- if p.startswith(self.path):
- if absolute:
- yield p
- else:
- yield line
-
- def __eq__(self, other):
- return (isinstance(other, EggInfoDistribution) and
- self.path == other.path)
-
- # See http://docs.python.org/reference/datamodel#object.__hash__
- __hash__ = object.__hash__
-
-new_dist_class = InstalledDistribution
-old_dist_class = EggInfoDistribution
-
-
-class DependencyGraph(object):
- """
- Represents a dependency graph between distributions.
-
- The dependency relationships are stored in an ``adjacency_list`` that maps
- distributions to a list of ``(other, label)`` tuples where ``other``
- is a distribution and the edge is labeled with ``label`` (i.e. the version
- specifier, if such was provided). Also, for more efficient traversal, for
- every distribution ``x``, a list of predecessors is kept in
- ``reverse_list[x]``. An edge from distribution ``a`` to
- distribution ``b`` means that ``a`` depends on ``b``. If any missing
- dependencies are found, they are stored in ``missing``, which is a
- dictionary that maps distributions to a list of requirements that were not
- provided by any other distributions.
- """
-
- def __init__(self):
- self.adjacency_list = {}
- self.reverse_list = {}
- self.missing = {}
-
- def add_distribution(self, distribution):
- """Add the *distribution* to the graph.
-
- :type distribution: :class:`distutils2.database.InstalledDistribution`
- or :class:`distutils2.database.EggInfoDistribution`
- """
- self.adjacency_list[distribution] = []
- self.reverse_list[distribution] = []
- #self.missing[distribution] = []
-
- def add_edge(self, x, y, label=None):
- """Add an edge from distribution *x* to distribution *y* with the given
- *label*.
-
- :type x: :class:`distutils2.database.InstalledDistribution` or
- :class:`distutils2.database.EggInfoDistribution`
- :type y: :class:`distutils2.database.InstalledDistribution` or
- :class:`distutils2.database.EggInfoDistribution`
- :type label: ``str`` or ``None``
- """
- self.adjacency_list[x].append((y, label))
- # multiple edges are allowed, so be careful
- if x not in self.reverse_list[y]:
- self.reverse_list[y].append(x)
-
- def add_missing(self, distribution, requirement):
- """
- Add a missing *requirement* for the given *distribution*.
-
- :type distribution: :class:`distutils2.database.InstalledDistribution`
- or :class:`distutils2.database.EggInfoDistribution`
- :type requirement: ``str``
- """
- logger.debug('%s missing %r', distribution, requirement)
- self.missing.setdefault(distribution, []).append(requirement)
-
- def _repr_dist(self, dist):
- return '%s %s' % (dist.name, dist.version)
-
- def repr_node(self, dist, level=1):
- """Prints only a subgraph"""
- output = [self._repr_dist(dist)]
- for other, label in self.adjacency_list[dist]:
- dist = self._repr_dist(other)
- if label is not None:
- dist = '%s [%s]' % (dist, label)
- output.append(' ' * level + str(dist))
- suboutput = self.repr_node(other, level + 1)
- subs = suboutput.split('\n')
- output.extend(subs[1:])
- return '\n'.join(output)
-
- def to_dot(self, f, skip_disconnected=True):
- """Writes a DOT output for the graph to the provided file *f*.
-
- If *skip_disconnected* is set to ``True``, then all distributions
- that are not dependent on any other distribution are skipped.
-
- :type f: has to support ``file``-like operations
- :type skip_disconnected: ``bool``
- """
- disconnected = []
-
- f.write("digraph dependencies {\n")
- for dist, adjs in self.adjacency_list.items():
- if len(adjs) == 0 and not skip_disconnected:
- disconnected.append(dist)
- for other, label in adjs:
- if not label is None:
- f.write('"%s" -> "%s" [label="%s"]\n' %
- (dist.name, other.name, label))
- else:
- f.write('"%s" -> "%s"\n' % (dist.name, other.name))
- if not skip_disconnected and len(disconnected) > 0:
- f.write('subgraph disconnected {\n')
- f.write('label = "Disconnected"\n')
- f.write('bgcolor = red\n')
-
- for dist in disconnected:
- f.write('"%s"' % dist.name)
- f.write('\n')
- f.write('}\n')
- f.write('}\n')
-
- def topological_sort(self):
- """
- Perform a topological sort of the graph.
- :return: A tuple, the first element of which is a topologically sorted
- list of distributions, and the second element of which is a
- list of distributions that cannot be sorted because they have
- circular dependencies and so form a cycle.
- """
- result = []
- # Make a shallow copy of the adjacency list
- alist = {}
- for k, v in self.adjacency_list.items():
- alist[k] = v[:]
- while True:
- # See what we can remove in this run
- to_remove = []
- for k, v in list(alist.items())[:]:
- if not v:
- to_remove.append(k)
- del alist[k]
- if not to_remove:
- # What's left in alist (if anything) is a cycle.
- break
- # Remove from the adjacency list of others
- for k, v in alist.items():
- alist[k] = [(d, r) for d, r in v if d not in to_remove]
- logger.debug('Moving to result: %s',
- ['%s (%s)' % (d.name, d.version) for d in to_remove])
- result.extend(to_remove)
- return result, list(alist.keys())
-
- def __repr__(self):
- """Representation of the graph"""
- output = []
- for dist, adjs in self.adjacency_list.items():
- output.append(self.repr_node(dist))
- return '\n'.join(output)
-
-
-def make_graph(dists, scheme='default'):
- """Makes a dependency graph from the given distributions.
-
- :parameter dists: a list of distributions
- :type dists: list of :class:`distutils2.database.InstalledDistribution` and
- :class:`distutils2.database.EggInfoDistribution` instances
- :rtype: a :class:`DependencyGraph` instance
- """
- scheme = get_scheme(scheme)
- graph = DependencyGraph()
- provided = {} # maps names to lists of (version, dist) tuples
-
- # first, build the graph and find out what's provided
- for dist in dists:
- graph.add_distribution(dist)
-
- for p in dist.provides:
- name, version = parse_name_and_version(p)
- logger.debug('Add to provided: %s, %s, %s', name, version, dist)
- provided.setdefault(name, []).append((version, dist))
-
- # now make the edges
- for dist in dists:
- requires = (dist.run_requires | dist.meta_requires |
- dist.build_requires | dist.dev_requires)
- for req in requires:
- try:
- matcher = scheme.matcher(req)
- except UnsupportedVersionError:
- # XXX compat-mode if cannot read the version
- logger.warning('could not read version %r - using name only',
- req)
- name = req.split()[0]
- matcher = scheme.matcher(name)
-
- name = matcher.key # case-insensitive
-
- matched = False
- if name in provided:
- for version, provider in provided[name]:
- try:
- match = matcher.match(version)
- except UnsupportedVersionError:
- match = False
-
- if match:
- graph.add_edge(dist, provider, req)
- matched = True
- break
- if not matched:
- graph.add_missing(dist, req)
- return graph
-
-
-def get_dependent_dists(dists, dist):
- """Recursively generate a list of distributions from *dists* that are
- dependent on *dist*.
-
- :param dists: a list of distributions
- :param dist: a distribution, member of *dists* for which we are interested
- """
- if dist not in dists:
- raise DistlibException('given distribution %r is not a member '
- 'of the list' % dist.name)
- graph = make_graph(dists)
-
- dep = [dist] # dependent distributions
- todo = graph.reverse_list[dist] # list of nodes we should inspect
-
- while todo:
- d = todo.pop()
- dep.append(d)
- for succ in graph.reverse_list[d]:
- if succ not in dep:
- todo.append(succ)
-
- dep.pop(0) # remove dist from dep, was there to prevent infinite loops
- return dep
-
-
-def get_required_dists(dists, dist):
- """Recursively generate a list of distributions from *dists* that are
- required by *dist*.
-
- :param dists: a list of distributions
- :param dist: a distribution, member of *dists* for which we are interested
- """
- if dist not in dists:
- raise DistlibException('given distribution %r is not a member '
- 'of the list' % dist.name)
- graph = make_graph(dists)
-
- req = [] # required distributions
- todo = graph.adjacency_list[dist] # list of nodes we should inspect
-
- while todo:
- d = todo.pop()[0]
- req.append(d)
- for pred in graph.adjacency_list[d]:
- if pred not in req:
- todo.append(pred)
-
- return req
-
-
-def make_dist(name, version, **kwargs):
- """
- A convenience method for making a dist given just a name and version.
- """
- summary = kwargs.pop('summary', 'Placeholder for summary')
- md = Metadata(**kwargs)
- md.name = name
- md.version = version
- md.summary = summary or 'Placeholder for summary'
- return Distribution(md)
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/index.py b/venv/Lib/site-packages/pip/_vendor/distlib/index.py
deleted file mode 100644
index 7a87cdc..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/index.py
+++ /dev/null
@@ -1,516 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-import hashlib
-import logging
-import os
-import shutil
-import subprocess
-import tempfile
-try:
- from threading import Thread
-except ImportError:
- from dummy_threading import Thread
-
-from . import DistlibException
-from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr,
- urlparse, build_opener, string_types)
-from .util import cached_property, zip_dir, ServerProxy
-
-logger = logging.getLogger(__name__)
-
-DEFAULT_INDEX = 'https://pypi.org/pypi'
-DEFAULT_REALM = 'pypi'
-
-class PackageIndex(object):
- """
- This class represents a package index compatible with PyPI, the Python
- Package Index.
- """
-
- boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$'
-
- def __init__(self, url=None):
- """
- Initialise an instance.
-
- :param url: The URL of the index. If not specified, the URL for PyPI is
- used.
- """
- self.url = url or DEFAULT_INDEX
- self.read_configuration()
- scheme, netloc, path, params, query, frag = urlparse(self.url)
- if params or query or frag or scheme not in ('http', 'https'):
- raise DistlibException('invalid repository: %s' % self.url)
- self.password_handler = None
- self.ssl_verifier = None
- self.gpg = None
- self.gpg_home = None
- with open(os.devnull, 'w') as sink:
- # Use gpg by default rather than gpg2, as gpg2 insists on
- # prompting for passwords
- for s in ('gpg', 'gpg2'):
- try:
- rc = subprocess.check_call([s, '--version'], stdout=sink,
- stderr=sink)
- if rc == 0:
- self.gpg = s
- break
- except OSError:
- pass
-
- def _get_pypirc_command(self):
- """
- Get the distutils command for interacting with PyPI configurations.
- :return: the command.
- """
- from distutils.core import Distribution
- from distutils.config import PyPIRCCommand
- d = Distribution()
- return PyPIRCCommand(d)
-
- def read_configuration(self):
- """
- Read the PyPI access configuration as supported by distutils, getting
- PyPI to do the actual work. This populates ``username``, ``password``,
- ``realm`` and ``url`` attributes from the configuration.
- """
- # get distutils to do the work
- c = self._get_pypirc_command()
- c.repository = self.url
- cfg = c._read_pypirc()
- self.username = cfg.get('username')
- self.password = cfg.get('password')
- self.realm = cfg.get('realm', 'pypi')
- self.url = cfg.get('repository', self.url)
-
- def save_configuration(self):
- """
- Save the PyPI access configuration. You must have set ``username`` and
- ``password`` attributes before calling this method.
-
- Again, distutils is used to do the actual work.
- """
- self.check_credentials()
- # get distutils to do the work
- c = self._get_pypirc_command()
- c._store_pypirc(self.username, self.password)
-
- def check_credentials(self):
- """
- Check that ``username`` and ``password`` have been set, and raise an
- exception if not.
- """
- if self.username is None or self.password is None:
- raise DistlibException('username and password must be set')
- pm = HTTPPasswordMgr()
- _, netloc, _, _, _, _ = urlparse(self.url)
- pm.add_password(self.realm, netloc, self.username, self.password)
- self.password_handler = HTTPBasicAuthHandler(pm)
-
- def register(self, metadata):
- """
- Register a distribution on PyPI, using the provided metadata.
-
- :param metadata: A :class:`Metadata` instance defining at least a name
- and version number for the distribution to be
- registered.
- :return: The HTTP response received from PyPI upon submission of the
- request.
- """
- self.check_credentials()
- metadata.validate()
- d = metadata.todict()
- d[':action'] = 'verify'
- request = self.encode_request(d.items(), [])
- response = self.send_request(request)
- d[':action'] = 'submit'
- request = self.encode_request(d.items(), [])
- return self.send_request(request)
-
- def _reader(self, name, stream, outbuf):
- """
- Thread runner for reading lines of from a subprocess into a buffer.
-
- :param name: The logical name of the stream (used for logging only).
- :param stream: The stream to read from. This will typically a pipe
- connected to the output stream of a subprocess.
- :param outbuf: The list to append the read lines to.
- """
- while True:
- s = stream.readline()
- if not s:
- break
- s = s.decode('utf-8').rstrip()
- outbuf.append(s)
- logger.debug('%s: %s' % (name, s))
- stream.close()
-
- def get_sign_command(self, filename, signer, sign_password,
- keystore=None):
- """
- Return a suitable command for signing a file.
-
- :param filename: The pathname to the file to be signed.
- :param signer: The identifier of the signer of the file.
- :param sign_password: The passphrase for the signer's
- private key used for signing.
- :param keystore: The path to a directory which contains the keys
- used in verification. If not specified, the
- instance's ``gpg_home`` attribute is used instead.
- :return: The signing command as a list suitable to be
- passed to :class:`subprocess.Popen`.
- """
- cmd = [self.gpg, '--status-fd', '2', '--no-tty']
- if keystore is None:
- keystore = self.gpg_home
- if keystore:
- cmd.extend(['--homedir', keystore])
- if sign_password is not None:
- cmd.extend(['--batch', '--passphrase-fd', '0'])
- td = tempfile.mkdtemp()
- sf = os.path.join(td, os.path.basename(filename) + '.asc')
- cmd.extend(['--detach-sign', '--armor', '--local-user',
- signer, '--output', sf, filename])
- logger.debug('invoking: %s', ' '.join(cmd))
- return cmd, sf
-
- def run_command(self, cmd, input_data=None):
- """
- Run a command in a child process , passing it any input data specified.
-
- :param cmd: The command to run.
- :param input_data: If specified, this must be a byte string containing
- data to be sent to the child process.
- :return: A tuple consisting of the subprocess' exit code, a list of
- lines read from the subprocess' ``stdout``, and a list of
- lines read from the subprocess' ``stderr``.
- """
- kwargs = {
- 'stdout': subprocess.PIPE,
- 'stderr': subprocess.PIPE,
- }
- if input_data is not None:
- kwargs['stdin'] = subprocess.PIPE
- stdout = []
- stderr = []
- p = subprocess.Popen(cmd, **kwargs)
- # We don't use communicate() here because we may need to
- # get clever with interacting with the command
- t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout))
- t1.start()
- t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr))
- t2.start()
- if input_data is not None:
- p.stdin.write(input_data)
- p.stdin.close()
-
- p.wait()
- t1.join()
- t2.join()
- return p.returncode, stdout, stderr
-
- def sign_file(self, filename, signer, sign_password, keystore=None):
- """
- Sign a file.
-
- :param filename: The pathname to the file to be signed.
- :param signer: The identifier of the signer of the file.
- :param sign_password: The passphrase for the signer's
- private key used for signing.
- :param keystore: The path to a directory which contains the keys
- used in signing. If not specified, the instance's
- ``gpg_home`` attribute is used instead.
- :return: The absolute pathname of the file where the signature is
- stored.
- """
- cmd, sig_file = self.get_sign_command(filename, signer, sign_password,
- keystore)
- rc, stdout, stderr = self.run_command(cmd,
- sign_password.encode('utf-8'))
- if rc != 0:
- raise DistlibException('sign command failed with error '
- 'code %s' % rc)
- return sig_file
-
- def upload_file(self, metadata, filename, signer=None, sign_password=None,
- filetype='sdist', pyversion='source', keystore=None):
- """
- Upload a release file to the index.
-
- :param metadata: A :class:`Metadata` instance defining at least a name
- and version number for the file to be uploaded.
- :param filename: The pathname of the file to be uploaded.
- :param signer: The identifier of the signer of the file.
- :param sign_password: The passphrase for the signer's
- private key used for signing.
- :param filetype: The type of the file being uploaded. This is the
- distutils command which produced that file, e.g.
- ``sdist`` or ``bdist_wheel``.
- :param pyversion: The version of Python which the release relates
- to. For code compatible with any Python, this would
- be ``source``, otherwise it would be e.g. ``3.2``.
- :param keystore: The path to a directory which contains the keys
- used in signing. If not specified, the instance's
- ``gpg_home`` attribute is used instead.
- :return: The HTTP response received from PyPI upon submission of the
- request.
- """
- self.check_credentials()
- if not os.path.exists(filename):
- raise DistlibException('not found: %s' % filename)
- metadata.validate()
- d = metadata.todict()
- sig_file = None
- if signer:
- if not self.gpg:
- logger.warning('no signing program available - not signed')
- else:
- sig_file = self.sign_file(filename, signer, sign_password,
- keystore)
- with open(filename, 'rb') as f:
- file_data = f.read()
- md5_digest = hashlib.md5(file_data).hexdigest()
- sha256_digest = hashlib.sha256(file_data).hexdigest()
- d.update({
- ':action': 'file_upload',
- 'protocol_version': '1',
- 'filetype': filetype,
- 'pyversion': pyversion,
- 'md5_digest': md5_digest,
- 'sha256_digest': sha256_digest,
- })
- files = [('content', os.path.basename(filename), file_data)]
- if sig_file:
- with open(sig_file, 'rb') as f:
- sig_data = f.read()
- files.append(('gpg_signature', os.path.basename(sig_file),
- sig_data))
- shutil.rmtree(os.path.dirname(sig_file))
- request = self.encode_request(d.items(), files)
- return self.send_request(request)
-
- def upload_documentation(self, metadata, doc_dir):
- """
- Upload documentation to the index.
-
- :param metadata: A :class:`Metadata` instance defining at least a name
- and version number for the documentation to be
- uploaded.
- :param doc_dir: The pathname of the directory which contains the
- documentation. This should be the directory that
- contains the ``index.html`` for the documentation.
- :return: The HTTP response received from PyPI upon submission of the
- request.
- """
- self.check_credentials()
- if not os.path.isdir(doc_dir):
- raise DistlibException('not a directory: %r' % doc_dir)
- fn = os.path.join(doc_dir, 'index.html')
- if not os.path.exists(fn):
- raise DistlibException('not found: %r' % fn)
- metadata.validate()
- name, version = metadata.name, metadata.version
- zip_data = zip_dir(doc_dir).getvalue()
- fields = [(':action', 'doc_upload'),
- ('name', name), ('version', version)]
- files = [('content', name, zip_data)]
- request = self.encode_request(fields, files)
- return self.send_request(request)
-
- def get_verify_command(self, signature_filename, data_filename,
- keystore=None):
- """
- Return a suitable command for verifying a file.
-
- :param signature_filename: The pathname to the file containing the
- signature.
- :param data_filename: The pathname to the file containing the
- signed data.
- :param keystore: The path to a directory which contains the keys
- used in verification. If not specified, the
- instance's ``gpg_home`` attribute is used instead.
- :return: The verifying command as a list suitable to be
- passed to :class:`subprocess.Popen`.
- """
- cmd = [self.gpg, '--status-fd', '2', '--no-tty']
- if keystore is None:
- keystore = self.gpg_home
- if keystore:
- cmd.extend(['--homedir', keystore])
- cmd.extend(['--verify', signature_filename, data_filename])
- logger.debug('invoking: %s', ' '.join(cmd))
- return cmd
-
- def verify_signature(self, signature_filename, data_filename,
- keystore=None):
- """
- Verify a signature for a file.
-
- :param signature_filename: The pathname to the file containing the
- signature.
- :param data_filename: The pathname to the file containing the
- signed data.
- :param keystore: The path to a directory which contains the keys
- used in verification. If not specified, the
- instance's ``gpg_home`` attribute is used instead.
- :return: True if the signature was verified, else False.
- """
- if not self.gpg:
- raise DistlibException('verification unavailable because gpg '
- 'unavailable')
- cmd = self.get_verify_command(signature_filename, data_filename,
- keystore)
- rc, stdout, stderr = self.run_command(cmd)
- if rc not in (0, 1):
- raise DistlibException('verify command failed with error '
- 'code %s' % rc)
- return rc == 0
-
- def download_file(self, url, destfile, digest=None, reporthook=None):
- """
- This is a convenience method for downloading a file from an URL.
- Normally, this will be a file from the index, though currently
- no check is made for this (i.e. a file can be downloaded from
- anywhere).
-
- The method is just like the :func:`urlretrieve` function in the
- standard library, except that it allows digest computation to be
- done during download and checking that the downloaded data
- matched any expected value.
-
- :param url: The URL of the file to be downloaded (assumed to be
- available via an HTTP GET request).
- :param destfile: The pathname where the downloaded file is to be
- saved.
- :param digest: If specified, this must be a (hasher, value)
- tuple, where hasher is the algorithm used (e.g.
- ``'md5'``) and ``value`` is the expected value.
- :param reporthook: The same as for :func:`urlretrieve` in the
- standard library.
- """
- if digest is None:
- digester = None
- logger.debug('No digest specified')
- else:
- if isinstance(digest, (list, tuple)):
- hasher, digest = digest
- else:
- hasher = 'md5'
- digester = getattr(hashlib, hasher)()
- logger.debug('Digest specified: %s' % digest)
- # The following code is equivalent to urlretrieve.
- # We need to do it this way so that we can compute the
- # digest of the file as we go.
- with open(destfile, 'wb') as dfp:
- # addinfourl is not a context manager on 2.x
- # so we have to use try/finally
- sfp = self.send_request(Request(url))
- try:
- headers = sfp.info()
- blocksize = 8192
- size = -1
- read = 0
- blocknum = 0
- if "content-length" in headers:
- size = int(headers["Content-Length"])
- if reporthook:
- reporthook(blocknum, blocksize, size)
- while True:
- block = sfp.read(blocksize)
- if not block:
- break
- read += len(block)
- dfp.write(block)
- if digester:
- digester.update(block)
- blocknum += 1
- if reporthook:
- reporthook(blocknum, blocksize, size)
- finally:
- sfp.close()
-
- # check that we got the whole file, if we can
- if size >= 0 and read < size:
- raise DistlibException(
- 'retrieval incomplete: got only %d out of %d bytes'
- % (read, size))
- # if we have a digest, it must match.
- if digester:
- actual = digester.hexdigest()
- if digest != actual:
- raise DistlibException('%s digest mismatch for %s: expected '
- '%s, got %s' % (hasher, destfile,
- digest, actual))
- logger.debug('Digest verified: %s', digest)
-
- def send_request(self, req):
- """
- Send a standard library :class:`Request` to PyPI and return its
- response.
-
- :param req: The request to send.
- :return: The HTTP response from PyPI (a standard library HTTPResponse).
- """
- handlers = []
- if self.password_handler:
- handlers.append(self.password_handler)
- if self.ssl_verifier:
- handlers.append(self.ssl_verifier)
- opener = build_opener(*handlers)
- return opener.open(req)
-
- def encode_request(self, fields, files):
- """
- Encode fields and files for posting to an HTTP server.
-
- :param fields: The fields to send as a list of (fieldname, value)
- tuples.
- :param files: The files to send as a list of (fieldname, filename,
- file_bytes) tuple.
- """
- # Adapted from packaging, which in turn was adapted from
- # http://code.activestate.com/recipes/146306
-
- parts = []
- boundary = self.boundary
- for k, values in fields:
- if not isinstance(values, (list, tuple)):
- values = [values]
-
- for v in values:
- parts.extend((
- b'--' + boundary,
- ('Content-Disposition: form-data; name="%s"' %
- k).encode('utf-8'),
- b'',
- v.encode('utf-8')))
- for key, filename, value in files:
- parts.extend((
- b'--' + boundary,
- ('Content-Disposition: form-data; name="%s"; filename="%s"' %
- (key, filename)).encode('utf-8'),
- b'',
- value))
-
- parts.extend((b'--' + boundary + b'--', b''))
-
- body = b'\r\n'.join(parts)
- ct = b'multipart/form-data; boundary=' + boundary
- headers = {
- 'Content-type': ct,
- 'Content-length': str(len(body))
- }
- return Request(self.url, body, headers)
-
- def search(self, terms, operator=None):
- if isinstance(terms, string_types):
- terms = {'name': terms}
- rpc_proxy = ServerProxy(self.url, timeout=3.0)
- try:
- return rpc_proxy.search(terms, operator or 'and')
- finally:
- rpc_proxy('close')()
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/locators.py b/venv/Lib/site-packages/pip/_vendor/distlib/locators.py
deleted file mode 100644
index 12a1d06..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/locators.py
+++ /dev/null
@@ -1,1302 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2015 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-
-import gzip
-from io import BytesIO
-import json
-import logging
-import os
-import posixpath
-import re
-try:
- import threading
-except ImportError: # pragma: no cover
- import dummy_threading as threading
-import zlib
-
-from . import DistlibException
-from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url,
- queue, quote, unescape, string_types, build_opener,
- HTTPRedirectHandler as BaseRedirectHandler, text_type,
- Request, HTTPError, URLError)
-from .database import Distribution, DistributionPath, make_dist
-from .metadata import Metadata, MetadataInvalidError
-from .util import (cached_property, parse_credentials, ensure_slash,
- split_filename, get_project_data, parse_requirement,
- parse_name_and_version, ServerProxy, normalize_name)
-from .version import get_scheme, UnsupportedVersionError
-from .wheel import Wheel, is_compatible
-
-logger = logging.getLogger(__name__)
-
-HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)')
-CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I)
-HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml')
-DEFAULT_INDEX = 'https://pypi.org/pypi'
-
-def get_all_distribution_names(url=None):
- """
- Return all distribution names known by an index.
- :param url: The URL of the index.
- :return: A list of all known distribution names.
- """
- if url is None:
- url = DEFAULT_INDEX
- client = ServerProxy(url, timeout=3.0)
- try:
- return client.list_packages()
- finally:
- client('close')()
-
-class RedirectHandler(BaseRedirectHandler):
- """
- A class to work around a bug in some Python 3.2.x releases.
- """
- # There's a bug in the base version for some 3.2.x
- # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header
- # returns e.g. /abc, it bails because it says the scheme ''
- # is bogus, when actually it should use the request's
- # URL for the scheme. See Python issue #13696.
- def http_error_302(self, req, fp, code, msg, headers):
- # Some servers (incorrectly) return multiple Location headers
- # (so probably same goes for URI). Use first header.
- newurl = None
- for key in ('location', 'uri'):
- if key in headers:
- newurl = headers[key]
- break
- if newurl is None: # pragma: no cover
- return
- urlparts = urlparse(newurl)
- if urlparts.scheme == '':
- newurl = urljoin(req.get_full_url(), newurl)
- if hasattr(headers, 'replace_header'):
- headers.replace_header(key, newurl)
- else:
- headers[key] = newurl
- return BaseRedirectHandler.http_error_302(self, req, fp, code, msg,
- headers)
-
- http_error_301 = http_error_303 = http_error_307 = http_error_302
-
-class Locator(object):
- """
- A base class for locators - things that locate distributions.
- """
- source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz')
- binary_extensions = ('.egg', '.exe', '.whl')
- excluded_extensions = ('.pdf',)
-
- # A list of tags indicating which wheels you want to match. The default
- # value of None matches against the tags compatible with the running
- # Python. If you want to match other values, set wheel_tags on a locator
- # instance to a list of tuples (pyver, abi, arch) which you want to match.
- wheel_tags = None
-
- downloadable_extensions = source_extensions + ('.whl',)
-
- def __init__(self, scheme='default'):
- """
- Initialise an instance.
- :param scheme: Because locators look for most recent versions, they
- need to know the version scheme to use. This specifies
- the current PEP-recommended scheme - use ``'legacy'``
- if you need to support existing distributions on PyPI.
- """
- self._cache = {}
- self.scheme = scheme
- # Because of bugs in some of the handlers on some of the platforms,
- # we use our own opener rather than just using urlopen.
- self.opener = build_opener(RedirectHandler())
- # If get_project() is called from locate(), the matcher instance
- # is set from the requirement passed to locate(). See issue #18 for
- # why this can be useful to know.
- self.matcher = None
- self.errors = queue.Queue()
-
- def get_errors(self):
- """
- Return any errors which have occurred.
- """
- result = []
- while not self.errors.empty(): # pragma: no cover
- try:
- e = self.errors.get(False)
- result.append(e)
- except self.errors.Empty:
- continue
- self.errors.task_done()
- return result
-
- def clear_errors(self):
- """
- Clear any errors which may have been logged.
- """
- # Just get the errors and throw them away
- self.get_errors()
-
- def clear_cache(self):
- self._cache.clear()
-
- def _get_scheme(self):
- return self._scheme
-
- def _set_scheme(self, value):
- self._scheme = value
-
- scheme = property(_get_scheme, _set_scheme)
-
- def _get_project(self, name):
- """
- For a given project, get a dictionary mapping available versions to Distribution
- instances.
-
- This should be implemented in subclasses.
-
- If called from a locate() request, self.matcher will be set to a
- matcher for the requirement to satisfy, otherwise it will be None.
- """
- raise NotImplementedError('Please implement in the subclass')
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- raise NotImplementedError('Please implement in the subclass')
-
- def get_project(self, name):
- """
- For a given project, get a dictionary mapping available versions to Distribution
- instances.
-
- This calls _get_project to do all the work, and just implements a caching layer on top.
- """
- if self._cache is None: # pragma: no cover
- result = self._get_project(name)
- elif name in self._cache:
- result = self._cache[name]
- else:
- self.clear_errors()
- result = self._get_project(name)
- self._cache[name] = result
- return result
-
- def score_url(self, url):
- """
- Give an url a score which can be used to choose preferred URLs
- for a given project release.
- """
- t = urlparse(url)
- basename = posixpath.basename(t.path)
- compatible = True
- is_wheel = basename.endswith('.whl')
- is_downloadable = basename.endswith(self.downloadable_extensions)
- if is_wheel:
- compatible = is_compatible(Wheel(basename), self.wheel_tags)
- return (t.scheme == 'https', 'pypi.org' in t.netloc,
- is_downloadable, is_wheel, compatible, basename)
-
- def prefer_url(self, url1, url2):
- """
- Choose one of two URLs where both are candidates for distribution
- archives for the same version of a distribution (for example,
- .tar.gz vs. zip).
-
- The current implementation favours https:// URLs over http://, archives
- from PyPI over those from other locations, wheel compatibility (if a
- wheel) and then the archive name.
- """
- result = url2
- if url1:
- s1 = self.score_url(url1)
- s2 = self.score_url(url2)
- if s1 > s2:
- result = url1
- if result != url2:
- logger.debug('Not replacing %r with %r', url1, url2)
- else:
- logger.debug('Replacing %r with %r', url1, url2)
- return result
-
- def split_filename(self, filename, project_name):
- """
- Attempt to split a filename in project name, version and Python version.
- """
- return split_filename(filename, project_name)
-
- def convert_url_to_download_info(self, url, project_name):
- """
- See if a URL is a candidate for a download URL for a project (the URL
- has typically been scraped from an HTML page).
-
- If it is, a dictionary is returned with keys "name", "version",
- "filename" and "url"; otherwise, None is returned.
- """
- def same_project(name1, name2):
- return normalize_name(name1) == normalize_name(name2)
-
- result = None
- scheme, netloc, path, params, query, frag = urlparse(url)
- if frag.lower().startswith('egg='): # pragma: no cover
- logger.debug('%s: version hint in fragment: %r',
- project_name, frag)
- m = HASHER_HASH.match(frag)
- if m:
- algo, digest = m.groups()
- else:
- algo, digest = None, None
- origpath = path
- if path and path[-1] == '/': # pragma: no cover
- path = path[:-1]
- if path.endswith('.whl'):
- try:
- wheel = Wheel(path)
- if not is_compatible(wheel, self.wheel_tags):
- logger.debug('Wheel not compatible: %s', path)
- else:
- if project_name is None:
- include = True
- else:
- include = same_project(wheel.name, project_name)
- if include:
- result = {
- 'name': wheel.name,
- 'version': wheel.version,
- 'filename': wheel.filename,
- 'url': urlunparse((scheme, netloc, origpath,
- params, query, '')),
- 'python-version': ', '.join(
- ['.'.join(list(v[2:])) for v in wheel.pyver]),
- }
- except Exception as e: # pragma: no cover
- logger.warning('invalid path for wheel: %s', path)
- elif not path.endswith(self.downloadable_extensions): # pragma: no cover
- logger.debug('Not downloadable: %s', path)
- else: # downloadable extension
- path = filename = posixpath.basename(path)
- for ext in self.downloadable_extensions:
- if path.endswith(ext):
- path = path[:-len(ext)]
- t = self.split_filename(path, project_name)
- if not t: # pragma: no cover
- logger.debug('No match for project/version: %s', path)
- else:
- name, version, pyver = t
- if not project_name or same_project(project_name, name):
- result = {
- 'name': name,
- 'version': version,
- 'filename': filename,
- 'url': urlunparse((scheme, netloc, origpath,
- params, query, '')),
- #'packagetype': 'sdist',
- }
- if pyver: # pragma: no cover
- result['python-version'] = pyver
- break
- if result and algo:
- result['%s_digest' % algo] = digest
- return result
-
- def _get_digest(self, info):
- """
- Get a digest from a dictionary by looking at a "digests" dictionary
- or keys of the form 'algo_digest'.
-
- Returns a 2-tuple (algo, digest) if found, else None. Currently
- looks only for SHA256, then MD5.
- """
- result = None
- if 'digests' in info:
- digests = info['digests']
- for algo in ('sha256', 'md5'):
- if algo in digests:
- result = (algo, digests[algo])
- break
- if not result:
- for algo in ('sha256', 'md5'):
- key = '%s_digest' % algo
- if key in info:
- result = (algo, info[key])
- break
- return result
-
- def _update_version_data(self, result, info):
- """
- Update a result dictionary (the final result from _get_project) with a
- dictionary for a specific version, which typically holds information
- gleaned from a filename or URL for an archive for the distribution.
- """
- name = info.pop('name')
- version = info.pop('version')
- if version in result:
- dist = result[version]
- md = dist.metadata
- else:
- dist = make_dist(name, version, scheme=self.scheme)
- md = dist.metadata
- dist.digest = digest = self._get_digest(info)
- url = info['url']
- result['digests'][url] = digest
- if md.source_url != info['url']:
- md.source_url = self.prefer_url(md.source_url, url)
- result['urls'].setdefault(version, set()).add(url)
- dist.locator = self
- result[version] = dist
-
- def locate(self, requirement, prereleases=False):
- """
- Find the most recent distribution which matches the given
- requirement.
-
- :param requirement: A requirement of the form 'foo (1.0)' or perhaps
- 'foo (>= 1.0, < 2.0, != 1.3)'
- :param prereleases: If ``True``, allow pre-release versions
- to be located. Otherwise, pre-release versions
- are not returned.
- :return: A :class:`Distribution` instance, or ``None`` if no such
- distribution could be located.
- """
- result = None
- r = parse_requirement(requirement)
- if r is None: # pragma: no cover
- raise DistlibException('Not a valid requirement: %r' % requirement)
- scheme = get_scheme(self.scheme)
- self.matcher = matcher = scheme.matcher(r.requirement)
- logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__)
- versions = self.get_project(r.name)
- if len(versions) > 2: # urls and digests keys are present
- # sometimes, versions are invalid
- slist = []
- vcls = matcher.version_class
- for k in versions:
- if k in ('urls', 'digests'):
- continue
- try:
- if not matcher.match(k):
- logger.debug('%s did not match %r', matcher, k)
- else:
- if prereleases or not vcls(k).is_prerelease:
- slist.append(k)
- else:
- logger.debug('skipping pre-release '
- 'version %s of %s', k, matcher.name)
- except Exception: # pragma: no cover
- logger.warning('error matching %s with %r', matcher, k)
- pass # slist.append(k)
- if len(slist) > 1:
- slist = sorted(slist, key=scheme.key)
- if slist:
- logger.debug('sorted list: %s', slist)
- version = slist[-1]
- result = versions[version]
- if result:
- if r.extras:
- result.extras = r.extras
- result.download_urls = versions.get('urls', {}).get(version, set())
- d = {}
- sd = versions.get('digests', {})
- for url in result.download_urls:
- if url in sd: # pragma: no cover
- d[url] = sd[url]
- result.digests = d
- self.matcher = None
- return result
-
-
-class PyPIRPCLocator(Locator):
- """
- This locator uses XML-RPC to locate distributions. It therefore
- cannot be used with simple mirrors (that only mirror file content).
- """
- def __init__(self, url, **kwargs):
- """
- Initialise an instance.
-
- :param url: The URL to use for XML-RPC.
- :param kwargs: Passed to the superclass constructor.
- """
- super(PyPIRPCLocator, self).__init__(**kwargs)
- self.base_url = url
- self.client = ServerProxy(url, timeout=3.0)
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- return set(self.client.list_packages())
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- versions = self.client.package_releases(name, True)
- for v in versions:
- urls = self.client.release_urls(name, v)
- data = self.client.release_data(name, v)
- metadata = Metadata(scheme=self.scheme)
- metadata.name = data['name']
- metadata.version = data['version']
- metadata.license = data.get('license')
- metadata.keywords = data.get('keywords', [])
- metadata.summary = data.get('summary')
- dist = Distribution(metadata)
- if urls:
- info = urls[0]
- metadata.source_url = info['url']
- dist.digest = self._get_digest(info)
- dist.locator = self
- result[v] = dist
- for info in urls:
- url = info['url']
- digest = self._get_digest(info)
- result['urls'].setdefault(v, set()).add(url)
- result['digests'][url] = digest
- return result
-
-class PyPIJSONLocator(Locator):
- """
- This locator uses PyPI's JSON interface. It's very limited in functionality
- and probably not worth using.
- """
- def __init__(self, url, **kwargs):
- super(PyPIJSONLocator, self).__init__(**kwargs)
- self.base_url = ensure_slash(url)
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- raise NotImplementedError('Not available from this locator')
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- url = urljoin(self.base_url, '%s/json' % quote(name))
- try:
- resp = self.opener.open(url)
- data = resp.read().decode() # for now
- d = json.loads(data)
- md = Metadata(scheme=self.scheme)
- data = d['info']
- md.name = data['name']
- md.version = data['version']
- md.license = data.get('license')
- md.keywords = data.get('keywords', [])
- md.summary = data.get('summary')
- dist = Distribution(md)
- dist.locator = self
- urls = d['urls']
- result[md.version] = dist
- for info in d['urls']:
- url = info['url']
- dist.download_urls.add(url)
- dist.digests[url] = self._get_digest(info)
- result['urls'].setdefault(md.version, set()).add(url)
- result['digests'][url] = self._get_digest(info)
- # Now get other releases
- for version, infos in d['releases'].items():
- if version == md.version:
- continue # already done
- omd = Metadata(scheme=self.scheme)
- omd.name = md.name
- omd.version = version
- odist = Distribution(omd)
- odist.locator = self
- result[version] = odist
- for info in infos:
- url = info['url']
- odist.download_urls.add(url)
- odist.digests[url] = self._get_digest(info)
- result['urls'].setdefault(version, set()).add(url)
- result['digests'][url] = self._get_digest(info)
-# for info in urls:
-# md.source_url = info['url']
-# dist.digest = self._get_digest(info)
-# dist.locator = self
-# for info in urls:
-# url = info['url']
-# result['urls'].setdefault(md.version, set()).add(url)
-# result['digests'][url] = self._get_digest(info)
- except Exception as e:
- self.errors.put(text_type(e))
- logger.exception('JSON fetch failed: %s', e)
- return result
-
-
-class Page(object):
- """
- This class represents a scraped HTML page.
- """
- # The following slightly hairy-looking regex just looks for the contents of
- # an anchor link, which has an attribute "href" either immediately preceded
- # or immediately followed by a "rel" attribute. The attribute values can be
- # declared with double quotes, single quotes or no quotes - which leads to
- # the length of the expression.
- _href = re.compile("""
-(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)?
-href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))
-(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))?
-""", re.I | re.S | re.X)
- _base = re.compile(r""" ]+)""", re.I | re.S)
-
- def __init__(self, data, url):
- """
- Initialise an instance with the Unicode page contents and the URL they
- came from.
- """
- self.data = data
- self.base_url = self.url = url
- m = self._base.search(self.data)
- if m:
- self.base_url = m.group(1)
-
- _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)
-
- @cached_property
- def links(self):
- """
- Return the URLs of all the links on a page together with information
- about their "rel" attribute, for determining which ones to treat as
- downloads and which ones to queue for further scraping.
- """
- def clean(url):
- "Tidy up an URL."
- scheme, netloc, path, params, query, frag = urlparse(url)
- return urlunparse((scheme, netloc, quote(path),
- params, query, frag))
-
- result = set()
- for match in self._href.finditer(self.data):
- d = match.groupdict('')
- rel = (d['rel1'] or d['rel2'] or d['rel3'] or
- d['rel4'] or d['rel5'] or d['rel6'])
- url = d['url1'] or d['url2'] or d['url3']
- url = urljoin(self.base_url, url)
- url = unescape(url)
- url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url)
- result.add((url, rel))
- # We sort the result, hoping to bring the most recent versions
- # to the front
- result = sorted(result, key=lambda t: t[0], reverse=True)
- return result
-
-
-class SimpleScrapingLocator(Locator):
- """
- A locator which scrapes HTML pages to locate downloads for a distribution.
- This runs multiple threads to do the I/O; performance is at least as good
- as pip's PackageFinder, which works in an analogous fashion.
- """
-
- # These are used to deal with various Content-Encoding schemes.
- decoders = {
- 'deflate': zlib.decompress,
- 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(),
- 'none': lambda b: b,
- }
-
- def __init__(self, url, timeout=None, num_workers=10, **kwargs):
- """
- Initialise an instance.
- :param url: The root URL to use for scraping.
- :param timeout: The timeout, in seconds, to be applied to requests.
- This defaults to ``None`` (no timeout specified).
- :param num_workers: The number of worker threads you want to do I/O,
- This defaults to 10.
- :param kwargs: Passed to the superclass.
- """
- super(SimpleScrapingLocator, self).__init__(**kwargs)
- self.base_url = ensure_slash(url)
- self.timeout = timeout
- self._page_cache = {}
- self._seen = set()
- self._to_fetch = queue.Queue()
- self._bad_hosts = set()
- self.skip_externals = False
- self.num_workers = num_workers
- self._lock = threading.RLock()
- # See issue #45: we need to be resilient when the locator is used
- # in a thread, e.g. with concurrent.futures. We can't use self._lock
- # as it is for coordinating our internal threads - the ones created
- # in _prepare_threads.
- self._gplock = threading.RLock()
- self.platform_check = False # See issue #112
-
- def _prepare_threads(self):
- """
- Threads are created only when get_project is called, and terminate
- before it returns. They are there primarily to parallelise I/O (i.e.
- fetching web pages).
- """
- self._threads = []
- for i in range(self.num_workers):
- t = threading.Thread(target=self._fetch)
- t.setDaemon(True)
- t.start()
- self._threads.append(t)
-
- def _wait_threads(self):
- """
- Tell all the threads to terminate (by sending a sentinel value) and
- wait for them to do so.
- """
- # Note that you need two loops, since you can't say which
- # thread will get each sentinel
- for t in self._threads:
- self._to_fetch.put(None) # sentinel
- for t in self._threads:
- t.join()
- self._threads = []
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- with self._gplock:
- self.result = result
- self.project_name = name
- url = urljoin(self.base_url, '%s/' % quote(name))
- self._seen.clear()
- self._page_cache.clear()
- self._prepare_threads()
- try:
- logger.debug('Queueing %s', url)
- self._to_fetch.put(url)
- self._to_fetch.join()
- finally:
- self._wait_threads()
- del self.result
- return result
-
- platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|'
- r'win(32|_amd64)|macosx_?\d+)\b', re.I)
-
- def _is_platform_dependent(self, url):
- """
- Does an URL refer to a platform-specific download?
- """
- return self.platform_dependent.search(url)
-
- def _process_download(self, url):
- """
- See if an URL is a suitable download for a project.
-
- If it is, register information in the result dictionary (for
- _get_project) about the specific version it's for.
-
- Note that the return value isn't actually used other than as a boolean
- value.
- """
- if self.platform_check and self._is_platform_dependent(url):
- info = None
- else:
- info = self.convert_url_to_download_info(url, self.project_name)
- logger.debug('process_download: %s -> %s', url, info)
- if info:
- with self._lock: # needed because self.result is shared
- self._update_version_data(self.result, info)
- return info
-
- def _should_queue(self, link, referrer, rel):
- """
- Determine whether a link URL from a referring page and with a
- particular "rel" attribute should be queued for scraping.
- """
- scheme, netloc, path, _, _, _ = urlparse(link)
- if path.endswith(self.source_extensions + self.binary_extensions +
- self.excluded_extensions):
- result = False
- elif self.skip_externals and not link.startswith(self.base_url):
- result = False
- elif not referrer.startswith(self.base_url):
- result = False
- elif rel not in ('homepage', 'download'):
- result = False
- elif scheme not in ('http', 'https', 'ftp'):
- result = False
- elif self._is_platform_dependent(link):
- result = False
- else:
- host = netloc.split(':', 1)[0]
- if host.lower() == 'localhost':
- result = False
- else:
- result = True
- logger.debug('should_queue: %s (%s) from %s -> %s', link, rel,
- referrer, result)
- return result
-
- def _fetch(self):
- """
- Get a URL to fetch from the work queue, get the HTML page, examine its
- links for download candidates and candidates for further scraping.
-
- This is a handy method to run in a thread.
- """
- while True:
- url = self._to_fetch.get()
- try:
- if url:
- page = self.get_page(url)
- if page is None: # e.g. after an error
- continue
- for link, rel in page.links:
- if link not in self._seen:
- try:
- self._seen.add(link)
- if (not self._process_download(link) and
- self._should_queue(link, url, rel)):
- logger.debug('Queueing %s from %s', link, url)
- self._to_fetch.put(link)
- except MetadataInvalidError: # e.g. invalid versions
- pass
- except Exception as e: # pragma: no cover
- self.errors.put(text_type(e))
- finally:
- # always do this, to avoid hangs :-)
- self._to_fetch.task_done()
- if not url:
- #logger.debug('Sentinel seen, quitting.')
- break
-
- def get_page(self, url):
- """
- Get the HTML for an URL, possibly from an in-memory cache.
-
- XXX TODO Note: this cache is never actually cleared. It's assumed that
- the data won't get stale over the lifetime of a locator instance (not
- necessarily true for the default_locator).
- """
- # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api
- scheme, netloc, path, _, _, _ = urlparse(url)
- if scheme == 'file' and os.path.isdir(url2pathname(path)):
- url = urljoin(ensure_slash(url), 'index.html')
-
- if url in self._page_cache:
- result = self._page_cache[url]
- logger.debug('Returning %s from cache: %s', url, result)
- else:
- host = netloc.split(':', 1)[0]
- result = None
- if host in self._bad_hosts:
- logger.debug('Skipping %s due to bad host %s', url, host)
- else:
- req = Request(url, headers={'Accept-encoding': 'identity'})
- try:
- logger.debug('Fetching %s', url)
- resp = self.opener.open(req, timeout=self.timeout)
- logger.debug('Fetched %s', url)
- headers = resp.info()
- content_type = headers.get('Content-Type', '')
- if HTML_CONTENT_TYPE.match(content_type):
- final_url = resp.geturl()
- data = resp.read()
- encoding = headers.get('Content-Encoding')
- if encoding:
- decoder = self.decoders[encoding] # fail if not found
- data = decoder(data)
- encoding = 'utf-8'
- m = CHARSET.search(content_type)
- if m:
- encoding = m.group(1)
- try:
- data = data.decode(encoding)
- except UnicodeError: # pragma: no cover
- data = data.decode('latin-1') # fallback
- result = Page(data, final_url)
- self._page_cache[final_url] = result
- except HTTPError as e:
- if e.code != 404:
- logger.exception('Fetch failed: %s: %s', url, e)
- except URLError as e: # pragma: no cover
- logger.exception('Fetch failed: %s: %s', url, e)
- with self._lock:
- self._bad_hosts.add(host)
- except Exception as e: # pragma: no cover
- logger.exception('Fetch failed: %s: %s', url, e)
- finally:
- self._page_cache[url] = result # even if None (failure)
- return result
-
- _distname_re = re.compile(']*>([^<]+)<')
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- result = set()
- page = self.get_page(self.base_url)
- if not page:
- raise DistlibException('Unable to get %s' % self.base_url)
- for match in self._distname_re.finditer(page.data):
- result.add(match.group(1))
- return result
-
-class DirectoryLocator(Locator):
- """
- This class locates distributions in a directory tree.
- """
-
- def __init__(self, path, **kwargs):
- """
- Initialise an instance.
- :param path: The root of the directory tree to search.
- :param kwargs: Passed to the superclass constructor,
- except for:
- * recursive - if True (the default), subdirectories are
- recursed into. If False, only the top-level directory
- is searched,
- """
- self.recursive = kwargs.pop('recursive', True)
- super(DirectoryLocator, self).__init__(**kwargs)
- path = os.path.abspath(path)
- if not os.path.isdir(path): # pragma: no cover
- raise DistlibException('Not a directory: %r' % path)
- self.base_dir = path
-
- def should_include(self, filename, parent):
- """
- Should a filename be considered as a candidate for a distribution
- archive? As well as the filename, the directory which contains it
- is provided, though not used by the current implementation.
- """
- return filename.endswith(self.downloadable_extensions)
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- for root, dirs, files in os.walk(self.base_dir):
- for fn in files:
- if self.should_include(fn, root):
- fn = os.path.join(root, fn)
- url = urlunparse(('file', '',
- pathname2url(os.path.abspath(fn)),
- '', '', ''))
- info = self.convert_url_to_download_info(url, name)
- if info:
- self._update_version_data(result, info)
- if not self.recursive:
- break
- return result
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- result = set()
- for root, dirs, files in os.walk(self.base_dir):
- for fn in files:
- if self.should_include(fn, root):
- fn = os.path.join(root, fn)
- url = urlunparse(('file', '',
- pathname2url(os.path.abspath(fn)),
- '', '', ''))
- info = self.convert_url_to_download_info(url, None)
- if info:
- result.add(info['name'])
- if not self.recursive:
- break
- return result
-
-class JSONLocator(Locator):
- """
- This locator uses special extended metadata (not available on PyPI) and is
- the basis of performant dependency resolution in distlib. Other locators
- require archive downloads before dependencies can be determined! As you
- might imagine, that can be slow.
- """
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- raise NotImplementedError('Not available from this locator')
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- data = get_project_data(name)
- if data:
- for info in data.get('files', []):
- if info['ptype'] != 'sdist' or info['pyversion'] != 'source':
- continue
- # We don't store summary in project metadata as it makes
- # the data bigger for no benefit during dependency
- # resolution
- dist = make_dist(data['name'], info['version'],
- summary=data.get('summary',
- 'Placeholder for summary'),
- scheme=self.scheme)
- md = dist.metadata
- md.source_url = info['url']
- # TODO SHA256 digest
- if 'digest' in info and info['digest']:
- dist.digest = ('md5', info['digest'])
- md.dependencies = info.get('requirements', {})
- dist.exports = info.get('exports', {})
- result[dist.version] = dist
- result['urls'].setdefault(dist.version, set()).add(info['url'])
- return result
-
-class DistPathLocator(Locator):
- """
- This locator finds installed distributions in a path. It can be useful for
- adding to an :class:`AggregatingLocator`.
- """
- def __init__(self, distpath, **kwargs):
- """
- Initialise an instance.
-
- :param distpath: A :class:`DistributionPath` instance to search.
- """
- super(DistPathLocator, self).__init__(**kwargs)
- assert isinstance(distpath, DistributionPath)
- self.distpath = distpath
-
- def _get_project(self, name):
- dist = self.distpath.get_distribution(name)
- if dist is None:
- result = {'urls': {}, 'digests': {}}
- else:
- result = {
- dist.version: dist,
- 'urls': {dist.version: set([dist.source_url])},
- 'digests': {dist.version: set([None])}
- }
- return result
-
-
-class AggregatingLocator(Locator):
- """
- This class allows you to chain and/or merge a list of locators.
- """
- def __init__(self, *locators, **kwargs):
- """
- Initialise an instance.
-
- :param locators: The list of locators to search.
- :param kwargs: Passed to the superclass constructor,
- except for:
- * merge - if False (the default), the first successful
- search from any of the locators is returned. If True,
- the results from all locators are merged (this can be
- slow).
- """
- self.merge = kwargs.pop('merge', False)
- self.locators = locators
- super(AggregatingLocator, self).__init__(**kwargs)
-
- def clear_cache(self):
- super(AggregatingLocator, self).clear_cache()
- for locator in self.locators:
- locator.clear_cache()
-
- def _set_scheme(self, value):
- self._scheme = value
- for locator in self.locators:
- locator.scheme = value
-
- scheme = property(Locator.scheme.fget, _set_scheme)
-
- def _get_project(self, name):
- result = {}
- for locator in self.locators:
- d = locator.get_project(name)
- if d:
- if self.merge:
- files = result.get('urls', {})
- digests = result.get('digests', {})
- # next line could overwrite result['urls'], result['digests']
- result.update(d)
- df = result.get('urls')
- if files and df:
- for k, v in files.items():
- if k in df:
- df[k] |= v
- else:
- df[k] = v
- dd = result.get('digests')
- if digests and dd:
- dd.update(digests)
- else:
- # See issue #18. If any dists are found and we're looking
- # for specific constraints, we only return something if
- # a match is found. For example, if a DirectoryLocator
- # returns just foo (1.0) while we're looking for
- # foo (>= 2.0), we'll pretend there was nothing there so
- # that subsequent locators can be queried. Otherwise we
- # would just return foo (1.0) which would then lead to a
- # failure to find foo (>= 2.0), because other locators
- # weren't searched. Note that this only matters when
- # merge=False.
- if self.matcher is None:
- found = True
- else:
- found = False
- for k in d:
- if self.matcher.match(k):
- found = True
- break
- if found:
- result = d
- break
- return result
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- result = set()
- for locator in self.locators:
- try:
- result |= locator.get_distribution_names()
- except NotImplementedError:
- pass
- return result
-
-
-# We use a legacy scheme simply because most of the dists on PyPI use legacy
-# versions which don't conform to PEP 426 / PEP 440.
-default_locator = AggregatingLocator(
- JSONLocator(),
- SimpleScrapingLocator('https://pypi.org/simple/',
- timeout=3.0),
- scheme='legacy')
-
-locate = default_locator.locate
-
-NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*'
- r'\(\s*(==\s*)?(?P[^)]+)\)$')
-
-class DependencyFinder(object):
- """
- Locate dependencies for distributions.
- """
-
- def __init__(self, locator=None):
- """
- Initialise an instance, using the specified locator
- to locate distributions.
- """
- self.locator = locator or default_locator
- self.scheme = get_scheme(self.locator.scheme)
-
- def add_distribution(self, dist):
- """
- Add a distribution to the finder. This will update internal information
- about who provides what.
- :param dist: The distribution to add.
- """
- logger.debug('adding distribution %s', dist)
- name = dist.key
- self.dists_by_name[name] = dist
- self.dists[(name, dist.version)] = dist
- for p in dist.provides:
- name, version = parse_name_and_version(p)
- logger.debug('Add to provided: %s, %s, %s', name, version, dist)
- self.provided.setdefault(name, set()).add((version, dist))
-
- def remove_distribution(self, dist):
- """
- Remove a distribution from the finder. This will update internal
- information about who provides what.
- :param dist: The distribution to remove.
- """
- logger.debug('removing distribution %s', dist)
- name = dist.key
- del self.dists_by_name[name]
- del self.dists[(name, dist.version)]
- for p in dist.provides:
- name, version = parse_name_and_version(p)
- logger.debug('Remove from provided: %s, %s, %s', name, version, dist)
- s = self.provided[name]
- s.remove((version, dist))
- if not s:
- del self.provided[name]
-
- def get_matcher(self, reqt):
- """
- Get a version matcher for a requirement.
- :param reqt: The requirement
- :type reqt: str
- :return: A version matcher (an instance of
- :class:`distlib.version.Matcher`).
- """
- try:
- matcher = self.scheme.matcher(reqt)
- except UnsupportedVersionError: # pragma: no cover
- # XXX compat-mode if cannot read the version
- name = reqt.split()[0]
- matcher = self.scheme.matcher(name)
- return matcher
-
- def find_providers(self, reqt):
- """
- Find the distributions which can fulfill a requirement.
-
- :param reqt: The requirement.
- :type reqt: str
- :return: A set of distribution which can fulfill the requirement.
- """
- matcher = self.get_matcher(reqt)
- name = matcher.key # case-insensitive
- result = set()
- provided = self.provided
- if name in provided:
- for version, provider in provided[name]:
- try:
- match = matcher.match(version)
- except UnsupportedVersionError:
- match = False
-
- if match:
- result.add(provider)
- break
- return result
-
- def try_to_replace(self, provider, other, problems):
- """
- Attempt to replace one provider with another. This is typically used
- when resolving dependencies from multiple sources, e.g. A requires
- (B >= 1.0) while C requires (B >= 1.1).
-
- For successful replacement, ``provider`` must meet all the requirements
- which ``other`` fulfills.
-
- :param provider: The provider we are trying to replace with.
- :param other: The provider we're trying to replace.
- :param problems: If False is returned, this will contain what
- problems prevented replacement. This is currently
- a tuple of the literal string 'cantreplace',
- ``provider``, ``other`` and the set of requirements
- that ``provider`` couldn't fulfill.
- :return: True if we can replace ``other`` with ``provider``, else
- False.
- """
- rlist = self.reqts[other]
- unmatched = set()
- for s in rlist:
- matcher = self.get_matcher(s)
- if not matcher.match(provider.version):
- unmatched.add(s)
- if unmatched:
- # can't replace other with provider
- problems.add(('cantreplace', provider, other,
- frozenset(unmatched)))
- result = False
- else:
- # can replace other with provider
- self.remove_distribution(other)
- del self.reqts[other]
- for s in rlist:
- self.reqts.setdefault(provider, set()).add(s)
- self.add_distribution(provider)
- result = True
- return result
-
- def find(self, requirement, meta_extras=None, prereleases=False):
- """
- Find a distribution and all distributions it depends on.
-
- :param requirement: The requirement specifying the distribution to
- find, or a Distribution instance.
- :param meta_extras: A list of meta extras such as :test:, :build: and
- so on.
- :param prereleases: If ``True``, allow pre-release versions to be
- returned - otherwise, don't return prereleases
- unless they're all that's available.
-
- Return a set of :class:`Distribution` instances and a set of
- problems.
-
- The distributions returned should be such that they have the
- :attr:`required` attribute set to ``True`` if they were
- from the ``requirement`` passed to ``find()``, and they have the
- :attr:`build_time_dependency` attribute set to ``True`` unless they
- are post-installation dependencies of the ``requirement``.
-
- The problems should be a tuple consisting of the string
- ``'unsatisfied'`` and the requirement which couldn't be satisfied
- by any distribution known to the locator.
- """
-
- self.provided = {}
- self.dists = {}
- self.dists_by_name = {}
- self.reqts = {}
-
- meta_extras = set(meta_extras or [])
- if ':*:' in meta_extras:
- meta_extras.remove(':*:')
- # :meta: and :run: are implicitly included
- meta_extras |= set([':test:', ':build:', ':dev:'])
-
- if isinstance(requirement, Distribution):
- dist = odist = requirement
- logger.debug('passed %s as requirement', odist)
- else:
- dist = odist = self.locator.locate(requirement,
- prereleases=prereleases)
- if dist is None:
- raise DistlibException('Unable to locate %r' % requirement)
- logger.debug('located %s', odist)
- dist.requested = True
- problems = set()
- todo = set([dist])
- install_dists = set([odist])
- while todo:
- dist = todo.pop()
- name = dist.key # case-insensitive
- if name not in self.dists_by_name:
- self.add_distribution(dist)
- else:
- #import pdb; pdb.set_trace()
- other = self.dists_by_name[name]
- if other != dist:
- self.try_to_replace(dist, other, problems)
-
- ireqts = dist.run_requires | dist.meta_requires
- sreqts = dist.build_requires
- ereqts = set()
- if meta_extras and dist in install_dists:
- for key in ('test', 'build', 'dev'):
- e = ':%s:' % key
- if e in meta_extras:
- ereqts |= getattr(dist, '%s_requires' % key)
- all_reqts = ireqts | sreqts | ereqts
- for r in all_reqts:
- providers = self.find_providers(r)
- if not providers:
- logger.debug('No providers found for %r', r)
- provider = self.locator.locate(r, prereleases=prereleases)
- # If no provider is found and we didn't consider
- # prereleases, consider them now.
- if provider is None and not prereleases:
- provider = self.locator.locate(r, prereleases=True)
- if provider is None:
- logger.debug('Cannot satisfy %r', r)
- problems.add(('unsatisfied', r))
- else:
- n, v = provider.key, provider.version
- if (n, v) not in self.dists:
- todo.add(provider)
- providers.add(provider)
- if r in ireqts and dist in install_dists:
- install_dists.add(provider)
- logger.debug('Adding %s to install_dists',
- provider.name_and_version)
- for p in providers:
- name = p.key
- if name not in self.dists_by_name:
- self.reqts.setdefault(p, set()).add(r)
- else:
- other = self.dists_by_name[name]
- if other != p:
- # see if other can be replaced by p
- self.try_to_replace(p, other, problems)
-
- dists = set(self.dists.values())
- for dist in dists:
- dist.build_time_dependency = dist not in install_dists
- if dist.build_time_dependency:
- logger.debug('%s is a build-time dependency only.',
- dist.name_and_version)
- logger.debug('find done for %s', odist)
- return dists, problems
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py b/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py
deleted file mode 100644
index ca0fe44..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py
+++ /dev/null
@@ -1,393 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2013 Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""
-Class representing the list of files in a distribution.
-
-Equivalent to distutils.filelist, but fixes some problems.
-"""
-import fnmatch
-import logging
-import os
-import re
-import sys
-
-from . import DistlibException
-from .compat import fsdecode
-from .util import convert_path
-
-
-__all__ = ['Manifest']
-
-logger = logging.getLogger(__name__)
-
-# a \ followed by some spaces + EOL
-_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M)
-_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S)
-
-#
-# Due to the different results returned by fnmatch.translate, we need
-# to do slightly different processing for Python 2.7 and 3.2 ... this needed
-# to be brought in for Python 3.6 onwards.
-#
-_PYTHON_VERSION = sys.version_info[:2]
-
-class Manifest(object):
- """A list of files built by on exploring the filesystem and filtered by
- applying various patterns to what we find there.
- """
-
- def __init__(self, base=None):
- """
- Initialise an instance.
-
- :param base: The base directory to explore under.
- """
- self.base = os.path.abspath(os.path.normpath(base or os.getcwd()))
- self.prefix = self.base + os.sep
- self.allfiles = None
- self.files = set()
-
- #
- # Public API
- #
-
- def findall(self):
- """Find all files under the base and set ``allfiles`` to the absolute
- pathnames of files found.
- """
- from stat import S_ISREG, S_ISDIR, S_ISLNK
-
- self.allfiles = allfiles = []
- root = self.base
- stack = [root]
- pop = stack.pop
- push = stack.append
-
- while stack:
- root = pop()
- names = os.listdir(root)
-
- for name in names:
- fullname = os.path.join(root, name)
-
- # Avoid excess stat calls -- just one will do, thank you!
- stat = os.stat(fullname)
- mode = stat.st_mode
- if S_ISREG(mode):
- allfiles.append(fsdecode(fullname))
- elif S_ISDIR(mode) and not S_ISLNK(mode):
- push(fullname)
-
- def add(self, item):
- """
- Add a file to the manifest.
-
- :param item: The pathname to add. This can be relative to the base.
- """
- if not item.startswith(self.prefix):
- item = os.path.join(self.base, item)
- self.files.add(os.path.normpath(item))
-
- def add_many(self, items):
- """
- Add a list of files to the manifest.
-
- :param items: The pathnames to add. These can be relative to the base.
- """
- for item in items:
- self.add(item)
-
- def sorted(self, wantdirs=False):
- """
- Return sorted files in directory order
- """
-
- def add_dir(dirs, d):
- dirs.add(d)
- logger.debug('add_dir added %s', d)
- if d != self.base:
- parent, _ = os.path.split(d)
- assert parent not in ('', '/')
- add_dir(dirs, parent)
-
- result = set(self.files) # make a copy!
- if wantdirs:
- dirs = set()
- for f in result:
- add_dir(dirs, os.path.dirname(f))
- result |= dirs
- return [os.path.join(*path_tuple) for path_tuple in
- sorted(os.path.split(path) for path in result)]
-
- def clear(self):
- """Clear all collected files."""
- self.files = set()
- self.allfiles = []
-
- def process_directive(self, directive):
- """
- Process a directive which either adds some files from ``allfiles`` to
- ``files``, or removes some files from ``files``.
-
- :param directive: The directive to process. This should be in a format
- compatible with distutils ``MANIFEST.in`` files:
-
- http://docs.python.org/distutils/sourcedist.html#commands
- """
- # Parse the line: split it up, make sure the right number of words
- # is there, and return the relevant words. 'action' is always
- # defined: it's the first word of the line. Which of the other
- # three are defined depends on the action; it'll be either
- # patterns, (dir and patterns), or (dirpattern).
- action, patterns, thedir, dirpattern = self._parse_directive(directive)
-
- # OK, now we know that the action is valid and we have the
- # right number of words on the line for that action -- so we
- # can proceed with minimal error-checking.
- if action == 'include':
- for pattern in patterns:
- if not self._include_pattern(pattern, anchor=True):
- logger.warning('no files found matching %r', pattern)
-
- elif action == 'exclude':
- for pattern in patterns:
- found = self._exclude_pattern(pattern, anchor=True)
- #if not found:
- # logger.warning('no previously-included files '
- # 'found matching %r', pattern)
-
- elif action == 'global-include':
- for pattern in patterns:
- if not self._include_pattern(pattern, anchor=False):
- logger.warning('no files found matching %r '
- 'anywhere in distribution', pattern)
-
- elif action == 'global-exclude':
- for pattern in patterns:
- found = self._exclude_pattern(pattern, anchor=False)
- #if not found:
- # logger.warning('no previously-included files '
- # 'matching %r found anywhere in '
- # 'distribution', pattern)
-
- elif action == 'recursive-include':
- for pattern in patterns:
- if not self._include_pattern(pattern, prefix=thedir):
- logger.warning('no files found matching %r '
- 'under directory %r', pattern, thedir)
-
- elif action == 'recursive-exclude':
- for pattern in patterns:
- found = self._exclude_pattern(pattern, prefix=thedir)
- #if not found:
- # logger.warning('no previously-included files '
- # 'matching %r found under directory %r',
- # pattern, thedir)
-
- elif action == 'graft':
- if not self._include_pattern(None, prefix=dirpattern):
- logger.warning('no directories found matching %r',
- dirpattern)
-
- elif action == 'prune':
- if not self._exclude_pattern(None, prefix=dirpattern):
- logger.warning('no previously-included directories found '
- 'matching %r', dirpattern)
- else: # pragma: no cover
- # This should never happen, as it should be caught in
- # _parse_template_line
- raise DistlibException(
- 'invalid action %r' % action)
-
- #
- # Private API
- #
-
- def _parse_directive(self, directive):
- """
- Validate a directive.
- :param directive: The directive to validate.
- :return: A tuple of action, patterns, thedir, dir_patterns
- """
- words = directive.split()
- if len(words) == 1 and words[0] not in ('include', 'exclude',
- 'global-include',
- 'global-exclude',
- 'recursive-include',
- 'recursive-exclude',
- 'graft', 'prune'):
- # no action given, let's use the default 'include'
- words.insert(0, 'include')
-
- action = words[0]
- patterns = thedir = dir_pattern = None
-
- if action in ('include', 'exclude',
- 'global-include', 'global-exclude'):
- if len(words) < 2:
- raise DistlibException(
- '%r expects ...' % action)
-
- patterns = [convert_path(word) for word in words[1:]]
-
- elif action in ('recursive-include', 'recursive-exclude'):
- if len(words) < 3:
- raise DistlibException(
- '%r expects ...' % action)
-
- thedir = convert_path(words[1])
- patterns = [convert_path(word) for word in words[2:]]
-
- elif action in ('graft', 'prune'):
- if len(words) != 2:
- raise DistlibException(
- '%r expects a single ' % action)
-
- dir_pattern = convert_path(words[1])
-
- else:
- raise DistlibException('unknown action %r' % action)
-
- return action, patterns, thedir, dir_pattern
-
- def _include_pattern(self, pattern, anchor=True, prefix=None,
- is_regex=False):
- """Select strings (presumably filenames) from 'self.files' that
- match 'pattern', a Unix-style wildcard (glob) pattern.
-
- Patterns are not quite the same as implemented by the 'fnmatch'
- module: '*' and '?' match non-special characters, where "special"
- is platform-dependent: slash on Unix; colon, slash, and backslash on
- DOS/Windows; and colon on Mac OS.
-
- If 'anchor' is true (the default), then the pattern match is more
- stringent: "*.py" will match "foo.py" but not "foo/bar.py". If
- 'anchor' is false, both of these will match.
-
- If 'prefix' is supplied, then only filenames starting with 'prefix'
- (itself a pattern) and ending with 'pattern', with anything in between
- them, will match. 'anchor' is ignored in this case.
-
- If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
- 'pattern' is assumed to be either a string containing a regex or a
- regex object -- no translation is done, the regex is just compiled
- and used as-is.
-
- Selected strings will be added to self.files.
-
- Return True if files are found.
- """
- # XXX docstring lying about what the special chars are?
- found = False
- pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
-
- # delayed loading of allfiles list
- if self.allfiles is None:
- self.findall()
-
- for name in self.allfiles:
- if pattern_re.search(name):
- self.files.add(name)
- found = True
- return found
-
- def _exclude_pattern(self, pattern, anchor=True, prefix=None,
- is_regex=False):
- """Remove strings (presumably filenames) from 'files' that match
- 'pattern'.
-
- Other parameters are the same as for 'include_pattern()', above.
- The list 'self.files' is modified in place. Return True if files are
- found.
-
- This API is public to allow e.g. exclusion of SCM subdirs, e.g. when
- packaging source distributions
- """
- found = False
- pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
- for f in list(self.files):
- if pattern_re.search(f):
- self.files.remove(f)
- found = True
- return found
-
- def _translate_pattern(self, pattern, anchor=True, prefix=None,
- is_regex=False):
- """Translate a shell-like wildcard pattern to a compiled regular
- expression.
-
- Return the compiled regex. If 'is_regex' true,
- then 'pattern' is directly compiled to a regex (if it's a string)
- or just returned as-is (assumes it's a regex object).
- """
- if is_regex:
- if isinstance(pattern, str):
- return re.compile(pattern)
- else:
- return pattern
-
- if _PYTHON_VERSION > (3, 2):
- # ditch start and end characters
- start, _, end = self._glob_to_re('_').partition('_')
-
- if pattern:
- pattern_re = self._glob_to_re(pattern)
- if _PYTHON_VERSION > (3, 2):
- assert pattern_re.startswith(start) and pattern_re.endswith(end)
- else:
- pattern_re = ''
-
- base = re.escape(os.path.join(self.base, ''))
- if prefix is not None:
- # ditch end of pattern character
- if _PYTHON_VERSION <= (3, 2):
- empty_pattern = self._glob_to_re('')
- prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)]
- else:
- prefix_re = self._glob_to_re(prefix)
- assert prefix_re.startswith(start) and prefix_re.endswith(end)
- prefix_re = prefix_re[len(start): len(prefix_re) - len(end)]
- sep = os.sep
- if os.sep == '\\':
- sep = r'\\'
- if _PYTHON_VERSION <= (3, 2):
- pattern_re = '^' + base + sep.join((prefix_re,
- '.*' + pattern_re))
- else:
- pattern_re = pattern_re[len(start): len(pattern_re) - len(end)]
- pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep,
- pattern_re, end)
- else: # no prefix -- respect anchor flag
- if anchor:
- if _PYTHON_VERSION <= (3, 2):
- pattern_re = '^' + base + pattern_re
- else:
- pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):])
-
- return re.compile(pattern_re)
-
- def _glob_to_re(self, pattern):
- """Translate a shell-like glob pattern to a regular expression.
-
- Return a string containing the regex. Differs from
- 'fnmatch.translate()' in that '*' does not match "special characters"
- (which are platform-specific).
- """
- pattern_re = fnmatch.translate(pattern)
-
- # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which
- # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix,
- # and by extension they shouldn't match such "special characters" under
- # any OS. So change all non-escaped dots in the RE to match any
- # character except the special characters (currently: just os.sep).
- sep = os.sep
- if os.sep == '\\':
- # we're using a regex to manipulate a regex, so we need
- # to escape the backslash twice
- sep = r'\\\\'
- escaped = r'\1[^%s]' % sep
- pattern_re = re.sub(r'((? y,
- '!=': lambda x, y: x != y,
- '<': lambda x, y: x < y,
- '<=': lambda x, y: x == y or x < y,
- '>': lambda x, y: x > y,
- '>=': lambda x, y: x == y or x > y,
- 'and': lambda x, y: x and y,
- 'or': lambda x, y: x or y,
- 'in': lambda x, y: x in y,
- 'not in': lambda x, y: x not in y,
- }
-
- def evaluate(self, expr, context):
- """
- Evaluate a marker expression returned by the :func:`parse_requirement`
- function in the specified context.
- """
- if isinstance(expr, string_types):
- if expr[0] in '\'"':
- result = expr[1:-1]
- else:
- if expr not in context:
- raise SyntaxError('unknown variable: %s' % expr)
- result = context[expr]
- else:
- assert isinstance(expr, dict)
- op = expr['op']
- if op not in self.operations:
- raise NotImplementedError('op not implemented: %s' % op)
- elhs = expr['lhs']
- erhs = expr['rhs']
- if _is_literal(expr['lhs']) and _is_literal(expr['rhs']):
- raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs))
-
- lhs = self.evaluate(elhs, context)
- rhs = self.evaluate(erhs, context)
- result = self.operations[op](lhs, rhs)
- return result
-
-def default_context():
- def format_full_version(info):
- version = '%s.%s.%s' % (info.major, info.minor, info.micro)
- kind = info.releaselevel
- if kind != 'final':
- version += kind[0] + str(info.serial)
- return version
-
- if hasattr(sys, 'implementation'):
- implementation_version = format_full_version(sys.implementation.version)
- implementation_name = sys.implementation.name
- else:
- implementation_version = '0'
- implementation_name = ''
-
- result = {
- 'implementation_name': implementation_name,
- 'implementation_version': implementation_version,
- 'os_name': os.name,
- 'platform_machine': platform.machine(),
- 'platform_python_implementation': platform.python_implementation(),
- 'platform_release': platform.release(),
- 'platform_system': platform.system(),
- 'platform_version': platform.version(),
- 'platform_in_venv': str(in_venv()),
- 'python_full_version': platform.python_version(),
- 'python_version': platform.python_version()[:3],
- 'sys_platform': sys.platform,
- }
- return result
-
-DEFAULT_CONTEXT = default_context()
-del default_context
-
-evaluator = Evaluator()
-
-def interpret(marker, execution_context=None):
- """
- Interpret a marker and return a result depending on environment.
-
- :param marker: The marker to interpret.
- :type marker: str
- :param execution_context: The context used for name lookup.
- :type execution_context: mapping
- """
- try:
- expr, rest = parse_marker(marker)
- except Exception as e:
- raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e))
- if rest and rest[0] != '#':
- raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest))
- context = dict(DEFAULT_CONTEXT)
- if execution_context:
- context.update(execution_context)
- return evaluator.evaluate(expr, context)
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py b/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py
deleted file mode 100644
index 6d5e236..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py
+++ /dev/null
@@ -1,1056 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""Implementation of the Metadata for Python packages PEPs.
-
-Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and withdrawn 2.0).
-"""
-from __future__ import unicode_literals
-
-import codecs
-from email import message_from_file
-import json
-import logging
-import re
-
-
-from . import DistlibException, __version__
-from .compat import StringIO, string_types, text_type
-from .markers import interpret
-from .util import extract_by_key, get_extras
-from .version import get_scheme, PEP440_VERSION_RE
-
-logger = logging.getLogger(__name__)
-
-
-class MetadataMissingError(DistlibException):
- """A required metadata is missing"""
-
-
-class MetadataConflictError(DistlibException):
- """Attempt to read or write metadata fields that are conflictual."""
-
-
-class MetadataUnrecognizedVersionError(DistlibException):
- """Unknown metadata version number."""
-
-
-class MetadataInvalidError(DistlibException):
- """A metadata value is invalid"""
-
-# public API of this module
-__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION']
-
-# Encoding used for the PKG-INFO files
-PKG_INFO_ENCODING = 'utf-8'
-
-# preferred version. Hopefully will be changed
-# to 1.2 once PEP 345 is supported everywhere
-PKG_INFO_PREFERRED_VERSION = '1.1'
-
-_LINE_PREFIX_1_2 = re.compile('\n \\|')
-_LINE_PREFIX_PRE_1_2 = re.compile('\n ')
-_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
- 'Summary', 'Description',
- 'Keywords', 'Home-page', 'Author', 'Author-email',
- 'License')
-
-_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
- 'Supported-Platform', 'Summary', 'Description',
- 'Keywords', 'Home-page', 'Author', 'Author-email',
- 'License', 'Classifier', 'Download-URL', 'Obsoletes',
- 'Provides', 'Requires')
-
-_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier',
- 'Download-URL')
-
-_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
- 'Supported-Platform', 'Summary', 'Description',
- 'Keywords', 'Home-page', 'Author', 'Author-email',
- 'Maintainer', 'Maintainer-email', 'License',
- 'Classifier', 'Download-URL', 'Obsoletes-Dist',
- 'Project-URL', 'Provides-Dist', 'Requires-Dist',
- 'Requires-Python', 'Requires-External')
-
-_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python',
- 'Obsoletes-Dist', 'Requires-External', 'Maintainer',
- 'Maintainer-email', 'Project-URL')
-
-_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
- 'Supported-Platform', 'Summary', 'Description',
- 'Keywords', 'Home-page', 'Author', 'Author-email',
- 'Maintainer', 'Maintainer-email', 'License',
- 'Classifier', 'Download-URL', 'Obsoletes-Dist',
- 'Project-URL', 'Provides-Dist', 'Requires-Dist',
- 'Requires-Python', 'Requires-External', 'Private-Version',
- 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension',
- 'Provides-Extra')
-
-_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By',
- 'Setup-Requires-Dist', 'Extension')
-
-# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in
-# the metadata. Include them in the tuple literal below to allow them
-# (for now).
-_566_FIELDS = _426_FIELDS + ('Description-Content-Type',
- 'Requires', 'Provides')
-
-_566_MARKERS = ('Description-Content-Type',)
-
-_ALL_FIELDS = set()
-_ALL_FIELDS.update(_241_FIELDS)
-_ALL_FIELDS.update(_314_FIELDS)
-_ALL_FIELDS.update(_345_FIELDS)
-_ALL_FIELDS.update(_426_FIELDS)
-_ALL_FIELDS.update(_566_FIELDS)
-
-EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''')
-
-
-def _version2fieldlist(version):
- if version == '1.0':
- return _241_FIELDS
- elif version == '1.1':
- return _314_FIELDS
- elif version == '1.2':
- return _345_FIELDS
- elif version in ('1.3', '2.1'):
- return _345_FIELDS + _566_FIELDS
- elif version == '2.0':
- return _426_FIELDS
- raise MetadataUnrecognizedVersionError(version)
-
-
-def _best_version(fields):
- """Detect the best version depending on the fields used."""
- def _has_marker(keys, markers):
- for marker in markers:
- if marker in keys:
- return True
- return False
-
- keys = []
- for key, value in fields.items():
- if value in ([], 'UNKNOWN', None):
- continue
- keys.append(key)
-
- possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1']
-
- # first let's try to see if a field is not part of one of the version
- for key in keys:
- if key not in _241_FIELDS and '1.0' in possible_versions:
- possible_versions.remove('1.0')
- logger.debug('Removed 1.0 due to %s', key)
- if key not in _314_FIELDS and '1.1' in possible_versions:
- possible_versions.remove('1.1')
- logger.debug('Removed 1.1 due to %s', key)
- if key not in _345_FIELDS and '1.2' in possible_versions:
- possible_versions.remove('1.2')
- logger.debug('Removed 1.2 due to %s', key)
- if key not in _566_FIELDS and '1.3' in possible_versions:
- possible_versions.remove('1.3')
- logger.debug('Removed 1.3 due to %s', key)
- if key not in _566_FIELDS and '2.1' in possible_versions:
- if key != 'Description': # In 2.1, description allowed after headers
- possible_versions.remove('2.1')
- logger.debug('Removed 2.1 due to %s', key)
- if key not in _426_FIELDS and '2.0' in possible_versions:
- possible_versions.remove('2.0')
- logger.debug('Removed 2.0 due to %s', key)
-
- # possible_version contains qualified versions
- if len(possible_versions) == 1:
- return possible_versions[0] # found !
- elif len(possible_versions) == 0:
- logger.debug('Out of options - unknown metadata set: %s', fields)
- raise MetadataConflictError('Unknown metadata set')
-
- # let's see if one unique marker is found
- is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS)
- is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS)
- is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS)
- is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS)
- if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1:
- raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields')
-
- # we have the choice, 1.0, or 1.2, or 2.0
- # - 1.0 has a broken Summary field but works with all tools
- # - 1.1 is to avoid
- # - 1.2 fixes Summary but has little adoption
- # - 2.0 adds more features and is very new
- if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0:
- # we couldn't find any specific marker
- if PKG_INFO_PREFERRED_VERSION in possible_versions:
- return PKG_INFO_PREFERRED_VERSION
- if is_1_1:
- return '1.1'
- if is_1_2:
- return '1.2'
- if is_2_1:
- return '2.1'
-
- return '2.0'
-
-# This follows the rules about transforming keys as described in
-# https://www.python.org/dev/peps/pep-0566/#id17
-_ATTR2FIELD = {
- name.lower().replace("-", "_"): name for name in _ALL_FIELDS
-}
-_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()}
-
-_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist')
-_VERSIONS_FIELDS = ('Requires-Python',)
-_VERSION_FIELDS = ('Version',)
-_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes',
- 'Requires', 'Provides', 'Obsoletes-Dist',
- 'Provides-Dist', 'Requires-Dist', 'Requires-External',
- 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist',
- 'Provides-Extra', 'Extension')
-_LISTTUPLEFIELDS = ('Project-URL',)
-
-_ELEMENTSFIELD = ('Keywords',)
-
-_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description')
-
-_MISSING = object()
-
-_FILESAFE = re.compile('[^A-Za-z0-9.]+')
-
-
-def _get_name_and_version(name, version, for_filename=False):
- """Return the distribution name with version.
-
- If for_filename is true, return a filename-escaped form."""
- if for_filename:
- # For both name and version any runs of non-alphanumeric or '.'
- # characters are replaced with a single '-'. Additionally any
- # spaces in the version string become '.'
- name = _FILESAFE.sub('-', name)
- version = _FILESAFE.sub('-', version.replace(' ', '.'))
- return '%s-%s' % (name, version)
-
-
-class LegacyMetadata(object):
- """The legacy metadata of a release.
-
- Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can
- instantiate the class with one of these arguments (or none):
- - *path*, the path to a metadata file
- - *fileobj* give a file-like object with metadata as content
- - *mapping* is a dict-like object
- - *scheme* is a version scheme name
- """
- # TODO document the mapping API and UNKNOWN default key
-
- def __init__(self, path=None, fileobj=None, mapping=None,
- scheme='default'):
- if [path, fileobj, mapping].count(None) < 2:
- raise TypeError('path, fileobj and mapping are exclusive')
- self._fields = {}
- self.requires_files = []
- self._dependencies = None
- self.scheme = scheme
- if path is not None:
- self.read(path)
- elif fileobj is not None:
- self.read_file(fileobj)
- elif mapping is not None:
- self.update(mapping)
- self.set_metadata_version()
-
- def set_metadata_version(self):
- self._fields['Metadata-Version'] = _best_version(self._fields)
-
- def _write_field(self, fileobj, name, value):
- fileobj.write('%s: %s\n' % (name, value))
-
- def __getitem__(self, name):
- return self.get(name)
-
- def __setitem__(self, name, value):
- return self.set(name, value)
-
- def __delitem__(self, name):
- field_name = self._convert_name(name)
- try:
- del self._fields[field_name]
- except KeyError:
- raise KeyError(name)
-
- def __contains__(self, name):
- return (name in self._fields or
- self._convert_name(name) in self._fields)
-
- def _convert_name(self, name):
- if name in _ALL_FIELDS:
- return name
- name = name.replace('-', '_').lower()
- return _ATTR2FIELD.get(name, name)
-
- def _default_value(self, name):
- if name in _LISTFIELDS or name in _ELEMENTSFIELD:
- return []
- return 'UNKNOWN'
-
- def _remove_line_prefix(self, value):
- if self.metadata_version in ('1.0', '1.1'):
- return _LINE_PREFIX_PRE_1_2.sub('\n', value)
- else:
- return _LINE_PREFIX_1_2.sub('\n', value)
-
- def __getattr__(self, name):
- if name in _ATTR2FIELD:
- return self[name]
- raise AttributeError(name)
-
- #
- # Public API
- #
-
-# dependencies = property(_get_dependencies, _set_dependencies)
-
- def get_fullname(self, filesafe=False):
- """Return the distribution name with version.
-
- If filesafe is true, return a filename-escaped form."""
- return _get_name_and_version(self['Name'], self['Version'], filesafe)
-
- def is_field(self, name):
- """return True if name is a valid metadata key"""
- name = self._convert_name(name)
- return name in _ALL_FIELDS
-
- def is_multi_field(self, name):
- name = self._convert_name(name)
- return name in _LISTFIELDS
-
- def read(self, filepath):
- """Read the metadata values from a file path."""
- fp = codecs.open(filepath, 'r', encoding='utf-8')
- try:
- self.read_file(fp)
- finally:
- fp.close()
-
- def read_file(self, fileob):
- """Read the metadata values from a file object."""
- msg = message_from_file(fileob)
- self._fields['Metadata-Version'] = msg['metadata-version']
-
- # When reading, get all the fields we can
- for field in _ALL_FIELDS:
- if field not in msg:
- continue
- if field in _LISTFIELDS:
- # we can have multiple lines
- values = msg.get_all(field)
- if field in _LISTTUPLEFIELDS and values is not None:
- values = [tuple(value.split(',')) for value in values]
- self.set(field, values)
- else:
- # single line
- value = msg[field]
- if value is not None and value != 'UNKNOWN':
- self.set(field, value)
-
- # PEP 566 specifies that the body be used for the description, if
- # available
- body = msg.get_payload()
- self["Description"] = body if body else self["Description"]
- # logger.debug('Attempting to set metadata for %s', self)
- # self.set_metadata_version()
-
- def write(self, filepath, skip_unknown=False):
- """Write the metadata fields to filepath."""
- fp = codecs.open(filepath, 'w', encoding='utf-8')
- try:
- self.write_file(fp, skip_unknown)
- finally:
- fp.close()
-
- def write_file(self, fileobject, skip_unknown=False):
- """Write the PKG-INFO format data to a file object."""
- self.set_metadata_version()
-
- for field in _version2fieldlist(self['Metadata-Version']):
- values = self.get(field)
- if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']):
- continue
- if field in _ELEMENTSFIELD:
- self._write_field(fileobject, field, ','.join(values))
- continue
- if field not in _LISTFIELDS:
- if field == 'Description':
- if self.metadata_version in ('1.0', '1.1'):
- values = values.replace('\n', '\n ')
- else:
- values = values.replace('\n', '\n |')
- values = [values]
-
- if field in _LISTTUPLEFIELDS:
- values = [','.join(value) for value in values]
-
- for value in values:
- self._write_field(fileobject, field, value)
-
- def update(self, other=None, **kwargs):
- """Set metadata values from the given iterable `other` and kwargs.
-
- Behavior is like `dict.update`: If `other` has a ``keys`` method,
- they are looped over and ``self[key]`` is assigned ``other[key]``.
- Else, ``other`` is an iterable of ``(key, value)`` iterables.
-
- Keys that don't match a metadata field or that have an empty value are
- dropped.
- """
- def _set(key, value):
- if key in _ATTR2FIELD and value:
- self.set(self._convert_name(key), value)
-
- if not other:
- # other is None or empty container
- pass
- elif hasattr(other, 'keys'):
- for k in other.keys():
- _set(k, other[k])
- else:
- for k, v in other:
- _set(k, v)
-
- if kwargs:
- for k, v in kwargs.items():
- _set(k, v)
-
- def set(self, name, value):
- """Control then set a metadata field."""
- name = self._convert_name(name)
-
- if ((name in _ELEMENTSFIELD or name == 'Platform') and
- not isinstance(value, (list, tuple))):
- if isinstance(value, string_types):
- value = [v.strip() for v in value.split(',')]
- else:
- value = []
- elif (name in _LISTFIELDS and
- not isinstance(value, (list, tuple))):
- if isinstance(value, string_types):
- value = [value]
- else:
- value = []
-
- if logger.isEnabledFor(logging.WARNING):
- project_name = self['Name']
-
- scheme = get_scheme(self.scheme)
- if name in _PREDICATE_FIELDS and value is not None:
- for v in value:
- # check that the values are valid
- if not scheme.is_valid_matcher(v.split(';')[0]):
- logger.warning(
- "'%s': '%s' is not valid (field '%s')",
- project_name, v, name)
- # FIXME this rejects UNKNOWN, is that right?
- elif name in _VERSIONS_FIELDS and value is not None:
- if not scheme.is_valid_constraint_list(value):
- logger.warning("'%s': '%s' is not a valid version (field '%s')",
- project_name, value, name)
- elif name in _VERSION_FIELDS and value is not None:
- if not scheme.is_valid_version(value):
- logger.warning("'%s': '%s' is not a valid version (field '%s')",
- project_name, value, name)
-
- if name in _UNICODEFIELDS:
- if name == 'Description':
- value = self._remove_line_prefix(value)
-
- self._fields[name] = value
-
- def get(self, name, default=_MISSING):
- """Get a metadata field."""
- name = self._convert_name(name)
- if name not in self._fields:
- if default is _MISSING:
- default = self._default_value(name)
- return default
- if name in _UNICODEFIELDS:
- value = self._fields[name]
- return value
- elif name in _LISTFIELDS:
- value = self._fields[name]
- if value is None:
- return []
- res = []
- for val in value:
- if name not in _LISTTUPLEFIELDS:
- res.append(val)
- else:
- # That's for Project-URL
- res.append((val[0], val[1]))
- return res
-
- elif name in _ELEMENTSFIELD:
- value = self._fields[name]
- if isinstance(value, string_types):
- return value.split(',')
- return self._fields[name]
-
- def check(self, strict=False):
- """Check if the metadata is compliant. If strict is True then raise if
- no Name or Version are provided"""
- self.set_metadata_version()
-
- # XXX should check the versions (if the file was loaded)
- missing, warnings = [], []
-
- for attr in ('Name', 'Version'): # required by PEP 345
- if attr not in self:
- missing.append(attr)
-
- if strict and missing != []:
- msg = 'missing required metadata: %s' % ', '.join(missing)
- raise MetadataMissingError(msg)
-
- for attr in ('Home-page', 'Author'):
- if attr not in self:
- missing.append(attr)
-
- # checking metadata 1.2 (XXX needs to check 1.1, 1.0)
- if self['Metadata-Version'] != '1.2':
- return missing, warnings
-
- scheme = get_scheme(self.scheme)
-
- def are_valid_constraints(value):
- for v in value:
- if not scheme.is_valid_matcher(v.split(';')[0]):
- return False
- return True
-
- for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints),
- (_VERSIONS_FIELDS,
- scheme.is_valid_constraint_list),
- (_VERSION_FIELDS,
- scheme.is_valid_version)):
- for field in fields:
- value = self.get(field, None)
- if value is not None and not controller(value):
- warnings.append("Wrong value for '%s': %s" % (field, value))
-
- return missing, warnings
-
- def todict(self, skip_missing=False):
- """Return fields as a dict.
-
- Field names will be converted to use the underscore-lowercase style
- instead of hyphen-mixed case (i.e. home_page instead of Home-page).
- This is as per https://www.python.org/dev/peps/pep-0566/#id17.
- """
- self.set_metadata_version()
-
- fields = _version2fieldlist(self['Metadata-Version'])
-
- data = {}
-
- for field_name in fields:
- if not skip_missing or field_name in self._fields:
- key = _FIELD2ATTR[field_name]
- if key != 'project_url':
- data[key] = self[field_name]
- else:
- data[key] = [','.join(u) for u in self[field_name]]
-
- return data
-
- def add_requirements(self, requirements):
- if self['Metadata-Version'] == '1.1':
- # we can't have 1.1 metadata *and* Setuptools requires
- for field in ('Obsoletes', 'Requires', 'Provides'):
- if field in self:
- del self[field]
- self['Requires-Dist'] += requirements
-
- # Mapping API
- # TODO could add iter* variants
-
- def keys(self):
- return list(_version2fieldlist(self['Metadata-Version']))
-
- def __iter__(self):
- for key in self.keys():
- yield key
-
- def values(self):
- return [self[key] for key in self.keys()]
-
- def items(self):
- return [(key, self[key]) for key in self.keys()]
-
- def __repr__(self):
- return '<%s %s %s>' % (self.__class__.__name__, self.name,
- self.version)
-
-
-METADATA_FILENAME = 'pydist.json'
-WHEEL_METADATA_FILENAME = 'metadata.json'
-LEGACY_METADATA_FILENAME = 'METADATA'
-
-
-class Metadata(object):
- """
- The metadata of a release. This implementation uses 2.0 (JSON)
- metadata where possible. If not possible, it wraps a LegacyMetadata
- instance which handles the key-value metadata format.
- """
-
- METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$')
-
- NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I)
-
- VERSION_MATCHER = PEP440_VERSION_RE
-
- SUMMARY_MATCHER = re.compile('.{1,2047}')
-
- METADATA_VERSION = '2.0'
-
- GENERATOR = 'distlib (%s)' % __version__
-
- MANDATORY_KEYS = {
- 'name': (),
- 'version': (),
- 'summary': ('legacy',),
- }
-
- INDEX_KEYS = ('name version license summary description author '
- 'author_email keywords platform home_page classifiers '
- 'download_url')
-
- DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires '
- 'dev_requires provides meta_requires obsoleted_by '
- 'supports_environments')
-
- SYNTAX_VALIDATORS = {
- 'metadata_version': (METADATA_VERSION_MATCHER, ()),
- 'name': (NAME_MATCHER, ('legacy',)),
- 'version': (VERSION_MATCHER, ('legacy',)),
- 'summary': (SUMMARY_MATCHER, ('legacy',)),
- }
-
- __slots__ = ('_legacy', '_data', 'scheme')
-
- def __init__(self, path=None, fileobj=None, mapping=None,
- scheme='default'):
- if [path, fileobj, mapping].count(None) < 2:
- raise TypeError('path, fileobj and mapping are exclusive')
- self._legacy = None
- self._data = None
- self.scheme = scheme
- #import pdb; pdb.set_trace()
- if mapping is not None:
- try:
- self._validate_mapping(mapping, scheme)
- self._data = mapping
- except MetadataUnrecognizedVersionError:
- self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme)
- self.validate()
- else:
- data = None
- if path:
- with open(path, 'rb') as f:
- data = f.read()
- elif fileobj:
- data = fileobj.read()
- if data is None:
- # Initialised with no args - to be added
- self._data = {
- 'metadata_version': self.METADATA_VERSION,
- 'generator': self.GENERATOR,
- }
- else:
- if not isinstance(data, text_type):
- data = data.decode('utf-8')
- try:
- self._data = json.loads(data)
- self._validate_mapping(self._data, scheme)
- except ValueError:
- # Note: MetadataUnrecognizedVersionError does not
- # inherit from ValueError (it's a DistlibException,
- # which should not inherit from ValueError).
- # The ValueError comes from the json.load - if that
- # succeeds and we get a validation error, we want
- # that to propagate
- self._legacy = LegacyMetadata(fileobj=StringIO(data),
- scheme=scheme)
- self.validate()
-
- common_keys = set(('name', 'version', 'license', 'keywords', 'summary'))
-
- none_list = (None, list)
- none_dict = (None, dict)
-
- mapped_keys = {
- 'run_requires': ('Requires-Dist', list),
- 'build_requires': ('Setup-Requires-Dist', list),
- 'dev_requires': none_list,
- 'test_requires': none_list,
- 'meta_requires': none_list,
- 'extras': ('Provides-Extra', list),
- 'modules': none_list,
- 'namespaces': none_list,
- 'exports': none_dict,
- 'commands': none_dict,
- 'classifiers': ('Classifier', list),
- 'source_url': ('Download-URL', None),
- 'metadata_version': ('Metadata-Version', None),
- }
-
- del none_list, none_dict
-
- def __getattribute__(self, key):
- common = object.__getattribute__(self, 'common_keys')
- mapped = object.__getattribute__(self, 'mapped_keys')
- if key in mapped:
- lk, maker = mapped[key]
- if self._legacy:
- if lk is None:
- result = None if maker is None else maker()
- else:
- result = self._legacy.get(lk)
- else:
- value = None if maker is None else maker()
- if key not in ('commands', 'exports', 'modules', 'namespaces',
- 'classifiers'):
- result = self._data.get(key, value)
- else:
- # special cases for PEP 459
- sentinel = object()
- result = sentinel
- d = self._data.get('extensions')
- if d:
- if key == 'commands':
- result = d.get('python.commands', value)
- elif key == 'classifiers':
- d = d.get('python.details')
- if d:
- result = d.get(key, value)
- else:
- d = d.get('python.exports')
- if not d:
- d = self._data.get('python.exports')
- if d:
- result = d.get(key, value)
- if result is sentinel:
- result = value
- elif key not in common:
- result = object.__getattribute__(self, key)
- elif self._legacy:
- result = self._legacy.get(key)
- else:
- result = self._data.get(key)
- return result
-
- def _validate_value(self, key, value, scheme=None):
- if key in self.SYNTAX_VALIDATORS:
- pattern, exclusions = self.SYNTAX_VALIDATORS[key]
- if (scheme or self.scheme) not in exclusions:
- m = pattern.match(value)
- if not m:
- raise MetadataInvalidError("'%s' is an invalid value for "
- "the '%s' property" % (value,
- key))
-
- def __setattr__(self, key, value):
- self._validate_value(key, value)
- common = object.__getattribute__(self, 'common_keys')
- mapped = object.__getattribute__(self, 'mapped_keys')
- if key in mapped:
- lk, _ = mapped[key]
- if self._legacy:
- if lk is None:
- raise NotImplementedError
- self._legacy[lk] = value
- elif key not in ('commands', 'exports', 'modules', 'namespaces',
- 'classifiers'):
- self._data[key] = value
- else:
- # special cases for PEP 459
- d = self._data.setdefault('extensions', {})
- if key == 'commands':
- d['python.commands'] = value
- elif key == 'classifiers':
- d = d.setdefault('python.details', {})
- d[key] = value
- else:
- d = d.setdefault('python.exports', {})
- d[key] = value
- elif key not in common:
- object.__setattr__(self, key, value)
- else:
- if key == 'keywords':
- if isinstance(value, string_types):
- value = value.strip()
- if value:
- value = value.split()
- else:
- value = []
- if self._legacy:
- self._legacy[key] = value
- else:
- self._data[key] = value
-
- @property
- def name_and_version(self):
- return _get_name_and_version(self.name, self.version, True)
-
- @property
- def provides(self):
- if self._legacy:
- result = self._legacy['Provides-Dist']
- else:
- result = self._data.setdefault('provides', [])
- s = '%s (%s)' % (self.name, self.version)
- if s not in result:
- result.append(s)
- return result
-
- @provides.setter
- def provides(self, value):
- if self._legacy:
- self._legacy['Provides-Dist'] = value
- else:
- self._data['provides'] = value
-
- def get_requirements(self, reqts, extras=None, env=None):
- """
- Base method to get dependencies, given a set of extras
- to satisfy and an optional environment context.
- :param reqts: A list of sometimes-wanted dependencies,
- perhaps dependent on extras and environment.
- :param extras: A list of optional components being requested.
- :param env: An optional environment for marker evaluation.
- """
- if self._legacy:
- result = reqts
- else:
- result = []
- extras = get_extras(extras or [], self.extras)
- for d in reqts:
- if 'extra' not in d and 'environment' not in d:
- # unconditional
- include = True
- else:
- if 'extra' not in d:
- # Not extra-dependent - only environment-dependent
- include = True
- else:
- include = d.get('extra') in extras
- if include:
- # Not excluded because of extras, check environment
- marker = d.get('environment')
- if marker:
- include = interpret(marker, env)
- if include:
- result.extend(d['requires'])
- for key in ('build', 'dev', 'test'):
- e = ':%s:' % key
- if e in extras:
- extras.remove(e)
- # A recursive call, but it should terminate since 'test'
- # has been removed from the extras
- reqts = self._data.get('%s_requires' % key, [])
- result.extend(self.get_requirements(reqts, extras=extras,
- env=env))
- return result
-
- @property
- def dictionary(self):
- if self._legacy:
- return self._from_legacy()
- return self._data
-
- @property
- def dependencies(self):
- if self._legacy:
- raise NotImplementedError
- else:
- return extract_by_key(self._data, self.DEPENDENCY_KEYS)
-
- @dependencies.setter
- def dependencies(self, value):
- if self._legacy:
- raise NotImplementedError
- else:
- self._data.update(value)
-
- def _validate_mapping(self, mapping, scheme):
- if mapping.get('metadata_version') != self.METADATA_VERSION:
- raise MetadataUnrecognizedVersionError()
- missing = []
- for key, exclusions in self.MANDATORY_KEYS.items():
- if key not in mapping:
- if scheme not in exclusions:
- missing.append(key)
- if missing:
- msg = 'Missing metadata items: %s' % ', '.join(missing)
- raise MetadataMissingError(msg)
- for k, v in mapping.items():
- self._validate_value(k, v, scheme)
-
- def validate(self):
- if self._legacy:
- missing, warnings = self._legacy.check(True)
- if missing or warnings:
- logger.warning('Metadata: missing: %s, warnings: %s',
- missing, warnings)
- else:
- self._validate_mapping(self._data, self.scheme)
-
- def todict(self):
- if self._legacy:
- return self._legacy.todict(True)
- else:
- result = extract_by_key(self._data, self.INDEX_KEYS)
- return result
-
- def _from_legacy(self):
- assert self._legacy and not self._data
- result = {
- 'metadata_version': self.METADATA_VERSION,
- 'generator': self.GENERATOR,
- }
- lmd = self._legacy.todict(True) # skip missing ones
- for k in ('name', 'version', 'license', 'summary', 'description',
- 'classifier'):
- if k in lmd:
- if k == 'classifier':
- nk = 'classifiers'
- else:
- nk = k
- result[nk] = lmd[k]
- kw = lmd.get('Keywords', [])
- if kw == ['']:
- kw = []
- result['keywords'] = kw
- keys = (('requires_dist', 'run_requires'),
- ('setup_requires_dist', 'build_requires'))
- for ok, nk in keys:
- if ok in lmd and lmd[ok]:
- result[nk] = [{'requires': lmd[ok]}]
- result['provides'] = self.provides
- author = {}
- maintainer = {}
- return result
-
- LEGACY_MAPPING = {
- 'name': 'Name',
- 'version': 'Version',
- ('extensions', 'python.details', 'license'): 'License',
- 'summary': 'Summary',
- 'description': 'Description',
- ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page',
- ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author',
- ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email',
- 'source_url': 'Download-URL',
- ('extensions', 'python.details', 'classifiers'): 'Classifier',
- }
-
- def _to_legacy(self):
- def process_entries(entries):
- reqts = set()
- for e in entries:
- extra = e.get('extra')
- env = e.get('environment')
- rlist = e['requires']
- for r in rlist:
- if not env and not extra:
- reqts.add(r)
- else:
- marker = ''
- if extra:
- marker = 'extra == "%s"' % extra
- if env:
- if marker:
- marker = '(%s) and %s' % (env, marker)
- else:
- marker = env
- reqts.add(';'.join((r, marker)))
- return reqts
-
- assert self._data and not self._legacy
- result = LegacyMetadata()
- nmd = self._data
- # import pdb; pdb.set_trace()
- for nk, ok in self.LEGACY_MAPPING.items():
- if not isinstance(nk, tuple):
- if nk in nmd:
- result[ok] = nmd[nk]
- else:
- d = nmd
- found = True
- for k in nk:
- try:
- d = d[k]
- except (KeyError, IndexError):
- found = False
- break
- if found:
- result[ok] = d
- r1 = process_entries(self.run_requires + self.meta_requires)
- r2 = process_entries(self.build_requires + self.dev_requires)
- if self.extras:
- result['Provides-Extra'] = sorted(self.extras)
- result['Requires-Dist'] = sorted(r1)
- result['Setup-Requires-Dist'] = sorted(r2)
- # TODO: any other fields wanted
- return result
-
- def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True):
- if [path, fileobj].count(None) != 1:
- raise ValueError('Exactly one of path and fileobj is needed')
- self.validate()
- if legacy:
- if self._legacy:
- legacy_md = self._legacy
- else:
- legacy_md = self._to_legacy()
- if path:
- legacy_md.write(path, skip_unknown=skip_unknown)
- else:
- legacy_md.write_file(fileobj, skip_unknown=skip_unknown)
- else:
- if self._legacy:
- d = self._from_legacy()
- else:
- d = self._data
- if fileobj:
- json.dump(d, fileobj, ensure_ascii=True, indent=2,
- sort_keys=True)
- else:
- with codecs.open(path, 'w', 'utf-8') as f:
- json.dump(d, f, ensure_ascii=True, indent=2,
- sort_keys=True)
-
- def add_requirements(self, requirements):
- if self._legacy:
- self._legacy.add_requirements(requirements)
- else:
- run_requires = self._data.setdefault('run_requires', [])
- always = None
- for entry in run_requires:
- if 'environment' not in entry and 'extra' not in entry:
- always = entry
- break
- if always is None:
- always = { 'requires': requirements }
- run_requires.insert(0, always)
- else:
- rset = set(always['requires']) | set(requirements)
- always['requires'] = sorted(rset)
-
- def __repr__(self):
- name = self.name or '(no name)'
- version = self.version or 'no version'
- return '<%s %s %s (%s)>' % (self.__class__.__name__,
- self.metadata_version, name, version)
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/resources.py b/venv/Lib/site-packages/pip/_vendor/distlib/resources.py
deleted file mode 100644
index 1884016..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/resources.py
+++ /dev/null
@@ -1,355 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013-2017 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-from __future__ import unicode_literals
-
-import bisect
-import io
-import logging
-import os
-import pkgutil
-import shutil
-import sys
-import types
-import zipimport
-
-from . import DistlibException
-from .util import cached_property, get_cache_base, path_to_cache_dir, Cache
-
-logger = logging.getLogger(__name__)
-
-
-cache = None # created when needed
-
-
-class ResourceCache(Cache):
- def __init__(self, base=None):
- if base is None:
- # Use native string to avoid issues on 2.x: see Python #20140.
- base = os.path.join(get_cache_base(), str('resource-cache'))
- super(ResourceCache, self).__init__(base)
-
- def is_stale(self, resource, path):
- """
- Is the cache stale for the given resource?
-
- :param resource: The :class:`Resource` being cached.
- :param path: The path of the resource in the cache.
- :return: True if the cache is stale.
- """
- # Cache invalidation is a hard problem :-)
- return True
-
- def get(self, resource):
- """
- Get a resource into the cache,
-
- :param resource: A :class:`Resource` instance.
- :return: The pathname of the resource in the cache.
- """
- prefix, path = resource.finder.get_cache_info(resource)
- if prefix is None:
- result = path
- else:
- result = os.path.join(self.base, self.prefix_to_dir(prefix), path)
- dirname = os.path.dirname(result)
- if not os.path.isdir(dirname):
- os.makedirs(dirname)
- if not os.path.exists(result):
- stale = True
- else:
- stale = self.is_stale(resource, path)
- if stale:
- # write the bytes of the resource to the cache location
- with open(result, 'wb') as f:
- f.write(resource.bytes)
- return result
-
-
-class ResourceBase(object):
- def __init__(self, finder, name):
- self.finder = finder
- self.name = name
-
-
-class Resource(ResourceBase):
- """
- A class representing an in-package resource, such as a data file. This is
- not normally instantiated by user code, but rather by a
- :class:`ResourceFinder` which manages the resource.
- """
- is_container = False # Backwards compatibility
-
- def as_stream(self):
- """
- Get the resource as a stream.
-
- This is not a property to make it obvious that it returns a new stream
- each time.
- """
- return self.finder.get_stream(self)
-
- @cached_property
- def file_path(self):
- global cache
- if cache is None:
- cache = ResourceCache()
- return cache.get(self)
-
- @cached_property
- def bytes(self):
- return self.finder.get_bytes(self)
-
- @cached_property
- def size(self):
- return self.finder.get_size(self)
-
-
-class ResourceContainer(ResourceBase):
- is_container = True # Backwards compatibility
-
- @cached_property
- def resources(self):
- return self.finder.get_resources(self)
-
-
-class ResourceFinder(object):
- """
- Resource finder for file system resources.
- """
-
- if sys.platform.startswith('java'):
- skipped_extensions = ('.pyc', '.pyo', '.class')
- else:
- skipped_extensions = ('.pyc', '.pyo')
-
- def __init__(self, module):
- self.module = module
- self.loader = getattr(module, '__loader__', None)
- self.base = os.path.dirname(getattr(module, '__file__', ''))
-
- def _adjust_path(self, path):
- return os.path.realpath(path)
-
- def _make_path(self, resource_name):
- # Issue #50: need to preserve type of path on Python 2.x
- # like os.path._get_sep
- if isinstance(resource_name, bytes): # should only happen on 2.x
- sep = b'/'
- else:
- sep = '/'
- parts = resource_name.split(sep)
- parts.insert(0, self.base)
- result = os.path.join(*parts)
- return self._adjust_path(result)
-
- def _find(self, path):
- return os.path.exists(path)
-
- def get_cache_info(self, resource):
- return None, resource.path
-
- def find(self, resource_name):
- path = self._make_path(resource_name)
- if not self._find(path):
- result = None
- else:
- if self._is_directory(path):
- result = ResourceContainer(self, resource_name)
- else:
- result = Resource(self, resource_name)
- result.path = path
- return result
-
- def get_stream(self, resource):
- return open(resource.path, 'rb')
-
- def get_bytes(self, resource):
- with open(resource.path, 'rb') as f:
- return f.read()
-
- def get_size(self, resource):
- return os.path.getsize(resource.path)
-
- def get_resources(self, resource):
- def allowed(f):
- return (f != '__pycache__' and not
- f.endswith(self.skipped_extensions))
- return set([f for f in os.listdir(resource.path) if allowed(f)])
-
- def is_container(self, resource):
- return self._is_directory(resource.path)
-
- _is_directory = staticmethod(os.path.isdir)
-
- def iterator(self, resource_name):
- resource = self.find(resource_name)
- if resource is not None:
- todo = [resource]
- while todo:
- resource = todo.pop(0)
- yield resource
- if resource.is_container:
- rname = resource.name
- for name in resource.resources:
- if not rname:
- new_name = name
- else:
- new_name = '/'.join([rname, name])
- child = self.find(new_name)
- if child.is_container:
- todo.append(child)
- else:
- yield child
-
-
-class ZipResourceFinder(ResourceFinder):
- """
- Resource finder for resources in .zip files.
- """
- def __init__(self, module):
- super(ZipResourceFinder, self).__init__(module)
- archive = self.loader.archive
- self.prefix_len = 1 + len(archive)
- # PyPy doesn't have a _files attr on zipimporter, and you can't set one
- if hasattr(self.loader, '_files'):
- self._files = self.loader._files
- else:
- self._files = zipimport._zip_directory_cache[archive]
- self.index = sorted(self._files)
-
- def _adjust_path(self, path):
- return path
-
- def _find(self, path):
- path = path[self.prefix_len:]
- if path in self._files:
- result = True
- else:
- if path and path[-1] != os.sep:
- path = path + os.sep
- i = bisect.bisect(self.index, path)
- try:
- result = self.index[i].startswith(path)
- except IndexError:
- result = False
- if not result:
- logger.debug('_find failed: %r %r', path, self.loader.prefix)
- else:
- logger.debug('_find worked: %r %r', path, self.loader.prefix)
- return result
-
- def get_cache_info(self, resource):
- prefix = self.loader.archive
- path = resource.path[1 + len(prefix):]
- return prefix, path
-
- def get_bytes(self, resource):
- return self.loader.get_data(resource.path)
-
- def get_stream(self, resource):
- return io.BytesIO(self.get_bytes(resource))
-
- def get_size(self, resource):
- path = resource.path[self.prefix_len:]
- return self._files[path][3]
-
- def get_resources(self, resource):
- path = resource.path[self.prefix_len:]
- if path and path[-1] != os.sep:
- path += os.sep
- plen = len(path)
- result = set()
- i = bisect.bisect(self.index, path)
- while i < len(self.index):
- if not self.index[i].startswith(path):
- break
- s = self.index[i][plen:]
- result.add(s.split(os.sep, 1)[0]) # only immediate children
- i += 1
- return result
-
- def _is_directory(self, path):
- path = path[self.prefix_len:]
- if path and path[-1] != os.sep:
- path += os.sep
- i = bisect.bisect(self.index, path)
- try:
- result = self.index[i].startswith(path)
- except IndexError:
- result = False
- return result
-
-_finder_registry = {
- type(None): ResourceFinder,
- zipimport.zipimporter: ZipResourceFinder
-}
-
-try:
- # In Python 3.6, _frozen_importlib -> _frozen_importlib_external
- try:
- import _frozen_importlib_external as _fi
- except ImportError:
- import _frozen_importlib as _fi
- _finder_registry[_fi.SourceFileLoader] = ResourceFinder
- _finder_registry[_fi.FileFinder] = ResourceFinder
- del _fi
-except (ImportError, AttributeError):
- pass
-
-
-def register_finder(loader, finder_maker):
- _finder_registry[type(loader)] = finder_maker
-
-_finder_cache = {}
-
-
-def finder(package):
- """
- Return a resource finder for a package.
- :param package: The name of the package.
- :return: A :class:`ResourceFinder` instance for the package.
- """
- if package in _finder_cache:
- result = _finder_cache[package]
- else:
- if package not in sys.modules:
- __import__(package)
- module = sys.modules[package]
- path = getattr(module, '__path__', None)
- if path is None:
- raise DistlibException('You cannot get a finder for a module, '
- 'only for a package')
- loader = getattr(module, '__loader__', None)
- finder_maker = _finder_registry.get(type(loader))
- if finder_maker is None:
- raise DistlibException('Unable to locate finder for %r' % package)
- result = finder_maker(module)
- _finder_cache[package] = result
- return result
-
-
-_dummy_module = types.ModuleType(str('__dummy__'))
-
-
-def finder_for_path(path):
- """
- Return a resource finder for a path, which should represent a container.
-
- :param path: The path.
- :return: A :class:`ResourceFinder` instance for the path.
- """
- result = None
- # calls any path hooks, gets importer into cache
- pkgutil.get_importer(path)
- loader = sys.path_importer_cache.get(path)
- finder = _finder_registry.get(type(loader))
- if finder:
- module = _dummy_module
- module.__file__ = os.path.join(path, '')
- module.__loader__ = loader
- result = finder(module)
- return result
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py b/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py
deleted file mode 100644
index 03f8f21..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py
+++ /dev/null
@@ -1,419 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013-2015 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-from io import BytesIO
-import logging
-import os
-import re
-import struct
-import sys
-
-from .compat import sysconfig, detect_encoding, ZipFile
-from .resources import finder
-from .util import (FileOperator, get_export_entry, convert_path,
- get_executable, in_venv)
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_MANIFEST = '''
-
-
-
-
-
-
-
-
-
-
-
-
- '''.strip()
-
-# check if Python is called on the first line with this expression
-FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$')
-SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*-
-import re
-import sys
-from %(module)s import %(import_name)s
-if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
- sys.exit(%(func)s())
-'''
-
-
-def enquote_executable(executable):
- if ' ' in executable:
- # make sure we quote only the executable in case of env
- # for example /usr/bin/env "/dir with spaces/bin/jython"
- # instead of "/usr/bin/env /dir with spaces/bin/jython"
- # otherwise whole
- if executable.startswith('/usr/bin/env '):
- env, _executable = executable.split(' ', 1)
- if ' ' in _executable and not _executable.startswith('"'):
- executable = '%s "%s"' % (env, _executable)
- else:
- if not executable.startswith('"'):
- executable = '"%s"' % executable
- return executable
-
-# Keep the old name around (for now), as there is at least one project using it!
-_enquote_executable = enquote_executable
-
-class ScriptMaker(object):
- """
- A class to copy or create scripts from source scripts or callable
- specifications.
- """
- script_template = SCRIPT_TEMPLATE
-
- executable = None # for shebangs
-
- def __init__(self, source_dir, target_dir, add_launchers=True,
- dry_run=False, fileop=None):
- self.source_dir = source_dir
- self.target_dir = target_dir
- self.add_launchers = add_launchers
- self.force = False
- self.clobber = False
- # It only makes sense to set mode bits on POSIX.
- self.set_mode = (os.name == 'posix') or (os.name == 'java' and
- os._name == 'posix')
- self.variants = set(('', 'X.Y'))
- self._fileop = fileop or FileOperator(dry_run)
-
- self._is_nt = os.name == 'nt' or (
- os.name == 'java' and os._name == 'nt')
- self.version_info = sys.version_info
-
- def _get_alternate_executable(self, executable, options):
- if options.get('gui', False) and self._is_nt: # pragma: no cover
- dn, fn = os.path.split(executable)
- fn = fn.replace('python', 'pythonw')
- executable = os.path.join(dn, fn)
- return executable
-
- if sys.platform.startswith('java'): # pragma: no cover
- def _is_shell(self, executable):
- """
- Determine if the specified executable is a script
- (contains a #! line)
- """
- try:
- with open(executable) as fp:
- return fp.read(2) == '#!'
- except (OSError, IOError):
- logger.warning('Failed to open %s', executable)
- return False
-
- def _fix_jython_executable(self, executable):
- if self._is_shell(executable):
- # Workaround for Jython is not needed on Linux systems.
- import java
-
- if java.lang.System.getProperty('os.name') == 'Linux':
- return executable
- elif executable.lower().endswith('jython.exe'):
- # Use wrapper exe for Jython on Windows
- return executable
- return '/usr/bin/env %s' % executable
-
- def _build_shebang(self, executable, post_interp):
- """
- Build a shebang line. In the simple case (on Windows, or a shebang line
- which is not too long or contains spaces) use a simple formulation for
- the shebang. Otherwise, use /bin/sh as the executable, with a contrived
- shebang which allows the script to run either under Python or sh, using
- suitable quoting. Thanks to Harald Nordgren for his input.
-
- See also: http://www.in-ulm.de/~mascheck/various/shebang/#length
- https://hg.mozilla.org/mozilla-central/file/tip/mach
- """
- if os.name != 'posix':
- simple_shebang = True
- else:
- # Add 3 for '#!' prefix and newline suffix.
- shebang_length = len(executable) + len(post_interp) + 3
- if sys.platform == 'darwin':
- max_shebang_length = 512
- else:
- max_shebang_length = 127
- simple_shebang = ((b' ' not in executable) and
- (shebang_length <= max_shebang_length))
-
- if simple_shebang:
- result = b'#!' + executable + post_interp + b'\n'
- else:
- result = b'#!/bin/sh\n'
- result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n'
- result += b"' '''"
- return result
-
- def _get_shebang(self, encoding, post_interp=b'', options=None):
- enquote = True
- if self.executable:
- executable = self.executable
- enquote = False # assume this will be taken care of
- elif not sysconfig.is_python_build():
- executable = get_executable()
- elif in_venv(): # pragma: no cover
- executable = os.path.join(sysconfig.get_path('scripts'),
- 'python%s' % sysconfig.get_config_var('EXE'))
- else: # pragma: no cover
- executable = os.path.join(
- sysconfig.get_config_var('BINDIR'),
- 'python%s%s' % (sysconfig.get_config_var('VERSION'),
- sysconfig.get_config_var('EXE')))
- if options:
- executable = self._get_alternate_executable(executable, options)
-
- if sys.platform.startswith('java'): # pragma: no cover
- executable = self._fix_jython_executable(executable)
-
- # Normalise case for Windows - COMMENTED OUT
- # executable = os.path.normcase(executable)
- # N.B. The normalising operation above has been commented out: See
- # issue #124. Although paths in Windows are generally case-insensitive,
- # they aren't always. For example, a path containing a ẞ (which is a
- # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a
- # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by
- # Windows as equivalent in path names.
-
- # If the user didn't specify an executable, it may be necessary to
- # cater for executable paths with spaces (not uncommon on Windows)
- if enquote:
- executable = enquote_executable(executable)
- # Issue #51: don't use fsencode, since we later try to
- # check that the shebang is decodable using utf-8.
- executable = executable.encode('utf-8')
- # in case of IronPython, play safe and enable frames support
- if (sys.platform == 'cli' and '-X:Frames' not in post_interp
- and '-X:FullFrames' not in post_interp): # pragma: no cover
- post_interp += b' -X:Frames'
- shebang = self._build_shebang(executable, post_interp)
- # Python parser starts to read a script using UTF-8 until
- # it gets a #coding:xxx cookie. The shebang has to be the
- # first line of a file, the #coding:xxx cookie cannot be
- # written before. So the shebang has to be decodable from
- # UTF-8.
- try:
- shebang.decode('utf-8')
- except UnicodeDecodeError: # pragma: no cover
- raise ValueError(
- 'The shebang (%r) is not decodable from utf-8' % shebang)
- # If the script is encoded to a custom encoding (use a
- # #coding:xxx cookie), the shebang has to be decodable from
- # the script encoding too.
- if encoding != 'utf-8':
- try:
- shebang.decode(encoding)
- except UnicodeDecodeError: # pragma: no cover
- raise ValueError(
- 'The shebang (%r) is not decodable '
- 'from the script encoding (%r)' % (shebang, encoding))
- return shebang
-
- def _get_script_text(self, entry):
- return self.script_template % dict(module=entry.prefix,
- import_name=entry.suffix.split('.')[0],
- func=entry.suffix)
-
- manifest = _DEFAULT_MANIFEST
-
- def get_manifest(self, exename):
- base = os.path.basename(exename)
- return self.manifest % base
-
- def _write_script(self, names, shebang, script_bytes, filenames, ext):
- use_launcher = self.add_launchers and self._is_nt
- linesep = os.linesep.encode('utf-8')
- if not shebang.endswith(linesep):
- shebang += linesep
- if not use_launcher:
- script_bytes = shebang + script_bytes
- else: # pragma: no cover
- if ext == 'py':
- launcher = self._get_launcher('t')
- else:
- launcher = self._get_launcher('w')
- stream = BytesIO()
- with ZipFile(stream, 'w') as zf:
- zf.writestr('__main__.py', script_bytes)
- zip_data = stream.getvalue()
- script_bytes = launcher + shebang + zip_data
- for name in names:
- outname = os.path.join(self.target_dir, name)
- if use_launcher: # pragma: no cover
- n, e = os.path.splitext(outname)
- if e.startswith('.py'):
- outname = n
- outname = '%s.exe' % outname
- try:
- self._fileop.write_binary_file(outname, script_bytes)
- except Exception:
- # Failed writing an executable - it might be in use.
- logger.warning('Failed to write executable - trying to '
- 'use .deleteme logic')
- dfname = '%s.deleteme' % outname
- if os.path.exists(dfname):
- os.remove(dfname) # Not allowed to fail here
- os.rename(outname, dfname) # nor here
- self._fileop.write_binary_file(outname, script_bytes)
- logger.debug('Able to replace executable using '
- '.deleteme logic')
- try:
- os.remove(dfname)
- except Exception:
- pass # still in use - ignore error
- else:
- if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover
- outname = '%s.%s' % (outname, ext)
- if os.path.exists(outname) and not self.clobber:
- logger.warning('Skipping existing file %s', outname)
- continue
- self._fileop.write_binary_file(outname, script_bytes)
- if self.set_mode:
- self._fileop.set_executable_mode([outname])
- filenames.append(outname)
-
- def _make_script(self, entry, filenames, options=None):
- post_interp = b''
- if options:
- args = options.get('interpreter_args', [])
- if args:
- args = ' %s' % ' '.join(args)
- post_interp = args.encode('utf-8')
- shebang = self._get_shebang('utf-8', post_interp, options=options)
- script = self._get_script_text(entry).encode('utf-8')
- name = entry.name
- scriptnames = set()
- if '' in self.variants:
- scriptnames.add(name)
- if 'X' in self.variants:
- scriptnames.add('%s%s' % (name, self.version_info[0]))
- if 'X.Y' in self.variants:
- scriptnames.add('%s-%s.%s' % (name, self.version_info[0],
- self.version_info[1]))
- if options and options.get('gui', False):
- ext = 'pyw'
- else:
- ext = 'py'
- self._write_script(scriptnames, shebang, script, filenames, ext)
-
- def _copy_script(self, script, filenames):
- adjust = False
- script = os.path.join(self.source_dir, convert_path(script))
- outname = os.path.join(self.target_dir, os.path.basename(script))
- if not self.force and not self._fileop.newer(script, outname):
- logger.debug('not copying %s (up-to-date)', script)
- return
-
- # Always open the file, but ignore failures in dry-run mode --
- # that way, we'll get accurate feedback if we can read the
- # script.
- try:
- f = open(script, 'rb')
- except IOError: # pragma: no cover
- if not self.dry_run:
- raise
- f = None
- else:
- first_line = f.readline()
- if not first_line: # pragma: no cover
- logger.warning('%s: %s is an empty file (skipping)',
- self.get_command_name(), script)
- return
-
- match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n'))
- if match:
- adjust = True
- post_interp = match.group(1) or b''
-
- if not adjust:
- if f:
- f.close()
- self._fileop.copy_file(script, outname)
- if self.set_mode:
- self._fileop.set_executable_mode([outname])
- filenames.append(outname)
- else:
- logger.info('copying and adjusting %s -> %s', script,
- self.target_dir)
- if not self._fileop.dry_run:
- encoding, lines = detect_encoding(f.readline)
- f.seek(0)
- shebang = self._get_shebang(encoding, post_interp)
- if b'pythonw' in first_line: # pragma: no cover
- ext = 'pyw'
- else:
- ext = 'py'
- n = os.path.basename(outname)
- self._write_script([n], shebang, f.read(), filenames, ext)
- if f:
- f.close()
-
- @property
- def dry_run(self):
- return self._fileop.dry_run
-
- @dry_run.setter
- def dry_run(self, value):
- self._fileop.dry_run = value
-
- if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover
- # Executable launcher support.
- # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/
-
- def _get_launcher(self, kind):
- if struct.calcsize('P') == 8: # 64-bit
- bits = '64'
- else:
- bits = '32'
- name = '%s%s.exe' % (kind, bits)
- # Issue 31: don't hardcode an absolute package name, but
- # determine it relative to the current package
- distlib_package = __name__.rsplit('.', 1)[0]
- resource = finder(distlib_package).find(name)
- if not resource:
- msg = ('Unable to find resource %s in package %s' % (name,
- distlib_package))
- raise ValueError(msg)
- return resource.bytes
-
- # Public API follows
-
- def make(self, specification, options=None):
- """
- Make a script.
-
- :param specification: The specification, which is either a valid export
- entry specification (to make a script from a
- callable) or a filename (to make a script by
- copying from a source location).
- :param options: A dictionary of options controlling script generation.
- :return: A list of all absolute pathnames written to.
- """
- filenames = []
- entry = get_export_entry(specification)
- if entry is None:
- self._copy_script(specification, filenames)
- else:
- self._make_script(entry, filenames, options=options)
- return filenames
-
- def make_multiple(self, specifications, options=None):
- """
- Take a list of specifications and make scripts from them,
- :param specifications: A list of specifications.
- :return: A list of all absolute pathnames written to,
- """
- filenames = []
- for specification in specifications:
- filenames.extend(self.make(specification, options))
- return filenames
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe b/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe
deleted file mode 100644
index 8932a18..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe b/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe
deleted file mode 100644
index 325b805..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/util.py b/venv/Lib/site-packages/pip/_vendor/distlib/util.py
deleted file mode 100644
index 01324ea..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/util.py
+++ /dev/null
@@ -1,1761 +0,0 @@
-#
-# Copyright (C) 2012-2017 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-import codecs
-from collections import deque
-import contextlib
-import csv
-from glob import iglob as std_iglob
-import io
-import json
-import logging
-import os
-import py_compile
-import re
-import socket
-try:
- import ssl
-except ImportError: # pragma: no cover
- ssl = None
-import subprocess
-import sys
-import tarfile
-import tempfile
-import textwrap
-
-try:
- import threading
-except ImportError: # pragma: no cover
- import dummy_threading as threading
-import time
-
-from . import DistlibException
-from .compat import (string_types, text_type, shutil, raw_input, StringIO,
- cache_from_source, urlopen, urljoin, httplib, xmlrpclib,
- splittype, HTTPHandler, BaseConfigurator, valid_ident,
- Container, configparser, URLError, ZipFile, fsdecode,
- unquote, urlparse)
-
-logger = logging.getLogger(__name__)
-
-#
-# Requirement parsing code as per PEP 508
-#
-
-IDENTIFIER = re.compile(r'^([\w\.-]+)\s*')
-VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*')
-COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*')
-MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*')
-OR = re.compile(r'^or\b\s*')
-AND = re.compile(r'^and\b\s*')
-NON_SPACE = re.compile(r'(\S+)\s*')
-STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)')
-
-
-def parse_marker(marker_string):
- """
- Parse a marker string and return a dictionary containing a marker expression.
-
- The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in
- the expression grammar, or strings. A string contained in quotes is to be
- interpreted as a literal string, and a string not contained in quotes is a
- variable (such as os_name).
- """
- def marker_var(remaining):
- # either identifier, or literal string
- m = IDENTIFIER.match(remaining)
- if m:
- result = m.groups()[0]
- remaining = remaining[m.end():]
- elif not remaining:
- raise SyntaxError('unexpected end of input')
- else:
- q = remaining[0]
- if q not in '\'"':
- raise SyntaxError('invalid expression: %s' % remaining)
- oq = '\'"'.replace(q, '')
- remaining = remaining[1:]
- parts = [q]
- while remaining:
- # either a string chunk, or oq, or q to terminate
- if remaining[0] == q:
- break
- elif remaining[0] == oq:
- parts.append(oq)
- remaining = remaining[1:]
- else:
- m = STRING_CHUNK.match(remaining)
- if not m:
- raise SyntaxError('error in string literal: %s' % remaining)
- parts.append(m.groups()[0])
- remaining = remaining[m.end():]
- else:
- s = ''.join(parts)
- raise SyntaxError('unterminated string: %s' % s)
- parts.append(q)
- result = ''.join(parts)
- remaining = remaining[1:].lstrip() # skip past closing quote
- return result, remaining
-
- def marker_expr(remaining):
- if remaining and remaining[0] == '(':
- result, remaining = marker(remaining[1:].lstrip())
- if remaining[0] != ')':
- raise SyntaxError('unterminated parenthesis: %s' % remaining)
- remaining = remaining[1:].lstrip()
- else:
- lhs, remaining = marker_var(remaining)
- while remaining:
- m = MARKER_OP.match(remaining)
- if not m:
- break
- op = m.groups()[0]
- remaining = remaining[m.end():]
- rhs, remaining = marker_var(remaining)
- lhs = {'op': op, 'lhs': lhs, 'rhs': rhs}
- result = lhs
- return result, remaining
-
- def marker_and(remaining):
- lhs, remaining = marker_expr(remaining)
- while remaining:
- m = AND.match(remaining)
- if not m:
- break
- remaining = remaining[m.end():]
- rhs, remaining = marker_expr(remaining)
- lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs}
- return lhs, remaining
-
- def marker(remaining):
- lhs, remaining = marker_and(remaining)
- while remaining:
- m = OR.match(remaining)
- if not m:
- break
- remaining = remaining[m.end():]
- rhs, remaining = marker_and(remaining)
- lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs}
- return lhs, remaining
-
- return marker(marker_string)
-
-
-def parse_requirement(req):
- """
- Parse a requirement passed in as a string. Return a Container
- whose attributes contain the various parts of the requirement.
- """
- remaining = req.strip()
- if not remaining or remaining.startswith('#'):
- return None
- m = IDENTIFIER.match(remaining)
- if not m:
- raise SyntaxError('name expected: %s' % remaining)
- distname = m.groups()[0]
- remaining = remaining[m.end():]
- extras = mark_expr = versions = uri = None
- if remaining and remaining[0] == '[':
- i = remaining.find(']', 1)
- if i < 0:
- raise SyntaxError('unterminated extra: %s' % remaining)
- s = remaining[1:i]
- remaining = remaining[i + 1:].lstrip()
- extras = []
- while s:
- m = IDENTIFIER.match(s)
- if not m:
- raise SyntaxError('malformed extra: %s' % s)
- extras.append(m.groups()[0])
- s = s[m.end():]
- if not s:
- break
- if s[0] != ',':
- raise SyntaxError('comma expected in extras: %s' % s)
- s = s[1:].lstrip()
- if not extras:
- extras = None
- if remaining:
- if remaining[0] == '@':
- # it's a URI
- remaining = remaining[1:].lstrip()
- m = NON_SPACE.match(remaining)
- if not m:
- raise SyntaxError('invalid URI: %s' % remaining)
- uri = m.groups()[0]
- t = urlparse(uri)
- # there are issues with Python and URL parsing, so this test
- # is a bit crude. See bpo-20271, bpo-23505. Python doesn't
- # always parse invalid URLs correctly - it should raise
- # exceptions for malformed URLs
- if not (t.scheme and t.netloc):
- raise SyntaxError('Invalid URL: %s' % uri)
- remaining = remaining[m.end():].lstrip()
- else:
-
- def get_versions(ver_remaining):
- """
- Return a list of operator, version tuples if any are
- specified, else None.
- """
- m = COMPARE_OP.match(ver_remaining)
- versions = None
- if m:
- versions = []
- while True:
- op = m.groups()[0]
- ver_remaining = ver_remaining[m.end():]
- m = VERSION_IDENTIFIER.match(ver_remaining)
- if not m:
- raise SyntaxError('invalid version: %s' % ver_remaining)
- v = m.groups()[0]
- versions.append((op, v))
- ver_remaining = ver_remaining[m.end():]
- if not ver_remaining or ver_remaining[0] != ',':
- break
- ver_remaining = ver_remaining[1:].lstrip()
- m = COMPARE_OP.match(ver_remaining)
- if not m:
- raise SyntaxError('invalid constraint: %s' % ver_remaining)
- if not versions:
- versions = None
- return versions, ver_remaining
-
- if remaining[0] != '(':
- versions, remaining = get_versions(remaining)
- else:
- i = remaining.find(')', 1)
- if i < 0:
- raise SyntaxError('unterminated parenthesis: %s' % remaining)
- s = remaining[1:i]
- remaining = remaining[i + 1:].lstrip()
- # As a special diversion from PEP 508, allow a version number
- # a.b.c in parentheses as a synonym for ~= a.b.c (because this
- # is allowed in earlier PEPs)
- if COMPARE_OP.match(s):
- versions, _ = get_versions(s)
- else:
- m = VERSION_IDENTIFIER.match(s)
- if not m:
- raise SyntaxError('invalid constraint: %s' % s)
- v = m.groups()[0]
- s = s[m.end():].lstrip()
- if s:
- raise SyntaxError('invalid constraint: %s' % s)
- versions = [('~=', v)]
-
- if remaining:
- if remaining[0] != ';':
- raise SyntaxError('invalid requirement: %s' % remaining)
- remaining = remaining[1:].lstrip()
-
- mark_expr, remaining = parse_marker(remaining)
-
- if remaining and remaining[0] != '#':
- raise SyntaxError('unexpected trailing data: %s' % remaining)
-
- if not versions:
- rs = distname
- else:
- rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions]))
- return Container(name=distname, extras=extras, constraints=versions,
- marker=mark_expr, url=uri, requirement=rs)
-
-
-def get_resources_dests(resources_root, rules):
- """Find destinations for resources files"""
-
- def get_rel_path(root, path):
- # normalizes and returns a lstripped-/-separated path
- root = root.replace(os.path.sep, '/')
- path = path.replace(os.path.sep, '/')
- assert path.startswith(root)
- return path[len(root):].lstrip('/')
-
- destinations = {}
- for base, suffix, dest in rules:
- prefix = os.path.join(resources_root, base)
- for abs_base in iglob(prefix):
- abs_glob = os.path.join(abs_base, suffix)
- for abs_path in iglob(abs_glob):
- resource_file = get_rel_path(resources_root, abs_path)
- if dest is None: # remove the entry if it was here
- destinations.pop(resource_file, None)
- else:
- rel_path = get_rel_path(abs_base, abs_path)
- rel_dest = dest.replace(os.path.sep, '/').rstrip('/')
- destinations[resource_file] = rel_dest + '/' + rel_path
- return destinations
-
-
-def in_venv():
- if hasattr(sys, 'real_prefix'):
- # virtualenv venvs
- result = True
- else:
- # PEP 405 venvs
- result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix)
- return result
-
-
-def get_executable():
-# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as
-# changes to the stub launcher mean that sys.executable always points
-# to the stub on OS X
-# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__'
-# in os.environ):
-# result = os.environ['__PYVENV_LAUNCHER__']
-# else:
-# result = sys.executable
-# return result
- result = os.path.normcase(sys.executable)
- if not isinstance(result, text_type):
- result = fsdecode(result)
- return result
-
-
-def proceed(prompt, allowed_chars, error_prompt=None, default=None):
- p = prompt
- while True:
- s = raw_input(p)
- p = prompt
- if not s and default:
- s = default
- if s:
- c = s[0].lower()
- if c in allowed_chars:
- break
- if error_prompt:
- p = '%c: %s\n%s' % (c, error_prompt, prompt)
- return c
-
-
-def extract_by_key(d, keys):
- if isinstance(keys, string_types):
- keys = keys.split()
- result = {}
- for key in keys:
- if key in d:
- result[key] = d[key]
- return result
-
-def read_exports(stream):
- if sys.version_info[0] >= 3:
- # needs to be a text stream
- stream = codecs.getreader('utf-8')(stream)
- # Try to load as JSON, falling back on legacy format
- data = stream.read()
- stream = StringIO(data)
- try:
- jdata = json.load(stream)
- result = jdata['extensions']['python.exports']['exports']
- for group, entries in result.items():
- for k, v in entries.items():
- s = '%s = %s' % (k, v)
- entry = get_export_entry(s)
- assert entry is not None
- entries[k] = entry
- return result
- except Exception:
- stream.seek(0, 0)
-
- def read_stream(cp, stream):
- if hasattr(cp, 'read_file'):
- cp.read_file(stream)
- else:
- cp.readfp(stream)
-
- cp = configparser.ConfigParser()
- try:
- read_stream(cp, stream)
- except configparser.MissingSectionHeaderError:
- stream.close()
- data = textwrap.dedent(data)
- stream = StringIO(data)
- read_stream(cp, stream)
-
- result = {}
- for key in cp.sections():
- result[key] = entries = {}
- for name, value in cp.items(key):
- s = '%s = %s' % (name, value)
- entry = get_export_entry(s)
- assert entry is not None
- #entry.dist = self
- entries[name] = entry
- return result
-
-
-def write_exports(exports, stream):
- if sys.version_info[0] >= 3:
- # needs to be a text stream
- stream = codecs.getwriter('utf-8')(stream)
- cp = configparser.ConfigParser()
- for k, v in exports.items():
- # TODO check k, v for valid values
- cp.add_section(k)
- for entry in v.values():
- if entry.suffix is None:
- s = entry.prefix
- else:
- s = '%s:%s' % (entry.prefix, entry.suffix)
- if entry.flags:
- s = '%s [%s]' % (s, ', '.join(entry.flags))
- cp.set(k, entry.name, s)
- cp.write(stream)
-
-
-@contextlib.contextmanager
-def tempdir():
- td = tempfile.mkdtemp()
- try:
- yield td
- finally:
- shutil.rmtree(td)
-
-@contextlib.contextmanager
-def chdir(d):
- cwd = os.getcwd()
- try:
- os.chdir(d)
- yield
- finally:
- os.chdir(cwd)
-
-
-@contextlib.contextmanager
-def socket_timeout(seconds=15):
- cto = socket.getdefaulttimeout()
- try:
- socket.setdefaulttimeout(seconds)
- yield
- finally:
- socket.setdefaulttimeout(cto)
-
-
-class cached_property(object):
- def __init__(self, func):
- self.func = func
- #for attr in ('__name__', '__module__', '__doc__'):
- # setattr(self, attr, getattr(func, attr, None))
-
- def __get__(self, obj, cls=None):
- if obj is None:
- return self
- value = self.func(obj)
- object.__setattr__(obj, self.func.__name__, value)
- #obj.__dict__[self.func.__name__] = value = self.func(obj)
- return value
-
-def convert_path(pathname):
- """Return 'pathname' as a name that will work on the native filesystem.
-
- The path is split on '/' and put back together again using the current
- directory separator. Needed because filenames in the setup script are
- always supplied in Unix style, and have to be converted to the local
- convention before we can actually use them in the filesystem. Raises
- ValueError on non-Unix-ish systems if 'pathname' either starts or
- ends with a slash.
- """
- if os.sep == '/':
- return pathname
- if not pathname:
- return pathname
- if pathname[0] == '/':
- raise ValueError("path '%s' cannot be absolute" % pathname)
- if pathname[-1] == '/':
- raise ValueError("path '%s' cannot end with '/'" % pathname)
-
- paths = pathname.split('/')
- while os.curdir in paths:
- paths.remove(os.curdir)
- if not paths:
- return os.curdir
- return os.path.join(*paths)
-
-
-class FileOperator(object):
- def __init__(self, dry_run=False):
- self.dry_run = dry_run
- self.ensured = set()
- self._init_record()
-
- def _init_record(self):
- self.record = False
- self.files_written = set()
- self.dirs_created = set()
-
- def record_as_written(self, path):
- if self.record:
- self.files_written.add(path)
-
- def newer(self, source, target):
- """Tell if the target is newer than the source.
-
- Returns true if 'source' exists and is more recently modified than
- 'target', or if 'source' exists and 'target' doesn't.
-
- Returns false if both exist and 'target' is the same age or younger
- than 'source'. Raise PackagingFileError if 'source' does not exist.
-
- Note that this test is not very accurate: files created in the same
- second will have the same "age".
- """
- if not os.path.exists(source):
- raise DistlibException("file '%r' does not exist" %
- os.path.abspath(source))
- if not os.path.exists(target):
- return True
-
- return os.stat(source).st_mtime > os.stat(target).st_mtime
-
- def copy_file(self, infile, outfile, check=True):
- """Copy a file respecting dry-run and force flags.
- """
- self.ensure_dir(os.path.dirname(outfile))
- logger.info('Copying %s to %s', infile, outfile)
- if not self.dry_run:
- msg = None
- if check:
- if os.path.islink(outfile):
- msg = '%s is a symlink' % outfile
- elif os.path.exists(outfile) and not os.path.isfile(outfile):
- msg = '%s is a non-regular file' % outfile
- if msg:
- raise ValueError(msg + ' which would be overwritten')
- shutil.copyfile(infile, outfile)
- self.record_as_written(outfile)
-
- def copy_stream(self, instream, outfile, encoding=None):
- assert not os.path.isdir(outfile)
- self.ensure_dir(os.path.dirname(outfile))
- logger.info('Copying stream %s to %s', instream, outfile)
- if not self.dry_run:
- if encoding is None:
- outstream = open(outfile, 'wb')
- else:
- outstream = codecs.open(outfile, 'w', encoding=encoding)
- try:
- shutil.copyfileobj(instream, outstream)
- finally:
- outstream.close()
- self.record_as_written(outfile)
-
- def write_binary_file(self, path, data):
- self.ensure_dir(os.path.dirname(path))
- if not self.dry_run:
- if os.path.exists(path):
- os.remove(path)
- with open(path, 'wb') as f:
- f.write(data)
- self.record_as_written(path)
-
- def write_text_file(self, path, data, encoding):
- self.write_binary_file(path, data.encode(encoding))
-
- def set_mode(self, bits, mask, files):
- if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'):
- # Set the executable bits (owner, group, and world) on
- # all the files specified.
- for f in files:
- if self.dry_run:
- logger.info("changing mode of %s", f)
- else:
- mode = (os.stat(f).st_mode | bits) & mask
- logger.info("changing mode of %s to %o", f, mode)
- os.chmod(f, mode)
-
- set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f)
-
- def ensure_dir(self, path):
- path = os.path.abspath(path)
- if path not in self.ensured and not os.path.exists(path):
- self.ensured.add(path)
- d, f = os.path.split(path)
- self.ensure_dir(d)
- logger.info('Creating %s' % path)
- if not self.dry_run:
- os.mkdir(path)
- if self.record:
- self.dirs_created.add(path)
-
- def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False):
- dpath = cache_from_source(path, not optimize)
- logger.info('Byte-compiling %s to %s', path, dpath)
- if not self.dry_run:
- if force or self.newer(path, dpath):
- if not prefix:
- diagpath = None
- else:
- assert path.startswith(prefix)
- diagpath = path[len(prefix):]
- compile_kwargs = {}
- if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'):
- compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH
- py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error
- self.record_as_written(dpath)
- return dpath
-
- def ensure_removed(self, path):
- if os.path.exists(path):
- if os.path.isdir(path) and not os.path.islink(path):
- logger.debug('Removing directory tree at %s', path)
- if not self.dry_run:
- shutil.rmtree(path)
- if self.record:
- if path in self.dirs_created:
- self.dirs_created.remove(path)
- else:
- if os.path.islink(path):
- s = 'link'
- else:
- s = 'file'
- logger.debug('Removing %s %s', s, path)
- if not self.dry_run:
- os.remove(path)
- if self.record:
- if path in self.files_written:
- self.files_written.remove(path)
-
- def is_writable(self, path):
- result = False
- while not result:
- if os.path.exists(path):
- result = os.access(path, os.W_OK)
- break
- parent = os.path.dirname(path)
- if parent == path:
- break
- path = parent
- return result
-
- def commit(self):
- """
- Commit recorded changes, turn off recording, return
- changes.
- """
- assert self.record
- result = self.files_written, self.dirs_created
- self._init_record()
- return result
-
- def rollback(self):
- if not self.dry_run:
- for f in list(self.files_written):
- if os.path.exists(f):
- os.remove(f)
- # dirs should all be empty now, except perhaps for
- # __pycache__ subdirs
- # reverse so that subdirs appear before their parents
- dirs = sorted(self.dirs_created, reverse=True)
- for d in dirs:
- flist = os.listdir(d)
- if flist:
- assert flist == ['__pycache__']
- sd = os.path.join(d, flist[0])
- os.rmdir(sd)
- os.rmdir(d) # should fail if non-empty
- self._init_record()
-
-def resolve(module_name, dotted_path):
- if module_name in sys.modules:
- mod = sys.modules[module_name]
- else:
- mod = __import__(module_name)
- if dotted_path is None:
- result = mod
- else:
- parts = dotted_path.split('.')
- result = getattr(mod, parts.pop(0))
- for p in parts:
- result = getattr(result, p)
- return result
-
-
-class ExportEntry(object):
- def __init__(self, name, prefix, suffix, flags):
- self.name = name
- self.prefix = prefix
- self.suffix = suffix
- self.flags = flags
-
- @cached_property
- def value(self):
- return resolve(self.prefix, self.suffix)
-
- def __repr__(self): # pragma: no cover
- return '' % (self.name, self.prefix,
- self.suffix, self.flags)
-
- def __eq__(self, other):
- if not isinstance(other, ExportEntry):
- result = False
- else:
- result = (self.name == other.name and
- self.prefix == other.prefix and
- self.suffix == other.suffix and
- self.flags == other.flags)
- return result
-
- __hash__ = object.__hash__
-
-
-ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+)
- \s*=\s*(?P(\w+)([:\.]\w+)*)
- \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])?
- ''', re.VERBOSE)
-
-def get_export_entry(specification):
- m = ENTRY_RE.search(specification)
- if not m:
- result = None
- if '[' in specification or ']' in specification:
- raise DistlibException("Invalid specification "
- "'%s'" % specification)
- else:
- d = m.groupdict()
- name = d['name']
- path = d['callable']
- colons = path.count(':')
- if colons == 0:
- prefix, suffix = path, None
- else:
- if colons != 1:
- raise DistlibException("Invalid specification "
- "'%s'" % specification)
- prefix, suffix = path.split(':')
- flags = d['flags']
- if flags is None:
- if '[' in specification or ']' in specification:
- raise DistlibException("Invalid specification "
- "'%s'" % specification)
- flags = []
- else:
- flags = [f.strip() for f in flags.split(',')]
- result = ExportEntry(name, prefix, suffix, flags)
- return result
-
-
-def get_cache_base(suffix=None):
- """
- Return the default base location for distlib caches. If the directory does
- not exist, it is created. Use the suffix provided for the base directory,
- and default to '.distlib' if it isn't provided.
-
- On Windows, if LOCALAPPDATA is defined in the environment, then it is
- assumed to be a directory, and will be the parent directory of the result.
- On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home
- directory - using os.expanduser('~') - will be the parent directory of
- the result.
-
- The result is just the directory '.distlib' in the parent directory as
- determined above, or with the name specified with ``suffix``.
- """
- if suffix is None:
- suffix = '.distlib'
- if os.name == 'nt' and 'LOCALAPPDATA' in os.environ:
- result = os.path.expandvars('$localappdata')
- else:
- # Assume posix, or old Windows
- result = os.path.expanduser('~')
- # we use 'isdir' instead of 'exists', because we want to
- # fail if there's a file with that name
- if os.path.isdir(result):
- usable = os.access(result, os.W_OK)
- if not usable:
- logger.warning('Directory exists but is not writable: %s', result)
- else:
- try:
- os.makedirs(result)
- usable = True
- except OSError:
- logger.warning('Unable to create %s', result, exc_info=True)
- usable = False
- if not usable:
- result = tempfile.mkdtemp()
- logger.warning('Default location unusable, using %s', result)
- return os.path.join(result, suffix)
-
-
-def path_to_cache_dir(path):
- """
- Convert an absolute path to a directory name for use in a cache.
-
- The algorithm used is:
-
- #. On Windows, any ``':'`` in the drive is replaced with ``'---'``.
- #. Any occurrence of ``os.sep`` is replaced with ``'--'``.
- #. ``'.cache'`` is appended.
- """
- d, p = os.path.splitdrive(os.path.abspath(path))
- if d:
- d = d.replace(':', '---')
- p = p.replace(os.sep, '--')
- return d + p + '.cache'
-
-
-def ensure_slash(s):
- if not s.endswith('/'):
- return s + '/'
- return s
-
-
-def parse_credentials(netloc):
- username = password = None
- if '@' in netloc:
- prefix, netloc = netloc.rsplit('@', 1)
- if ':' not in prefix:
- username = prefix
- else:
- username, password = prefix.split(':', 1)
- if username:
- username = unquote(username)
- if password:
- password = unquote(password)
- return username, password, netloc
-
-
-def get_process_umask():
- result = os.umask(0o22)
- os.umask(result)
- return result
-
-def is_string_sequence(seq):
- result = True
- i = None
- for i, s in enumerate(seq):
- if not isinstance(s, string_types):
- result = False
- break
- assert i is not None
- return result
-
-PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-'
- '([a-z0-9_.+-]+)', re.I)
-PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)')
-
-
-def split_filename(filename, project_name=None):
- """
- Extract name, version, python version from a filename (no extension)
-
- Return name, version, pyver or None
- """
- result = None
- pyver = None
- filename = unquote(filename).replace(' ', '-')
- m = PYTHON_VERSION.search(filename)
- if m:
- pyver = m.group(1)
- filename = filename[:m.start()]
- if project_name and len(filename) > len(project_name) + 1:
- m = re.match(re.escape(project_name) + r'\b', filename)
- if m:
- n = m.end()
- result = filename[:n], filename[n + 1:], pyver
- if result is None:
- m = PROJECT_NAME_AND_VERSION.match(filename)
- if m:
- result = m.group(1), m.group(3), pyver
- return result
-
-# Allow spaces in name because of legacy dists like "Twisted Core"
-NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*'
- r'\(\s*(?P[^\s)]+)\)$')
-
-def parse_name_and_version(p):
- """
- A utility method used to get name and version from a string.
-
- From e.g. a Provides-Dist value.
-
- :param p: A value in a form 'foo (1.0)'
- :return: The name and version as a tuple.
- """
- m = NAME_VERSION_RE.match(p)
- if not m:
- raise DistlibException('Ill-formed name/version string: \'%s\'' % p)
- d = m.groupdict()
- return d['name'].strip().lower(), d['ver']
-
-def get_extras(requested, available):
- result = set()
- requested = set(requested or [])
- available = set(available or [])
- if '*' in requested:
- requested.remove('*')
- result |= available
- for r in requested:
- if r == '-':
- result.add(r)
- elif r.startswith('-'):
- unwanted = r[1:]
- if unwanted not in available:
- logger.warning('undeclared extra: %s' % unwanted)
- if unwanted in result:
- result.remove(unwanted)
- else:
- if r not in available:
- logger.warning('undeclared extra: %s' % r)
- result.add(r)
- return result
-#
-# Extended metadata functionality
-#
-
-def _get_external_data(url):
- result = {}
- try:
- # urlopen might fail if it runs into redirections,
- # because of Python issue #13696. Fixed in locators
- # using a custom redirect handler.
- resp = urlopen(url)
- headers = resp.info()
- ct = headers.get('Content-Type')
- if not ct.startswith('application/json'):
- logger.debug('Unexpected response for JSON request: %s', ct)
- else:
- reader = codecs.getreader('utf-8')(resp)
- #data = reader.read().decode('utf-8')
- #result = json.loads(data)
- result = json.load(reader)
- except Exception as e:
- logger.exception('Failed to get external data for %s: %s', url, e)
- return result
-
-_external_data_base_url = 'https://www.red-dove.com/pypi/projects/'
-
-def get_project_data(name):
- url = '%s/%s/project.json' % (name[0].upper(), name)
- url = urljoin(_external_data_base_url, url)
- result = _get_external_data(url)
- return result
-
-def get_package_data(name, version):
- url = '%s/%s/package-%s.json' % (name[0].upper(), name, version)
- url = urljoin(_external_data_base_url, url)
- return _get_external_data(url)
-
-
-class Cache(object):
- """
- A class implementing a cache for resources that need to live in the file system
- e.g. shared libraries. This class was moved from resources to here because it
- could be used by other modules, e.g. the wheel module.
- """
-
- def __init__(self, base):
- """
- Initialise an instance.
-
- :param base: The base directory where the cache should be located.
- """
- # we use 'isdir' instead of 'exists', because we want to
- # fail if there's a file with that name
- if not os.path.isdir(base): # pragma: no cover
- os.makedirs(base)
- if (os.stat(base).st_mode & 0o77) != 0:
- logger.warning('Directory \'%s\' is not private', base)
- self.base = os.path.abspath(os.path.normpath(base))
-
- def prefix_to_dir(self, prefix):
- """
- Converts a resource prefix to a directory name in the cache.
- """
- return path_to_cache_dir(prefix)
-
- def clear(self):
- """
- Clear the cache.
- """
- not_removed = []
- for fn in os.listdir(self.base):
- fn = os.path.join(self.base, fn)
- try:
- if os.path.islink(fn) or os.path.isfile(fn):
- os.remove(fn)
- elif os.path.isdir(fn):
- shutil.rmtree(fn)
- except Exception:
- not_removed.append(fn)
- return not_removed
-
-
-class EventMixin(object):
- """
- A very simple publish/subscribe system.
- """
- def __init__(self):
- self._subscribers = {}
-
- def add(self, event, subscriber, append=True):
- """
- Add a subscriber for an event.
-
- :param event: The name of an event.
- :param subscriber: The subscriber to be added (and called when the
- event is published).
- :param append: Whether to append or prepend the subscriber to an
- existing subscriber list for the event.
- """
- subs = self._subscribers
- if event not in subs:
- subs[event] = deque([subscriber])
- else:
- sq = subs[event]
- if append:
- sq.append(subscriber)
- else:
- sq.appendleft(subscriber)
-
- def remove(self, event, subscriber):
- """
- Remove a subscriber for an event.
-
- :param event: The name of an event.
- :param subscriber: The subscriber to be removed.
- """
- subs = self._subscribers
- if event not in subs:
- raise ValueError('No subscribers: %r' % event)
- subs[event].remove(subscriber)
-
- def get_subscribers(self, event):
- """
- Return an iterator for the subscribers for an event.
- :param event: The event to return subscribers for.
- """
- return iter(self._subscribers.get(event, ()))
-
- def publish(self, event, *args, **kwargs):
- """
- Publish a event and return a list of values returned by its
- subscribers.
-
- :param event: The event to publish.
- :param args: The positional arguments to pass to the event's
- subscribers.
- :param kwargs: The keyword arguments to pass to the event's
- subscribers.
- """
- result = []
- for subscriber in self.get_subscribers(event):
- try:
- value = subscriber(event, *args, **kwargs)
- except Exception:
- logger.exception('Exception during event publication')
- value = None
- result.append(value)
- logger.debug('publish %s: args = %s, kwargs = %s, result = %s',
- event, args, kwargs, result)
- return result
-
-#
-# Simple sequencing
-#
-class Sequencer(object):
- def __init__(self):
- self._preds = {}
- self._succs = {}
- self._nodes = set() # nodes with no preds/succs
-
- def add_node(self, node):
- self._nodes.add(node)
-
- def remove_node(self, node, edges=False):
- if node in self._nodes:
- self._nodes.remove(node)
- if edges:
- for p in set(self._preds.get(node, ())):
- self.remove(p, node)
- for s in set(self._succs.get(node, ())):
- self.remove(node, s)
- # Remove empties
- for k, v in list(self._preds.items()):
- if not v:
- del self._preds[k]
- for k, v in list(self._succs.items()):
- if not v:
- del self._succs[k]
-
- def add(self, pred, succ):
- assert pred != succ
- self._preds.setdefault(succ, set()).add(pred)
- self._succs.setdefault(pred, set()).add(succ)
-
- def remove(self, pred, succ):
- assert pred != succ
- try:
- preds = self._preds[succ]
- succs = self._succs[pred]
- except KeyError: # pragma: no cover
- raise ValueError('%r not a successor of anything' % succ)
- try:
- preds.remove(pred)
- succs.remove(succ)
- except KeyError: # pragma: no cover
- raise ValueError('%r not a successor of %r' % (succ, pred))
-
- def is_step(self, step):
- return (step in self._preds or step in self._succs or
- step in self._nodes)
-
- def get_steps(self, final):
- if not self.is_step(final):
- raise ValueError('Unknown: %r' % final)
- result = []
- todo = []
- seen = set()
- todo.append(final)
- while todo:
- step = todo.pop(0)
- if step in seen:
- # if a step was already seen,
- # move it to the end (so it will appear earlier
- # when reversed on return) ... but not for the
- # final step, as that would be confusing for
- # users
- if step != final:
- result.remove(step)
- result.append(step)
- else:
- seen.add(step)
- result.append(step)
- preds = self._preds.get(step, ())
- todo.extend(preds)
- return reversed(result)
-
- @property
- def strong_connections(self):
- #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
- index_counter = [0]
- stack = []
- lowlinks = {}
- index = {}
- result = []
-
- graph = self._succs
-
- def strongconnect(node):
- # set the depth index for this node to the smallest unused index
- index[node] = index_counter[0]
- lowlinks[node] = index_counter[0]
- index_counter[0] += 1
- stack.append(node)
-
- # Consider successors
- try:
- successors = graph[node]
- except Exception:
- successors = []
- for successor in successors:
- if successor not in lowlinks:
- # Successor has not yet been visited
- strongconnect(successor)
- lowlinks[node] = min(lowlinks[node],lowlinks[successor])
- elif successor in stack:
- # the successor is in the stack and hence in the current
- # strongly connected component (SCC)
- lowlinks[node] = min(lowlinks[node],index[successor])
-
- # If `node` is a root node, pop the stack and generate an SCC
- if lowlinks[node] == index[node]:
- connected_component = []
-
- while True:
- successor = stack.pop()
- connected_component.append(successor)
- if successor == node: break
- component = tuple(connected_component)
- # storing the result
- result.append(component)
-
- for node in graph:
- if node not in lowlinks:
- strongconnect(node)
-
- return result
-
- @property
- def dot(self):
- result = ['digraph G {']
- for succ in self._preds:
- preds = self._preds[succ]
- for pred in preds:
- result.append(' %s -> %s;' % (pred, succ))
- for node in self._nodes:
- result.append(' %s;' % node)
- result.append('}')
- return '\n'.join(result)
-
-#
-# Unarchiving functionality for zip, tar, tgz, tbz, whl
-#
-
-ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip',
- '.tgz', '.tbz', '.whl')
-
-def unarchive(archive_filename, dest_dir, format=None, check=True):
-
- def check_path(path):
- if not isinstance(path, text_type):
- path = path.decode('utf-8')
- p = os.path.abspath(os.path.join(dest_dir, path))
- if not p.startswith(dest_dir) or p[plen] != os.sep:
- raise ValueError('path outside destination: %r' % p)
-
- dest_dir = os.path.abspath(dest_dir)
- plen = len(dest_dir)
- archive = None
- if format is None:
- if archive_filename.endswith(('.zip', '.whl')):
- format = 'zip'
- elif archive_filename.endswith(('.tar.gz', '.tgz')):
- format = 'tgz'
- mode = 'r:gz'
- elif archive_filename.endswith(('.tar.bz2', '.tbz')):
- format = 'tbz'
- mode = 'r:bz2'
- elif archive_filename.endswith('.tar'):
- format = 'tar'
- mode = 'r'
- else: # pragma: no cover
- raise ValueError('Unknown format for %r' % archive_filename)
- try:
- if format == 'zip':
- archive = ZipFile(archive_filename, 'r')
- if check:
- names = archive.namelist()
- for name in names:
- check_path(name)
- else:
- archive = tarfile.open(archive_filename, mode)
- if check:
- names = archive.getnames()
- for name in names:
- check_path(name)
- if format != 'zip' and sys.version_info[0] < 3:
- # See Python issue 17153. If the dest path contains Unicode,
- # tarfile extraction fails on Python 2.x if a member path name
- # contains non-ASCII characters - it leads to an implicit
- # bytes -> unicode conversion using ASCII to decode.
- for tarinfo in archive.getmembers():
- if not isinstance(tarinfo.name, text_type):
- tarinfo.name = tarinfo.name.decode('utf-8')
- archive.extractall(dest_dir)
-
- finally:
- if archive:
- archive.close()
-
-
-def zip_dir(directory):
- """zip a directory tree into a BytesIO object"""
- result = io.BytesIO()
- dlen = len(directory)
- with ZipFile(result, "w") as zf:
- for root, dirs, files in os.walk(directory):
- for name in files:
- full = os.path.join(root, name)
- rel = root[dlen:]
- dest = os.path.join(rel, name)
- zf.write(full, dest)
- return result
-
-#
-# Simple progress bar
-#
-
-UNITS = ('', 'K', 'M', 'G','T','P')
-
-
-class Progress(object):
- unknown = 'UNKNOWN'
-
- def __init__(self, minval=0, maxval=100):
- assert maxval is None or maxval >= minval
- self.min = self.cur = minval
- self.max = maxval
- self.started = None
- self.elapsed = 0
- self.done = False
-
- def update(self, curval):
- assert self.min <= curval
- assert self.max is None or curval <= self.max
- self.cur = curval
- now = time.time()
- if self.started is None:
- self.started = now
- else:
- self.elapsed = now - self.started
-
- def increment(self, incr):
- assert incr >= 0
- self.update(self.cur + incr)
-
- def start(self):
- self.update(self.min)
- return self
-
- def stop(self):
- if self.max is not None:
- self.update(self.max)
- self.done = True
-
- @property
- def maximum(self):
- return self.unknown if self.max is None else self.max
-
- @property
- def percentage(self):
- if self.done:
- result = '100 %'
- elif self.max is None:
- result = ' ?? %'
- else:
- v = 100.0 * (self.cur - self.min) / (self.max - self.min)
- result = '%3d %%' % v
- return result
-
- def format_duration(self, duration):
- if (duration <= 0) and self.max is None or self.cur == self.min:
- result = '??:??:??'
- #elif duration < 1:
- # result = '--:--:--'
- else:
- result = time.strftime('%H:%M:%S', time.gmtime(duration))
- return result
-
- @property
- def ETA(self):
- if self.done:
- prefix = 'Done'
- t = self.elapsed
- #import pdb; pdb.set_trace()
- else:
- prefix = 'ETA '
- if self.max is None:
- t = -1
- elif self.elapsed == 0 or (self.cur == self.min):
- t = 0
- else:
- #import pdb; pdb.set_trace()
- t = float(self.max - self.min)
- t /= self.cur - self.min
- t = (t - 1) * self.elapsed
- return '%s: %s' % (prefix, self.format_duration(t))
-
- @property
- def speed(self):
- if self.elapsed == 0:
- result = 0.0
- else:
- result = (self.cur - self.min) / self.elapsed
- for unit in UNITS:
- if result < 1000:
- break
- result /= 1000.0
- return '%d %sB/s' % (result, unit)
-
-#
-# Glob functionality
-#
-
-RICH_GLOB = re.compile(r'\{([^}]*)\}')
-_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]')
-_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$')
-
-
-def iglob(path_glob):
- """Extended globbing function that supports ** and {opt1,opt2,opt3}."""
- if _CHECK_RECURSIVE_GLOB.search(path_glob):
- msg = """invalid glob %r: recursive glob "**" must be used alone"""
- raise ValueError(msg % path_glob)
- if _CHECK_MISMATCH_SET.search(path_glob):
- msg = """invalid glob %r: mismatching set marker '{' or '}'"""
- raise ValueError(msg % path_glob)
- return _iglob(path_glob)
-
-
-def _iglob(path_glob):
- rich_path_glob = RICH_GLOB.split(path_glob, 1)
- if len(rich_path_glob) > 1:
- assert len(rich_path_glob) == 3, rich_path_glob
- prefix, set, suffix = rich_path_glob
- for item in set.split(','):
- for path in _iglob(''.join((prefix, item, suffix))):
- yield path
- else:
- if '**' not in path_glob:
- for item in std_iglob(path_glob):
- yield item
- else:
- prefix, radical = path_glob.split('**', 1)
- if prefix == '':
- prefix = '.'
- if radical == '':
- radical = '*'
- else:
- # we support both
- radical = radical.lstrip('/')
- radical = radical.lstrip('\\')
- for path, dir, files in os.walk(prefix):
- path = os.path.normpath(path)
- for fn in _iglob(os.path.join(path, radical)):
- yield fn
-
-if ssl:
- from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname,
- CertificateError)
-
-
-#
-# HTTPSConnection which verifies certificates/matches domains
-#
-
- class HTTPSConnection(httplib.HTTPSConnection):
- ca_certs = None # set this to the path to the certs file (.pem)
- check_domain = True # only used if ca_certs is not None
-
- # noinspection PyPropertyAccess
- def connect(self):
- sock = socket.create_connection((self.host, self.port), self.timeout)
- if getattr(self, '_tunnel_host', False):
- self.sock = sock
- self._tunnel()
-
- if not hasattr(ssl, 'SSLContext'):
- # For 2.x
- if self.ca_certs:
- cert_reqs = ssl.CERT_REQUIRED
- else:
- cert_reqs = ssl.CERT_NONE
- self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file,
- cert_reqs=cert_reqs,
- ssl_version=ssl.PROTOCOL_SSLv23,
- ca_certs=self.ca_certs)
- else: # pragma: no cover
- context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
- if hasattr(ssl, 'OP_NO_SSLv2'):
- context.options |= ssl.OP_NO_SSLv2
- if self.cert_file:
- context.load_cert_chain(self.cert_file, self.key_file)
- kwargs = {}
- if self.ca_certs:
- context.verify_mode = ssl.CERT_REQUIRED
- context.load_verify_locations(cafile=self.ca_certs)
- if getattr(ssl, 'HAS_SNI', False):
- kwargs['server_hostname'] = self.host
- self.sock = context.wrap_socket(sock, **kwargs)
- if self.ca_certs and self.check_domain:
- try:
- match_hostname(self.sock.getpeercert(), self.host)
- logger.debug('Host verified: %s', self.host)
- except CertificateError: # pragma: no cover
- self.sock.shutdown(socket.SHUT_RDWR)
- self.sock.close()
- raise
-
- class HTTPSHandler(BaseHTTPSHandler):
- def __init__(self, ca_certs, check_domain=True):
- BaseHTTPSHandler.__init__(self)
- self.ca_certs = ca_certs
- self.check_domain = check_domain
-
- def _conn_maker(self, *args, **kwargs):
- """
- This is called to create a connection instance. Normally you'd
- pass a connection class to do_open, but it doesn't actually check for
- a class, and just expects a callable. As long as we behave just as a
- constructor would have, we should be OK. If it ever changes so that
- we *must* pass a class, we'll create an UnsafeHTTPSConnection class
- which just sets check_domain to False in the class definition, and
- choose which one to pass to do_open.
- """
- result = HTTPSConnection(*args, **kwargs)
- if self.ca_certs:
- result.ca_certs = self.ca_certs
- result.check_domain = self.check_domain
- return result
-
- def https_open(self, req):
- try:
- return self.do_open(self._conn_maker, req)
- except URLError as e:
- if 'certificate verify failed' in str(e.reason):
- raise CertificateError('Unable to verify server certificate '
- 'for %s' % req.host)
- else:
- raise
-
- #
- # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The-
- # Middle proxy using HTTP listens on port 443, or an index mistakenly serves
- # HTML containing a http://xyz link when it should be https://xyz),
- # you can use the following handler class, which does not allow HTTP traffic.
- #
- # It works by inheriting from HTTPHandler - so build_opener won't add a
- # handler for HTTP itself.
- #
- class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler):
- def http_open(self, req):
- raise URLError('Unexpected HTTP request on what should be a secure '
- 'connection: %s' % req)
-
-#
-# XML-RPC with timeouts
-#
-
-_ver_info = sys.version_info[:2]
-
-if _ver_info == (2, 6):
- class HTTP(httplib.HTTP):
- def __init__(self, host='', port=None, **kwargs):
- if port == 0: # 0 means use port 0, not the default port
- port = None
- self._setup(self._connection_class(host, port, **kwargs))
-
-
- if ssl:
- class HTTPS(httplib.HTTPS):
- def __init__(self, host='', port=None, **kwargs):
- if port == 0: # 0 means use port 0, not the default port
- port = None
- self._setup(self._connection_class(host, port, **kwargs))
-
-
-class Transport(xmlrpclib.Transport):
- def __init__(self, timeout, use_datetime=0):
- self.timeout = timeout
- xmlrpclib.Transport.__init__(self, use_datetime)
-
- def make_connection(self, host):
- h, eh, x509 = self.get_host_info(host)
- if _ver_info == (2, 6):
- result = HTTP(h, timeout=self.timeout)
- else:
- if not self._connection or host != self._connection[0]:
- self._extra_headers = eh
- self._connection = host, httplib.HTTPConnection(h)
- result = self._connection[1]
- return result
-
-if ssl:
- class SafeTransport(xmlrpclib.SafeTransport):
- def __init__(self, timeout, use_datetime=0):
- self.timeout = timeout
- xmlrpclib.SafeTransport.__init__(self, use_datetime)
-
- def make_connection(self, host):
- h, eh, kwargs = self.get_host_info(host)
- if not kwargs:
- kwargs = {}
- kwargs['timeout'] = self.timeout
- if _ver_info == (2, 6):
- result = HTTPS(host, None, **kwargs)
- else:
- if not self._connection or host != self._connection[0]:
- self._extra_headers = eh
- self._connection = host, httplib.HTTPSConnection(h, None,
- **kwargs)
- result = self._connection[1]
- return result
-
-
-class ServerProxy(xmlrpclib.ServerProxy):
- def __init__(self, uri, **kwargs):
- self.timeout = timeout = kwargs.pop('timeout', None)
- # The above classes only come into play if a timeout
- # is specified
- if timeout is not None:
- scheme, _ = splittype(uri)
- use_datetime = kwargs.get('use_datetime', 0)
- if scheme == 'https':
- tcls = SafeTransport
- else:
- tcls = Transport
- kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime)
- self.transport = t
- xmlrpclib.ServerProxy.__init__(self, uri, **kwargs)
-
-#
-# CSV functionality. This is provided because on 2.x, the csv module can't
-# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files.
-#
-
-def _csv_open(fn, mode, **kwargs):
- if sys.version_info[0] < 3:
- mode += 'b'
- else:
- kwargs['newline'] = ''
- # Python 3 determines encoding from locale. Force 'utf-8'
- # file encoding to match other forced utf-8 encoding
- kwargs['encoding'] = 'utf-8'
- return open(fn, mode, **kwargs)
-
-
-class CSVBase(object):
- defaults = {
- 'delimiter': str(','), # The strs are used because we need native
- 'quotechar': str('"'), # str in the csv API (2.x won't take
- 'lineterminator': str('\n') # Unicode)
- }
-
- def __enter__(self):
- return self
-
- def __exit__(self, *exc_info):
- self.stream.close()
-
-
-class CSVReader(CSVBase):
- def __init__(self, **kwargs):
- if 'stream' in kwargs:
- stream = kwargs['stream']
- if sys.version_info[0] >= 3:
- # needs to be a text stream
- stream = codecs.getreader('utf-8')(stream)
- self.stream = stream
- else:
- self.stream = _csv_open(kwargs['path'], 'r')
- self.reader = csv.reader(self.stream, **self.defaults)
-
- def __iter__(self):
- return self
-
- def next(self):
- result = next(self.reader)
- if sys.version_info[0] < 3:
- for i, item in enumerate(result):
- if not isinstance(item, text_type):
- result[i] = item.decode('utf-8')
- return result
-
- __next__ = next
-
-class CSVWriter(CSVBase):
- def __init__(self, fn, **kwargs):
- self.stream = _csv_open(fn, 'w')
- self.writer = csv.writer(self.stream, **self.defaults)
-
- def writerow(self, row):
- if sys.version_info[0] < 3:
- r = []
- for item in row:
- if isinstance(item, text_type):
- item = item.encode('utf-8')
- r.append(item)
- row = r
- self.writer.writerow(row)
-
-#
-# Configurator functionality
-#
-
-class Configurator(BaseConfigurator):
-
- value_converters = dict(BaseConfigurator.value_converters)
- value_converters['inc'] = 'inc_convert'
-
- def __init__(self, config, base=None):
- super(Configurator, self).__init__(config)
- self.base = base or os.getcwd()
-
- def configure_custom(self, config):
- def convert(o):
- if isinstance(o, (list, tuple)):
- result = type(o)([convert(i) for i in o])
- elif isinstance(o, dict):
- if '()' in o:
- result = self.configure_custom(o)
- else:
- result = {}
- for k in o:
- result[k] = convert(o[k])
- else:
- result = self.convert(o)
- return result
-
- c = config.pop('()')
- if not callable(c):
- c = self.resolve(c)
- props = config.pop('.', None)
- # Check for valid identifiers
- args = config.pop('[]', ())
- if args:
- args = tuple([convert(o) for o in args])
- items = [(k, convert(config[k])) for k in config if valid_ident(k)]
- kwargs = dict(items)
- result = c(*args, **kwargs)
- if props:
- for n, v in props.items():
- setattr(result, n, convert(v))
- return result
-
- def __getitem__(self, key):
- result = self.config[key]
- if isinstance(result, dict) and '()' in result:
- self.config[key] = result = self.configure_custom(result)
- return result
-
- def inc_convert(self, value):
- """Default converter for the inc:// protocol."""
- if not os.path.isabs(value):
- value = os.path.join(self.base, value)
- with codecs.open(value, 'r', encoding='utf-8') as f:
- result = json.load(f)
- return result
-
-
-class SubprocessMixin(object):
- """
- Mixin for running subprocesses and capturing their output
- """
- def __init__(self, verbose=False, progress=None):
- self.verbose = verbose
- self.progress = progress
-
- def reader(self, stream, context):
- """
- Read lines from a subprocess' output stream and either pass to a progress
- callable (if specified) or write progress information to sys.stderr.
- """
- progress = self.progress
- verbose = self.verbose
- while True:
- s = stream.readline()
- if not s:
- break
- if progress is not None:
- progress(s, context)
- else:
- if not verbose:
- sys.stderr.write('.')
- else:
- sys.stderr.write(s.decode('utf-8'))
- sys.stderr.flush()
- stream.close()
-
- def run_command(self, cmd, **kwargs):
- p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
- stderr=subprocess.PIPE, **kwargs)
- t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout'))
- t1.start()
- t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr'))
- t2.start()
- p.wait()
- t1.join()
- t2.join()
- if self.progress is not None:
- self.progress('done.', 'main')
- elif self.verbose:
- sys.stderr.write('done.\n')
- return p
-
-
-def normalize_name(name):
- """Normalize a python package name a la PEP 503"""
- # https://www.python.org/dev/peps/pep-0503/#normalized-names
- return re.sub('[-_.]+', '-', name).lower()
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/version.py b/venv/Lib/site-packages/pip/_vendor/distlib/version.py
deleted file mode 100644
index 3eebe18..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/version.py
+++ /dev/null
@@ -1,736 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2017 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""
-Implementation of a flexible versioning scheme providing support for PEP-440,
-setuptools-compatible and semantic versioning.
-"""
-
-import logging
-import re
-
-from .compat import string_types
-from .util import parse_requirement
-
-__all__ = ['NormalizedVersion', 'NormalizedMatcher',
- 'LegacyVersion', 'LegacyMatcher',
- 'SemanticVersion', 'SemanticMatcher',
- 'UnsupportedVersionError', 'get_scheme']
-
-logger = logging.getLogger(__name__)
-
-
-class UnsupportedVersionError(ValueError):
- """This is an unsupported version."""
- pass
-
-
-class Version(object):
- def __init__(self, s):
- self._string = s = s.strip()
- self._parts = parts = self.parse(s)
- assert isinstance(parts, tuple)
- assert len(parts) > 0
-
- def parse(self, s):
- raise NotImplementedError('please implement in a subclass')
-
- def _check_compatible(self, other):
- if type(self) != type(other):
- raise TypeError('cannot compare %r and %r' % (self, other))
-
- def __eq__(self, other):
- self._check_compatible(other)
- return self._parts == other._parts
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- def __lt__(self, other):
- self._check_compatible(other)
- return self._parts < other._parts
-
- def __gt__(self, other):
- return not (self.__lt__(other) or self.__eq__(other))
-
- def __le__(self, other):
- return self.__lt__(other) or self.__eq__(other)
-
- def __ge__(self, other):
- return self.__gt__(other) or self.__eq__(other)
-
- # See http://docs.python.org/reference/datamodel#object.__hash__
- def __hash__(self):
- return hash(self._parts)
-
- def __repr__(self):
- return "%s('%s')" % (self.__class__.__name__, self._string)
-
- def __str__(self):
- return self._string
-
- @property
- def is_prerelease(self):
- raise NotImplementedError('Please implement in subclasses.')
-
-
-class Matcher(object):
- version_class = None
-
- # value is either a callable or the name of a method
- _operators = {
- '<': lambda v, c, p: v < c,
- '>': lambda v, c, p: v > c,
- '<=': lambda v, c, p: v == c or v < c,
- '>=': lambda v, c, p: v == c or v > c,
- '==': lambda v, c, p: v == c,
- '===': lambda v, c, p: v == c,
- # by default, compatible => >=.
- '~=': lambda v, c, p: v == c or v > c,
- '!=': lambda v, c, p: v != c,
- }
-
- # this is a method only to support alternative implementations
- # via overriding
- def parse_requirement(self, s):
- return parse_requirement(s)
-
- def __init__(self, s):
- if self.version_class is None:
- raise ValueError('Please specify a version class')
- self._string = s = s.strip()
- r = self.parse_requirement(s)
- if not r:
- raise ValueError('Not valid: %r' % s)
- self.name = r.name
- self.key = self.name.lower() # for case-insensitive comparisons
- clist = []
- if r.constraints:
- # import pdb; pdb.set_trace()
- for op, s in r.constraints:
- if s.endswith('.*'):
- if op not in ('==', '!='):
- raise ValueError('\'.*\' not allowed for '
- '%r constraints' % op)
- # Could be a partial version (e.g. for '2.*') which
- # won't parse as a version, so keep it as a string
- vn, prefix = s[:-2], True
- # Just to check that vn is a valid version
- self.version_class(vn)
- else:
- # Should parse as a version, so we can create an
- # instance for the comparison
- vn, prefix = self.version_class(s), False
- clist.append((op, vn, prefix))
- self._parts = tuple(clist)
-
- def match(self, version):
- """
- Check if the provided version matches the constraints.
-
- :param version: The version to match against this instance.
- :type version: String or :class:`Version` instance.
- """
- if isinstance(version, string_types):
- version = self.version_class(version)
- for operator, constraint, prefix in self._parts:
- f = self._operators.get(operator)
- if isinstance(f, string_types):
- f = getattr(self, f)
- if not f:
- msg = ('%r not implemented '
- 'for %s' % (operator, self.__class__.__name__))
- raise NotImplementedError(msg)
- if not f(version, constraint, prefix):
- return False
- return True
-
- @property
- def exact_version(self):
- result = None
- if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='):
- result = self._parts[0][1]
- return result
-
- def _check_compatible(self, other):
- if type(self) != type(other) or self.name != other.name:
- raise TypeError('cannot compare %s and %s' % (self, other))
-
- def __eq__(self, other):
- self._check_compatible(other)
- return self.key == other.key and self._parts == other._parts
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- # See http://docs.python.org/reference/datamodel#object.__hash__
- def __hash__(self):
- return hash(self.key) + hash(self._parts)
-
- def __repr__(self):
- return "%s(%r)" % (self.__class__.__name__, self._string)
-
- def __str__(self):
- return self._string
-
-
-PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?'
- r'(\.(post)(\d+))?(\.(dev)(\d+))?'
- r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$')
-
-
-def _pep_440_key(s):
- s = s.strip()
- m = PEP440_VERSION_RE.match(s)
- if not m:
- raise UnsupportedVersionError('Not a valid version: %s' % s)
- groups = m.groups()
- nums = tuple(int(v) for v in groups[1].split('.'))
- while len(nums) > 1 and nums[-1] == 0:
- nums = nums[:-1]
-
- if not groups[0]:
- epoch = 0
- else:
- epoch = int(groups[0])
- pre = groups[4:6]
- post = groups[7:9]
- dev = groups[10:12]
- local = groups[13]
- if pre == (None, None):
- pre = ()
- else:
- pre = pre[0], int(pre[1])
- if post == (None, None):
- post = ()
- else:
- post = post[0], int(post[1])
- if dev == (None, None):
- dev = ()
- else:
- dev = dev[0], int(dev[1])
- if local is None:
- local = ()
- else:
- parts = []
- for part in local.split('.'):
- # to ensure that numeric compares as > lexicographic, avoid
- # comparing them directly, but encode a tuple which ensures
- # correct sorting
- if part.isdigit():
- part = (1, int(part))
- else:
- part = (0, part)
- parts.append(part)
- local = tuple(parts)
- if not pre:
- # either before pre-release, or final release and after
- if not post and dev:
- # before pre-release
- pre = ('a', -1) # to sort before a0
- else:
- pre = ('z',) # to sort after all pre-releases
- # now look at the state of post and dev.
- if not post:
- post = ('_',) # sort before 'a'
- if not dev:
- dev = ('final',)
-
- #print('%s -> %s' % (s, m.groups()))
- return epoch, nums, pre, post, dev, local
-
-
-_normalized_key = _pep_440_key
-
-
-class NormalizedVersion(Version):
- """A rational version.
-
- Good:
- 1.2 # equivalent to "1.2.0"
- 1.2.0
- 1.2a1
- 1.2.3a2
- 1.2.3b1
- 1.2.3c1
- 1.2.3.4
- TODO: fill this out
-
- Bad:
- 1 # minimum two numbers
- 1.2a # release level must have a release serial
- 1.2.3b
- """
- def parse(self, s):
- result = _normalized_key(s)
- # _normalized_key loses trailing zeroes in the release
- # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0
- # However, PEP 440 prefix matching needs it: for example,
- # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0).
- m = PEP440_VERSION_RE.match(s) # must succeed
- groups = m.groups()
- self._release_clause = tuple(int(v) for v in groups[1].split('.'))
- return result
-
- PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev'])
-
- @property
- def is_prerelease(self):
- return any(t[0] in self.PREREL_TAGS for t in self._parts if t)
-
-
-def _match_prefix(x, y):
- x = str(x)
- y = str(y)
- if x == y:
- return True
- if not x.startswith(y):
- return False
- n = len(y)
- return x[n] == '.'
-
-
-class NormalizedMatcher(Matcher):
- version_class = NormalizedVersion
-
- # value is either a callable or the name of a method
- _operators = {
- '~=': '_match_compatible',
- '<': '_match_lt',
- '>': '_match_gt',
- '<=': '_match_le',
- '>=': '_match_ge',
- '==': '_match_eq',
- '===': '_match_arbitrary',
- '!=': '_match_ne',
- }
-
- def _adjust_local(self, version, constraint, prefix):
- if prefix:
- strip_local = '+' not in constraint and version._parts[-1]
- else:
- # both constraint and version are
- # NormalizedVersion instances.
- # If constraint does not have a local component,
- # ensure the version doesn't, either.
- strip_local = not constraint._parts[-1] and version._parts[-1]
- if strip_local:
- s = version._string.split('+', 1)[0]
- version = self.version_class(s)
- return version, constraint
-
- def _match_lt(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if version >= constraint:
- return False
- release_clause = constraint._release_clause
- pfx = '.'.join([str(i) for i in release_clause])
- return not _match_prefix(version, pfx)
-
- def _match_gt(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if version <= constraint:
- return False
- release_clause = constraint._release_clause
- pfx = '.'.join([str(i) for i in release_clause])
- return not _match_prefix(version, pfx)
-
- def _match_le(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- return version <= constraint
-
- def _match_ge(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- return version >= constraint
-
- def _match_eq(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if not prefix:
- result = (version == constraint)
- else:
- result = _match_prefix(version, constraint)
- return result
-
- def _match_arbitrary(self, version, constraint, prefix):
- return str(version) == str(constraint)
-
- def _match_ne(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if not prefix:
- result = (version != constraint)
- else:
- result = not _match_prefix(version, constraint)
- return result
-
- def _match_compatible(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if version == constraint:
- return True
- if version < constraint:
- return False
-# if not prefix:
-# return True
- release_clause = constraint._release_clause
- if len(release_clause) > 1:
- release_clause = release_clause[:-1]
- pfx = '.'.join([str(i) for i in release_clause])
- return _match_prefix(version, pfx)
-
-_REPLACEMENTS = (
- (re.compile('[.+-]$'), ''), # remove trailing puncts
- (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start
- (re.compile('^[.-]'), ''), # remove leading puncts
- (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses
- (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion)
- (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion)
- (re.compile('[.]{2,}'), '.'), # multiple runs of '.'
- (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha
- (re.compile(r'\b(pre-alpha|prealpha)\b'),
- 'pre.alpha'), # standardise
- (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses
-)
-
-_SUFFIX_REPLACEMENTS = (
- (re.compile('^[:~._+-]+'), ''), # remove leading puncts
- (re.compile('[,*")([\\]]'), ''), # remove unwanted chars
- (re.compile('[~:+_ -]'), '.'), # replace illegal chars
- (re.compile('[.]{2,}'), '.'), # multiple runs of '.'
- (re.compile(r'\.$'), ''), # trailing '.'
-)
-
-_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)')
-
-
-def _suggest_semantic_version(s):
- """
- Try to suggest a semantic form for a version for which
- _suggest_normalized_version couldn't come up with anything.
- """
- result = s.strip().lower()
- for pat, repl in _REPLACEMENTS:
- result = pat.sub(repl, result)
- if not result:
- result = '0.0.0'
-
- # Now look for numeric prefix, and separate it out from
- # the rest.
- #import pdb; pdb.set_trace()
- m = _NUMERIC_PREFIX.match(result)
- if not m:
- prefix = '0.0.0'
- suffix = result
- else:
- prefix = m.groups()[0].split('.')
- prefix = [int(i) for i in prefix]
- while len(prefix) < 3:
- prefix.append(0)
- if len(prefix) == 3:
- suffix = result[m.end():]
- else:
- suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():]
- prefix = prefix[:3]
- prefix = '.'.join([str(i) for i in prefix])
- suffix = suffix.strip()
- if suffix:
- #import pdb; pdb.set_trace()
- # massage the suffix.
- for pat, repl in _SUFFIX_REPLACEMENTS:
- suffix = pat.sub(repl, suffix)
-
- if not suffix:
- result = prefix
- else:
- sep = '-' if 'dev' in suffix else '+'
- result = prefix + sep + suffix
- if not is_semver(result):
- result = None
- return result
-
-
-def _suggest_normalized_version(s):
- """Suggest a normalized version close to the given version string.
-
- If you have a version string that isn't rational (i.e. NormalizedVersion
- doesn't like it) then you might be able to get an equivalent (or close)
- rational version from this function.
-
- This does a number of simple normalizations to the given string, based
- on observation of versions currently in use on PyPI. Given a dump of
- those version during PyCon 2009, 4287 of them:
- - 2312 (53.93%) match NormalizedVersion without change
- with the automatic suggestion
- - 3474 (81.04%) match when using this suggestion method
-
- @param s {str} An irrational version string.
- @returns A rational version string, or None, if couldn't determine one.
- """
- try:
- _normalized_key(s)
- return s # already rational
- except UnsupportedVersionError:
- pass
-
- rs = s.lower()
-
- # part of this could use maketrans
- for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'),
- ('beta', 'b'), ('rc', 'c'), ('-final', ''),
- ('-pre', 'c'),
- ('-release', ''), ('.release', ''), ('-stable', ''),
- ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''),
- ('final', '')):
- rs = rs.replace(orig, repl)
-
- # if something ends with dev or pre, we add a 0
- rs = re.sub(r"pre$", r"pre0", rs)
- rs = re.sub(r"dev$", r"dev0", rs)
-
- # if we have something like "b-2" or "a.2" at the end of the
- # version, that is probably beta, alpha, etc
- # let's remove the dash or dot
- rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs)
-
- # 1.0-dev-r371 -> 1.0.dev371
- # 0.1-dev-r79 -> 0.1.dev79
- rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs)
-
- # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1
- rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs)
-
- # Clean: v0.3, v1.0
- if rs.startswith('v'):
- rs = rs[1:]
-
- # Clean leading '0's on numbers.
- #TODO: unintended side-effect on, e.g., "2003.05.09"
- # PyPI stats: 77 (~2%) better
- rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs)
-
- # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers
- # zero.
- # PyPI stats: 245 (7.56%) better
- rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs)
-
- # the 'dev-rNNN' tag is a dev tag
- rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs)
-
- # clean the - when used as a pre delimiter
- rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs)
-
- # a terminal "dev" or "devel" can be changed into ".dev0"
- rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs)
-
- # a terminal "dev" can be changed into ".dev0"
- rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs)
-
- # a terminal "final" or "stable" can be removed
- rs = re.sub(r"(final|stable)$", "", rs)
-
- # The 'r' and the '-' tags are post release tags
- # 0.4a1.r10 -> 0.4a1.post10
- # 0.9.33-17222 -> 0.9.33.post17222
- # 0.9.33-r17222 -> 0.9.33.post17222
- rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs)
-
- # Clean 'r' instead of 'dev' usage:
- # 0.9.33+r17222 -> 0.9.33.dev17222
- # 1.0dev123 -> 1.0.dev123
- # 1.0.git123 -> 1.0.dev123
- # 1.0.bzr123 -> 1.0.dev123
- # 0.1a0dev.123 -> 0.1a0.dev123
- # PyPI stats: ~150 (~4%) better
- rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs)
-
- # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage:
- # 0.2.pre1 -> 0.2c1
- # 0.2-c1 -> 0.2c1
- # 1.0preview123 -> 1.0c123
- # PyPI stats: ~21 (0.62%) better
- rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs)
-
- # Tcl/Tk uses "px" for their post release markers
- rs = re.sub(r"p(\d+)$", r".post\1", rs)
-
- try:
- _normalized_key(rs)
- except UnsupportedVersionError:
- rs = None
- return rs
-
-#
-# Legacy version processing (distribute-compatible)
-#
-
-_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I)
-_VERSION_REPLACE = {
- 'pre': 'c',
- 'preview': 'c',
- '-': 'final-',
- 'rc': 'c',
- 'dev': '@',
- '': None,
- '.': None,
-}
-
-
-def _legacy_key(s):
- def get_parts(s):
- result = []
- for p in _VERSION_PART.split(s.lower()):
- p = _VERSION_REPLACE.get(p, p)
- if p:
- if '0' <= p[:1] <= '9':
- p = p.zfill(8)
- else:
- p = '*' + p
- result.append(p)
- result.append('*final')
- return result
-
- result = []
- for p in get_parts(s):
- if p.startswith('*'):
- if p < '*final':
- while result and result[-1] == '*final-':
- result.pop()
- while result and result[-1] == '00000000':
- result.pop()
- result.append(p)
- return tuple(result)
-
-
-class LegacyVersion(Version):
- def parse(self, s):
- return _legacy_key(s)
-
- @property
- def is_prerelease(self):
- result = False
- for x in self._parts:
- if (isinstance(x, string_types) and x.startswith('*') and
- x < '*final'):
- result = True
- break
- return result
-
-
-class LegacyMatcher(Matcher):
- version_class = LegacyVersion
-
- _operators = dict(Matcher._operators)
- _operators['~='] = '_match_compatible'
-
- numeric_re = re.compile(r'^(\d+(\.\d+)*)')
-
- def _match_compatible(self, version, constraint, prefix):
- if version < constraint:
- return False
- m = self.numeric_re.match(str(constraint))
- if not m:
- logger.warning('Cannot compute compatible match for version %s '
- ' and constraint %s', version, constraint)
- return True
- s = m.groups()[0]
- if '.' in s:
- s = s.rsplit('.', 1)[0]
- return _match_prefix(version, s)
-
-#
-# Semantic versioning
-#
-
-_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)'
- r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?'
- r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I)
-
-
-def is_semver(s):
- return _SEMVER_RE.match(s)
-
-
-def _semantic_key(s):
- def make_tuple(s, absent):
- if s is None:
- result = (absent,)
- else:
- parts = s[1:].split('.')
- # We can't compare ints and strings on Python 3, so fudge it
- # by zero-filling numeric values so simulate a numeric comparison
- result = tuple([p.zfill(8) if p.isdigit() else p for p in parts])
- return result
-
- m = is_semver(s)
- if not m:
- raise UnsupportedVersionError(s)
- groups = m.groups()
- major, minor, patch = [int(i) for i in groups[:3]]
- # choose the '|' and '*' so that versions sort correctly
- pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*')
- return (major, minor, patch), pre, build
-
-
-class SemanticVersion(Version):
- def parse(self, s):
- return _semantic_key(s)
-
- @property
- def is_prerelease(self):
- return self._parts[1][0] != '|'
-
-
-class SemanticMatcher(Matcher):
- version_class = SemanticVersion
-
-
-class VersionScheme(object):
- def __init__(self, key, matcher, suggester=None):
- self.key = key
- self.matcher = matcher
- self.suggester = suggester
-
- def is_valid_version(self, s):
- try:
- self.matcher.version_class(s)
- result = True
- except UnsupportedVersionError:
- result = False
- return result
-
- def is_valid_matcher(self, s):
- try:
- self.matcher(s)
- result = True
- except UnsupportedVersionError:
- result = False
- return result
-
- def is_valid_constraint_list(self, s):
- """
- Used for processing some metadata fields
- """
- return self.is_valid_matcher('dummy_name (%s)' % s)
-
- def suggest(self, s):
- if self.suggester is None:
- result = None
- else:
- result = self.suggester(s)
- return result
-
-_SCHEMES = {
- 'normalized': VersionScheme(_normalized_key, NormalizedMatcher,
- _suggest_normalized_version),
- 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s),
- 'semantic': VersionScheme(_semantic_key, SemanticMatcher,
- _suggest_semantic_version),
-}
-
-_SCHEMES['default'] = _SCHEMES['normalized']
-
-
-def get_scheme(name):
- if name not in _SCHEMES:
- raise ValueError('unknown scheme name: %r' % name)
- return _SCHEMES[name]
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe b/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe
deleted file mode 100644
index e6439e9..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe b/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe
deleted file mode 100644
index 46139db..0000000
Binary files a/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe and /dev/null differ
diff --git a/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py b/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py
deleted file mode 100644
index 1e2c7a0..0000000
--- a/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py
+++ /dev/null
@@ -1,1018 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013-2017 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-from __future__ import unicode_literals
-
-import base64
-import codecs
-import datetime
-import distutils.util
-from email import message_from_file
-import hashlib
-import imp
-import json
-import logging
-import os
-import posixpath
-import re
-import shutil
-import sys
-import tempfile
-import zipfile
-
-from . import __version__, DistlibException
-from .compat import sysconfig, ZipFile, fsdecode, text_type, filter
-from .database import InstalledDistribution
-from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME,
- LEGACY_METADATA_FILENAME)
-from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache,
- cached_property, get_cache_base, read_exports, tempdir)
-from .version import NormalizedVersion, UnsupportedVersionError
-
-logger = logging.getLogger(__name__)
-
-cache = None # created when needed
-
-if hasattr(sys, 'pypy_version_info'): # pragma: no cover
- IMP_PREFIX = 'pp'
-elif sys.platform.startswith('java'): # pragma: no cover
- IMP_PREFIX = 'jy'
-elif sys.platform == 'cli': # pragma: no cover
- IMP_PREFIX = 'ip'
-else:
- IMP_PREFIX = 'cp'
-
-VER_SUFFIX = sysconfig.get_config_var('py_version_nodot')
-if not VER_SUFFIX: # pragma: no cover
- VER_SUFFIX = '%s%s' % sys.version_info[:2]
-PYVER = 'py' + VER_SUFFIX
-IMPVER = IMP_PREFIX + VER_SUFFIX
-
-ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_')
-
-ABI = sysconfig.get_config_var('SOABI')
-if ABI and ABI.startswith('cpython-'):
- ABI = ABI.replace('cpython-', 'cp')
-else:
- def _derive_abi():
- parts = ['cp', VER_SUFFIX]
- if sysconfig.get_config_var('Py_DEBUG'):
- parts.append('d')
- if sysconfig.get_config_var('WITH_PYMALLOC'):
- parts.append('m')
- if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4:
- parts.append('u')
- return ''.join(parts)
- ABI = _derive_abi()
- del _derive_abi
-
-FILENAME_RE = re.compile(r'''
-(?P[^-]+)
--(?P\d+[^-]*)
-(-(?P\d+[^-]*))?
--(?P\w+\d+(\.\w+\d+)*)
--(?P\w+)
--(?P\w+(\.\w+)*)
-\.whl$
-''', re.IGNORECASE | re.VERBOSE)
-
-NAME_VERSION_RE = re.compile(r'''
-(?P[^-]+)
--(?P