diff --git a/.gitmodules b/.gitmodules
index 95c8647d45..c70c2097d9 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
[submodule "client/ayon_core/hosts/unreal/integration"]
- path = client/ayon_core/hosts/unreal/integration
+ path = server_addon/unreal/client/ayon_unreal/integration
url = https://github.com/ynput/ayon-unreal-plugin.git
diff --git a/client/ayon_core/addon/README.md b/client/ayon_core/addon/README.md
index 88c27db154..e1c04ea0d6 100644
--- a/client/ayon_core/addon/README.md
+++ b/client/ayon_core/addon/README.md
@@ -35,14 +35,14 @@ AYON addons should contain separated logic of specific kind of implementation, s
- addon has more logic when used in a tray
- it is possible that addon can be used only in the tray
- abstract methods
- - `tray_init` - initialization triggered after `initialize` when used in `TrayModulesManager` and before `connect_with_addons`
+ - `tray_init` - initialization triggered after `initialize` when used in `TrayAddonsManager` and before `connect_with_addons`
- `tray_menu` - add actions to tray widget's menu that represent the addon
- `tray_start` - start of addon's login in tray
- addon is initialized and connected with other addons
- `tray_exit` - addon's cleanup like stop and join threads etc.
- - order of calling is based on implementation this order is how it works with `TrayModulesManager`
+ - order of calling is based on implementation this order is how it works with `TrayAddonsManager`
- it is recommended to import and use GUI implementation only in these methods
-- has attribute `tray_initialized` (bool) which is set to False by default and is set by `TrayModulesManager` to True after `tray_init`
+- has attribute `tray_initialized` (bool) which is set to False by default and is set by `TrayAddonsManager` to True after `tray_init`
- if addon has logic only in tray or for both then should be checking for `tray_initialized` attribute to decide how should handle situations
### ITrayService
diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py
index 8a23c1a5d7..b10629ede8 100644
--- a/client/ayon_core/addon/base.py
+++ b/client/ayon_core/addon/base.py
@@ -37,14 +37,7 @@ IGNORED_DEFAULT_FILENAMES = (
"base.py",
"interfaces.py",
"click_wrap.py",
- "example_addons",
- "default_modules",
)
-IGNORED_HOSTS_IN_AYON = {
- "flame",
- "harmony",
-}
-IGNORED_MODULES_IN_AYON = set()
# When addon was moved from ayon-core codebase
# - this is used to log the missing addon
@@ -70,6 +63,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = {
"royalrender": VersionInfo(0, 2, 0),
"substancepainter": VersionInfo(0, 2, 0),
"houdini": VersionInfo(0, 3, 0),
+ "unreal": VersionInfo(0, 2, 0),
}
@@ -420,12 +414,6 @@ def _load_addons_in_core(
hosts_dir = os.path.join(AYON_CORE_ROOT, "hosts")
modules_dir = os.path.join(AYON_CORE_ROOT, "modules")
- ignored_host_names = set(IGNORED_HOSTS_IN_AYON)
- ignored_module_dir_filenames = (
- set(IGNORED_DEFAULT_FILENAMES)
- | IGNORED_MODULES_IN_AYON
- )
-
for dirpath in {hosts_dir, modules_dir}:
if not os.path.exists(dirpath):
log.warning((
@@ -434,10 +422,9 @@ def _load_addons_in_core(
continue
is_in_modules_dir = dirpath == modules_dir
+ ignored_filenames = set()
if is_in_modules_dir:
- ignored_filenames = ignored_module_dir_filenames
- else:
- ignored_filenames = ignored_host_names
+ ignored_filenames = set(IGNORED_DEFAULT_FILENAMES)
for filename in os.listdir(dirpath):
# Ignore filenames
@@ -503,9 +490,6 @@ def _load_addons_in_core(
def _load_addons():
- # Support to use 'openpype' imports
- sys.modules["openpype"] = sys.modules["ayon_core"]
-
# Key under which will be modules imported in `sys.modules`
modules_key = "openpype_modules"
diff --git a/client/ayon_core/cli.py b/client/ayon_core/cli.py
index bd47dc1aac..60cf5624b0 100644
--- a/client/ayon_core/cli.py
+++ b/client/ayon_core/cli.py
@@ -268,7 +268,7 @@ def main(*args, **kwargs):
os.path.join(AYON_CORE_ROOT, "tools"),
# add common AYON vendor
# (common for multiple Python interpreter versions)
- os.path.join(AYON_CORE_ROOT, "vendor", "python", "common")
+ os.path.join(AYON_CORE_ROOT, "vendor", "python")
]
for path in additional_paths:
if path not in split_paths:
diff --git a/client/ayon_core/cli_commands.py b/client/ayon_core/cli_commands.py
index 0fb18be687..f71588e196 100644
--- a/client/ayon_core/cli_commands.py
+++ b/client/ayon_core/cli_commands.py
@@ -36,7 +36,7 @@ class Commands:
log.warning(
"Failed to add cli command for module \"{}\"".format(
addon.name
- )
+ ), exc_info=True
)
return click_func
diff --git a/client/ayon_core/hosts/unreal/__init__.py b/client/ayon_core/hosts/unreal/__init__.py
deleted file mode 100644
index 42dd8f0ac4..0000000000
--- a/client/ayon_core/hosts/unreal/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from .addon import UnrealAddon
-
-
-__all__ = (
- "UnrealAddon",
-)
diff --git a/client/ayon_core/lib/__init__.py b/client/ayon_core/lib/__init__.py
index e25d3479ee..1f864284cd 100644
--- a/client/ayon_core/lib/__init__.py
+++ b/client/ayon_core/lib/__init__.py
@@ -1,19 +1,6 @@
# -*- coding: utf-8 -*-
# flake8: noqa E402
"""AYON lib functions."""
-# add vendor to sys path based on Python version
-import sys
-import os
-import site
-from ayon_core import AYON_CORE_ROOT
-
-# Add Python version specific vendor folder
-python_version_dir = os.path.join(
- AYON_CORE_ROOT, "vendor", "python", "python_{}".format(sys.version[0])
-)
-# Prepend path in sys paths
-sys.path.insert(0, python_version_dir)
-site.addsitedir(python_version_dir)
from .local_settings import (
IniSettingRegistry,
diff --git a/client/ayon_core/lib/attribute_definitions.py b/client/ayon_core/lib/attribute_definitions.py
index 3dd284b8e4..0a9d38ab65 100644
--- a/client/ayon_core/lib/attribute_definitions.py
+++ b/client/ayon_core/lib/attribute_definitions.py
@@ -281,7 +281,7 @@ class HiddenDef(AbstractAttrDef):
def __init__(self, key, default=None, **kwargs):
kwargs["default"] = default
kwargs["hidden"] = True
- super(UnknownDef, self).__init__(key, **kwargs)
+ super(HiddenDef, self).__init__(key, **kwargs)
def convert_value(self, value):
return value
diff --git a/client/ayon_core/pipeline/create/context.py b/client/ayon_core/pipeline/create/context.py
index 45846553a4..0d8722dab1 100644
--- a/client/ayon_core/pipeline/create/context.py
+++ b/client/ayon_core/pipeline/create/context.py
@@ -37,6 +37,7 @@ from .creator_plugins import (
# Changes of instances and context are send as tuple of 2 information
UpdateData = collections.namedtuple("UpdateData", ["instance", "changes"])
+_NOT_SET = object()
class UnavailableSharedData(Exception):
@@ -1401,6 +1402,11 @@ class CreateContext:
self._current_folder_path = None
self._current_task_name = None
self._current_workfile_path = None
+ self._current_project_settings = None
+
+ self._current_folder_entity = _NOT_SET
+ self._current_task_entity = _NOT_SET
+ self._current_task_type = _NOT_SET
self._current_project_anatomy = None
@@ -1571,6 +1577,64 @@ class CreateContext:
return self._current_task_name
+ def get_current_task_type(self):
+ """Task type which was used as current context on context reset.
+
+ Returns:
+ Union[str, None]: Task type.
+
+ """
+ if self._current_task_type is _NOT_SET:
+ task_type = None
+ task_entity = self.get_current_task_entity()
+ if task_entity:
+ task_type = task_entity["taskType"]
+ self._current_task_type = task_type
+ return self._current_task_type
+
+ def get_current_folder_entity(self):
+ """Folder entity for current context folder.
+
+ Returns:
+ Union[dict[str, Any], None]: Folder entity.
+
+ """
+ if self._current_folder_entity is not _NOT_SET:
+ return copy.deepcopy(self._current_folder_entity)
+ folder_entity = None
+ folder_path = self.get_current_folder_path()
+ if folder_path:
+ project_name = self.get_current_project_name()
+ folder_entity = ayon_api.get_folder_by_path(
+ project_name, folder_path
+ )
+ self._current_folder_entity = folder_entity
+ return copy.deepcopy(self._current_folder_entity)
+
+ def get_current_task_entity(self):
+ """Task entity for current context task.
+
+ Returns:
+ Union[dict[str, Any], None]: Task entity.
+
+ """
+ if self._current_task_entity is not _NOT_SET:
+ return copy.deepcopy(self._current_task_entity)
+ task_entity = None
+ task_name = self.get_current_task_name()
+ if task_name:
+ folder_entity = self.get_current_folder_entity()
+ if folder_entity:
+ project_name = self.get_current_project_name()
+ task_entity = ayon_api.get_task_by_name(
+ project_name,
+ folder_id=folder_entity["id"],
+ task_name=task_name
+ )
+ self._current_task_entity = task_entity
+ return copy.deepcopy(self._current_task_entity)
+
+
def get_current_workfile_path(self):
"""Workfile path which was opened on context reset.
@@ -1592,6 +1656,12 @@ class CreateContext:
self._current_project_name)
return self._current_project_anatomy
+ def get_current_project_settings(self):
+ if self._current_project_settings is None:
+ self._current_project_settings = get_project_settings(
+ self.get_current_project_name())
+ return self._current_project_settings
+
@property
def context_has_changed(self):
"""Host context has changed.
@@ -1718,7 +1788,12 @@ class CreateContext:
self._current_task_name = task_name
self._current_workfile_path = workfile_path
+ self._current_folder_entity = _NOT_SET
+ self._current_task_entity = _NOT_SET
+ self._current_task_type = _NOT_SET
+
self._current_project_anatomy = None
+ self._current_project_settings = None
def reset_plugins(self, discover_publish_plugins=True):
"""Reload plugins.
@@ -1772,7 +1847,7 @@ class CreateContext:
def _reset_creator_plugins(self):
# Prepare settings
- project_settings = get_project_settings(self.project_name)
+ project_settings = self.get_current_project_settings()
# Discover and prepare creators
creators = {}
diff --git a/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py b/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py
index ad5a5d43fc..0c15ec0b57 100644
--- a/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py
+++ b/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py
@@ -391,7 +391,11 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
anatomy_data.update(folder_data)
return
- if instance.data.get("newAssetPublishing"):
+ if (
+ instance.data.get("newHierarchyIntegration")
+ # Backwards compatible (Deprecated since 24/06/06)
+ or instance.data.get("newAssetPublishing")
+ ):
hierarchy = instance.data["hierarchy"]
anatomy_data["hierarchy"] = hierarchy
@@ -409,7 +413,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
"path": instance.data["folderPath"],
# TODO get folder type from hierarchy
# Using 'Shot' is current default behavior of editorial
- # (or 'newAssetPublishing') publishing.
+ # (or 'newHierarchyIntegration') publishing.
"type": "Shot",
},
})
@@ -432,15 +436,22 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
if task_data:
# Fill task data
# - if we're in editorial, make sure the task type is filled
- if (
- not instance.data.get("newAssetPublishing")
- or task_data["type"]
- ):
+ new_hierarchy = (
+ instance.data.get("newHierarchyIntegration")
+ # Backwards compatible (Deprecated since 24/06/06)
+ or instance.data.get("newAssetPublishing")
+ )
+ if not new_hierarchy or task_data["type"]:
anatomy_data["task"] = task_data
return
# New hierarchy is not created, so we can only skip rest of the logic
- if not instance.data.get("newAssetPublishing"):
+ new_hierarchy = (
+ instance.data.get("newHierarchyIntegration")
+ # Backwards compatible (Deprecated since 24/06/06)
+ or instance.data.get("newAssetPublishing")
+ )
+ if not new_hierarchy:
return
# Try to find task data based on hierarchy context and folder path
diff --git a/client/ayon_core/plugins/publish/collect_scene_version.py b/client/ayon_core/plugins/publish/collect_scene_version.py
index b04900c74e..8b99e2cd98 100644
--- a/client/ayon_core/plugins/publish/collect_scene_version.py
+++ b/client/ayon_core/plugins/publish/collect_scene_version.py
@@ -27,7 +27,8 @@ class CollectSceneVersion(pyblish.api.ContextPlugin):
"nuke",
"photoshop",
"resolve",
- "tvpaint"
+ "tvpaint",
+ "motionbuilder"
]
# in some cases of headless publishing (for example webpublisher using PS)
diff --git a/client/ayon_core/plugins/publish/extract_color_transcode.py b/client/ayon_core/plugins/publish/extract_color_transcode.py
index 1130c575a3..07f10cb469 100644
--- a/client/ayon_core/plugins/publish/extract_color_transcode.py
+++ b/client/ayon_core/plugins/publish/extract_color_transcode.py
@@ -364,7 +364,7 @@ class ExtractOIIOTranscode(publish.Extractor):
if not repre.get("colorspaceData"):
self.log.debug("Representation '{}' has no colorspace data. "
- "Skipped.")
+ "Skipped.".format(repre["name"]))
return False
return True
diff --git a/client/ayon_core/plugins/publish/validate_asset_docs.py b/client/ayon_core/plugins/publish/validate_asset_docs.py
index 95fe4252be..b80b81b366 100644
--- a/client/ayon_core/plugins/publish/validate_asset_docs.py
+++ b/client/ayon_core/plugins/publish/validate_asset_docs.py
@@ -24,7 +24,11 @@ class ValidateFolderEntities(pyblish.api.InstancePlugin):
if instance.data.get("folderEntity"):
self.log.debug("Instance has set fodler entity in its data.")
- elif instance.data.get("newAssetPublishing"):
+ elif (
+ instance.data.get("newHierarchyIntegration")
+ # Backwards compatible (Deprecated since 24/06/06)
+ or instance.data.get("newAssetPublishing")
+ ):
# skip if it is editorial
self.log.debug("Editorial instance has no need to check...")
diff --git a/client/ayon_core/resources/app_icons/motionbuilder.png b/client/ayon_core/resources/app_icons/motionbuilder.png
new file mode 100644
index 0000000000..68a17f7afb
Binary files /dev/null and b/client/ayon_core/resources/app_icons/motionbuilder.png differ
diff --git a/client/ayon_core/resources/ftrack/action_icons/ActionAskWhereIRun.svg b/client/ayon_core/resources/ftrack/action_icons/ActionAskWhereIRun.svg
deleted file mode 100644
index c02b8f83d8..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/ActionAskWhereIRun.svg
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/AssetsRemover.svg b/client/ayon_core/resources/ftrack/action_icons/AssetsRemover.svg
deleted file mode 100644
index e838ee9f28..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/AssetsRemover.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/client/ayon_core/resources/ftrack/action_icons/BatchTasks.svg b/client/ayon_core/resources/ftrack/action_icons/BatchTasks.svg
deleted file mode 100644
index 5cf5d423dd..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/BatchTasks.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/ComponentOpen.svg b/client/ayon_core/resources/ftrack/action_icons/ComponentOpen.svg
deleted file mode 100644
index f549e6142b..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/ComponentOpen.svg
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/CreateFolders.svg b/client/ayon_core/resources/ftrack/action_icons/CreateFolders.svg
deleted file mode 100644
index 18efc273aa..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/CreateFolders.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/CreateProjectFolders.svg b/client/ayon_core/resources/ftrack/action_icons/CreateProjectFolders.svg
deleted file mode 100644
index 0e5821b0be..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/CreateProjectFolders.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/DeleteAsset.svg b/client/ayon_core/resources/ftrack/action_icons/DeleteAsset.svg
deleted file mode 100644
index 855bdae7c5..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/DeleteAsset.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/Delivery.svg b/client/ayon_core/resources/ftrack/action_icons/Delivery.svg
deleted file mode 100644
index a6333333ae..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/Delivery.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/MultipleNotes.svg b/client/ayon_core/resources/ftrack/action_icons/MultipleNotes.svg
deleted file mode 100644
index 40113fc709..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/MultipleNotes.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/OpenPypeAdmin.svg b/client/ayon_core/resources/ftrack/action_icons/OpenPypeAdmin.svg
deleted file mode 100644
index c2abc6146f..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/OpenPypeAdmin.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/PrepareProject.svg b/client/ayon_core/resources/ftrack/action_icons/PrepareProject.svg
deleted file mode 100644
index 644d83f84d..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/PrepareProject.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/RV.png b/client/ayon_core/resources/ftrack/action_icons/RV.png
deleted file mode 100644
index 741e7a9772..0000000000
Binary files a/client/ayon_core/resources/ftrack/action_icons/RV.png and /dev/null differ
diff --git a/client/ayon_core/resources/ftrack/action_icons/SeedProject.svg b/client/ayon_core/resources/ftrack/action_icons/SeedProject.svg
deleted file mode 100644
index ff818b5ecb..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/SeedProject.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/SortReview.svg b/client/ayon_core/resources/ftrack/action_icons/SortReview.svg
deleted file mode 100644
index 13a7def648..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/SortReview.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/TestAction.svg b/client/ayon_core/resources/ftrack/action_icons/TestAction.svg
deleted file mode 100644
index 917ef2d0c7..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/TestAction.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/action_icons/Thumbnail.svg b/client/ayon_core/resources/ftrack/action_icons/Thumbnail.svg
deleted file mode 100644
index 9af330e79a..0000000000
--- a/client/ayon_core/resources/ftrack/action_icons/Thumbnail.svg
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/ayon_core/resources/ftrack/sign_in_message.html b/client/ayon_core/resources/ftrack/sign_in_message.html
deleted file mode 100644
index 8ee2828c26..0000000000
--- a/client/ayon_core/resources/ftrack/sign_in_message.html
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- Sign in to Ftrack was successful
-
- You signed in with username {} .
-
-
- You can close this window now.
-
-
-
diff --git a/client/ayon_core/tools/launcher/ui/hierarchy_page.py b/client/ayon_core/tools/launcher/ui/hierarchy_page.py
index 226a57930b..ad48e8ac77 100644
--- a/client/ayon_core/tools/launcher/ui/hierarchy_page.py
+++ b/client/ayon_core/tools/launcher/ui/hierarchy_page.py
@@ -70,7 +70,7 @@ class HierarchyPage(QtWidgets.QWidget):
main_layout.addWidget(content_body, 1)
btn_back.clicked.connect(self._on_back_clicked)
- refresh_btn.clicked.connect(self._on_refreh_clicked)
+ refresh_btn.clicked.connect(self._on_refresh_clicked)
folders_filter_text.textChanged.connect(self._on_filter_text_changed)
self._is_visible = False
@@ -99,7 +99,7 @@ class HierarchyPage(QtWidgets.QWidget):
def _on_back_clicked(self):
self._controller.set_selected_project(None)
- def _on_refreh_clicked(self):
+ def _on_refresh_clicked(self):
self._controller.refresh()
def _on_filter_text_changed(self, text):
diff --git a/client/ayon_core/tools/publisher/control.py b/client/ayon_core/tools/publisher/control.py
index ede772b917..4e2cfd8783 100644
--- a/client/ayon_core/tools/publisher/control.py
+++ b/client/ayon_core/tools/publisher/control.py
@@ -8,6 +8,7 @@ import tempfile
import shutil
import inspect
from abc import ABCMeta, abstractmethod
+import re
import six
import arrow
@@ -39,6 +40,7 @@ from ayon_core.pipeline.create.context import (
)
from ayon_core.pipeline.publish import get_publish_instance_label
from ayon_core.tools.common_models import HierarchyModel
+from ayon_core.lib.profiles_filtering import filter_profiles
# Define constant for plugin orders offset
PLUGIN_ORDER_OFFSET = 0.5
@@ -1686,6 +1688,15 @@ class PublisherController(BasePublisherController):
"""Publish plugins."""
return self._create_context.publish_plugins
+ def _get_current_project_settings(self):
+ """Current project settings.
+
+ Returns:
+ dict
+ """
+
+ return self._create_context.get_current_project_settings()
+
# Hierarchy model
def get_folder_items(self, project_name, sender=None):
return self._hierarchy_model.get_folder_items(project_name, sender)
@@ -1827,8 +1838,13 @@ class PublisherController(BasePublisherController):
def _collect_creator_items(self):
# TODO add crashed initialization of create plugins to report
output = {}
+ allowed_creator_pattern = self._get_allowed_creators_pattern()
for identifier, creator in self._create_context.creators.items():
try:
+ if (not self._is_label_allowed(
+ creator.label, allowed_creator_pattern)):
+ self.log.debug(f"{creator.label} not allowed for context")
+ continue
output[identifier] = CreatorItem.from_creator(creator)
except Exception:
self.log.error(
@@ -1839,6 +1855,60 @@ class PublisherController(BasePublisherController):
return output
+ def _get_allowed_creators_pattern(self):
+ """Provide regex pattern for configured creator labels in this context
+
+ If no profile matches current context, it shows all creators.
+ Support usage of regular expressions for configured values.
+ Returns:
+ (re.Pattern)[optional]: None or regex compiled patterns
+ into single one ('Render|Image.*')
+ """
+
+ task_type = self._create_context.get_current_task_type()
+ project_settings = self._get_current_project_settings()
+
+ filter_creator_profiles = (
+ project_settings
+ ["core"]
+ ["tools"]
+ ["creator"]
+ ["filter_creator_profiles"]
+ )
+ filtering_criteria = {
+ "task_names": self.current_task_name,
+ "task_types": task_type,
+ "host_names": self._create_context.host_name
+ }
+ profile = filter_profiles(
+ filter_creator_profiles,
+ filtering_criteria,
+ logger=self.log
+ )
+
+ allowed_creator_pattern = None
+ if profile:
+ allowed_creator_labels = {
+ label
+ for label in profile["creator_labels"]
+ if label
+ }
+ self.log.debug(f"Only allowed `{allowed_creator_labels}` creators")
+ allowed_creator_pattern = (
+ re.compile("|".join(allowed_creator_labels)))
+ return allowed_creator_pattern
+
+ def _is_label_allowed(self, label, allowed_labels_regex):
+ """Implement regex support for allowed labels.
+
+ Args:
+ label (str): Label of creator - shown in Publisher
+ allowed_labels_regex (re.Pattern): compiled regular expression
+ """
+ if not allowed_labels_regex:
+ return True
+ return bool(allowed_labels_regex.match(label))
+
def _reset_instances(self):
"""Reset create instances."""
if self._resetting_instances:
diff --git a/client/ayon_core/vendor/python/common/README.md b/client/ayon_core/vendor/python/README.md
similarity index 100%
rename from client/ayon_core/vendor/python/common/README.md
rename to client/ayon_core/vendor/python/README.md
diff --git a/client/ayon_core/vendor/python/python_2/README.md b/client/ayon_core/vendor/python/python_2/README.md
deleted file mode 100644
index f101ddbf54..0000000000
--- a/client/ayon_core/vendor/python/python_2/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## Info
-
-Only **Python 2** specific modules are here.
\ No newline at end of file
diff --git a/client/ayon_core/vendor/python/python_2/arrow/__init__.py b/client/ayon_core/vendor/python/python_2/arrow/__init__.py
deleted file mode 100644
index 2883527be8..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/__init__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-from ._version import __version__
-from .api import get, now, utcnow
-from .arrow import Arrow
-from .factory import ArrowFactory
-from .formatter import (
- FORMAT_ATOM,
- FORMAT_COOKIE,
- FORMAT_RFC822,
- FORMAT_RFC850,
- FORMAT_RFC1036,
- FORMAT_RFC1123,
- FORMAT_RFC2822,
- FORMAT_RFC3339,
- FORMAT_RSS,
- FORMAT_W3C,
-)
-from .parser import ParserError
diff --git a/client/ayon_core/vendor/python/python_2/arrow/_version.py b/client/ayon_core/vendor/python/python_2/arrow/_version.py
deleted file mode 100644
index fd86b3ee91..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/_version.py
+++ /dev/null
@@ -1 +0,0 @@
-__version__ = "0.17.0"
diff --git a/client/ayon_core/vendor/python/python_2/arrow/api.py b/client/ayon_core/vendor/python/python_2/arrow/api.py
deleted file mode 100644
index a6b7be3de2..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/api.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Provides the default implementation of :class:`ArrowFactory `
-methods for use as a module API.
-
-"""
-
-from __future__ import absolute_import
-
-from arrow.factory import ArrowFactory
-
-# internal default factory.
-_factory = ArrowFactory()
-
-
-def get(*args, **kwargs):
- """Calls the default :class:`ArrowFactory ` ``get`` method."""
-
- return _factory.get(*args, **kwargs)
-
-
-get.__doc__ = _factory.get.__doc__
-
-
-def utcnow():
- """Calls the default :class:`ArrowFactory ` ``utcnow`` method."""
-
- return _factory.utcnow()
-
-
-utcnow.__doc__ = _factory.utcnow.__doc__
-
-
-def now(tz=None):
- """Calls the default :class:`ArrowFactory ` ``now`` method."""
-
- return _factory.now(tz)
-
-
-now.__doc__ = _factory.now.__doc__
-
-
-def factory(type):
- """Returns an :class:`.ArrowFactory` for the specified :class:`Arrow `
- or derived type.
-
- :param type: the type, :class:`Arrow ` or derived.
-
- """
-
- return ArrowFactory(type)
-
-
-__all__ = ["get", "utcnow", "now", "factory"]
diff --git a/client/ayon_core/vendor/python/python_2/arrow/arrow.py b/client/ayon_core/vendor/python/python_2/arrow/arrow.py
deleted file mode 100644
index 4fe9541789..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/arrow.py
+++ /dev/null
@@ -1,1584 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Provides the :class:`Arrow ` class, an enhanced ``datetime``
-replacement.
-
-"""
-
-from __future__ import absolute_import
-
-import calendar
-import sys
-import warnings
-from datetime import datetime, timedelta
-from datetime import tzinfo as dt_tzinfo
-from math import trunc
-
-from dateutil import tz as dateutil_tz
-from dateutil.relativedelta import relativedelta
-
-from arrow import formatter, locales, parser, util
-
-if sys.version_info[:2] < (3, 6): # pragma: no cover
- with warnings.catch_warnings():
- warnings.simplefilter("default", DeprecationWarning)
- warnings.warn(
- "Arrow will drop support for Python 2.7 and 3.5 in the upcoming v1.0.0 release. Please upgrade to "
- "Python 3.6+ to continue receiving updates for Arrow.",
- DeprecationWarning,
- )
-
-
-class Arrow(object):
- """An :class:`Arrow ` object.
-
- Implements the ``datetime`` interface, behaving as an aware ``datetime`` while implementing
- additional functionality.
-
- :param year: the calendar year.
- :param month: the calendar month.
- :param day: the calendar day.
- :param hour: (optional) the hour. Defaults to 0.
- :param minute: (optional) the minute, Defaults to 0.
- :param second: (optional) the second, Defaults to 0.
- :param microsecond: (optional) the microsecond. Defaults to 0.
- :param tzinfo: (optional) A timezone expression. Defaults to UTC.
- :param fold: (optional) 0 or 1, used to disambiguate repeated times. Defaults to 0.
-
- .. _tz-expr:
-
- Recognized timezone expressions:
-
- - A ``tzinfo`` object.
- - A ``str`` describing a timezone, similar to 'US/Pacific', or 'Europe/Berlin'.
- - A ``str`` in ISO 8601 style, as in '+07:00'.
- - A ``str``, one of the following: 'local', 'utc', 'UTC'.
-
- Usage::
-
- >>> import arrow
- >>> arrow.Arrow(2013, 5, 5, 12, 30, 45)
-
-
- """
-
- resolution = datetime.resolution
-
- _ATTRS = ["year", "month", "day", "hour", "minute", "second", "microsecond"]
- _ATTRS_PLURAL = ["{}s".format(a) for a in _ATTRS]
- _MONTHS_PER_QUARTER = 3
- _SECS_PER_MINUTE = float(60)
- _SECS_PER_HOUR = float(60 * 60)
- _SECS_PER_DAY = float(60 * 60 * 24)
- _SECS_PER_WEEK = float(60 * 60 * 24 * 7)
- _SECS_PER_MONTH = float(60 * 60 * 24 * 30.5)
- _SECS_PER_YEAR = float(60 * 60 * 24 * 365.25)
-
- def __init__(
- self,
- year,
- month,
- day,
- hour=0,
- minute=0,
- second=0,
- microsecond=0,
- tzinfo=None,
- **kwargs
- ):
- if tzinfo is None:
- tzinfo = dateutil_tz.tzutc()
- # detect that tzinfo is a pytz object (issue #626)
- elif (
- isinstance(tzinfo, dt_tzinfo)
- and hasattr(tzinfo, "localize")
- and hasattr(tzinfo, "zone")
- and tzinfo.zone
- ):
- tzinfo = parser.TzinfoParser.parse(tzinfo.zone)
- elif util.isstr(tzinfo):
- tzinfo = parser.TzinfoParser.parse(tzinfo)
-
- fold = kwargs.get("fold", 0)
-
- # use enfold here to cover direct arrow.Arrow init on 2.7/3.5
- self._datetime = dateutil_tz.enfold(
- datetime(year, month, day, hour, minute, second, microsecond, tzinfo),
- fold=fold,
- )
-
- # factories: single object, both original and from datetime.
-
- @classmethod
- def now(cls, tzinfo=None):
- """Constructs an :class:`Arrow ` object, representing "now" in the given
- timezone.
-
- :param tzinfo: (optional) a ``tzinfo`` object. Defaults to local time.
-
- Usage::
-
- >>> arrow.now('Asia/Baku')
-
-
- """
-
- if tzinfo is None:
- tzinfo = dateutil_tz.tzlocal()
-
- dt = datetime.now(tzinfo)
-
- return cls(
- dt.year,
- dt.month,
- dt.day,
- dt.hour,
- dt.minute,
- dt.second,
- dt.microsecond,
- dt.tzinfo,
- fold=getattr(dt, "fold", 0),
- )
-
- @classmethod
- def utcnow(cls):
- """Constructs an :class:`Arrow ` object, representing "now" in UTC
- time.
-
- Usage::
-
- >>> arrow.utcnow()
-
-
- """
-
- dt = datetime.now(dateutil_tz.tzutc())
-
- return cls(
- dt.year,
- dt.month,
- dt.day,
- dt.hour,
- dt.minute,
- dt.second,
- dt.microsecond,
- dt.tzinfo,
- fold=getattr(dt, "fold", 0),
- )
-
- @classmethod
- def fromtimestamp(cls, timestamp, tzinfo=None):
- """Constructs an :class:`Arrow ` object from a timestamp, converted to
- the given timezone.
-
- :param timestamp: an ``int`` or ``float`` timestamp, or a ``str`` that converts to either.
- :param tzinfo: (optional) a ``tzinfo`` object. Defaults to local time.
- """
-
- if tzinfo is None:
- tzinfo = dateutil_tz.tzlocal()
- elif util.isstr(tzinfo):
- tzinfo = parser.TzinfoParser.parse(tzinfo)
-
- if not util.is_timestamp(timestamp):
- raise ValueError(
- "The provided timestamp '{}' is invalid.".format(timestamp)
- )
-
- timestamp = util.normalize_timestamp(float(timestamp))
- dt = datetime.fromtimestamp(timestamp, tzinfo)
-
- return cls(
- dt.year,
- dt.month,
- dt.day,
- dt.hour,
- dt.minute,
- dt.second,
- dt.microsecond,
- dt.tzinfo,
- fold=getattr(dt, "fold", 0),
- )
-
- @classmethod
- def utcfromtimestamp(cls, timestamp):
- """Constructs an :class:`Arrow ` object from a timestamp, in UTC time.
-
- :param timestamp: an ``int`` or ``float`` timestamp, or a ``str`` that converts to either.
-
- """
-
- if not util.is_timestamp(timestamp):
- raise ValueError(
- "The provided timestamp '{}' is invalid.".format(timestamp)
- )
-
- timestamp = util.normalize_timestamp(float(timestamp))
- dt = datetime.utcfromtimestamp(timestamp)
-
- return cls(
- dt.year,
- dt.month,
- dt.day,
- dt.hour,
- dt.minute,
- dt.second,
- dt.microsecond,
- dateutil_tz.tzutc(),
- fold=getattr(dt, "fold", 0),
- )
-
- @classmethod
- def fromdatetime(cls, dt, tzinfo=None):
- """Constructs an :class:`Arrow ` object from a ``datetime`` and
- optional replacement timezone.
-
- :param dt: the ``datetime``
- :param tzinfo: (optional) A :ref:`timezone expression `. Defaults to ``dt``'s
- timezone, or UTC if naive.
-
- If you only want to replace the timezone of naive datetimes::
-
- >>> dt
- datetime.datetime(2013, 5, 5, 0, 0, tzinfo=tzutc())
- >>> arrow.Arrow.fromdatetime(dt, dt.tzinfo or 'US/Pacific')
-
-
- """
-
- if tzinfo is None:
- if dt.tzinfo is None:
- tzinfo = dateutil_tz.tzutc()
- else:
- tzinfo = dt.tzinfo
-
- return cls(
- dt.year,
- dt.month,
- dt.day,
- dt.hour,
- dt.minute,
- dt.second,
- dt.microsecond,
- tzinfo,
- fold=getattr(dt, "fold", 0),
- )
-
- @classmethod
- def fromdate(cls, date, tzinfo=None):
- """Constructs an :class:`Arrow ` object from a ``date`` and optional
- replacement timezone. Time values are set to 0.
-
- :param date: the ``date``
- :param tzinfo: (optional) A :ref:`timezone expression `. Defaults to UTC.
- """
-
- if tzinfo is None:
- tzinfo = dateutil_tz.tzutc()
-
- return cls(date.year, date.month, date.day, tzinfo=tzinfo)
-
- @classmethod
- def strptime(cls, date_str, fmt, tzinfo=None):
- """Constructs an :class:`Arrow ` object from a date string and format,
- in the style of ``datetime.strptime``. Optionally replaces the parsed timezone.
-
- :param date_str: the date string.
- :param fmt: the format string.
- :param tzinfo: (optional) A :ref:`timezone expression `. Defaults to the parsed
- timezone if ``fmt`` contains a timezone directive, otherwise UTC.
-
- Usage::
-
- >>> arrow.Arrow.strptime('20-01-2019 15:49:10', '%d-%m-%Y %H:%M:%S')
-
-
- """
-
- dt = datetime.strptime(date_str, fmt)
- if tzinfo is None:
- tzinfo = dt.tzinfo
-
- return cls(
- dt.year,
- dt.month,
- dt.day,
- dt.hour,
- dt.minute,
- dt.second,
- dt.microsecond,
- tzinfo,
- fold=getattr(dt, "fold", 0),
- )
-
- # factories: ranges and spans
-
- @classmethod
- def range(cls, frame, start, end=None, tz=None, limit=None):
- """Returns an iterator of :class:`Arrow ` objects, representing
- points in time between two inputs.
-
- :param frame: The timeframe. Can be any ``datetime`` property (day, hour, minute...).
- :param start: A datetime expression, the start of the range.
- :param end: (optional) A datetime expression, the end of the range.
- :param tz: (optional) A :ref:`timezone expression `. Defaults to
- ``start``'s timezone, or UTC if ``start`` is naive.
- :param limit: (optional) A maximum number of tuples to return.
-
- **NOTE**: The ``end`` or ``limit`` must be provided. Call with ``end`` alone to
- return the entire range. Call with ``limit`` alone to return a maximum # of results from
- the start. Call with both to cap a range at a maximum # of results.
-
- **NOTE**: ``tz`` internally **replaces** the timezones of both ``start`` and ``end`` before
- iterating. As such, either call with naive objects and ``tz``, or aware objects from the
- same timezone and no ``tz``.
-
- Supported frame values: year, quarter, month, week, day, hour, minute, second.
-
- Recognized datetime expressions:
-
- - An :class:`Arrow ` object.
- - A ``datetime`` object.
-
- Usage::
-
- >>> start = datetime(2013, 5, 5, 12, 30)
- >>> end = datetime(2013, 5, 5, 17, 15)
- >>> for r in arrow.Arrow.range('hour', start, end):
- ... print(repr(r))
- ...
-
-
-
-
-
-
- **NOTE**: Unlike Python's ``range``, ``end`` *may* be included in the returned iterator::
-
- >>> start = datetime(2013, 5, 5, 12, 30)
- >>> end = datetime(2013, 5, 5, 13, 30)
- >>> for r in arrow.Arrow.range('hour', start, end):
- ... print(repr(r))
- ...
-
-
-
- """
-
- _, frame_relative, relative_steps = cls._get_frames(frame)
-
- tzinfo = cls._get_tzinfo(start.tzinfo if tz is None else tz)
-
- start = cls._get_datetime(start).replace(tzinfo=tzinfo)
- end, limit = cls._get_iteration_params(end, limit)
- end = cls._get_datetime(end).replace(tzinfo=tzinfo)
-
- current = cls.fromdatetime(start)
- original_day = start.day
- day_is_clipped = False
- i = 0
-
- while current <= end and i < limit:
- i += 1
- yield current
-
- values = [getattr(current, f) for f in cls._ATTRS]
- current = cls(*values, tzinfo=tzinfo).shift(
- **{frame_relative: relative_steps}
- )
-
- if frame in ["month", "quarter", "year"] and current.day < original_day:
- day_is_clipped = True
-
- if day_is_clipped and not cls._is_last_day_of_month(current):
- current = current.replace(day=original_day)
-
- def span(self, frame, count=1, bounds="[)"):
- """Returns two new :class:`Arrow ` objects, representing the timespan
- of the :class:`Arrow ` object in a given timeframe.
-
- :param frame: the timeframe. Can be any ``datetime`` property (day, hour, minute...).
- :param count: (optional) the number of frames to span.
- :param bounds: (optional) a ``str`` of either '()', '(]', '[)', or '[]' that specifies
- whether to include or exclude the start and end values in the span. '(' excludes
- the start, '[' includes the start, ')' excludes the end, and ']' includes the end.
- If the bounds are not specified, the default bound '[)' is used.
-
- Supported frame values: year, quarter, month, week, day, hour, minute, second.
-
- Usage::
-
- >>> arrow.utcnow()
-
-
- >>> arrow.utcnow().span('hour')
- (, )
-
- >>> arrow.utcnow().span('day')
- (, )
-
- >>> arrow.utcnow().span('day', count=2)
- (, )
-
- >>> arrow.utcnow().span('day', bounds='[]')
- (, )
-
- """
-
- util.validate_bounds(bounds)
-
- frame_absolute, frame_relative, relative_steps = self._get_frames(frame)
-
- if frame_absolute == "week":
- attr = "day"
- elif frame_absolute == "quarter":
- attr = "month"
- else:
- attr = frame_absolute
-
- index = self._ATTRS.index(attr)
- frames = self._ATTRS[: index + 1]
-
- values = [getattr(self, f) for f in frames]
-
- for _ in range(3 - len(values)):
- values.append(1)
-
- floor = self.__class__(*values, tzinfo=self.tzinfo)
-
- if frame_absolute == "week":
- floor = floor.shift(days=-(self.isoweekday() - 1))
- elif frame_absolute == "quarter":
- floor = floor.shift(months=-((self.month - 1) % 3))
-
- ceil = floor.shift(**{frame_relative: count * relative_steps})
-
- if bounds[0] == "(":
- floor = floor.shift(microseconds=+1)
-
- if bounds[1] == ")":
- ceil = ceil.shift(microseconds=-1)
-
- return floor, ceil
-
- def floor(self, frame):
- """Returns a new :class:`Arrow ` object, representing the "floor"
- of the timespan of the :class:`Arrow ` object in a given timeframe.
- Equivalent to the first element in the 2-tuple returned by
- :func:`span `.
-
- :param frame: the timeframe. Can be any ``datetime`` property (day, hour, minute...).
-
- Usage::
-
- >>> arrow.utcnow().floor('hour')
-
- """
-
- return self.span(frame)[0]
-
- def ceil(self, frame):
- """Returns a new :class:`Arrow ` object, representing the "ceiling"
- of the timespan of the :class:`Arrow ` object in a given timeframe.
- Equivalent to the second element in the 2-tuple returned by
- :func:`span `.
-
- :param frame: the timeframe. Can be any ``datetime`` property (day, hour, minute...).
-
- Usage::
-
- >>> arrow.utcnow().ceil('hour')
-
- """
-
- return self.span(frame)[1]
-
- @classmethod
- def span_range(cls, frame, start, end, tz=None, limit=None, bounds="[)"):
- """Returns an iterator of tuples, each :class:`Arrow ` objects,
- representing a series of timespans between two inputs.
-
- :param frame: The timeframe. Can be any ``datetime`` property (day, hour, minute...).
- :param start: A datetime expression, the start of the range.
- :param end: (optional) A datetime expression, the end of the range.
- :param tz: (optional) A :ref:`timezone expression `. Defaults to
- ``start``'s timezone, or UTC if ``start`` is naive.
- :param limit: (optional) A maximum number of tuples to return.
- :param bounds: (optional) a ``str`` of either '()', '(]', '[)', or '[]' that specifies
- whether to include or exclude the start and end values in each span in the range. '(' excludes
- the start, '[' includes the start, ')' excludes the end, and ']' includes the end.
- If the bounds are not specified, the default bound '[)' is used.
-
- **NOTE**: The ``end`` or ``limit`` must be provided. Call with ``end`` alone to
- return the entire range. Call with ``limit`` alone to return a maximum # of results from
- the start. Call with both to cap a range at a maximum # of results.
-
- **NOTE**: ``tz`` internally **replaces** the timezones of both ``start`` and ``end`` before
- iterating. As such, either call with naive objects and ``tz``, or aware objects from the
- same timezone and no ``tz``.
-
- Supported frame values: year, quarter, month, week, day, hour, minute, second.
-
- Recognized datetime expressions:
-
- - An :class:`Arrow ` object.
- - A ``datetime`` object.
-
- **NOTE**: Unlike Python's ``range``, ``end`` will *always* be included in the returned
- iterator of timespans.
-
- Usage:
-
- >>> start = datetime(2013, 5, 5, 12, 30)
- >>> end = datetime(2013, 5, 5, 17, 15)
- >>> for r in arrow.Arrow.span_range('hour', start, end):
- ... print(r)
- ...
- (, )
- (, )
- (, )
- (, )
- (, )
- (, )
-
- """
-
- tzinfo = cls._get_tzinfo(start.tzinfo if tz is None else tz)
- start = cls.fromdatetime(start, tzinfo).span(frame)[0]
- _range = cls.range(frame, start, end, tz, limit)
- return (r.span(frame, bounds=bounds) for r in _range)
-
- @classmethod
- def interval(cls, frame, start, end, interval=1, tz=None, bounds="[)"):
- """Returns an iterator of tuples, each :class:`Arrow ` objects,
- representing a series of intervals between two inputs.
-
- :param frame: The timeframe. Can be any ``datetime`` property (day, hour, minute...).
- :param start: A datetime expression, the start of the range.
- :param end: (optional) A datetime expression, the end of the range.
- :param interval: (optional) Time interval for the given time frame.
- :param tz: (optional) A timezone expression. Defaults to UTC.
- :param bounds: (optional) a ``str`` of either '()', '(]', '[)', or '[]' that specifies
- whether to include or exclude the start and end values in the intervals. '(' excludes
- the start, '[' includes the start, ')' excludes the end, and ']' includes the end.
- If the bounds are not specified, the default bound '[)' is used.
-
- Supported frame values: year, quarter, month, week, day, hour, minute, second
-
- Recognized datetime expressions:
-
- - An :class:`Arrow ` object.
- - A ``datetime`` object.
-
- Recognized timezone expressions:
-
- - A ``tzinfo`` object.
- - A ``str`` describing a timezone, similar to 'US/Pacific', or 'Europe/Berlin'.
- - A ``str`` in ISO 8601 style, as in '+07:00'.
- - A ``str``, one of the following: 'local', 'utc', 'UTC'.
-
- Usage:
-
- >>> start = datetime(2013, 5, 5, 12, 30)
- >>> end = datetime(2013, 5, 5, 17, 15)
- >>> for r in arrow.Arrow.interval('hour', start, end, 2):
- ... print r
- ...
- (, )
- (, )
- (, )
- """
- if interval < 1:
- raise ValueError("interval has to be a positive integer")
-
- spanRange = iter(cls.span_range(frame, start, end, tz, bounds=bounds))
- while True:
- try:
- intvlStart, intvlEnd = next(spanRange)
- for _ in range(interval - 1):
- _, intvlEnd = next(spanRange)
- yield intvlStart, intvlEnd
- except StopIteration:
- return
-
- # representations
-
- def __repr__(self):
- return "<{} [{}]>".format(self.__class__.__name__, self.__str__())
-
- def __str__(self):
- return self._datetime.isoformat()
-
- def __format__(self, formatstr):
-
- if len(formatstr) > 0:
- return self.format(formatstr)
-
- return str(self)
-
- def __hash__(self):
- return self._datetime.__hash__()
-
- # attributes and properties
-
- def __getattr__(self, name):
-
- if name == "week":
- return self.isocalendar()[1]
-
- if name == "quarter":
- return int((self.month - 1) / self._MONTHS_PER_QUARTER) + 1
-
- if not name.startswith("_"):
- value = getattr(self._datetime, name, None)
-
- if value is not None:
- return value
-
- return object.__getattribute__(self, name)
-
- @property
- def tzinfo(self):
- """Gets the ``tzinfo`` of the :class:`Arrow ` object.
-
- Usage::
-
- >>> arw=arrow.utcnow()
- >>> arw.tzinfo
- tzutc()
-
- """
-
- return self._datetime.tzinfo
-
- @tzinfo.setter
- def tzinfo(self, tzinfo):
- """ Sets the ``tzinfo`` of the :class:`Arrow ` object. """
-
- self._datetime = self._datetime.replace(tzinfo=tzinfo)
-
- @property
- def datetime(self):
- """Returns a datetime representation of the :class:`Arrow ` object.
-
- Usage::
-
- >>> arw=arrow.utcnow()
- >>> arw.datetime
- datetime.datetime(2019, 1, 24, 16, 35, 27, 276649, tzinfo=tzutc())
-
- """
-
- return self._datetime
-
- @property
- def naive(self):
- """Returns a naive datetime representation of the :class:`Arrow `
- object.
-
- Usage::
-
- >>> nairobi = arrow.now('Africa/Nairobi')
- >>> nairobi
-
- >>> nairobi.naive
- datetime.datetime(2019, 1, 23, 19, 27, 12, 297999)
-
- """
-
- return self._datetime.replace(tzinfo=None)
-
- @property
- def timestamp(self):
- """Returns a timestamp representation of the :class:`Arrow ` object, in
- UTC time.
-
- Usage::
-
- >>> arrow.utcnow().timestamp
- 1548260567
-
- """
-
- warnings.warn(
- "For compatibility with the datetime.timestamp() method this property will be replaced with a method in "
- "the 1.0.0 release, please switch to the .int_timestamp property for identical behaviour as soon as "
- "possible.",
- DeprecationWarning,
- )
- return calendar.timegm(self._datetime.utctimetuple())
-
- @property
- def int_timestamp(self):
- """Returns a timestamp representation of the :class:`Arrow ` object, in
- UTC time.
-
- Usage::
-
- >>> arrow.utcnow().int_timestamp
- 1548260567
-
- """
-
- return calendar.timegm(self._datetime.utctimetuple())
-
- @property
- def float_timestamp(self):
- """Returns a floating-point representation of the :class:`Arrow `
- object, in UTC time.
-
- Usage::
-
- >>> arrow.utcnow().float_timestamp
- 1548260516.830896
-
- """
-
- # IDEA get rid of this in 1.0.0 and wrap datetime.timestamp()
- # Or for compatibility retain this but make it call the timestamp method
- with warnings.catch_warnings():
- warnings.simplefilter("ignore", DeprecationWarning)
- return self.timestamp + float(self.microsecond) / 1000000
-
- @property
- def fold(self):
- """ Returns the ``fold`` value of the :class:`Arrow ` object. """
-
- # in python < 3.6 _datetime will be a _DatetimeWithFold if fold=1 and a datetime with no fold attribute
- # otherwise, so we need to return zero to cover the latter case
- return getattr(self._datetime, "fold", 0)
-
- @property
- def ambiguous(self):
- """ Returns a boolean indicating whether the :class:`Arrow ` object is ambiguous."""
-
- return dateutil_tz.datetime_ambiguous(self._datetime)
-
- @property
- def imaginary(self):
- """Indicates whether the :class: `Arrow ` object exists in the current timezone."""
-
- return not dateutil_tz.datetime_exists(self._datetime)
-
- # mutation and duplication.
-
- def clone(self):
- """Returns a new :class:`Arrow ` object, cloned from the current one.
-
- Usage:
-
- >>> arw = arrow.utcnow()
- >>> cloned = arw.clone()
-
- """
-
- return self.fromdatetime(self._datetime)
-
- def replace(self, **kwargs):
- """Returns a new :class:`Arrow ` object with attributes updated
- according to inputs.
-
- Use property names to set their value absolutely::
-
- >>> import arrow
- >>> arw = arrow.utcnow()
- >>> arw
-
- >>> arw.replace(year=2014, month=6)
-
-
- You can also replace the timezone without conversion, using a
- :ref:`timezone expression `::
-
- >>> arw.replace(tzinfo=tz.tzlocal())
-
-
- """
-
- absolute_kwargs = {}
-
- for key, value in kwargs.items():
-
- if key in self._ATTRS:
- absolute_kwargs[key] = value
- elif key in ["week", "quarter"]:
- raise AttributeError("setting absolute {} is not supported".format(key))
- elif key not in ["tzinfo", "fold"]:
- raise AttributeError('unknown attribute: "{}"'.format(key))
-
- current = self._datetime.replace(**absolute_kwargs)
-
- tzinfo = kwargs.get("tzinfo")
-
- if tzinfo is not None:
- tzinfo = self._get_tzinfo(tzinfo)
- current = current.replace(tzinfo=tzinfo)
-
- fold = kwargs.get("fold")
-
- # TODO revisit this once we drop support for 2.7/3.5
- if fold is not None:
- current = dateutil_tz.enfold(current, fold=fold)
-
- return self.fromdatetime(current)
-
- def shift(self, **kwargs):
- """Returns a new :class:`Arrow ` object with attributes updated
- according to inputs.
-
- Use pluralized property names to relatively shift their current value:
-
- >>> import arrow
- >>> arw = arrow.utcnow()
- >>> arw
-
- >>> arw.shift(years=1, months=-1)
-
-
- Day-of-the-week relative shifting can use either Python's weekday numbers
- (Monday = 0, Tuesday = 1 .. Sunday = 6) or using dateutil.relativedelta's
- day instances (MO, TU .. SU). When using weekday numbers, the returned
- date will always be greater than or equal to the starting date.
-
- Using the above code (which is a Saturday) and asking it to shift to Saturday:
-
- >>> arw.shift(weekday=5)
-
-
- While asking for a Monday:
-
- >>> arw.shift(weekday=0)
-
-
- """
-
- relative_kwargs = {}
- additional_attrs = ["weeks", "quarters", "weekday"]
-
- for key, value in kwargs.items():
-
- if key in self._ATTRS_PLURAL or key in additional_attrs:
- relative_kwargs[key] = value
- else:
- raise AttributeError(
- "Invalid shift time frame. Please select one of the following: {}.".format(
- ", ".join(self._ATTRS_PLURAL + additional_attrs)
- )
- )
-
- # core datetime does not support quarters, translate to months.
- relative_kwargs.setdefault("months", 0)
- relative_kwargs["months"] += (
- relative_kwargs.pop("quarters", 0) * self._MONTHS_PER_QUARTER
- )
-
- current = self._datetime + relativedelta(**relative_kwargs)
-
- if not dateutil_tz.datetime_exists(current):
- current = dateutil_tz.resolve_imaginary(current)
-
- return self.fromdatetime(current)
-
- def to(self, tz):
- """Returns a new :class:`Arrow ` object, converted
- to the target timezone.
-
- :param tz: A :ref:`timezone expression `.
-
- Usage::
-
- >>> utc = arrow.utcnow()
- >>> utc
-
-
- >>> utc.to('US/Pacific')
-
-
- >>> utc.to(tz.tzlocal())
-
-
- >>> utc.to('-07:00')
-
-
- >>> utc.to('local')
-
-
- >>> utc.to('local').to('utc')
-
-
- """
-
- if not isinstance(tz, dt_tzinfo):
- tz = parser.TzinfoParser.parse(tz)
-
- dt = self._datetime.astimezone(tz)
-
- return self.__class__(
- dt.year,
- dt.month,
- dt.day,
- dt.hour,
- dt.minute,
- dt.second,
- dt.microsecond,
- dt.tzinfo,
- fold=getattr(dt, "fold", 0),
- )
-
- # string output and formatting
-
- def format(self, fmt="YYYY-MM-DD HH:mm:ssZZ", locale="en_us"):
- """Returns a string representation of the :class:`Arrow ` object,
- formatted according to a format string.
-
- :param fmt: the format string.
-
- Usage::
-
- >>> arrow.utcnow().format('YYYY-MM-DD HH:mm:ss ZZ')
- '2013-05-09 03:56:47 -00:00'
-
- >>> arrow.utcnow().format('X')
- '1368071882'
-
- >>> arrow.utcnow().format('MMMM DD, YYYY')
- 'May 09, 2013'
-
- >>> arrow.utcnow().format()
- '2013-05-09 03:56:47 -00:00'
-
- """
-
- return formatter.DateTimeFormatter(locale).format(self._datetime, fmt)
-
- def humanize(
- self, other=None, locale="en_us", only_distance=False, granularity="auto"
- ):
- """Returns a localized, humanized representation of a relative difference in time.
-
- :param other: (optional) an :class:`Arrow ` or ``datetime`` object.
- Defaults to now in the current :class:`Arrow ` object's timezone.
- :param locale: (optional) a ``str`` specifying a locale. Defaults to 'en_us'.
- :param only_distance: (optional) returns only time difference eg: "11 seconds" without "in" or "ago" part.
- :param granularity: (optional) defines the precision of the output. Set it to strings 'second', 'minute',
- 'hour', 'day', 'week', 'month' or 'year' or a list of any combination of these strings
-
- Usage::
-
- >>> earlier = arrow.utcnow().shift(hours=-2)
- >>> earlier.humanize()
- '2 hours ago'
-
- >>> later = earlier.shift(hours=4)
- >>> later.humanize(earlier)
- 'in 4 hours'
-
- """
-
- locale_name = locale
- locale = locales.get_locale(locale)
-
- if other is None:
- utc = datetime.utcnow().replace(tzinfo=dateutil_tz.tzutc())
- dt = utc.astimezone(self._datetime.tzinfo)
-
- elif isinstance(other, Arrow):
- dt = other._datetime
-
- elif isinstance(other, datetime):
- if other.tzinfo is None:
- dt = other.replace(tzinfo=self._datetime.tzinfo)
- else:
- dt = other.astimezone(self._datetime.tzinfo)
-
- else:
- raise TypeError(
- "Invalid 'other' argument of type '{}'. "
- "Argument must be of type None, Arrow, or datetime.".format(
- type(other).__name__
- )
- )
-
- if isinstance(granularity, list) and len(granularity) == 1:
- granularity = granularity[0]
-
- delta = int(round(util.total_seconds(self._datetime - dt)))
- sign = -1 if delta < 0 else 1
- diff = abs(delta)
- delta = diff
-
- try:
- if granularity == "auto":
- if diff < 10:
- return locale.describe("now", only_distance=only_distance)
-
- if diff < 45:
- seconds = sign * delta
- return locale.describe(
- "seconds", seconds, only_distance=only_distance
- )
-
- elif diff < 90:
- return locale.describe("minute", sign, only_distance=only_distance)
- elif diff < 2700:
- minutes = sign * int(max(delta / 60, 2))
- return locale.describe(
- "minutes", minutes, only_distance=only_distance
- )
-
- elif diff < 5400:
- return locale.describe("hour", sign, only_distance=only_distance)
- elif diff < 79200:
- hours = sign * int(max(delta / 3600, 2))
- return locale.describe("hours", hours, only_distance=only_distance)
-
- # anything less than 48 hours should be 1 day
- elif diff < 172800:
- return locale.describe("day", sign, only_distance=only_distance)
- elif diff < 554400:
- days = sign * int(max(delta / 86400, 2))
- return locale.describe("days", days, only_distance=only_distance)
-
- elif diff < 907200:
- return locale.describe("week", sign, only_distance=only_distance)
- elif diff < 2419200:
- weeks = sign * int(max(delta / 604800, 2))
- return locale.describe("weeks", weeks, only_distance=only_distance)
-
- elif diff < 3888000:
- return locale.describe("month", sign, only_distance=only_distance)
- elif diff < 29808000:
- self_months = self._datetime.year * 12 + self._datetime.month
- other_months = dt.year * 12 + dt.month
-
- months = sign * int(max(abs(other_months - self_months), 2))
-
- return locale.describe(
- "months", months, only_distance=only_distance
- )
-
- elif diff < 47260800:
- return locale.describe("year", sign, only_distance=only_distance)
- else:
- years = sign * int(max(delta / 31536000, 2))
- return locale.describe("years", years, only_distance=only_distance)
-
- elif util.isstr(granularity):
- if granularity == "second":
- delta = sign * delta
- if abs(delta) < 2:
- return locale.describe("now", only_distance=only_distance)
- elif granularity == "minute":
- delta = sign * delta / self._SECS_PER_MINUTE
- elif granularity == "hour":
- delta = sign * delta / self._SECS_PER_HOUR
- elif granularity == "day":
- delta = sign * delta / self._SECS_PER_DAY
- elif granularity == "week":
- delta = sign * delta / self._SECS_PER_WEEK
- elif granularity == "month":
- delta = sign * delta / self._SECS_PER_MONTH
- elif granularity == "year":
- delta = sign * delta / self._SECS_PER_YEAR
- else:
- raise AttributeError(
- "Invalid level of granularity. Please select between 'second', 'minute', 'hour', 'day', 'week', 'month' or 'year'"
- )
-
- if trunc(abs(delta)) != 1:
- granularity += "s"
- return locale.describe(granularity, delta, only_distance=only_distance)
-
- else:
- timeframes = []
- if "year" in granularity:
- years = sign * delta / self._SECS_PER_YEAR
- delta %= self._SECS_PER_YEAR
- timeframes.append(["year", years])
-
- if "month" in granularity:
- months = sign * delta / self._SECS_PER_MONTH
- delta %= self._SECS_PER_MONTH
- timeframes.append(["month", months])
-
- if "week" in granularity:
- weeks = sign * delta / self._SECS_PER_WEEK
- delta %= self._SECS_PER_WEEK
- timeframes.append(["week", weeks])
-
- if "day" in granularity:
- days = sign * delta / self._SECS_PER_DAY
- delta %= self._SECS_PER_DAY
- timeframes.append(["day", days])
-
- if "hour" in granularity:
- hours = sign * delta / self._SECS_PER_HOUR
- delta %= self._SECS_PER_HOUR
- timeframes.append(["hour", hours])
-
- if "minute" in granularity:
- minutes = sign * delta / self._SECS_PER_MINUTE
- delta %= self._SECS_PER_MINUTE
- timeframes.append(["minute", minutes])
-
- if "second" in granularity:
- seconds = sign * delta
- timeframes.append(["second", seconds])
-
- if len(timeframes) < len(granularity):
- raise AttributeError(
- "Invalid level of granularity. "
- "Please select between 'second', 'minute', 'hour', 'day', 'week', 'month' or 'year'."
- )
-
- for tf in timeframes:
- # Make granularity plural if the delta is not equal to 1
- if trunc(abs(tf[1])) != 1:
- tf[0] += "s"
- return locale.describe_multi(timeframes, only_distance=only_distance)
-
- except KeyError as e:
- raise ValueError(
- "Humanization of the {} granularity is not currently translated in the '{}' locale. "
- "Please consider making a contribution to this locale.".format(
- e, locale_name
- )
- )
-
- # query functions
-
- def is_between(self, start, end, bounds="()"):
- """Returns a boolean denoting whether the specified date and time is between
- the start and end dates and times.
-
- :param start: an :class:`Arrow ` object.
- :param end: an :class:`Arrow ` object.
- :param bounds: (optional) a ``str`` of either '()', '(]', '[)', or '[]' that specifies
- whether to include or exclude the start and end values in the range. '(' excludes
- the start, '[' includes the start, ')' excludes the end, and ']' includes the end.
- If the bounds are not specified, the default bound '()' is used.
-
- Usage::
-
- >>> start = arrow.get(datetime(2013, 5, 5, 12, 30, 10))
- >>> end = arrow.get(datetime(2013, 5, 5, 12, 30, 36))
- >>> arrow.get(datetime(2013, 5, 5, 12, 30, 27)).is_between(start, end)
- True
-
- >>> start = arrow.get(datetime(2013, 5, 5))
- >>> end = arrow.get(datetime(2013, 5, 8))
- >>> arrow.get(datetime(2013, 5, 8)).is_between(start, end, '[]')
- True
-
- >>> start = arrow.get(datetime(2013, 5, 5))
- >>> end = arrow.get(datetime(2013, 5, 8))
- >>> arrow.get(datetime(2013, 5, 8)).is_between(start, end, '[)')
- False
-
- """
-
- util.validate_bounds(bounds)
-
- if not isinstance(start, Arrow):
- raise TypeError(
- "Can't parse start date argument type of '{}'".format(type(start))
- )
-
- if not isinstance(end, Arrow):
- raise TypeError(
- "Can't parse end date argument type of '{}'".format(type(end))
- )
-
- include_start = bounds[0] == "["
- include_end = bounds[1] == "]"
-
- target_timestamp = self.float_timestamp
- start_timestamp = start.float_timestamp
- end_timestamp = end.float_timestamp
-
- if include_start and include_end:
- return (
- target_timestamp >= start_timestamp
- and target_timestamp <= end_timestamp
- )
- elif include_start and not include_end:
- return (
- target_timestamp >= start_timestamp and target_timestamp < end_timestamp
- )
- elif not include_start and include_end:
- return (
- target_timestamp > start_timestamp and target_timestamp <= end_timestamp
- )
- else:
- return (
- target_timestamp > start_timestamp and target_timestamp < end_timestamp
- )
-
- # datetime methods
-
- def date(self):
- """Returns a ``date`` object with the same year, month and day.
-
- Usage::
-
- >>> arrow.utcnow().date()
- datetime.date(2019, 1, 23)
-
- """
-
- return self._datetime.date()
-
- def time(self):
- """Returns a ``time`` object with the same hour, minute, second, microsecond.
-
- Usage::
-
- >>> arrow.utcnow().time()
- datetime.time(12, 15, 34, 68352)
-
- """
-
- return self._datetime.time()
-
- def timetz(self):
- """Returns a ``time`` object with the same hour, minute, second, microsecond and
- tzinfo.
-
- Usage::
-
- >>> arrow.utcnow().timetz()
- datetime.time(12, 5, 18, 298893, tzinfo=tzutc())
-
- """
-
- return self._datetime.timetz()
-
- def astimezone(self, tz):
- """Returns a ``datetime`` object, converted to the specified timezone.
-
- :param tz: a ``tzinfo`` object.
-
- Usage::
-
- >>> pacific=arrow.now('US/Pacific')
- >>> nyc=arrow.now('America/New_York').tzinfo
- >>> pacific.astimezone(nyc)
- datetime.datetime(2019, 1, 20, 10, 24, 22, 328172, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York'))
-
- """
-
- return self._datetime.astimezone(tz)
-
- def utcoffset(self):
- """Returns a ``timedelta`` object representing the whole number of minutes difference from
- UTC time.
-
- Usage::
-
- >>> arrow.now('US/Pacific').utcoffset()
- datetime.timedelta(-1, 57600)
-
- """
-
- return self._datetime.utcoffset()
-
- def dst(self):
- """Returns the daylight savings time adjustment.
-
- Usage::
-
- >>> arrow.utcnow().dst()
- datetime.timedelta(0)
-
- """
-
- return self._datetime.dst()
-
- def timetuple(self):
- """Returns a ``time.struct_time``, in the current timezone.
-
- Usage::
-
- >>> arrow.utcnow().timetuple()
- time.struct_time(tm_year=2019, tm_mon=1, tm_mday=20, tm_hour=15, tm_min=17, tm_sec=8, tm_wday=6, tm_yday=20, tm_isdst=0)
-
- """
-
- return self._datetime.timetuple()
-
- def utctimetuple(self):
- """Returns a ``time.struct_time``, in UTC time.
-
- Usage::
-
- >>> arrow.utcnow().utctimetuple()
- time.struct_time(tm_year=2019, tm_mon=1, tm_mday=19, tm_hour=21, tm_min=41, tm_sec=7, tm_wday=5, tm_yday=19, tm_isdst=0)
-
- """
-
- return self._datetime.utctimetuple()
-
- def toordinal(self):
- """Returns the proleptic Gregorian ordinal of the date.
-
- Usage::
-
- >>> arrow.utcnow().toordinal()
- 737078
-
- """
-
- return self._datetime.toordinal()
-
- def weekday(self):
- """Returns the day of the week as an integer (0-6).
-
- Usage::
-
- >>> arrow.utcnow().weekday()
- 5
-
- """
-
- return self._datetime.weekday()
-
- def isoweekday(self):
- """Returns the ISO day of the week as an integer (1-7).
-
- Usage::
-
- >>> arrow.utcnow().isoweekday()
- 6
-
- """
-
- return self._datetime.isoweekday()
-
- def isocalendar(self):
- """Returns a 3-tuple, (ISO year, ISO week number, ISO weekday).
-
- Usage::
-
- >>> arrow.utcnow().isocalendar()
- (2019, 3, 6)
-
- """
-
- return self._datetime.isocalendar()
-
- def isoformat(self, sep="T"):
- """Returns an ISO 8601 formatted representation of the date and time.
-
- Usage::
-
- >>> arrow.utcnow().isoformat()
- '2019-01-19T18:30:52.442118+00:00'
-
- """
-
- return self._datetime.isoformat(sep)
-
- def ctime(self):
- """Returns a ctime formatted representation of the date and time.
-
- Usage::
-
- >>> arrow.utcnow().ctime()
- 'Sat Jan 19 18:26:50 2019'
-
- """
-
- return self._datetime.ctime()
-
- def strftime(self, format):
- """Formats in the style of ``datetime.strftime``.
-
- :param format: the format string.
-
- Usage::
-
- >>> arrow.utcnow().strftime('%d-%m-%Y %H:%M:%S')
- '23-01-2019 12:28:17'
-
- """
-
- return self._datetime.strftime(format)
-
- def for_json(self):
- """Serializes for the ``for_json`` protocol of simplejson.
-
- Usage::
-
- >>> arrow.utcnow().for_json()
- '2019-01-19T18:25:36.760079+00:00'
-
- """
-
- return self.isoformat()
-
- # math
-
- def __add__(self, other):
-
- if isinstance(other, (timedelta, relativedelta)):
- return self.fromdatetime(self._datetime + other, self._datetime.tzinfo)
-
- return NotImplemented
-
- def __radd__(self, other):
- return self.__add__(other)
-
- def __sub__(self, other):
-
- if isinstance(other, (timedelta, relativedelta)):
- return self.fromdatetime(self._datetime - other, self._datetime.tzinfo)
-
- elif isinstance(other, datetime):
- return self._datetime - other
-
- elif isinstance(other, Arrow):
- return self._datetime - other._datetime
-
- return NotImplemented
-
- def __rsub__(self, other):
-
- if isinstance(other, datetime):
- return other - self._datetime
-
- return NotImplemented
-
- # comparisons
-
- def __eq__(self, other):
-
- if not isinstance(other, (Arrow, datetime)):
- return False
-
- return self._datetime == self._get_datetime(other)
-
- def __ne__(self, other):
-
- if not isinstance(other, (Arrow, datetime)):
- return True
-
- return not self.__eq__(other)
-
- def __gt__(self, other):
-
- if not isinstance(other, (Arrow, datetime)):
- return NotImplemented
-
- return self._datetime > self._get_datetime(other)
-
- def __ge__(self, other):
-
- if not isinstance(other, (Arrow, datetime)):
- return NotImplemented
-
- return self._datetime >= self._get_datetime(other)
-
- def __lt__(self, other):
-
- if not isinstance(other, (Arrow, datetime)):
- return NotImplemented
-
- return self._datetime < self._get_datetime(other)
-
- def __le__(self, other):
-
- if not isinstance(other, (Arrow, datetime)):
- return NotImplemented
-
- return self._datetime <= self._get_datetime(other)
-
- def __cmp__(self, other):
- if sys.version_info[0] < 3: # pragma: no cover
- if not isinstance(other, (Arrow, datetime)):
- raise TypeError(
- "can't compare '{}' to '{}'".format(type(self), type(other))
- )
-
- # internal methods
-
- @staticmethod
- def _get_tzinfo(tz_expr):
-
- if tz_expr is None:
- return dateutil_tz.tzutc()
- if isinstance(tz_expr, dt_tzinfo):
- return tz_expr
- else:
- try:
- return parser.TzinfoParser.parse(tz_expr)
- except parser.ParserError:
- raise ValueError("'{}' not recognized as a timezone".format(tz_expr))
-
- @classmethod
- def _get_datetime(cls, expr):
- """Get datetime object for a specified expression."""
- if isinstance(expr, Arrow):
- return expr.datetime
- elif isinstance(expr, datetime):
- return expr
- elif util.is_timestamp(expr):
- timestamp = float(expr)
- return cls.utcfromtimestamp(timestamp).datetime
- else:
- raise ValueError(
- "'{}' not recognized as a datetime or timestamp.".format(expr)
- )
-
- @classmethod
- def _get_frames(cls, name):
-
- if name in cls._ATTRS:
- return name, "{}s".format(name), 1
- elif name[-1] == "s" and name[:-1] in cls._ATTRS:
- return name[:-1], name, 1
- elif name in ["week", "weeks"]:
- return "week", "weeks", 1
- elif name in ["quarter", "quarters"]:
- return "quarter", "months", 3
-
- supported = ", ".join(
- [
- "year(s)",
- "month(s)",
- "day(s)",
- "hour(s)",
- "minute(s)",
- "second(s)",
- "microsecond(s)",
- "week(s)",
- "quarter(s)",
- ]
- )
- raise AttributeError(
- "range/span over frame {} not supported. Supported frames: {}".format(
- name, supported
- )
- )
-
- @classmethod
- def _get_iteration_params(cls, end, limit):
-
- if end is None:
-
- if limit is None:
- raise ValueError("one of 'end' or 'limit' is required")
-
- return cls.max, limit
-
- else:
- if limit is None:
- return end, sys.maxsize
- return end, limit
-
- @staticmethod
- def _is_last_day_of_month(date):
- return date.day == calendar.monthrange(date.year, date.month)[1]
-
-
-Arrow.min = Arrow.fromdatetime(datetime.min)
-Arrow.max = Arrow.fromdatetime(datetime.max)
diff --git a/client/ayon_core/vendor/python/python_2/arrow/constants.py b/client/ayon_core/vendor/python/python_2/arrow/constants.py
deleted file mode 100644
index 81e37b26de..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/constants.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Output of time.mktime(datetime.max.timetuple()) on macOS
-# This value must be hardcoded for compatibility with Windows
-# Platform-independent max timestamps are hard to form
-# https://stackoverflow.com/q/46133223
-MAX_TIMESTAMP = 253402318799.0
-MAX_TIMESTAMP_MS = MAX_TIMESTAMP * 1000
-MAX_TIMESTAMP_US = MAX_TIMESTAMP * 1000000
diff --git a/client/ayon_core/vendor/python/python_2/arrow/factory.py b/client/ayon_core/vendor/python/python_2/arrow/factory.py
deleted file mode 100644
index 05933e8151..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/factory.py
+++ /dev/null
@@ -1,301 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Implements the :class:`ArrowFactory ` class,
-providing factory methods for common :class:`Arrow `
-construction scenarios.
-
-"""
-
-from __future__ import absolute_import
-
-import calendar
-from datetime import date, datetime
-from datetime import tzinfo as dt_tzinfo
-from time import struct_time
-
-from dateutil import tz as dateutil_tz
-
-from arrow import parser
-from arrow.arrow import Arrow
-from arrow.util import is_timestamp, iso_to_gregorian, isstr
-
-
-class ArrowFactory(object):
- """A factory for generating :class:`Arrow ` objects.
-
- :param type: (optional) the :class:`Arrow `-based class to construct from.
- Defaults to :class:`Arrow `.
-
- """
-
- def __init__(self, type=Arrow):
- self.type = type
-
- def get(self, *args, **kwargs):
- """Returns an :class:`Arrow ` object based on flexible inputs.
-
- :param locale: (optional) a ``str`` specifying a locale for the parser. Defaults to 'en_us'.
- :param tzinfo: (optional) a :ref:`timezone expression ` or tzinfo object.
- Replaces the timezone unless using an input form that is explicitly UTC or specifies
- the timezone in a positional argument. Defaults to UTC.
- :param normalize_whitespace: (optional) a ``bool`` specifying whether or not to normalize
- redundant whitespace (spaces, tabs, and newlines) in a datetime string before parsing.
- Defaults to false.
-
- Usage::
-
- >>> import arrow
-
- **No inputs** to get current UTC time::
-
- >>> arrow.get()
-
-
- **None** to also get current UTC time::
-
- >>> arrow.get(None)
-
-
- **One** :class:`Arrow ` object, to get a copy.
-
- >>> arw = arrow.utcnow()
- >>> arrow.get(arw)
-
-
- **One** ``float`` or ``int``, convertible to a floating-point timestamp, to get
- that timestamp in UTC::
-
- >>> arrow.get(1367992474.293378)
-
-
- >>> arrow.get(1367992474)
-
-
- **One** ISO 8601-formatted ``str``, to parse it::
-
- >>> arrow.get('2013-09-29T01:26:43.830580')
-
-
- **One** ISO 8601-formatted ``str``, in basic format, to parse it::
-
- >>> arrow.get('20160413T133656.456289')
-
-
- **One** ``tzinfo``, to get the current time **converted** to that timezone::
-
- >>> arrow.get(tz.tzlocal())
-
-
- **One** naive ``datetime``, to get that datetime in UTC::
-
- >>> arrow.get(datetime(2013, 5, 5))
-
-
- **One** aware ``datetime``, to get that datetime::
-
- >>> arrow.get(datetime(2013, 5, 5, tzinfo=tz.tzlocal()))
-
-
- **One** naive ``date``, to get that date in UTC::
-
- >>> arrow.get(date(2013, 5, 5))
-
-
- **One** time.struct time::
-
- >>> arrow.get(gmtime(0))
-
-
- **One** iso calendar ``tuple``, to get that week date in UTC::
-
- >>> arrow.get((2013, 18, 7))
-
-
- **Two** arguments, a naive or aware ``datetime``, and a replacement
- :ref:`timezone expression `::
-
- >>> arrow.get(datetime(2013, 5, 5), 'US/Pacific')
-
-
- **Two** arguments, a naive ``date``, and a replacement
- :ref:`timezone expression `::
-
- >>> arrow.get(date(2013, 5, 5), 'US/Pacific')
-
-
- **Two** arguments, both ``str``, to parse the first according to the format of the second::
-
- >>> arrow.get('2013-05-05 12:30:45 America/Chicago', 'YYYY-MM-DD HH:mm:ss ZZZ')
-
-
- **Two** arguments, first a ``str`` to parse and second a ``list`` of formats to try::
-
- >>> arrow.get('2013-05-05 12:30:45', ['MM/DD/YYYY', 'YYYY-MM-DD HH:mm:ss'])
-
-
- **Three or more** arguments, as for the constructor of a ``datetime``::
-
- >>> arrow.get(2013, 5, 5, 12, 30, 45)
-
-
- """
-
- arg_count = len(args)
- locale = kwargs.pop("locale", "en_us")
- tz = kwargs.get("tzinfo", None)
- normalize_whitespace = kwargs.pop("normalize_whitespace", False)
-
- # if kwargs given, send to constructor unless only tzinfo provided
- if len(kwargs) > 1:
- arg_count = 3
-
- # tzinfo kwarg is not provided
- if len(kwargs) == 1 and tz is None:
- arg_count = 3
-
- # () -> now, @ utc.
- if arg_count == 0:
- if isstr(tz):
- tz = parser.TzinfoParser.parse(tz)
- return self.type.now(tz)
-
- if isinstance(tz, dt_tzinfo):
- return self.type.now(tz)
-
- return self.type.utcnow()
-
- if arg_count == 1:
- arg = args[0]
-
- # (None) -> now, @ utc.
- if arg is None:
- return self.type.utcnow()
-
- # try (int, float) -> from timestamp with tz
- elif not isstr(arg) and is_timestamp(arg):
- if tz is None:
- # set to UTC by default
- tz = dateutil_tz.tzutc()
- return self.type.fromtimestamp(arg, tzinfo=tz)
-
- # (Arrow) -> from the object's datetime.
- elif isinstance(arg, Arrow):
- return self.type.fromdatetime(arg.datetime)
-
- # (datetime) -> from datetime.
- elif isinstance(arg, datetime):
- return self.type.fromdatetime(arg)
-
- # (date) -> from date.
- elif isinstance(arg, date):
- return self.type.fromdate(arg)
-
- # (tzinfo) -> now, @ tzinfo.
- elif isinstance(arg, dt_tzinfo):
- return self.type.now(arg)
-
- # (str) -> parse.
- elif isstr(arg):
- dt = parser.DateTimeParser(locale).parse_iso(arg, normalize_whitespace)
- return self.type.fromdatetime(dt, tz)
-
- # (struct_time) -> from struct_time
- elif isinstance(arg, struct_time):
- return self.type.utcfromtimestamp(calendar.timegm(arg))
-
- # (iso calendar) -> convert then from date
- elif isinstance(arg, tuple) and len(arg) == 3:
- dt = iso_to_gregorian(*arg)
- return self.type.fromdate(dt)
-
- else:
- raise TypeError(
- "Can't parse single argument of type '{}'".format(type(arg))
- )
-
- elif arg_count == 2:
-
- arg_1, arg_2 = args[0], args[1]
-
- if isinstance(arg_1, datetime):
-
- # (datetime, tzinfo/str) -> fromdatetime replace tzinfo.
- if isinstance(arg_2, dt_tzinfo) or isstr(arg_2):
- return self.type.fromdatetime(arg_1, arg_2)
- else:
- raise TypeError(
- "Can't parse two arguments of types 'datetime', '{}'".format(
- type(arg_2)
- )
- )
-
- elif isinstance(arg_1, date):
-
- # (date, tzinfo/str) -> fromdate replace tzinfo.
- if isinstance(arg_2, dt_tzinfo) or isstr(arg_2):
- return self.type.fromdate(arg_1, tzinfo=arg_2)
- else:
- raise TypeError(
- "Can't parse two arguments of types 'date', '{}'".format(
- type(arg_2)
- )
- )
-
- # (str, format) -> parse.
- elif isstr(arg_1) and (isstr(arg_2) or isinstance(arg_2, list)):
- dt = parser.DateTimeParser(locale).parse(
- args[0], args[1], normalize_whitespace
- )
- return self.type.fromdatetime(dt, tzinfo=tz)
-
- else:
- raise TypeError(
- "Can't parse two arguments of types '{}' and '{}'".format(
- type(arg_1), type(arg_2)
- )
- )
-
- # 3+ args -> datetime-like via constructor.
- else:
- return self.type(*args, **kwargs)
-
- def utcnow(self):
- """Returns an :class:`Arrow ` object, representing "now" in UTC time.
-
- Usage::
-
- >>> import arrow
- >>> arrow.utcnow()
-
- """
-
- return self.type.utcnow()
-
- def now(self, tz=None):
- """Returns an :class:`Arrow ` object, representing "now" in the given
- timezone.
-
- :param tz: (optional) A :ref:`timezone expression `. Defaults to local time.
-
- Usage::
-
- >>> import arrow
- >>> arrow.now()
-
-
- >>> arrow.now('US/Pacific')
-
-
- >>> arrow.now('+02:00')
-
-
- >>> arrow.now('local')
-
- """
-
- if tz is None:
- tz = dateutil_tz.tzlocal()
- elif not isinstance(tz, dt_tzinfo):
- tz = parser.TzinfoParser.parse(tz)
-
- return self.type.now(tz)
diff --git a/client/ayon_core/vendor/python/python_2/arrow/formatter.py b/client/ayon_core/vendor/python/python_2/arrow/formatter.py
deleted file mode 100644
index 9f9d7a44da..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/formatter.py
+++ /dev/null
@@ -1,139 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import, division
-
-import calendar
-import re
-
-from dateutil import tz as dateutil_tz
-
-from arrow import locales, util
-
-FORMAT_ATOM = "YYYY-MM-DD HH:mm:ssZZ"
-FORMAT_COOKIE = "dddd, DD-MMM-YYYY HH:mm:ss ZZZ"
-FORMAT_RFC822 = "ddd, DD MMM YY HH:mm:ss Z"
-FORMAT_RFC850 = "dddd, DD-MMM-YY HH:mm:ss ZZZ"
-FORMAT_RFC1036 = "ddd, DD MMM YY HH:mm:ss Z"
-FORMAT_RFC1123 = "ddd, DD MMM YYYY HH:mm:ss Z"
-FORMAT_RFC2822 = "ddd, DD MMM YYYY HH:mm:ss Z"
-FORMAT_RFC3339 = "YYYY-MM-DD HH:mm:ssZZ"
-FORMAT_RSS = "ddd, DD MMM YYYY HH:mm:ss Z"
-FORMAT_W3C = "YYYY-MM-DD HH:mm:ssZZ"
-
-
-class DateTimeFormatter(object):
-
- # This pattern matches characters enclosed in square brackets are matched as
- # an atomic group. For more info on atomic groups and how to they are
- # emulated in Python's re library, see https://stackoverflow.com/a/13577411/2701578
-
- _FORMAT_RE = re.compile(
- r"(\[(?:(?=(?P[^]]))(?P=literal))*\]|YYY?Y?|MM?M?M?|Do|DD?D?D?|d?dd?d?|HH?|hh?|mm?|ss?|SS?S?S?S?S?|ZZ?Z?|a|A|X|x|W)"
- )
-
- def __init__(self, locale="en_us"):
-
- self.locale = locales.get_locale(locale)
-
- def format(cls, dt, fmt):
-
- return cls._FORMAT_RE.sub(lambda m: cls._format_token(dt, m.group(0)), fmt)
-
- def _format_token(self, dt, token):
-
- if token and token.startswith("[") and token.endswith("]"):
- return token[1:-1]
-
- if token == "YYYY":
- return self.locale.year_full(dt.year)
- if token == "YY":
- return self.locale.year_abbreviation(dt.year)
-
- if token == "MMMM":
- return self.locale.month_name(dt.month)
- if token == "MMM":
- return self.locale.month_abbreviation(dt.month)
- if token == "MM":
- return "{:02d}".format(dt.month)
- if token == "M":
- return str(dt.month)
-
- if token == "DDDD":
- return "{:03d}".format(dt.timetuple().tm_yday)
- if token == "DDD":
- return str(dt.timetuple().tm_yday)
- if token == "DD":
- return "{:02d}".format(dt.day)
- if token == "D":
- return str(dt.day)
-
- if token == "Do":
- return self.locale.ordinal_number(dt.day)
-
- if token == "dddd":
- return self.locale.day_name(dt.isoweekday())
- if token == "ddd":
- return self.locale.day_abbreviation(dt.isoweekday())
- if token == "d":
- return str(dt.isoweekday())
-
- if token == "HH":
- return "{:02d}".format(dt.hour)
- if token == "H":
- return str(dt.hour)
- if token == "hh":
- return "{:02d}".format(dt.hour if 0 < dt.hour < 13 else abs(dt.hour - 12))
- if token == "h":
- return str(dt.hour if 0 < dt.hour < 13 else abs(dt.hour - 12))
-
- if token == "mm":
- return "{:02d}".format(dt.minute)
- if token == "m":
- return str(dt.minute)
-
- if token == "ss":
- return "{:02d}".format(dt.second)
- if token == "s":
- return str(dt.second)
-
- if token == "SSSSSS":
- return str("{:06d}".format(int(dt.microsecond)))
- if token == "SSSSS":
- return str("{:05d}".format(int(dt.microsecond / 10)))
- if token == "SSSS":
- return str("{:04d}".format(int(dt.microsecond / 100)))
- if token == "SSS":
- return str("{:03d}".format(int(dt.microsecond / 1000)))
- if token == "SS":
- return str("{:02d}".format(int(dt.microsecond / 10000)))
- if token == "S":
- return str(int(dt.microsecond / 100000))
-
- if token == "X":
- # TODO: replace with a call to dt.timestamp() when we drop Python 2.7
- return str(calendar.timegm(dt.utctimetuple()))
-
- if token == "x":
- # TODO: replace with a call to dt.timestamp() when we drop Python 2.7
- ts = calendar.timegm(dt.utctimetuple()) + (dt.microsecond / 1000000)
- return str(int(ts * 1000000))
-
- if token == "ZZZ":
- return dt.tzname()
-
- if token in ["ZZ", "Z"]:
- separator = ":" if token == "ZZ" else ""
- tz = dateutil_tz.tzutc() if dt.tzinfo is None else dt.tzinfo
- total_minutes = int(util.total_seconds(tz.utcoffset(dt)) / 60)
-
- sign = "+" if total_minutes >= 0 else "-"
- total_minutes = abs(total_minutes)
- hour, minute = divmod(total_minutes, 60)
-
- return "{}{:02d}{}{:02d}".format(sign, hour, separator, minute)
-
- if token in ("a", "A"):
- return self.locale.meridian(dt.hour, token)
-
- if token == "W":
- year, week, day = dt.isocalendar()
- return "{}-W{:02d}-{}".format(year, week, day)
diff --git a/client/ayon_core/vendor/python/python_2/arrow/locales.py b/client/ayon_core/vendor/python/python_2/arrow/locales.py
deleted file mode 100644
index 6833da5a78..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/locales.py
+++ /dev/null
@@ -1,4267 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import, unicode_literals
-
-import inspect
-import sys
-from math import trunc
-
-
-def get_locale(name):
- """Returns an appropriate :class:`Locale `
- corresponding to an inpute locale name.
-
- :param name: the name of the locale.
-
- """
-
- locale_cls = _locales.get(name.lower())
-
- if locale_cls is None:
- raise ValueError("Unsupported locale '{}'".format(name))
-
- return locale_cls()
-
-
-def get_locale_by_class_name(name):
- """Returns an appropriate :class:`Locale `
- corresponding to an locale class name.
-
- :param name: the name of the locale class.
-
- """
- locale_cls = globals().get(name)
-
- if locale_cls is None:
- raise ValueError("Unsupported locale '{}'".format(name))
-
- return locale_cls()
-
-
-# base locale type.
-
-
-class Locale(object):
- """ Represents locale-specific data and functionality. """
-
- names = []
-
- timeframes = {
- "now": "",
- "second": "",
- "seconds": "",
- "minute": "",
- "minutes": "",
- "hour": "",
- "hours": "",
- "day": "",
- "days": "",
- "week": "",
- "weeks": "",
- "month": "",
- "months": "",
- "year": "",
- "years": "",
- }
-
- meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
-
- past = None
- future = None
- and_word = None
-
- month_names = []
- month_abbreviations = []
-
- day_names = []
- day_abbreviations = []
-
- ordinal_day_re = r"(\d+)"
-
- def __init__(self):
-
- self._month_name_to_ordinal = None
-
- def describe(self, timeframe, delta=0, only_distance=False):
- """Describes a delta within a timeframe in plain language.
-
- :param timeframe: a string representing a timeframe.
- :param delta: a quantity representing a delta in a timeframe.
- :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
- """
-
- humanized = self._format_timeframe(timeframe, delta)
- if not only_distance:
- humanized = self._format_relative(humanized, timeframe, delta)
-
- return humanized
-
- def describe_multi(self, timeframes, only_distance=False):
- """Describes a delta within multiple timeframes in plain language.
-
- :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
- :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
- """
-
- humanized = ""
- for index, (timeframe, delta) in enumerate(timeframes):
- humanized += self._format_timeframe(timeframe, delta)
- if index == len(timeframes) - 2 and self.and_word:
- humanized += " " + self.and_word + " "
- elif index < len(timeframes) - 1:
- humanized += " "
-
- if not only_distance:
- humanized = self._format_relative(humanized, timeframe, delta)
-
- return humanized
-
- def day_name(self, day):
- """Returns the day name for a specified day of the week.
-
- :param day: the ``int`` day of the week (1-7).
-
- """
-
- return self.day_names[day]
-
- def day_abbreviation(self, day):
- """Returns the day abbreviation for a specified day of the week.
-
- :param day: the ``int`` day of the week (1-7).
-
- """
-
- return self.day_abbreviations[day]
-
- def month_name(self, month):
- """Returns the month name for a specified month of the year.
-
- :param month: the ``int`` month of the year (1-12).
-
- """
-
- return self.month_names[month]
-
- def month_abbreviation(self, month):
- """Returns the month abbreviation for a specified month of the year.
-
- :param month: the ``int`` month of the year (1-12).
-
- """
-
- return self.month_abbreviations[month]
-
- def month_number(self, name):
- """Returns the month number for a month specified by name or abbreviation.
-
- :param name: the month name or abbreviation.
-
- """
-
- if self._month_name_to_ordinal is None:
- self._month_name_to_ordinal = self._name_to_ordinal(self.month_names)
- self._month_name_to_ordinal.update(
- self._name_to_ordinal(self.month_abbreviations)
- )
-
- return self._month_name_to_ordinal.get(name)
-
- def year_full(self, year):
- """Returns the year for specific locale if available
-
- :param name: the ``int`` year (4-digit)
- """
- return "{:04d}".format(year)
-
- def year_abbreviation(self, year):
- """Returns the year for specific locale if available
-
- :param name: the ``int`` year (4-digit)
- """
- return "{:04d}".format(year)[2:]
-
- def meridian(self, hour, token):
- """Returns the meridian indicator for a specified hour and format token.
-
- :param hour: the ``int`` hour of the day.
- :param token: the format token.
- """
-
- if token == "a":
- return self.meridians["am"] if hour < 12 else self.meridians["pm"]
- if token == "A":
- return self.meridians["AM"] if hour < 12 else self.meridians["PM"]
-
- def ordinal_number(self, n):
- """Returns the ordinal format of a given integer
-
- :param n: an integer
- """
- return self._ordinal_number(n)
-
- def _ordinal_number(self, n):
- return "{}".format(n)
-
- def _name_to_ordinal(self, lst):
- return dict(map(lambda i: (i[1].lower(), i[0] + 1), enumerate(lst[1:])))
-
- def _format_timeframe(self, timeframe, delta):
- return self.timeframes[timeframe].format(trunc(abs(delta)))
-
- def _format_relative(self, humanized, timeframe, delta):
-
- if timeframe == "now":
- return humanized
-
- direction = self.past if delta < 0 else self.future
-
- return direction.format(humanized)
-
-
-# base locale type implementations.
-
-
-class EnglishLocale(Locale):
-
- names = [
- "en",
- "en_us",
- "en_gb",
- "en_au",
- "en_be",
- "en_jp",
- "en_za",
- "en_ca",
- "en_ph",
- ]
-
- past = "{0} ago"
- future = "in {0}"
- and_word = "and"
-
- timeframes = {
- "now": "just now",
- "second": "a second",
- "seconds": "{0} seconds",
- "minute": "a minute",
- "minutes": "{0} minutes",
- "hour": "an hour",
- "hours": "{0} hours",
- "day": "a day",
- "days": "{0} days",
- "week": "a week",
- "weeks": "{0} weeks",
- "month": "a month",
- "months": "{0} months",
- "year": "a year",
- "years": "{0} years",
- }
-
- meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
-
- month_names = [
- "",
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December",
- ]
- month_abbreviations = [
- "",
- "Jan",
- "Feb",
- "Mar",
- "Apr",
- "May",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Oct",
- "Nov",
- "Dec",
- ]
-
- day_names = [
- "",
- "Monday",
- "Tuesday",
- "Wednesday",
- "Thursday",
- "Friday",
- "Saturday",
- "Sunday",
- ]
- day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
-
- ordinal_day_re = r"((?P[2-3]?1(?=st)|[2-3]?2(?=nd)|[2-3]?3(?=rd)|[1-3]?[04-9](?=th)|1[1-3](?=th))(st|nd|rd|th))"
-
- def _ordinal_number(self, n):
- if n % 100 not in (11, 12, 13):
- remainder = abs(n) % 10
- if remainder == 1:
- return "{}st".format(n)
- elif remainder == 2:
- return "{}nd".format(n)
- elif remainder == 3:
- return "{}rd".format(n)
- return "{}th".format(n)
-
- def describe(self, timeframe, delta=0, only_distance=False):
- """Describes a delta within a timeframe in plain language.
-
- :param timeframe: a string representing a timeframe.
- :param delta: a quantity representing a delta in a timeframe.
- :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
- """
-
- humanized = super(EnglishLocale, self).describe(timeframe, delta, only_distance)
- if only_distance and timeframe == "now":
- humanized = "instantly"
-
- return humanized
-
-
-class ItalianLocale(Locale):
- names = ["it", "it_it"]
- past = "{0} fa"
- future = "tra {0}"
- and_word = "e"
-
- timeframes = {
- "now": "adesso",
- "second": "un secondo",
- "seconds": "{0} qualche secondo",
- "minute": "un minuto",
- "minutes": "{0} minuti",
- "hour": "un'ora",
- "hours": "{0} ore",
- "day": "un giorno",
- "days": "{0} giorni",
- "week": "una settimana,",
- "weeks": "{0} settimane",
- "month": "un mese",
- "months": "{0} mesi",
- "year": "un anno",
- "years": "{0} anni",
- }
-
- month_names = [
- "",
- "gennaio",
- "febbraio",
- "marzo",
- "aprile",
- "maggio",
- "giugno",
- "luglio",
- "agosto",
- "settembre",
- "ottobre",
- "novembre",
- "dicembre",
- ]
- month_abbreviations = [
- "",
- "gen",
- "feb",
- "mar",
- "apr",
- "mag",
- "giu",
- "lug",
- "ago",
- "set",
- "ott",
- "nov",
- "dic",
- ]
-
- day_names = [
- "",
- "lunedì",
- "martedì",
- "mercoledì",
- "giovedì",
- "venerdì",
- "sabato",
- "domenica",
- ]
- day_abbreviations = ["", "lun", "mar", "mer", "gio", "ven", "sab", "dom"]
-
- ordinal_day_re = r"((?P[1-3]?[0-9](?=[ºª]))[ºª])"
-
- def _ordinal_number(self, n):
- return "{}º".format(n)
-
-
-class SpanishLocale(Locale):
- names = ["es", "es_es"]
- past = "hace {0}"
- future = "en {0}"
- and_word = "y"
-
- timeframes = {
- "now": "ahora",
- "second": "un segundo",
- "seconds": "{0} segundos",
- "minute": "un minuto",
- "minutes": "{0} minutos",
- "hour": "una hora",
- "hours": "{0} horas",
- "day": "un día",
- "days": "{0} días",
- "week": "una semana",
- "weeks": "{0} semanas",
- "month": "un mes",
- "months": "{0} meses",
- "year": "un año",
- "years": "{0} años",
- }
-
- meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
-
- month_names = [
- "",
- "enero",
- "febrero",
- "marzo",
- "abril",
- "mayo",
- "junio",
- "julio",
- "agosto",
- "septiembre",
- "octubre",
- "noviembre",
- "diciembre",
- ]
- month_abbreviations = [
- "",
- "ene",
- "feb",
- "mar",
- "abr",
- "may",
- "jun",
- "jul",
- "ago",
- "sep",
- "oct",
- "nov",
- "dic",
- ]
-
- day_names = [
- "",
- "lunes",
- "martes",
- "miércoles",
- "jueves",
- "viernes",
- "sábado",
- "domingo",
- ]
- day_abbreviations = ["", "lun", "mar", "mie", "jue", "vie", "sab", "dom"]
-
- ordinal_day_re = r"((?P[1-3]?[0-9](?=[ºª]))[ºª])"
-
- def _ordinal_number(self, n):
- return "{}º".format(n)
-
-
-class FrenchBaseLocale(Locale):
-
- past = "il y a {0}"
- future = "dans {0}"
- and_word = "et"
-
- timeframes = {
- "now": "maintenant",
- "second": "une seconde",
- "seconds": "{0} quelques secondes",
- "minute": "une minute",
- "minutes": "{0} minutes",
- "hour": "une heure",
- "hours": "{0} heures",
- "day": "un jour",
- "days": "{0} jours",
- "week": "une semaine",
- "weeks": "{0} semaines",
- "month": "un mois",
- "months": "{0} mois",
- "year": "un an",
- "years": "{0} ans",
- }
-
- month_names = [
- "",
- "janvier",
- "février",
- "mars",
- "avril",
- "mai",
- "juin",
- "juillet",
- "août",
- "septembre",
- "octobre",
- "novembre",
- "décembre",
- ]
-
- day_names = [
- "",
- "lundi",
- "mardi",
- "mercredi",
- "jeudi",
- "vendredi",
- "samedi",
- "dimanche",
- ]
- day_abbreviations = ["", "lun", "mar", "mer", "jeu", "ven", "sam", "dim"]
-
- ordinal_day_re = (
- r"((?P\b1(?=er\b)|[1-3]?[02-9](?=e\b)|[1-3]1(?=e\b))(er|e)\b)"
- )
-
- def _ordinal_number(self, n):
- if abs(n) == 1:
- return "{}er".format(n)
- return "{}e".format(n)
-
-
-class FrenchLocale(FrenchBaseLocale, Locale):
-
- names = ["fr", "fr_fr"]
-
- month_abbreviations = [
- "",
- "janv",
- "févr",
- "mars",
- "avr",
- "mai",
- "juin",
- "juil",
- "août",
- "sept",
- "oct",
- "nov",
- "déc",
- ]
-
-
-class FrenchCanadianLocale(FrenchBaseLocale, Locale):
-
- names = ["fr_ca"]
-
- month_abbreviations = [
- "",
- "janv",
- "févr",
- "mars",
- "avr",
- "mai",
- "juin",
- "juill",
- "août",
- "sept",
- "oct",
- "nov",
- "déc",
- ]
-
-
-class GreekLocale(Locale):
-
- names = ["el", "el_gr"]
-
- past = "{0} πριν"
- future = "σε {0}"
- and_word = "και"
-
- timeframes = {
- "now": "τώρα",
- "second": "ένα δεύτερο",
- "seconds": "{0} δευτερόλεπτα",
- "minute": "ένα λεπτό",
- "minutes": "{0} λεπτά",
- "hour": "μία ώρα",
- "hours": "{0} ώρες",
- "day": "μία μέρα",
- "days": "{0} μέρες",
- "month": "ένα μήνα",
- "months": "{0} μήνες",
- "year": "ένα χρόνο",
- "years": "{0} χρόνια",
- }
-
- month_names = [
- "",
- "Ιανουαρίου",
- "Φεβρουαρίου",
- "Μαρτίου",
- "Απριλίου",
- "Μαΐου",
- "Ιουνίου",
- "Ιουλίου",
- "Αυγούστου",
- "Σεπτεμβρίου",
- "Οκτωβρίου",
- "Νοεμβρίου",
- "Δεκεμβρίου",
- ]
- month_abbreviations = [
- "",
- "Ιαν",
- "Φεβ",
- "Μαρ",
- "Απρ",
- "Μαϊ",
- "Ιον",
- "Ιολ",
- "Αυγ",
- "Σεπ",
- "Οκτ",
- "Νοε",
- "Δεκ",
- ]
-
- day_names = [
- "",
- "Δευτέρα",
- "Τρίτη",
- "Τετάρτη",
- "Πέμπτη",
- "Παρασκευή",
- "Σάββατο",
- "Κυριακή",
- ]
- day_abbreviations = ["", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"]
-
-
-class JapaneseLocale(Locale):
-
- names = ["ja", "ja_jp"]
-
- past = "{0}前"
- future = "{0}後"
-
- timeframes = {
- "now": "現在",
- "second": "二番目の",
- "seconds": "{0}数秒",
- "minute": "1分",
- "minutes": "{0}分",
- "hour": "1時間",
- "hours": "{0}時間",
- "day": "1日",
- "days": "{0}日",
- "week": "1週間",
- "weeks": "{0}週間",
- "month": "1ヶ月",
- "months": "{0}ヶ月",
- "year": "1年",
- "years": "{0}年",
- }
-
- month_names = [
- "",
- "1月",
- "2月",
- "3月",
- "4月",
- "5月",
- "6月",
- "7月",
- "8月",
- "9月",
- "10月",
- "11月",
- "12月",
- ]
- month_abbreviations = [
- "",
- " 1",
- " 2",
- " 3",
- " 4",
- " 5",
- " 6",
- " 7",
- " 8",
- " 9",
- "10",
- "11",
- "12",
- ]
-
- day_names = ["", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"]
- day_abbreviations = ["", "月", "火", "水", "木", "金", "土", "日"]
-
-
-class SwedishLocale(Locale):
-
- names = ["sv", "sv_se"]
-
- past = "för {0} sen"
- future = "om {0}"
- and_word = "och"
-
- timeframes = {
- "now": "just nu",
- "second": "en sekund",
- "seconds": "{0} några sekunder",
- "minute": "en minut",
- "minutes": "{0} minuter",
- "hour": "en timme",
- "hours": "{0} timmar",
- "day": "en dag",
- "days": "{0} dagar",
- "week": "en vecka",
- "weeks": "{0} veckor",
- "month": "en månad",
- "months": "{0} månader",
- "year": "ett år",
- "years": "{0} år",
- }
-
- month_names = [
- "",
- "januari",
- "februari",
- "mars",
- "april",
- "maj",
- "juni",
- "juli",
- "augusti",
- "september",
- "oktober",
- "november",
- "december",
- ]
- month_abbreviations = [
- "",
- "jan",
- "feb",
- "mar",
- "apr",
- "maj",
- "jun",
- "jul",
- "aug",
- "sep",
- "okt",
- "nov",
- "dec",
- ]
-
- day_names = [
- "",
- "måndag",
- "tisdag",
- "onsdag",
- "torsdag",
- "fredag",
- "lördag",
- "söndag",
- ]
- day_abbreviations = ["", "mån", "tis", "ons", "tor", "fre", "lör", "sön"]
-
-
-class FinnishLocale(Locale):
-
- names = ["fi", "fi_fi"]
-
- # The finnish grammar is very complex, and its hard to convert
- # 1-to-1 to something like English.
-
- past = "{0} sitten"
- future = "{0} kuluttua"
-
- timeframes = {
- "now": ["juuri nyt", "juuri nyt"],
- "second": ["sekunti", "sekunti"],
- "seconds": ["{0} muutama sekunti", "{0} muutaman sekunnin"],
- "minute": ["minuutti", "minuutin"],
- "minutes": ["{0} minuuttia", "{0} minuutin"],
- "hour": ["tunti", "tunnin"],
- "hours": ["{0} tuntia", "{0} tunnin"],
- "day": ["päivä", "päivä"],
- "days": ["{0} päivää", "{0} päivän"],
- "month": ["kuukausi", "kuukauden"],
- "months": ["{0} kuukautta", "{0} kuukauden"],
- "year": ["vuosi", "vuoden"],
- "years": ["{0} vuotta", "{0} vuoden"],
- }
-
- # Months and days are lowercase in Finnish
- month_names = [
- "",
- "tammikuu",
- "helmikuu",
- "maaliskuu",
- "huhtikuu",
- "toukokuu",
- "kesäkuu",
- "heinäkuu",
- "elokuu",
- "syyskuu",
- "lokakuu",
- "marraskuu",
- "joulukuu",
- ]
-
- month_abbreviations = [
- "",
- "tammi",
- "helmi",
- "maalis",
- "huhti",
- "touko",
- "kesä",
- "heinä",
- "elo",
- "syys",
- "loka",
- "marras",
- "joulu",
- ]
-
- day_names = [
- "",
- "maanantai",
- "tiistai",
- "keskiviikko",
- "torstai",
- "perjantai",
- "lauantai",
- "sunnuntai",
- ]
-
- day_abbreviations = ["", "ma", "ti", "ke", "to", "pe", "la", "su"]
-
- def _format_timeframe(self, timeframe, delta):
- return (
- self.timeframes[timeframe][0].format(abs(delta)),
- self.timeframes[timeframe][1].format(abs(delta)),
- )
-
- def _format_relative(self, humanized, timeframe, delta):
- if timeframe == "now":
- return humanized[0]
-
- direction = self.past if delta < 0 else self.future
- which = 0 if delta < 0 else 1
-
- return direction.format(humanized[which])
-
- def _ordinal_number(self, n):
- return "{}.".format(n)
-
-
-class ChineseCNLocale(Locale):
-
- names = ["zh", "zh_cn"]
-
- past = "{0}前"
- future = "{0}后"
-
- timeframes = {
- "now": "刚才",
- "second": "一秒",
- "seconds": "{0}秒",
- "minute": "1分钟",
- "minutes": "{0}分钟",
- "hour": "1小时",
- "hours": "{0}小时",
- "day": "1天",
- "days": "{0}天",
- "week": "一周",
- "weeks": "{0}周",
- "month": "1个月",
- "months": "{0}个月",
- "year": "1年",
- "years": "{0}年",
- }
-
- month_names = [
- "",
- "一月",
- "二月",
- "三月",
- "四月",
- "五月",
- "六月",
- "七月",
- "八月",
- "九月",
- "十月",
- "十一月",
- "十二月",
- ]
- month_abbreviations = [
- "",
- " 1",
- " 2",
- " 3",
- " 4",
- " 5",
- " 6",
- " 7",
- " 8",
- " 9",
- "10",
- "11",
- "12",
- ]
-
- day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
- day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
-
-
-class ChineseTWLocale(Locale):
-
- names = ["zh_tw"]
-
- past = "{0}前"
- future = "{0}後"
- and_word = "和"
-
- timeframes = {
- "now": "剛才",
- "second": "1秒",
- "seconds": "{0}秒",
- "minute": "1分鐘",
- "minutes": "{0}分鐘",
- "hour": "1小時",
- "hours": "{0}小時",
- "day": "1天",
- "days": "{0}天",
- "week": "1週",
- "weeks": "{0}週",
- "month": "1個月",
- "months": "{0}個月",
- "year": "1年",
- "years": "{0}年",
- }
-
- month_names = [
- "",
- "1月",
- "2月",
- "3月",
- "4月",
- "5月",
- "6月",
- "7月",
- "8月",
- "9月",
- "10月",
- "11月",
- "12月",
- ]
- month_abbreviations = [
- "",
- " 1",
- " 2",
- " 3",
- " 4",
- " 5",
- " 6",
- " 7",
- " 8",
- " 9",
- "10",
- "11",
- "12",
- ]
-
- day_names = ["", "週一", "週二", "週三", "週四", "週五", "週六", "週日"]
- day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
-
-
-class HongKongLocale(Locale):
-
- names = ["zh_hk"]
-
- past = "{0}前"
- future = "{0}後"
-
- timeframes = {
- "now": "剛才",
- "second": "1秒",
- "seconds": "{0}秒",
- "minute": "1分鐘",
- "minutes": "{0}分鐘",
- "hour": "1小時",
- "hours": "{0}小時",
- "day": "1天",
- "days": "{0}天",
- "week": "1星期",
- "weeks": "{0}星期",
- "month": "1個月",
- "months": "{0}個月",
- "year": "1年",
- "years": "{0}年",
- }
-
- month_names = [
- "",
- "1月",
- "2月",
- "3月",
- "4月",
- "5月",
- "6月",
- "7月",
- "8月",
- "9月",
- "10月",
- "11月",
- "12月",
- ]
- month_abbreviations = [
- "",
- " 1",
- " 2",
- " 3",
- " 4",
- " 5",
- " 6",
- " 7",
- " 8",
- " 9",
- "10",
- "11",
- "12",
- ]
-
- day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
- day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"]
-
-
-class KoreanLocale(Locale):
-
- names = ["ko", "ko_kr"]
-
- past = "{0} 전"
- future = "{0} 후"
-
- timeframes = {
- "now": "지금",
- "second": "1초",
- "seconds": "{0}초",
- "minute": "1분",
- "minutes": "{0}분",
- "hour": "한시간",
- "hours": "{0}시간",
- "day": "하루",
- "days": "{0}일",
- "week": "1주",
- "weeks": "{0}주",
- "month": "한달",
- "months": "{0}개월",
- "year": "1년",
- "years": "{0}년",
- }
-
- special_dayframes = {
- -3: "그끄제",
- -2: "그제",
- -1: "어제",
- 1: "내일",
- 2: "모레",
- 3: "글피",
- 4: "그글피",
- }
-
- special_yearframes = {-2: "제작년", -1: "작년", 1: "내년", 2: "내후년"}
-
- month_names = [
- "",
- "1월",
- "2월",
- "3월",
- "4월",
- "5월",
- "6월",
- "7월",
- "8월",
- "9월",
- "10월",
- "11월",
- "12월",
- ]
- month_abbreviations = [
- "",
- " 1",
- " 2",
- " 3",
- " 4",
- " 5",
- " 6",
- " 7",
- " 8",
- " 9",
- "10",
- "11",
- "12",
- ]
-
- day_names = ["", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
- day_abbreviations = ["", "월", "화", "수", "목", "금", "토", "일"]
-
- def _ordinal_number(self, n):
- ordinals = ["0", "첫", "두", "세", "네", "다섯", "여섯", "일곱", "여덟", "아홉", "열"]
- if n < len(ordinals):
- return "{}번째".format(ordinals[n])
- return "{}번째".format(n)
-
- def _format_relative(self, humanized, timeframe, delta):
- if timeframe in ("day", "days"):
- special = self.special_dayframes.get(delta)
- if special:
- return special
- elif timeframe in ("year", "years"):
- special = self.special_yearframes.get(delta)
- if special:
- return special
-
- return super(KoreanLocale, self)._format_relative(humanized, timeframe, delta)
-
-
-# derived locale types & implementations.
-class DutchLocale(Locale):
-
- names = ["nl", "nl_nl"]
-
- past = "{0} geleden"
- future = "over {0}"
-
- timeframes = {
- "now": "nu",
- "second": "een seconde",
- "seconds": "{0} seconden",
- "minute": "een minuut",
- "minutes": "{0} minuten",
- "hour": "een uur",
- "hours": "{0} uur",
- "day": "een dag",
- "days": "{0} dagen",
- "week": "een week",
- "weeks": "{0} weken",
- "month": "een maand",
- "months": "{0} maanden",
- "year": "een jaar",
- "years": "{0} jaar",
- }
-
- # In Dutch names of months and days are not starting with a capital letter
- # like in the English language.
- month_names = [
- "",
- "januari",
- "februari",
- "maart",
- "april",
- "mei",
- "juni",
- "juli",
- "augustus",
- "september",
- "oktober",
- "november",
- "december",
- ]
- month_abbreviations = [
- "",
- "jan",
- "feb",
- "mrt",
- "apr",
- "mei",
- "jun",
- "jul",
- "aug",
- "sep",
- "okt",
- "nov",
- "dec",
- ]
-
- day_names = [
- "",
- "maandag",
- "dinsdag",
- "woensdag",
- "donderdag",
- "vrijdag",
- "zaterdag",
- "zondag",
- ]
- day_abbreviations = ["", "ma", "di", "wo", "do", "vr", "za", "zo"]
-
-
-class SlavicBaseLocale(Locale):
- def _format_timeframe(self, timeframe, delta):
-
- form = self.timeframes[timeframe]
- delta = abs(delta)
-
- if isinstance(form, list):
-
- if delta % 10 == 1 and delta % 100 != 11:
- form = form[0]
- elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
- form = form[1]
- else:
- form = form[2]
-
- return form.format(delta)
-
-
-class BelarusianLocale(SlavicBaseLocale):
-
- names = ["be", "be_by"]
-
- past = "{0} таму"
- future = "праз {0}"
-
- timeframes = {
- "now": "зараз",
- "second": "секунду",
- "seconds": "{0} некалькі секунд",
- "minute": "хвіліну",
- "minutes": ["{0} хвіліну", "{0} хвіліны", "{0} хвілін"],
- "hour": "гадзіну",
- "hours": ["{0} гадзіну", "{0} гадзіны", "{0} гадзін"],
- "day": "дзень",
- "days": ["{0} дзень", "{0} дні", "{0} дзён"],
- "month": "месяц",
- "months": ["{0} месяц", "{0} месяцы", "{0} месяцаў"],
- "year": "год",
- "years": ["{0} год", "{0} гады", "{0} гадоў"],
- }
-
- month_names = [
- "",
- "студзеня",
- "лютага",
- "сакавіка",
- "красавіка",
- "траўня",
- "чэрвеня",
- "ліпеня",
- "жніўня",
- "верасня",
- "кастрычніка",
- "лістапада",
- "снежня",
- ]
- month_abbreviations = [
- "",
- "студ",
- "лют",
- "сак",
- "крас",
- "трав",
- "чэрв",
- "ліп",
- "жнів",
- "вер",
- "каст",
- "ліст",
- "снеж",
- ]
-
- day_names = [
- "",
- "панядзелак",
- "аўторак",
- "серада",
- "чацвер",
- "пятніца",
- "субота",
- "нядзеля",
- ]
- day_abbreviations = ["", "пн", "ат", "ср", "чц", "пт", "сб", "нд"]
-
-
-class PolishLocale(SlavicBaseLocale):
-
- names = ["pl", "pl_pl"]
-
- past = "{0} temu"
- future = "za {0}"
-
- # The nouns should be in genitive case (Polish: "dopełniacz")
- # in order to correctly form `past` & `future` expressions.
- timeframes = {
- "now": "teraz",
- "second": "sekundę",
- "seconds": ["{0} sekund", "{0} sekundy", "{0} sekund"],
- "minute": "minutę",
- "minutes": ["{0} minut", "{0} minuty", "{0} minut"],
- "hour": "godzinę",
- "hours": ["{0} godzin", "{0} godziny", "{0} godzin"],
- "day": "dzień",
- "days": "{0} dni",
- "week": "tydzień",
- "weeks": ["{0} tygodni", "{0} tygodnie", "{0} tygodni"],
- "month": "miesiąc",
- "months": ["{0} miesięcy", "{0} miesiące", "{0} miesięcy"],
- "year": "rok",
- "years": ["{0} lat", "{0} lata", "{0} lat"],
- }
-
- month_names = [
- "",
- "styczeń",
- "luty",
- "marzec",
- "kwiecień",
- "maj",
- "czerwiec",
- "lipiec",
- "sierpień",
- "wrzesień",
- "październik",
- "listopad",
- "grudzień",
- ]
- month_abbreviations = [
- "",
- "sty",
- "lut",
- "mar",
- "kwi",
- "maj",
- "cze",
- "lip",
- "sie",
- "wrz",
- "paź",
- "lis",
- "gru",
- ]
-
- day_names = [
- "",
- "poniedziałek",
- "wtorek",
- "środa",
- "czwartek",
- "piątek",
- "sobota",
- "niedziela",
- ]
- day_abbreviations = ["", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nd"]
-
-
-class RussianLocale(SlavicBaseLocale):
-
- names = ["ru", "ru_ru"]
-
- past = "{0} назад"
- future = "через {0}"
-
- timeframes = {
- "now": "сейчас",
- "second": "Второй",
- "seconds": "{0} несколько секунд",
- "minute": "минуту",
- "minutes": ["{0} минуту", "{0} минуты", "{0} минут"],
- "hour": "час",
- "hours": ["{0} час", "{0} часа", "{0} часов"],
- "day": "день",
- "days": ["{0} день", "{0} дня", "{0} дней"],
- "week": "неделю",
- "weeks": ["{0} неделю", "{0} недели", "{0} недель"],
- "month": "месяц",
- "months": ["{0} месяц", "{0} месяца", "{0} месяцев"],
- "year": "год",
- "years": ["{0} год", "{0} года", "{0} лет"],
- }
-
- month_names = [
- "",
- "января",
- "февраля",
- "марта",
- "апреля",
- "мая",
- "июня",
- "июля",
- "августа",
- "сентября",
- "октября",
- "ноября",
- "декабря",
- ]
- month_abbreviations = [
- "",
- "янв",
- "фев",
- "мар",
- "апр",
- "май",
- "июн",
- "июл",
- "авг",
- "сен",
- "окт",
- "ноя",
- "дек",
- ]
-
- day_names = [
- "",
- "понедельник",
- "вторник",
- "среда",
- "четверг",
- "пятница",
- "суббота",
- "воскресенье",
- ]
- day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"]
-
-
-class AfrikaansLocale(Locale):
-
- names = ["af", "af_nl"]
-
- past = "{0} gelede"
- future = "in {0}"
-
- timeframes = {
- "now": "nou",
- "second": "n sekonde",
- "seconds": "{0} sekondes",
- "minute": "minuut",
- "minutes": "{0} minute",
- "hour": "uur",
- "hours": "{0} ure",
- "day": "een dag",
- "days": "{0} dae",
- "month": "een maand",
- "months": "{0} maande",
- "year": "een jaar",
- "years": "{0} jaar",
- }
-
- month_names = [
- "",
- "Januarie",
- "Februarie",
- "Maart",
- "April",
- "Mei",
- "Junie",
- "Julie",
- "Augustus",
- "September",
- "Oktober",
- "November",
- "Desember",
- ]
- month_abbreviations = [
- "",
- "Jan",
- "Feb",
- "Mrt",
- "Apr",
- "Mei",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Okt",
- "Nov",
- "Des",
- ]
-
- day_names = [
- "",
- "Maandag",
- "Dinsdag",
- "Woensdag",
- "Donderdag",
- "Vrydag",
- "Saterdag",
- "Sondag",
- ]
- day_abbreviations = ["", "Ma", "Di", "Wo", "Do", "Vr", "Za", "So"]
-
-
-class BulgarianLocale(SlavicBaseLocale):
-
- names = ["bg", "bg_BG"]
-
- past = "{0} назад"
- future = "напред {0}"
-
- timeframes = {
- "now": "сега",
- "second": "секунда",
- "seconds": "{0} няколко секунди",
- "minute": "минута",
- "minutes": ["{0} минута", "{0} минути", "{0} минути"],
- "hour": "час",
- "hours": ["{0} час", "{0} часа", "{0} часа"],
- "day": "ден",
- "days": ["{0} ден", "{0} дни", "{0} дни"],
- "month": "месец",
- "months": ["{0} месец", "{0} месеца", "{0} месеца"],
- "year": "година",
- "years": ["{0} година", "{0} години", "{0} години"],
- }
-
- month_names = [
- "",
- "януари",
- "февруари",
- "март",
- "април",
- "май",
- "юни",
- "юли",
- "август",
- "септември",
- "октомври",
- "ноември",
- "декември",
- ]
- month_abbreviations = [
- "",
- "ян",
- "февр",
- "март",
- "апр",
- "май",
- "юни",
- "юли",
- "авг",
- "септ",
- "окт",
- "ноем",
- "дек",
- ]
-
- day_names = [
- "",
- "понеделник",
- "вторник",
- "сряда",
- "четвъртък",
- "петък",
- "събота",
- "неделя",
- ]
- day_abbreviations = ["", "пон", "вт", "ср", "четв", "пет", "съб", "нед"]
-
-
-class UkrainianLocale(SlavicBaseLocale):
-
- names = ["ua", "uk_ua"]
-
- past = "{0} тому"
- future = "за {0}"
-
- timeframes = {
- "now": "зараз",
- "second": "секунда",
- "seconds": "{0} кілька секунд",
- "minute": "хвилину",
- "minutes": ["{0} хвилину", "{0} хвилини", "{0} хвилин"],
- "hour": "годину",
- "hours": ["{0} годину", "{0} години", "{0} годин"],
- "day": "день",
- "days": ["{0} день", "{0} дні", "{0} днів"],
- "month": "місяць",
- "months": ["{0} місяць", "{0} місяці", "{0} місяців"],
- "year": "рік",
- "years": ["{0} рік", "{0} роки", "{0} років"],
- }
-
- month_names = [
- "",
- "січня",
- "лютого",
- "березня",
- "квітня",
- "травня",
- "червня",
- "липня",
- "серпня",
- "вересня",
- "жовтня",
- "листопада",
- "грудня",
- ]
- month_abbreviations = [
- "",
- "січ",
- "лют",
- "бер",
- "квіт",
- "трав",
- "черв",
- "лип",
- "серп",
- "вер",
- "жовт",
- "лист",
- "груд",
- ]
-
- day_names = [
- "",
- "понеділок",
- "вівторок",
- "середа",
- "четвер",
- "п’ятниця",
- "субота",
- "неділя",
- ]
- day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "нд"]
-
-
-class MacedonianLocale(SlavicBaseLocale):
- names = ["mk", "mk_mk"]
-
- past = "пред {0}"
- future = "за {0}"
-
- timeframes = {
- "now": "сега",
- "second": "една секунда",
- "seconds": ["{0} секунда", "{0} секунди", "{0} секунди"],
- "minute": "една минута",
- "minutes": ["{0} минута", "{0} минути", "{0} минути"],
- "hour": "еден саат",
- "hours": ["{0} саат", "{0} саати", "{0} саати"],
- "day": "еден ден",
- "days": ["{0} ден", "{0} дена", "{0} дена"],
- "week": "една недела",
- "weeks": ["{0} недела", "{0} недели", "{0} недели"],
- "month": "еден месец",
- "months": ["{0} месец", "{0} месеци", "{0} месеци"],
- "year": "една година",
- "years": ["{0} година", "{0} години", "{0} години"],
- }
-
- meridians = {"am": "дп", "pm": "пп", "AM": "претпладне", "PM": "попладне"}
-
- month_names = [
- "",
- "Јануари",
- "Февруари",
- "Март",
- "Април",
- "Мај",
- "Јуни",
- "Јули",
- "Август",
- "Септември",
- "Октомври",
- "Ноември",
- "Декември",
- ]
- month_abbreviations = [
- "",
- "Јан",
- "Фев",
- "Мар",
- "Апр",
- "Мај",
- "Јун",
- "Јул",
- "Авг",
- "Септ",
- "Окт",
- "Ноем",
- "Декем",
- ]
-
- day_names = [
- "",
- "Понеделник",
- "Вторник",
- "Среда",
- "Четврток",
- "Петок",
- "Сабота",
- "Недела",
- ]
- day_abbreviations = [
- "",
- "Пон",
- "Вт",
- "Сре",
- "Чет",
- "Пет",
- "Саб",
- "Нед",
- ]
-
-
-class GermanBaseLocale(Locale):
-
- past = "vor {0}"
- future = "in {0}"
- and_word = "und"
-
- timeframes = {
- "now": "gerade eben",
- "second": "eine Sekunde",
- "seconds": "{0} Sekunden",
- "minute": "einer Minute",
- "minutes": "{0} Minuten",
- "hour": "einer Stunde",
- "hours": "{0} Stunden",
- "day": "einem Tag",
- "days": "{0} Tagen",
- "week": "einer Woche",
- "weeks": "{0} Wochen",
- "month": "einem Monat",
- "months": "{0} Monaten",
- "year": "einem Jahr",
- "years": "{0} Jahren",
- }
-
- timeframes_only_distance = timeframes.copy()
- timeframes_only_distance["minute"] = "eine Minute"
- timeframes_only_distance["hour"] = "eine Stunde"
- timeframes_only_distance["day"] = "ein Tag"
- timeframes_only_distance["week"] = "eine Woche"
- timeframes_only_distance["month"] = "ein Monat"
- timeframes_only_distance["year"] = "ein Jahr"
-
- month_names = [
- "",
- "Januar",
- "Februar",
- "März",
- "April",
- "Mai",
- "Juni",
- "Juli",
- "August",
- "September",
- "Oktober",
- "November",
- "Dezember",
- ]
-
- month_abbreviations = [
- "",
- "Jan",
- "Feb",
- "Mär",
- "Apr",
- "Mai",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Okt",
- "Nov",
- "Dez",
- ]
-
- day_names = [
- "",
- "Montag",
- "Dienstag",
- "Mittwoch",
- "Donnerstag",
- "Freitag",
- "Samstag",
- "Sonntag",
- ]
-
- day_abbreviations = ["", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
-
- def _ordinal_number(self, n):
- return "{}.".format(n)
-
- def describe(self, timeframe, delta=0, only_distance=False):
- """Describes a delta within a timeframe in plain language.
-
- :param timeframe: a string representing a timeframe.
- :param delta: a quantity representing a delta in a timeframe.
- :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords
- """
-
- if not only_distance:
- return super(GermanBaseLocale, self).describe(
- timeframe, delta, only_distance
- )
-
- # German uses a different case without 'in' or 'ago'
- humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta)))
-
- return humanized
-
-
-class GermanLocale(GermanBaseLocale, Locale):
-
- names = ["de", "de_de"]
-
-
-class SwissLocale(GermanBaseLocale, Locale):
-
- names = ["de_ch"]
-
-
-class AustrianLocale(GermanBaseLocale, Locale):
-
- names = ["de_at"]
-
- month_names = [
- "",
- "Jänner",
- "Februar",
- "März",
- "April",
- "Mai",
- "Juni",
- "Juli",
- "August",
- "September",
- "Oktober",
- "November",
- "Dezember",
- ]
-
-
-class NorwegianLocale(Locale):
-
- names = ["nb", "nb_no"]
-
- past = "for {0} siden"
- future = "om {0}"
-
- timeframes = {
- "now": "nå nettopp",
- "second": "et sekund",
- "seconds": "{0} noen sekunder",
- "minute": "ett minutt",
- "minutes": "{0} minutter",
- "hour": "en time",
- "hours": "{0} timer",
- "day": "en dag",
- "days": "{0} dager",
- "month": "en måned",
- "months": "{0} måneder",
- "year": "ett år",
- "years": "{0} år",
- }
-
- month_names = [
- "",
- "januar",
- "februar",
- "mars",
- "april",
- "mai",
- "juni",
- "juli",
- "august",
- "september",
- "oktober",
- "november",
- "desember",
- ]
- month_abbreviations = [
- "",
- "jan",
- "feb",
- "mar",
- "apr",
- "mai",
- "jun",
- "jul",
- "aug",
- "sep",
- "okt",
- "nov",
- "des",
- ]
-
- day_names = [
- "",
- "mandag",
- "tirsdag",
- "onsdag",
- "torsdag",
- "fredag",
- "lørdag",
- "søndag",
- ]
- day_abbreviations = ["", "ma", "ti", "on", "to", "fr", "lø", "sø"]
-
-
-class NewNorwegianLocale(Locale):
-
- names = ["nn", "nn_no"]
-
- past = "for {0} sidan"
- future = "om {0}"
-
- timeframes = {
- "now": "no nettopp",
- "second": "et sekund",
- "seconds": "{0} nokre sekund",
- "minute": "ett minutt",
- "minutes": "{0} minutt",
- "hour": "ein time",
- "hours": "{0} timar",
- "day": "ein dag",
- "days": "{0} dagar",
- "month": "en månad",
- "months": "{0} månader",
- "year": "eit år",
- "years": "{0} år",
- }
-
- month_names = [
- "",
- "januar",
- "februar",
- "mars",
- "april",
- "mai",
- "juni",
- "juli",
- "august",
- "september",
- "oktober",
- "november",
- "desember",
- ]
- month_abbreviations = [
- "",
- "jan",
- "feb",
- "mar",
- "apr",
- "mai",
- "jun",
- "jul",
- "aug",
- "sep",
- "okt",
- "nov",
- "des",
- ]
-
- day_names = [
- "",
- "måndag",
- "tysdag",
- "onsdag",
- "torsdag",
- "fredag",
- "laurdag",
- "sundag",
- ]
- day_abbreviations = ["", "må", "ty", "on", "to", "fr", "la", "su"]
-
-
-class PortugueseLocale(Locale):
- names = ["pt", "pt_pt"]
-
- past = "há {0}"
- future = "em {0}"
- and_word = "e"
-
- timeframes = {
- "now": "agora",
- "second": "um segundo",
- "seconds": "{0} segundos",
- "minute": "um minuto",
- "minutes": "{0} minutos",
- "hour": "uma hora",
- "hours": "{0} horas",
- "day": "um dia",
- "days": "{0} dias",
- "week": "uma semana",
- "weeks": "{0} semanas",
- "month": "um mês",
- "months": "{0} meses",
- "year": "um ano",
- "years": "{0} anos",
- }
-
- month_names = [
- "",
- "Janeiro",
- "Fevereiro",
- "Março",
- "Abril",
- "Maio",
- "Junho",
- "Julho",
- "Agosto",
- "Setembro",
- "Outubro",
- "Novembro",
- "Dezembro",
- ]
- month_abbreviations = [
- "",
- "Jan",
- "Fev",
- "Mar",
- "Abr",
- "Mai",
- "Jun",
- "Jul",
- "Ago",
- "Set",
- "Out",
- "Nov",
- "Dez",
- ]
-
- day_names = [
- "",
- "Segunda-feira",
- "Terça-feira",
- "Quarta-feira",
- "Quinta-feira",
- "Sexta-feira",
- "Sábado",
- "Domingo",
- ]
- day_abbreviations = ["", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom"]
-
-
-class BrazilianPortugueseLocale(PortugueseLocale):
- names = ["pt_br"]
-
- past = "faz {0}"
-
-
-class TagalogLocale(Locale):
-
- names = ["tl", "tl_ph"]
-
- past = "nakaraang {0}"
- future = "{0} mula ngayon"
-
- timeframes = {
- "now": "ngayon lang",
- "second": "isang segundo",
- "seconds": "{0} segundo",
- "minute": "isang minuto",
- "minutes": "{0} minuto",
- "hour": "isang oras",
- "hours": "{0} oras",
- "day": "isang araw",
- "days": "{0} araw",
- "week": "isang linggo",
- "weeks": "{0} linggo",
- "month": "isang buwan",
- "months": "{0} buwan",
- "year": "isang taon",
- "years": "{0} taon",
- }
-
- month_names = [
- "",
- "Enero",
- "Pebrero",
- "Marso",
- "Abril",
- "Mayo",
- "Hunyo",
- "Hulyo",
- "Agosto",
- "Setyembre",
- "Oktubre",
- "Nobyembre",
- "Disyembre",
- ]
- month_abbreviations = [
- "",
- "Ene",
- "Peb",
- "Mar",
- "Abr",
- "May",
- "Hun",
- "Hul",
- "Ago",
- "Set",
- "Okt",
- "Nob",
- "Dis",
- ]
-
- day_names = [
- "",
- "Lunes",
- "Martes",
- "Miyerkules",
- "Huwebes",
- "Biyernes",
- "Sabado",
- "Linggo",
- ]
- day_abbreviations = ["", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab", "Lin"]
-
- meridians = {"am": "nu", "pm": "nh", "AM": "ng umaga", "PM": "ng hapon"}
-
- def _ordinal_number(self, n):
- return "ika-{}".format(n)
-
-
-class VietnameseLocale(Locale):
-
- names = ["vi", "vi_vn"]
-
- past = "{0} trước"
- future = "{0} nữa"
-
- timeframes = {
- "now": "hiện tại",
- "second": "một giây",
- "seconds": "{0} giây",
- "minute": "một phút",
- "minutes": "{0} phút",
- "hour": "một giờ",
- "hours": "{0} giờ",
- "day": "một ngày",
- "days": "{0} ngày",
- "week": "một tuần",
- "weeks": "{0} tuần",
- "month": "một tháng",
- "months": "{0} tháng",
- "year": "một năm",
- "years": "{0} năm",
- }
-
- month_names = [
- "",
- "Tháng Một",
- "Tháng Hai",
- "Tháng Ba",
- "Tháng Tư",
- "Tháng Năm",
- "Tháng Sáu",
- "Tháng Bảy",
- "Tháng Tám",
- "Tháng Chín",
- "Tháng Mười",
- "Tháng Mười Một",
- "Tháng Mười Hai",
- ]
- month_abbreviations = [
- "",
- "Tháng 1",
- "Tháng 2",
- "Tháng 3",
- "Tháng 4",
- "Tháng 5",
- "Tháng 6",
- "Tháng 7",
- "Tháng 8",
- "Tháng 9",
- "Tháng 10",
- "Tháng 11",
- "Tháng 12",
- ]
-
- day_names = [
- "",
- "Thứ Hai",
- "Thứ Ba",
- "Thứ Tư",
- "Thứ Năm",
- "Thứ Sáu",
- "Thứ Bảy",
- "Chủ Nhật",
- ]
- day_abbreviations = ["", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7", "CN"]
-
-
-class TurkishLocale(Locale):
-
- names = ["tr", "tr_tr"]
-
- past = "{0} önce"
- future = "{0} sonra"
-
- timeframes = {
- "now": "şimdi",
- "second": "bir saniye",
- "seconds": "{0} saniye",
- "minute": "bir dakika",
- "minutes": "{0} dakika",
- "hour": "bir saat",
- "hours": "{0} saat",
- "day": "bir gün",
- "days": "{0} gün",
- "month": "bir ay",
- "months": "{0} ay",
- "year": "yıl",
- "years": "{0} yıl",
- }
-
- month_names = [
- "",
- "Ocak",
- "Şubat",
- "Mart",
- "Nisan",
- "Mayıs",
- "Haziran",
- "Temmuz",
- "Ağustos",
- "Eylül",
- "Ekim",
- "Kasım",
- "Aralık",
- ]
- month_abbreviations = [
- "",
- "Oca",
- "Şub",
- "Mar",
- "Nis",
- "May",
- "Haz",
- "Tem",
- "Ağu",
- "Eyl",
- "Eki",
- "Kas",
- "Ara",
- ]
-
- day_names = [
- "",
- "Pazartesi",
- "Salı",
- "Çarşamba",
- "Perşembe",
- "Cuma",
- "Cumartesi",
- "Pazar",
- ]
- day_abbreviations = ["", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"]
-
-
-class AzerbaijaniLocale(Locale):
-
- names = ["az", "az_az"]
-
- past = "{0} əvvəl"
- future = "{0} sonra"
-
- timeframes = {
- "now": "indi",
- "second": "saniyə",
- "seconds": "{0} saniyə",
- "minute": "bir dəqiqə",
- "minutes": "{0} dəqiqə",
- "hour": "bir saat",
- "hours": "{0} saat",
- "day": "bir gün",
- "days": "{0} gün",
- "month": "bir ay",
- "months": "{0} ay",
- "year": "il",
- "years": "{0} il",
- }
-
- month_names = [
- "",
- "Yanvar",
- "Fevral",
- "Mart",
- "Aprel",
- "May",
- "İyun",
- "İyul",
- "Avqust",
- "Sentyabr",
- "Oktyabr",
- "Noyabr",
- "Dekabr",
- ]
- month_abbreviations = [
- "",
- "Yan",
- "Fev",
- "Mar",
- "Apr",
- "May",
- "İyn",
- "İyl",
- "Avq",
- "Sen",
- "Okt",
- "Noy",
- "Dek",
- ]
-
- day_names = [
- "",
- "Bazar ertəsi",
- "Çərşənbə axşamı",
- "Çərşənbə",
- "Cümə axşamı",
- "Cümə",
- "Şənbə",
- "Bazar",
- ]
- day_abbreviations = ["", "Ber", "Çax", "Çər", "Cax", "Cüm", "Şnb", "Bzr"]
-
-
-class ArabicLocale(Locale):
- names = [
- "ar",
- "ar_ae",
- "ar_bh",
- "ar_dj",
- "ar_eg",
- "ar_eh",
- "ar_er",
- "ar_km",
- "ar_kw",
- "ar_ly",
- "ar_om",
- "ar_qa",
- "ar_sa",
- "ar_sd",
- "ar_so",
- "ar_ss",
- "ar_td",
- "ar_ye",
- ]
-
- past = "منذ {0}"
- future = "خلال {0}"
-
- timeframes = {
- "now": "الآن",
- "second": "ثانية",
- "seconds": {"double": "ثانيتين", "ten": "{0} ثوان", "higher": "{0} ثانية"},
- "minute": "دقيقة",
- "minutes": {"double": "دقيقتين", "ten": "{0} دقائق", "higher": "{0} دقيقة"},
- "hour": "ساعة",
- "hours": {"double": "ساعتين", "ten": "{0} ساعات", "higher": "{0} ساعة"},
- "day": "يوم",
- "days": {"double": "يومين", "ten": "{0} أيام", "higher": "{0} يوم"},
- "month": "شهر",
- "months": {"double": "شهرين", "ten": "{0} أشهر", "higher": "{0} شهر"},
- "year": "سنة",
- "years": {"double": "سنتين", "ten": "{0} سنوات", "higher": "{0} سنة"},
- }
-
- month_names = [
- "",
- "يناير",
- "فبراير",
- "مارس",
- "أبريل",
- "مايو",
- "يونيو",
- "يوليو",
- "أغسطس",
- "سبتمبر",
- "أكتوبر",
- "نوفمبر",
- "ديسمبر",
- ]
- month_abbreviations = [
- "",
- "يناير",
- "فبراير",
- "مارس",
- "أبريل",
- "مايو",
- "يونيو",
- "يوليو",
- "أغسطس",
- "سبتمبر",
- "أكتوبر",
- "نوفمبر",
- "ديسمبر",
- ]
-
- day_names = [
- "",
- "الإثنين",
- "الثلاثاء",
- "الأربعاء",
- "الخميس",
- "الجمعة",
- "السبت",
- "الأحد",
- ]
- day_abbreviations = ["", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"]
-
- def _format_timeframe(self, timeframe, delta):
- form = self.timeframes[timeframe]
- delta = abs(delta)
- if isinstance(form, dict):
- if delta == 2:
- form = form["double"]
- elif delta > 2 and delta <= 10:
- form = form["ten"]
- else:
- form = form["higher"]
-
- return form.format(delta)
-
-
-class LevantArabicLocale(ArabicLocale):
- names = ["ar_iq", "ar_jo", "ar_lb", "ar_ps", "ar_sy"]
- month_names = [
- "",
- "كانون الثاني",
- "شباط",
- "آذار",
- "نيسان",
- "أيار",
- "حزيران",
- "تموز",
- "آب",
- "أيلول",
- "تشرين الأول",
- "تشرين الثاني",
- "كانون الأول",
- ]
- month_abbreviations = [
- "",
- "كانون الثاني",
- "شباط",
- "آذار",
- "نيسان",
- "أيار",
- "حزيران",
- "تموز",
- "آب",
- "أيلول",
- "تشرين الأول",
- "تشرين الثاني",
- "كانون الأول",
- ]
-
-
-class AlgeriaTunisiaArabicLocale(ArabicLocale):
- names = ["ar_tn", "ar_dz"]
- month_names = [
- "",
- "جانفي",
- "فيفري",
- "مارس",
- "أفريل",
- "ماي",
- "جوان",
- "جويلية",
- "أوت",
- "سبتمبر",
- "أكتوبر",
- "نوفمبر",
- "ديسمبر",
- ]
- month_abbreviations = [
- "",
- "جانفي",
- "فيفري",
- "مارس",
- "أفريل",
- "ماي",
- "جوان",
- "جويلية",
- "أوت",
- "سبتمبر",
- "أكتوبر",
- "نوفمبر",
- "ديسمبر",
- ]
-
-
-class MauritaniaArabicLocale(ArabicLocale):
- names = ["ar_mr"]
- month_names = [
- "",
- "يناير",
- "فبراير",
- "مارس",
- "إبريل",
- "مايو",
- "يونيو",
- "يوليو",
- "أغشت",
- "شتمبر",
- "أكتوبر",
- "نوفمبر",
- "دجمبر",
- ]
- month_abbreviations = [
- "",
- "يناير",
- "فبراير",
- "مارس",
- "إبريل",
- "مايو",
- "يونيو",
- "يوليو",
- "أغشت",
- "شتمبر",
- "أكتوبر",
- "نوفمبر",
- "دجمبر",
- ]
-
-
-class MoroccoArabicLocale(ArabicLocale):
- names = ["ar_ma"]
- month_names = [
- "",
- "يناير",
- "فبراير",
- "مارس",
- "أبريل",
- "ماي",
- "يونيو",
- "يوليوز",
- "غشت",
- "شتنبر",
- "أكتوبر",
- "نونبر",
- "دجنبر",
- ]
- month_abbreviations = [
- "",
- "يناير",
- "فبراير",
- "مارس",
- "أبريل",
- "ماي",
- "يونيو",
- "يوليوز",
- "غشت",
- "شتنبر",
- "أكتوبر",
- "نونبر",
- "دجنبر",
- ]
-
-
-class IcelandicLocale(Locale):
- def _format_timeframe(self, timeframe, delta):
-
- timeframe = self.timeframes[timeframe]
- if delta < 0:
- timeframe = timeframe[0]
- elif delta > 0:
- timeframe = timeframe[1]
-
- return timeframe.format(abs(delta))
-
- names = ["is", "is_is"]
-
- past = "fyrir {0} síðan"
- future = "eftir {0}"
-
- timeframes = {
- "now": "rétt í þessu",
- "second": ("sekúndu", "sekúndu"),
- "seconds": ("{0} nokkrum sekúndum", "nokkrar sekúndur"),
- "minute": ("einni mínútu", "eina mínútu"),
- "minutes": ("{0} mínútum", "{0} mínútur"),
- "hour": ("einum tíma", "einn tíma"),
- "hours": ("{0} tímum", "{0} tíma"),
- "day": ("einum degi", "einn dag"),
- "days": ("{0} dögum", "{0} daga"),
- "month": ("einum mánuði", "einn mánuð"),
- "months": ("{0} mánuðum", "{0} mánuði"),
- "year": ("einu ári", "eitt ár"),
- "years": ("{0} árum", "{0} ár"),
- }
-
- meridians = {"am": "f.h.", "pm": "e.h.", "AM": "f.h.", "PM": "e.h."}
-
- month_names = [
- "",
- "janúar",
- "febrúar",
- "mars",
- "apríl",
- "maí",
- "júní",
- "júlí",
- "ágúst",
- "september",
- "október",
- "nóvember",
- "desember",
- ]
- month_abbreviations = [
- "",
- "jan",
- "feb",
- "mar",
- "apr",
- "maí",
- "jún",
- "júl",
- "ágú",
- "sep",
- "okt",
- "nóv",
- "des",
- ]
-
- day_names = [
- "",
- "mánudagur",
- "þriðjudagur",
- "miðvikudagur",
- "fimmtudagur",
- "föstudagur",
- "laugardagur",
- "sunnudagur",
- ]
- day_abbreviations = ["", "mán", "þri", "mið", "fim", "fös", "lau", "sun"]
-
-
-class DanishLocale(Locale):
-
- names = ["da", "da_dk"]
-
- past = "for {0} siden"
- future = "efter {0}"
- and_word = "og"
-
- timeframes = {
- "now": "lige nu",
- "second": "et sekund",
- "seconds": "{0} et par sekunder",
- "minute": "et minut",
- "minutes": "{0} minutter",
- "hour": "en time",
- "hours": "{0} timer",
- "day": "en dag",
- "days": "{0} dage",
- "month": "en måned",
- "months": "{0} måneder",
- "year": "et år",
- "years": "{0} år",
- }
-
- month_names = [
- "",
- "januar",
- "februar",
- "marts",
- "april",
- "maj",
- "juni",
- "juli",
- "august",
- "september",
- "oktober",
- "november",
- "december",
- ]
- month_abbreviations = [
- "",
- "jan",
- "feb",
- "mar",
- "apr",
- "maj",
- "jun",
- "jul",
- "aug",
- "sep",
- "okt",
- "nov",
- "dec",
- ]
-
- day_names = [
- "",
- "mandag",
- "tirsdag",
- "onsdag",
- "torsdag",
- "fredag",
- "lørdag",
- "søndag",
- ]
- day_abbreviations = ["", "man", "tir", "ons", "tor", "fre", "lør", "søn"]
-
-
-class MalayalamLocale(Locale):
-
- names = ["ml"]
-
- past = "{0} മുമ്പ്"
- future = "{0} ശേഷം"
-
- timeframes = {
- "now": "ഇപ്പോൾ",
- "second": "ഒരു നിമിഷം",
- "seconds": "{0} സെക്കന്റ്",
- "minute": "ഒരു മിനിറ്റ്",
- "minutes": "{0} മിനിറ്റ്",
- "hour": "ഒരു മണിക്കൂർ",
- "hours": "{0} മണിക്കൂർ",
- "day": "ഒരു ദിവസം ",
- "days": "{0} ദിവസം ",
- "month": "ഒരു മാസം ",
- "months": "{0} മാസം ",
- "year": "ഒരു വർഷം ",
- "years": "{0} വർഷം ",
- }
-
- meridians = {
- "am": "രാവിലെ",
- "pm": "ഉച്ചക്ക് ശേഷം",
- "AM": "രാവിലെ",
- "PM": "ഉച്ചക്ക് ശേഷം",
- }
-
- month_names = [
- "",
- "ജനുവരി",
- "ഫെബ്രുവരി",
- "മാർച്ച്",
- "ഏപ്രിൽ ",
- "മെയ് ",
- "ജൂണ്",
- "ജൂലൈ",
- "ഓഗസ്റ്റ്",
- "സെപ്റ്റംബർ",
- "ഒക്ടോബർ",
- "നവംബർ",
- "ഡിസംബർ",
- ]
- month_abbreviations = [
- "",
- "ജനു",
- "ഫെബ് ",
- "മാർ",
- "ഏപ്രിൽ",
- "മേയ്",
- "ജൂണ്",
- "ജൂലൈ",
- "ഓഗസ്റ",
- "സെപ്റ്റ",
- "ഒക്ടോ",
- "നവം",
- "ഡിസം",
- ]
-
- day_names = ["", "തിങ്കള്", "ചൊവ്വ", "ബുധന്", "വ്യാഴം", "വെള്ളി", "ശനി", "ഞായര്"]
- day_abbreviations = [
- "",
- "തിങ്കള്",
- "ചൊവ്വ",
- "ബുധന്",
- "വ്യാഴം",
- "വെള്ളി",
- "ശനി",
- "ഞായര്",
- ]
-
-
-class HindiLocale(Locale):
-
- names = ["hi"]
-
- past = "{0} पहले"
- future = "{0} बाद"
-
- timeframes = {
- "now": "अभी",
- "second": "एक पल",
- "seconds": "{0} सेकंड्",
- "minute": "एक मिनट ",
- "minutes": "{0} मिनट ",
- "hour": "एक घंटा",
- "hours": "{0} घंटे",
- "day": "एक दिन",
- "days": "{0} दिन",
- "month": "एक माह ",
- "months": "{0} महीने ",
- "year": "एक वर्ष ",
- "years": "{0} साल ",
- }
-
- meridians = {"am": "सुबह", "pm": "शाम", "AM": "सुबह", "PM": "शाम"}
-
- month_names = [
- "",
- "जनवरी",
- "फरवरी",
- "मार्च",
- "अप्रैल ",
- "मई",
- "जून",
- "जुलाई",
- "अगस्त",
- "सितंबर",
- "अक्टूबर",
- "नवंबर",
- "दिसंबर",
- ]
- month_abbreviations = [
- "",
- "जन",
- "फ़र",
- "मार्च",
- "अप्रै",
- "मई",
- "जून",
- "जुलाई",
- "आग",
- "सित",
- "अकत",
- "नवे",
- "दिस",
- ]
-
- day_names = [
- "",
- "सोमवार",
- "मंगलवार",
- "बुधवार",
- "गुरुवार",
- "शुक्रवार",
- "शनिवार",
- "रविवार",
- ]
- day_abbreviations = ["", "सोम", "मंगल", "बुध", "गुरुवार", "शुक्र", "शनि", "रवि"]
-
-
-class CzechLocale(Locale):
- names = ["cs", "cs_cz"]
-
- timeframes = {
- "now": "Teď",
- "second": {"past": "vteřina", "future": "vteřina", "zero": "vteřina"},
- "seconds": {"past": "{0} sekundami", "future": ["{0} sekundy", "{0} sekund"]},
- "minute": {"past": "minutou", "future": "minutu", "zero": "{0} minut"},
- "minutes": {"past": "{0} minutami", "future": ["{0} minuty", "{0} minut"]},
- "hour": {"past": "hodinou", "future": "hodinu", "zero": "{0} hodin"},
- "hours": {"past": "{0} hodinami", "future": ["{0} hodiny", "{0} hodin"]},
- "day": {"past": "dnem", "future": "den", "zero": "{0} dnů"},
- "days": {"past": "{0} dny", "future": ["{0} dny", "{0} dnů"]},
- "week": {"past": "týdnem", "future": "týden", "zero": "{0} týdnů"},
- "weeks": {"past": "{0} týdny", "future": ["{0} týdny", "{0} týdnů"]},
- "month": {"past": "měsícem", "future": "měsíc", "zero": "{0} měsíců"},
- "months": {"past": "{0} měsíci", "future": ["{0} měsíce", "{0} měsíců"]},
- "year": {"past": "rokem", "future": "rok", "zero": "{0} let"},
- "years": {"past": "{0} lety", "future": ["{0} roky", "{0} let"]},
- }
-
- past = "Před {0}"
- future = "Za {0}"
-
- month_names = [
- "",
- "leden",
- "únor",
- "březen",
- "duben",
- "květen",
- "červen",
- "červenec",
- "srpen",
- "září",
- "říjen",
- "listopad",
- "prosinec",
- ]
- month_abbreviations = [
- "",
- "led",
- "úno",
- "bře",
- "dub",
- "kvě",
- "čvn",
- "čvc",
- "srp",
- "zář",
- "říj",
- "lis",
- "pro",
- ]
-
- day_names = [
- "",
- "pondělí",
- "úterý",
- "středa",
- "čtvrtek",
- "pátek",
- "sobota",
- "neděle",
- ]
- day_abbreviations = ["", "po", "út", "st", "čt", "pá", "so", "ne"]
-
- def _format_timeframe(self, timeframe, delta):
- """Czech aware time frame format function, takes into account
- the differences between past and future forms."""
- form = self.timeframes[timeframe]
- if isinstance(form, dict):
- if delta == 0:
- form = form["zero"] # And *never* use 0 in the singular!
- elif delta > 0:
- form = form["future"]
- else:
- form = form["past"]
- delta = abs(delta)
-
- if isinstance(form, list):
- if 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
- form = form[0]
- else:
- form = form[1]
-
- return form.format(delta)
-
-
-class SlovakLocale(Locale):
- names = ["sk", "sk_sk"]
-
- timeframes = {
- "now": "Teraz",
- "second": {"past": "sekundou", "future": "sekundu", "zero": "{0} sekúnd"},
- "seconds": {"past": "{0} sekundami", "future": ["{0} sekundy", "{0} sekúnd"]},
- "minute": {"past": "minútou", "future": "minútu", "zero": "{0} minút"},
- "minutes": {"past": "{0} minútami", "future": ["{0} minúty", "{0} minút"]},
- "hour": {"past": "hodinou", "future": "hodinu", "zero": "{0} hodín"},
- "hours": {"past": "{0} hodinami", "future": ["{0} hodiny", "{0} hodín"]},
- "day": {"past": "dňom", "future": "deň", "zero": "{0} dní"},
- "days": {"past": "{0} dňami", "future": ["{0} dni", "{0} dní"]},
- "week": {"past": "týždňom", "future": "týždeň", "zero": "{0} týždňov"},
- "weeks": {"past": "{0} týždňami", "future": ["{0} týždne", "{0} týždňov"]},
- "month": {"past": "mesiacom", "future": "mesiac", "zero": "{0} mesiacov"},
- "months": {"past": "{0} mesiacmi", "future": ["{0} mesiace", "{0} mesiacov"]},
- "year": {"past": "rokom", "future": "rok", "zero": "{0} rokov"},
- "years": {"past": "{0} rokmi", "future": ["{0} roky", "{0} rokov"]},
- }
-
- past = "Pred {0}"
- future = "O {0}"
- and_word = "a"
-
- month_names = [
- "",
- "január",
- "február",
- "marec",
- "apríl",
- "máj",
- "jún",
- "júl",
- "august",
- "september",
- "október",
- "november",
- "december",
- ]
- month_abbreviations = [
- "",
- "jan",
- "feb",
- "mar",
- "apr",
- "máj",
- "jún",
- "júl",
- "aug",
- "sep",
- "okt",
- "nov",
- "dec",
- ]
-
- day_names = [
- "",
- "pondelok",
- "utorok",
- "streda",
- "štvrtok",
- "piatok",
- "sobota",
- "nedeľa",
- ]
- day_abbreviations = ["", "po", "ut", "st", "št", "pi", "so", "ne"]
-
- def _format_timeframe(self, timeframe, delta):
- """Slovak aware time frame format function, takes into account
- the differences between past and future forms."""
- form = self.timeframes[timeframe]
- if isinstance(form, dict):
- if delta == 0:
- form = form["zero"] # And *never* use 0 in the singular!
- elif delta > 0:
- form = form["future"]
- else:
- form = form["past"]
- delta = abs(delta)
-
- if isinstance(form, list):
- if 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20):
- form = form[0]
- else:
- form = form[1]
-
- return form.format(delta)
-
-
-class FarsiLocale(Locale):
-
- names = ["fa", "fa_ir"]
-
- past = "{0} قبل"
- future = "در {0}"
-
- timeframes = {
- "now": "اکنون",
- "second": "یک لحظه",
- "seconds": "{0} ثانیه",
- "minute": "یک دقیقه",
- "minutes": "{0} دقیقه",
- "hour": "یک ساعت",
- "hours": "{0} ساعت",
- "day": "یک روز",
- "days": "{0} روز",
- "month": "یک ماه",
- "months": "{0} ماه",
- "year": "یک سال",
- "years": "{0} سال",
- }
-
- meridians = {
- "am": "قبل از ظهر",
- "pm": "بعد از ظهر",
- "AM": "قبل از ظهر",
- "PM": "بعد از ظهر",
- }
-
- month_names = [
- "",
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December",
- ]
- month_abbreviations = [
- "",
- "Jan",
- "Feb",
- "Mar",
- "Apr",
- "May",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Oct",
- "Nov",
- "Dec",
- ]
-
- day_names = [
- "",
- "دو شنبه",
- "سه شنبه",
- "چهارشنبه",
- "پنجشنبه",
- "جمعه",
- "شنبه",
- "یکشنبه",
- ]
- day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
-
-
-class HebrewLocale(Locale):
-
- names = ["he", "he_IL"]
-
- past = "לפני {0}"
- future = "בעוד {0}"
- and_word = "ו"
-
- timeframes = {
- "now": "הרגע",
- "second": "שנייה",
- "seconds": "{0} שניות",
- "minute": "דקה",
- "minutes": "{0} דקות",
- "hour": "שעה",
- "hours": "{0} שעות",
- "2-hours": "שעתיים",
- "day": "יום",
- "days": "{0} ימים",
- "2-days": "יומיים",
- "week": "שבוע",
- "weeks": "{0} שבועות",
- "2-weeks": "שבועיים",
- "month": "חודש",
- "months": "{0} חודשים",
- "2-months": "חודשיים",
- "year": "שנה",
- "years": "{0} שנים",
- "2-years": "שנתיים",
- }
-
- meridians = {
- "am": 'לפנ"צ',
- "pm": 'אחר"צ',
- "AM": "לפני הצהריים",
- "PM": "אחרי הצהריים",
- }
-
- month_names = [
- "",
- "ינואר",
- "פברואר",
- "מרץ",
- "אפריל",
- "מאי",
- "יוני",
- "יולי",
- "אוגוסט",
- "ספטמבר",
- "אוקטובר",
- "נובמבר",
- "דצמבר",
- ]
- month_abbreviations = [
- "",
- "ינו׳",
- "פבר׳",
- "מרץ",
- "אפר׳",
- "מאי",
- "יוני",
- "יולי",
- "אוג׳",
- "ספט׳",
- "אוק׳",
- "נוב׳",
- "דצמ׳",
- ]
-
- day_names = ["", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"]
- day_abbreviations = ["", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳", "א׳"]
-
- def _format_timeframe(self, timeframe, delta):
- """Hebrew couple of aware"""
- couple = "2-{}".format(timeframe)
- single = timeframe.rstrip("s")
- if abs(delta) == 2 and couple in self.timeframes:
- key = couple
- elif abs(delta) == 1 and single in self.timeframes:
- key = single
- else:
- key = timeframe
-
- return self.timeframes[key].format(trunc(abs(delta)))
-
- def describe_multi(self, timeframes, only_distance=False):
- """Describes a delta within multiple timeframes in plain language.
- In Hebrew, the and word behaves a bit differently.
-
- :param timeframes: a list of string, quantity pairs each representing a timeframe and delta.
- :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords
- """
-
- humanized = ""
- for index, (timeframe, delta) in enumerate(timeframes):
- last_humanized = self._format_timeframe(timeframe, delta)
- if index == 0:
- humanized = last_humanized
- elif index == len(timeframes) - 1: # Must have at least 2 items
- humanized += " " + self.and_word
- if last_humanized[0].isdecimal():
- humanized += "־"
- humanized += last_humanized
- else: # Don't add for the last one
- humanized += ", " + last_humanized
-
- if not only_distance:
- humanized = self._format_relative(humanized, timeframe, delta)
-
- return humanized
-
-
-class MarathiLocale(Locale):
-
- names = ["mr"]
-
- past = "{0} आधी"
- future = "{0} नंतर"
-
- timeframes = {
- "now": "सद्य",
- "second": "एक सेकंद",
- "seconds": "{0} सेकंद",
- "minute": "एक मिनिट ",
- "minutes": "{0} मिनिट ",
- "hour": "एक तास",
- "hours": "{0} तास",
- "day": "एक दिवस",
- "days": "{0} दिवस",
- "month": "एक महिना ",
- "months": "{0} महिने ",
- "year": "एक वर्ष ",
- "years": "{0} वर्ष ",
- }
-
- meridians = {"am": "सकाळ", "pm": "संध्याकाळ", "AM": "सकाळ", "PM": "संध्याकाळ"}
-
- month_names = [
- "",
- "जानेवारी",
- "फेब्रुवारी",
- "मार्च",
- "एप्रिल",
- "मे",
- "जून",
- "जुलै",
- "अॉगस्ट",
- "सप्टेंबर",
- "अॉक्टोबर",
- "नोव्हेंबर",
- "डिसेंबर",
- ]
- month_abbreviations = [
- "",
- "जान",
- "फेब्रु",
- "मार्च",
- "एप्रि",
- "मे",
- "जून",
- "जुलै",
- "अॉग",
- "सप्टें",
- "अॉक्टो",
- "नोव्हें",
- "डिसें",
- ]
-
- day_names = [
- "",
- "सोमवार",
- "मंगळवार",
- "बुधवार",
- "गुरुवार",
- "शुक्रवार",
- "शनिवार",
- "रविवार",
- ]
- day_abbreviations = ["", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि", "रवि"]
-
-
-def _map_locales():
-
- locales = {}
-
- for _, cls in inspect.getmembers(sys.modules[__name__], inspect.isclass):
- if issubclass(cls, Locale): # pragma: no branch
- for name in cls.names:
- locales[name.lower()] = cls
-
- return locales
-
-
-class CatalanLocale(Locale):
- names = ["ca", "ca_es", "ca_ad", "ca_fr", "ca_it"]
- past = "Fa {0}"
- future = "En {0}"
- and_word = "i"
-
- timeframes = {
- "now": "Ara mateix",
- "second": "un segon",
- "seconds": "{0} segons",
- "minute": "1 minut",
- "minutes": "{0} minuts",
- "hour": "una hora",
- "hours": "{0} hores",
- "day": "un dia",
- "days": "{0} dies",
- "month": "un mes",
- "months": "{0} mesos",
- "year": "un any",
- "years": "{0} anys",
- }
-
- month_names = [
- "",
- "gener",
- "febrer",
- "març",
- "abril",
- "maig",
- "juny",
- "juliol",
- "agost",
- "setembre",
- "octubre",
- "novembre",
- "desembre",
- ]
- month_abbreviations = [
- "",
- "gen.",
- "febr.",
- "març",
- "abr.",
- "maig",
- "juny",
- "jul.",
- "ag.",
- "set.",
- "oct.",
- "nov.",
- "des.",
- ]
- day_names = [
- "",
- "dilluns",
- "dimarts",
- "dimecres",
- "dijous",
- "divendres",
- "dissabte",
- "diumenge",
- ]
- day_abbreviations = [
- "",
- "dl.",
- "dt.",
- "dc.",
- "dj.",
- "dv.",
- "ds.",
- "dg.",
- ]
-
-
-class BasqueLocale(Locale):
- names = ["eu", "eu_eu"]
- past = "duela {0}"
- future = "{0}" # I don't know what's the right phrase in Basque for the future.
-
- timeframes = {
- "now": "Orain",
- "second": "segundo bat",
- "seconds": "{0} segundu",
- "minute": "minutu bat",
- "minutes": "{0} minutu",
- "hour": "ordu bat",
- "hours": "{0} ordu",
- "day": "egun bat",
- "days": "{0} egun",
- "month": "hilabete bat",
- "months": "{0} hilabet",
- "year": "urte bat",
- "years": "{0} urte",
- }
-
- month_names = [
- "",
- "urtarrilak",
- "otsailak",
- "martxoak",
- "apirilak",
- "maiatzak",
- "ekainak",
- "uztailak",
- "abuztuak",
- "irailak",
- "urriak",
- "azaroak",
- "abenduak",
- ]
- month_abbreviations = [
- "",
- "urt",
- "ots",
- "mar",
- "api",
- "mai",
- "eka",
- "uzt",
- "abu",
- "ira",
- "urr",
- "aza",
- "abe",
- ]
- day_names = [
- "",
- "astelehena",
- "asteartea",
- "asteazkena",
- "osteguna",
- "ostirala",
- "larunbata",
- "igandea",
- ]
- day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"]
-
-
-class HungarianLocale(Locale):
-
- names = ["hu", "hu_hu"]
-
- past = "{0} ezelőtt"
- future = "{0} múlva"
-
- timeframes = {
- "now": "éppen most",
- "second": {"past": "egy második", "future": "egy második"},
- "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"},
- "minute": {"past": "egy perccel", "future": "egy perc"},
- "minutes": {"past": "{0} perccel", "future": "{0} perc"},
- "hour": {"past": "egy órával", "future": "egy óra"},
- "hours": {"past": "{0} órával", "future": "{0} óra"},
- "day": {"past": "egy nappal", "future": "egy nap"},
- "days": {"past": "{0} nappal", "future": "{0} nap"},
- "month": {"past": "egy hónappal", "future": "egy hónap"},
- "months": {"past": "{0} hónappal", "future": "{0} hónap"},
- "year": {"past": "egy évvel", "future": "egy év"},
- "years": {"past": "{0} évvel", "future": "{0} év"},
- }
-
- month_names = [
- "",
- "január",
- "február",
- "március",
- "április",
- "május",
- "június",
- "július",
- "augusztus",
- "szeptember",
- "október",
- "november",
- "december",
- ]
- month_abbreviations = [
- "",
- "jan",
- "febr",
- "márc",
- "ápr",
- "máj",
- "jún",
- "júl",
- "aug",
- "szept",
- "okt",
- "nov",
- "dec",
- ]
-
- day_names = [
- "",
- "hétfő",
- "kedd",
- "szerda",
- "csütörtök",
- "péntek",
- "szombat",
- "vasárnap",
- ]
- day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"]
-
- meridians = {"am": "de", "pm": "du", "AM": "DE", "PM": "DU"}
-
- def _format_timeframe(self, timeframe, delta):
- form = self.timeframes[timeframe]
-
- if isinstance(form, dict):
- if delta > 0:
- form = form["future"]
- else:
- form = form["past"]
-
- return form.format(abs(delta))
-
-
-class EsperantoLocale(Locale):
- names = ["eo", "eo_xx"]
- past = "antaŭ {0}"
- future = "post {0}"
-
- timeframes = {
- "now": "nun",
- "second": "sekundo",
- "seconds": "{0} kelkaj sekundoj",
- "minute": "unu minuto",
- "minutes": "{0} minutoj",
- "hour": "un horo",
- "hours": "{0} horoj",
- "day": "unu tago",
- "days": "{0} tagoj",
- "month": "unu monato",
- "months": "{0} monatoj",
- "year": "unu jaro",
- "years": "{0} jaroj",
- }
-
- month_names = [
- "",
- "januaro",
- "februaro",
- "marto",
- "aprilo",
- "majo",
- "junio",
- "julio",
- "aŭgusto",
- "septembro",
- "oktobro",
- "novembro",
- "decembro",
- ]
- month_abbreviations = [
- "",
- "jan",
- "feb",
- "mar",
- "apr",
- "maj",
- "jun",
- "jul",
- "aŭg",
- "sep",
- "okt",
- "nov",
- "dec",
- ]
-
- day_names = [
- "",
- "lundo",
- "mardo",
- "merkredo",
- "ĵaŭdo",
- "vendredo",
- "sabato",
- "dimanĉo",
- ]
- day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"]
-
- meridians = {"am": "atm", "pm": "ptm", "AM": "ATM", "PM": "PTM"}
-
- ordinal_day_re = r"((?P[1-3]?[0-9](?=a))a)"
-
- def _ordinal_number(self, n):
- return "{}a".format(n)
-
-
-class ThaiLocale(Locale):
-
- names = ["th", "th_th"]
-
- past = "{0}{1}ที่ผ่านมา"
- future = "ในอีก{1}{0}"
-
- timeframes = {
- "now": "ขณะนี้",
- "second": "วินาที",
- "seconds": "{0} ไม่กี่วินาที",
- "minute": "1 นาที",
- "minutes": "{0} นาที",
- "hour": "1 ชั่วโมง",
- "hours": "{0} ชั่วโมง",
- "day": "1 วัน",
- "days": "{0} วัน",
- "month": "1 เดือน",
- "months": "{0} เดือน",
- "year": "1 ปี",
- "years": "{0} ปี",
- }
-
- month_names = [
- "",
- "มกราคม",
- "กุมภาพันธ์",
- "มีนาคม",
- "เมษายน",
- "พฤษภาคม",
- "มิถุนายน",
- "กรกฎาคม",
- "สิงหาคม",
- "กันยายน",
- "ตุลาคม",
- "พฤศจิกายน",
- "ธันวาคม",
- ]
- month_abbreviations = [
- "",
- "ม.ค.",
- "ก.พ.",
- "มี.ค.",
- "เม.ย.",
- "พ.ค.",
- "มิ.ย.",
- "ก.ค.",
- "ส.ค.",
- "ก.ย.",
- "ต.ค.",
- "พ.ย.",
- "ธ.ค.",
- ]
-
- day_names = ["", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศุกร์", "เสาร์", "อาทิตย์"]
- day_abbreviations = ["", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"]
-
- meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"}
-
- BE_OFFSET = 543
-
- def year_full(self, year):
- """Thai always use Buddhist Era (BE) which is CE + 543"""
- year += self.BE_OFFSET
- return "{:04d}".format(year)
-
- def year_abbreviation(self, year):
- """Thai always use Buddhist Era (BE) which is CE + 543"""
- year += self.BE_OFFSET
- return "{:04d}".format(year)[2:]
-
- def _format_relative(self, humanized, timeframe, delta):
- """Thai normally doesn't have any space between words"""
- if timeframe == "now":
- return humanized
- space = "" if timeframe == "seconds" else " "
- direction = self.past if delta < 0 else self.future
-
- return direction.format(humanized, space)
-
-
-class BengaliLocale(Locale):
-
- names = ["bn", "bn_bd", "bn_in"]
-
- past = "{0} আগে"
- future = "{0} পরে"
-
- timeframes = {
- "now": "এখন",
- "second": "একটি দ্বিতীয়",
- "seconds": "{0} সেকেন্ড",
- "minute": "এক মিনিট",
- "minutes": "{0} মিনিট",
- "hour": "এক ঘণ্টা",
- "hours": "{0} ঘণ্টা",
- "day": "এক দিন",
- "days": "{0} দিন",
- "month": "এক মাস",
- "months": "{0} মাস ",
- "year": "এক বছর",
- "years": "{0} বছর",
- }
-
- meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"}
-
- month_names = [
- "",
- "জানুয়ারি",
- "ফেব্রুয়ারি",
- "মার্চ",
- "এপ্রিল",
- "মে",
- "জুন",
- "জুলাই",
- "আগস্ট",
- "সেপ্টেম্বর",
- "অক্টোবর",
- "নভেম্বর",
- "ডিসেম্বর",
- ]
- month_abbreviations = [
- "",
- "জানু",
- "ফেব",
- "মার্চ",
- "এপ্রি",
- "মে",
- "জুন",
- "জুল",
- "অগা",
- "সেপ্ট",
- "অক্টো",
- "নভে",
- "ডিসে",
- ]
-
- day_names = [
- "",
- "সোমবার",
- "মঙ্গলবার",
- "বুধবার",
- "বৃহস্পতিবার",
- "শুক্রবার",
- "শনিবার",
- "রবিবার",
- ]
- day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"]
-
- def _ordinal_number(self, n):
- if n > 10 or n == 0:
- return "{}তম".format(n)
- if n in [1, 5, 7, 8, 9, 10]:
- return "{}ম".format(n)
- if n in [2, 3]:
- return "{}য়".format(n)
- if n == 4:
- return "{}র্থ".format(n)
- if n == 6:
- return "{}ষ্ঠ".format(n)
-
-
-class RomanshLocale(Locale):
-
- names = ["rm", "rm_ch"]
-
- past = "avant {0}"
- future = "en {0}"
-
- timeframes = {
- "now": "en quest mument",
- "second": "in secunda",
- "seconds": "{0} secundas",
- "minute": "ina minuta",
- "minutes": "{0} minutas",
- "hour": "in'ura",
- "hours": "{0} ura",
- "day": "in di",
- "days": "{0} dis",
- "month": "in mais",
- "months": "{0} mais",
- "year": "in onn",
- "years": "{0} onns",
- }
-
- month_names = [
- "",
- "schaner",
- "favrer",
- "mars",
- "avrigl",
- "matg",
- "zercladur",
- "fanadur",
- "avust",
- "settember",
- "october",
- "november",
- "december",
- ]
-
- month_abbreviations = [
- "",
- "schan",
- "fav",
- "mars",
- "avr",
- "matg",
- "zer",
- "fan",
- "avu",
- "set",
- "oct",
- "nov",
- "dec",
- ]
-
- day_names = [
- "",
- "glindesdi",
- "mardi",
- "mesemna",
- "gievgia",
- "venderdi",
- "sonda",
- "dumengia",
- ]
-
- day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"]
-
-
-class RomanianLocale(Locale):
- names = ["ro", "ro_ro"]
-
- past = "{0} în urmă"
- future = "peste {0}"
- and_word = "și"
-
- timeframes = {
- "now": "acum",
- "second": "o secunda",
- "seconds": "{0} câteva secunde",
- "minute": "un minut",
- "minutes": "{0} minute",
- "hour": "o oră",
- "hours": "{0} ore",
- "day": "o zi",
- "days": "{0} zile",
- "month": "o lună",
- "months": "{0} luni",
- "year": "un an",
- "years": "{0} ani",
- }
-
- month_names = [
- "",
- "ianuarie",
- "februarie",
- "martie",
- "aprilie",
- "mai",
- "iunie",
- "iulie",
- "august",
- "septembrie",
- "octombrie",
- "noiembrie",
- "decembrie",
- ]
- month_abbreviations = [
- "",
- "ian",
- "febr",
- "mart",
- "apr",
- "mai",
- "iun",
- "iul",
- "aug",
- "sept",
- "oct",
- "nov",
- "dec",
- ]
-
- day_names = [
- "",
- "luni",
- "marți",
- "miercuri",
- "joi",
- "vineri",
- "sâmbătă",
- "duminică",
- ]
- day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"]
-
-
-class SlovenianLocale(Locale):
- names = ["sl", "sl_si"]
-
- past = "pred {0}"
- future = "čez {0}"
- and_word = "in"
-
- timeframes = {
- "now": "zdaj",
- "second": "sekundo",
- "seconds": "{0} sekund",
- "minute": "minuta",
- "minutes": "{0} minutami",
- "hour": "uro",
- "hours": "{0} ur",
- "day": "dan",
- "days": "{0} dni",
- "month": "mesec",
- "months": "{0} mesecev",
- "year": "leto",
- "years": "{0} let",
- }
-
- meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
-
- month_names = [
- "",
- "Januar",
- "Februar",
- "Marec",
- "April",
- "Maj",
- "Junij",
- "Julij",
- "Avgust",
- "September",
- "Oktober",
- "November",
- "December",
- ]
-
- month_abbreviations = [
- "",
- "Jan",
- "Feb",
- "Mar",
- "Apr",
- "Maj",
- "Jun",
- "Jul",
- "Avg",
- "Sep",
- "Okt",
- "Nov",
- "Dec",
- ]
-
- day_names = [
- "",
- "Ponedeljek",
- "Torek",
- "Sreda",
- "Četrtek",
- "Petek",
- "Sobota",
- "Nedelja",
- ]
-
- day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"]
-
-
-class IndonesianLocale(Locale):
-
- names = ["id", "id_id"]
-
- past = "{0} yang lalu"
- future = "dalam {0}"
- and_word = "dan"
-
- timeframes = {
- "now": "baru saja",
- "second": "1 sebentar",
- "seconds": "{0} detik",
- "minute": "1 menit",
- "minutes": "{0} menit",
- "hour": "1 jam",
- "hours": "{0} jam",
- "day": "1 hari",
- "days": "{0} hari",
- "month": "1 bulan",
- "months": "{0} bulan",
- "year": "1 tahun",
- "years": "{0} tahun",
- }
-
- meridians = {"am": "", "pm": "", "AM": "", "PM": ""}
-
- month_names = [
- "",
- "Januari",
- "Februari",
- "Maret",
- "April",
- "Mei",
- "Juni",
- "Juli",
- "Agustus",
- "September",
- "Oktober",
- "November",
- "Desember",
- ]
-
- month_abbreviations = [
- "",
- "Jan",
- "Feb",
- "Mar",
- "Apr",
- "Mei",
- "Jun",
- "Jul",
- "Ags",
- "Sept",
- "Okt",
- "Nov",
- "Des",
- ]
-
- day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]
-
- day_abbreviations = [
- "",
- "Senin",
- "Selasa",
- "Rabu",
- "Kamis",
- "Jumat",
- "Sabtu",
- "Minggu",
- ]
-
-
-class NepaliLocale(Locale):
- names = ["ne", "ne_np"]
-
- past = "{0} पहिले"
- future = "{0} पछी"
-
- timeframes = {
- "now": "अहिले",
- "second": "एक सेकेन्ड",
- "seconds": "{0} सेकण्ड",
- "minute": "मिनेट",
- "minutes": "{0} मिनेट",
- "hour": "एक घण्टा",
- "hours": "{0} घण्टा",
- "day": "एक दिन",
- "days": "{0} दिन",
- "month": "एक महिना",
- "months": "{0} महिना",
- "year": "एक बर्ष",
- "years": "बर्ष",
- }
-
- meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"}
-
- month_names = [
- "",
- "जनवरी",
- "फेब्रुअरी",
- "मार्च",
- "एप्रील",
- "मे",
- "जुन",
- "जुलाई",
- "अगष्ट",
- "सेप्टेम्बर",
- "अक्टोबर",
- "नोवेम्बर",
- "डिसेम्बर",
- ]
- month_abbreviations = [
- "",
- "जन",
- "फेब",
- "मार्च",
- "एप्रील",
- "मे",
- "जुन",
- "जुलाई",
- "अग",
- "सेप",
- "अक्ट",
- "नोव",
- "डिस",
- ]
-
- day_names = [
- "",
- "सोमवार",
- "मंगलवार",
- "बुधवार",
- "बिहिवार",
- "शुक्रवार",
- "शनिवार",
- "आइतवार",
- ]
-
- day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"]
-
-
-class EstonianLocale(Locale):
- names = ["ee", "et"]
-
- past = "{0} tagasi"
- future = "{0} pärast"
- and_word = "ja"
-
- timeframes = {
- "now": {"past": "just nüüd", "future": "just nüüd"},
- "second": {"past": "üks sekund", "future": "ühe sekundi"},
- "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"},
- "minute": {"past": "üks minut", "future": "ühe minuti"},
- "minutes": {"past": "{0} minutit", "future": "{0} minuti"},
- "hour": {"past": "tund aega", "future": "tunni aja"},
- "hours": {"past": "{0} tundi", "future": "{0} tunni"},
- "day": {"past": "üks päev", "future": "ühe päeva"},
- "days": {"past": "{0} päeva", "future": "{0} päeva"},
- "month": {"past": "üks kuu", "future": "ühe kuu"},
- "months": {"past": "{0} kuud", "future": "{0} kuu"},
- "year": {"past": "üks aasta", "future": "ühe aasta"},
- "years": {"past": "{0} aastat", "future": "{0} aasta"},
- }
-
- month_names = [
- "",
- "Jaanuar",
- "Veebruar",
- "Märts",
- "Aprill",
- "Mai",
- "Juuni",
- "Juuli",
- "August",
- "September",
- "Oktoober",
- "November",
- "Detsember",
- ]
- month_abbreviations = [
- "",
- "Jan",
- "Veb",
- "Mär",
- "Apr",
- "Mai",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Okt",
- "Nov",
- "Dets",
- ]
-
- day_names = [
- "",
- "Esmaspäev",
- "Teisipäev",
- "Kolmapäev",
- "Neljapäev",
- "Reede",
- "Laupäev",
- "Pühapäev",
- ]
- day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"]
-
- def _format_timeframe(self, timeframe, delta):
- form = self.timeframes[timeframe]
- if delta > 0:
- form = form["future"]
- else:
- form = form["past"]
- return form.format(abs(delta))
-
-
-class SwahiliLocale(Locale):
-
- names = [
- "sw",
- "sw_ke",
- "sw_tz",
- ]
-
- past = "{0} iliyopita"
- future = "muda wa {0}"
- and_word = "na"
-
- timeframes = {
- "now": "sasa hivi",
- "second": "sekunde",
- "seconds": "sekunde {0}",
- "minute": "dakika moja",
- "minutes": "dakika {0}",
- "hour": "saa moja",
- "hours": "saa {0}",
- "day": "siku moja",
- "days": "siku {0}",
- "week": "wiki moja",
- "weeks": "wiki {0}",
- "month": "mwezi moja",
- "months": "miezi {0}",
- "year": "mwaka moja",
- "years": "miaka {0}",
- }
-
- meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"}
-
- month_names = [
- "",
- "Januari",
- "Februari",
- "Machi",
- "Aprili",
- "Mei",
- "Juni",
- "Julai",
- "Agosti",
- "Septemba",
- "Oktoba",
- "Novemba",
- "Desemba",
- ]
- month_abbreviations = [
- "",
- "Jan",
- "Feb",
- "Mac",
- "Apr",
- "Mei",
- "Jun",
- "Jul",
- "Ago",
- "Sep",
- "Okt",
- "Nov",
- "Des",
- ]
-
- day_names = [
- "",
- "Jumatatu",
- "Jumanne",
- "Jumatano",
- "Alhamisi",
- "Ijumaa",
- "Jumamosi",
- "Jumapili",
- ]
- day_abbreviations = [
- "",
- "Jumatatu",
- "Jumanne",
- "Jumatano",
- "Alhamisi",
- "Ijumaa",
- "Jumamosi",
- "Jumapili",
- ]
-
-
-_locales = _map_locales()
diff --git a/client/ayon_core/vendor/python/python_2/arrow/parser.py b/client/ayon_core/vendor/python/python_2/arrow/parser.py
deleted file mode 100644
index 243fd1721c..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/parser.py
+++ /dev/null
@@ -1,596 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import, unicode_literals
-
-import re
-from datetime import datetime, timedelta
-
-from dateutil import tz
-
-from arrow import locales
-from arrow.util import iso_to_gregorian, next_weekday, normalize_timestamp
-
-try:
- from functools import lru_cache
-except ImportError: # pragma: no cover
- from backports.functools_lru_cache import lru_cache # pragma: no cover
-
-
-class ParserError(ValueError):
- pass
-
-
-# Allows for ParserErrors to be propagated from _build_datetime()
-# when day_of_year errors occur.
-# Before this, the ParserErrors were caught by the try/except in
-# _parse_multiformat() and the appropriate error message was not
-# transmitted to the user.
-class ParserMatchError(ParserError):
- pass
-
-
-class DateTimeParser(object):
-
- _FORMAT_RE = re.compile(
- r"(YYY?Y?|MM?M?M?|Do|DD?D?D?|d?d?d?d|HH?|hh?|mm?|ss?|S+|ZZ?Z?|a|A|x|X|W)"
- )
- _ESCAPE_RE = re.compile(r"\[[^\[\]]*\]")
-
- _ONE_OR_TWO_DIGIT_RE = re.compile(r"\d{1,2}")
- _ONE_OR_TWO_OR_THREE_DIGIT_RE = re.compile(r"\d{1,3}")
- _ONE_OR_MORE_DIGIT_RE = re.compile(r"\d+")
- _TWO_DIGIT_RE = re.compile(r"\d{2}")
- _THREE_DIGIT_RE = re.compile(r"\d{3}")
- _FOUR_DIGIT_RE = re.compile(r"\d{4}")
- _TZ_Z_RE = re.compile(r"([\+\-])(\d{2})(?:(\d{2}))?|Z")
- _TZ_ZZ_RE = re.compile(r"([\+\-])(\d{2})(?:\:(\d{2}))?|Z")
- _TZ_NAME_RE = re.compile(r"\w[\w+\-/]+")
- # NOTE: timestamps cannot be parsed from natural language strings (by removing the ^...$) because it will
- # break cases like "15 Jul 2000" and a format list (see issue #447)
- _TIMESTAMP_RE = re.compile(r"^\-?\d+\.?\d+$")
- _TIMESTAMP_EXPANDED_RE = re.compile(r"^\-?\d+$")
- _TIME_RE = re.compile(r"^(\d{2})(?:\:?(\d{2}))?(?:\:?(\d{2}))?(?:([\.\,])(\d+))?$")
- _WEEK_DATE_RE = re.compile(r"(?P\d{4})[\-]?W(?P\d{2})[\-]?(?P\d)?")
-
- _BASE_INPUT_RE_MAP = {
- "YYYY": _FOUR_DIGIT_RE,
- "YY": _TWO_DIGIT_RE,
- "MM": _TWO_DIGIT_RE,
- "M": _ONE_OR_TWO_DIGIT_RE,
- "DDDD": _THREE_DIGIT_RE,
- "DDD": _ONE_OR_TWO_OR_THREE_DIGIT_RE,
- "DD": _TWO_DIGIT_RE,
- "D": _ONE_OR_TWO_DIGIT_RE,
- "HH": _TWO_DIGIT_RE,
- "H": _ONE_OR_TWO_DIGIT_RE,
- "hh": _TWO_DIGIT_RE,
- "h": _ONE_OR_TWO_DIGIT_RE,
- "mm": _TWO_DIGIT_RE,
- "m": _ONE_OR_TWO_DIGIT_RE,
- "ss": _TWO_DIGIT_RE,
- "s": _ONE_OR_TWO_DIGIT_RE,
- "X": _TIMESTAMP_RE,
- "x": _TIMESTAMP_EXPANDED_RE,
- "ZZZ": _TZ_NAME_RE,
- "ZZ": _TZ_ZZ_RE,
- "Z": _TZ_Z_RE,
- "S": _ONE_OR_MORE_DIGIT_RE,
- "W": _WEEK_DATE_RE,
- }
-
- SEPARATORS = ["-", "/", "."]
-
- def __init__(self, locale="en_us", cache_size=0):
-
- self.locale = locales.get_locale(locale)
- self._input_re_map = self._BASE_INPUT_RE_MAP.copy()
- self._input_re_map.update(
- {
- "MMMM": self._generate_choice_re(
- self.locale.month_names[1:], re.IGNORECASE
- ),
- "MMM": self._generate_choice_re(
- self.locale.month_abbreviations[1:], re.IGNORECASE
- ),
- "Do": re.compile(self.locale.ordinal_day_re),
- "dddd": self._generate_choice_re(
- self.locale.day_names[1:], re.IGNORECASE
- ),
- "ddd": self._generate_choice_re(
- self.locale.day_abbreviations[1:], re.IGNORECASE
- ),
- "d": re.compile(r"[1-7]"),
- "a": self._generate_choice_re(
- (self.locale.meridians["am"], self.locale.meridians["pm"])
- ),
- # note: 'A' token accepts both 'am/pm' and 'AM/PM' formats to
- # ensure backwards compatibility of this token
- "A": self._generate_choice_re(self.locale.meridians.values()),
- }
- )
- if cache_size > 0:
- self._generate_pattern_re = lru_cache(maxsize=cache_size)(
- self._generate_pattern_re
- )
-
- # TODO: since we support more than ISO 8601, we should rename this function
- # IDEA: break into multiple functions
- def parse_iso(self, datetime_string, normalize_whitespace=False):
-
- if normalize_whitespace:
- datetime_string = re.sub(r"\s+", " ", datetime_string.strip())
-
- has_space_divider = " " in datetime_string
- has_t_divider = "T" in datetime_string
-
- num_spaces = datetime_string.count(" ")
- if has_space_divider and num_spaces != 1 or has_t_divider and num_spaces > 0:
- raise ParserError(
- "Expected an ISO 8601-like string, but was given '{}'. Try passing in a format string to resolve this.".format(
- datetime_string
- )
- )
-
- has_time = has_space_divider or has_t_divider
- has_tz = False
-
- # date formats (ISO 8601 and others) to test against
- # NOTE: YYYYMM is omitted to avoid confusion with YYMMDD (no longer part of ISO 8601, but is still often used)
- formats = [
- "YYYY-MM-DD",
- "YYYY-M-DD",
- "YYYY-M-D",
- "YYYY/MM/DD",
- "YYYY/M/DD",
- "YYYY/M/D",
- "YYYY.MM.DD",
- "YYYY.M.DD",
- "YYYY.M.D",
- "YYYYMMDD",
- "YYYY-DDDD",
- "YYYYDDDD",
- "YYYY-MM",
- "YYYY/MM",
- "YYYY.MM",
- "YYYY",
- "W",
- ]
-
- if has_time:
-
- if has_space_divider:
- date_string, time_string = datetime_string.split(" ", 1)
- else:
- date_string, time_string = datetime_string.split("T", 1)
-
- time_parts = re.split(r"[\+\-Z]", time_string, 1, re.IGNORECASE)
-
- time_components = self._TIME_RE.match(time_parts[0])
-
- if time_components is None:
- raise ParserError(
- "Invalid time component provided. Please specify a format or provide a valid time component in the basic or extended ISO 8601 time format."
- )
-
- (
- hours,
- minutes,
- seconds,
- subseconds_sep,
- subseconds,
- ) = time_components.groups()
-
- has_tz = len(time_parts) == 2
- has_minutes = minutes is not None
- has_seconds = seconds is not None
- has_subseconds = subseconds is not None
-
- is_basic_time_format = ":" not in time_parts[0]
- tz_format = "Z"
-
- # use 'ZZ' token instead since tz offset is present in non-basic format
- if has_tz and ":" in time_parts[1]:
- tz_format = "ZZ"
-
- time_sep = "" if is_basic_time_format else ":"
-
- if has_subseconds:
- time_string = "HH{time_sep}mm{time_sep}ss{subseconds_sep}S".format(
- time_sep=time_sep, subseconds_sep=subseconds_sep
- )
- elif has_seconds:
- time_string = "HH{time_sep}mm{time_sep}ss".format(time_sep=time_sep)
- elif has_minutes:
- time_string = "HH{time_sep}mm".format(time_sep=time_sep)
- else:
- time_string = "HH"
-
- if has_space_divider:
- formats = ["{} {}".format(f, time_string) for f in formats]
- else:
- formats = ["{}T{}".format(f, time_string) for f in formats]
-
- if has_time and has_tz:
- # Add "Z" or "ZZ" to the format strings to indicate to
- # _parse_token() that a timezone needs to be parsed
- formats = ["{}{}".format(f, tz_format) for f in formats]
-
- return self._parse_multiformat(datetime_string, formats)
-
- def parse(self, datetime_string, fmt, normalize_whitespace=False):
-
- if normalize_whitespace:
- datetime_string = re.sub(r"\s+", " ", datetime_string)
-
- if isinstance(fmt, list):
- return self._parse_multiformat(datetime_string, fmt)
-
- fmt_tokens, fmt_pattern_re = self._generate_pattern_re(fmt)
-
- match = fmt_pattern_re.search(datetime_string)
-
- if match is None:
- raise ParserMatchError(
- "Failed to match '{}' when parsing '{}'".format(fmt, datetime_string)
- )
-
- parts = {}
- for token in fmt_tokens:
- if token == "Do":
- value = match.group("value")
- elif token == "W":
- value = (match.group("year"), match.group("week"), match.group("day"))
- else:
- value = match.group(token)
- self._parse_token(token, value, parts)
-
- return self._build_datetime(parts)
-
- def _generate_pattern_re(self, fmt):
-
- # fmt is a string of tokens like 'YYYY-MM-DD'
- # we construct a new string by replacing each
- # token by its pattern:
- # 'YYYY-MM-DD' -> '(?P\d{4})-(?P\d{2})-(?P\d{2})'
- tokens = []
- offset = 0
-
- # Escape all special RegEx chars
- escaped_fmt = re.escape(fmt)
-
- # Extract the bracketed expressions to be reinserted later.
- escaped_fmt = re.sub(self._ESCAPE_RE, "#", escaped_fmt)
-
- # Any number of S is the same as one.
- # TODO: allow users to specify the number of digits to parse
- escaped_fmt = re.sub(r"S+", "S", escaped_fmt)
-
- escaped_data = re.findall(self._ESCAPE_RE, fmt)
-
- fmt_pattern = escaped_fmt
-
- for m in self._FORMAT_RE.finditer(escaped_fmt):
- token = m.group(0)
- try:
- input_re = self._input_re_map[token]
- except KeyError:
- raise ParserError("Unrecognized token '{}'".format(token))
- input_pattern = "(?P<{}>{})".format(token, input_re.pattern)
- tokens.append(token)
- # a pattern doesn't have the same length as the token
- # it replaces! We keep the difference in the offset variable.
- # This works because the string is scanned left-to-right and matches
- # are returned in the order found by finditer.
- fmt_pattern = (
- fmt_pattern[: m.start() + offset]
- + input_pattern
- + fmt_pattern[m.end() + offset :]
- )
- offset += len(input_pattern) - (m.end() - m.start())
-
- final_fmt_pattern = ""
- split_fmt = fmt_pattern.split(r"\#")
-
- # Due to the way Python splits, 'split_fmt' will always be longer
- for i in range(len(split_fmt)):
- final_fmt_pattern += split_fmt[i]
- if i < len(escaped_data):
- final_fmt_pattern += escaped_data[i][1:-1]
-
- # Wrap final_fmt_pattern in a custom word boundary to strictly
- # match the formatting pattern and filter out date and time formats
- # that include junk such as: blah1998-09-12 blah, blah 1998-09-12blah,
- # blah1998-09-12blah. The custom word boundary matches every character
- # that is not a whitespace character to allow for searching for a date
- # and time string in a natural language sentence. Therefore, searching
- # for a string of the form YYYY-MM-DD in "blah 1998-09-12 blah" will
- # work properly.
- # Certain punctuation before or after the target pattern such as
- # "1998-09-12," is permitted. For the full list of valid punctuation,
- # see the documentation.
-
- starting_word_boundary = (
- r"(?\s])" # This is the list of punctuation that is ok before the pattern (i.e. "It can't not be these characters before the pattern")
- r"(\b|^)" # The \b is to block cases like 1201912 but allow 201912 for pattern YYYYMM. The ^ was necessary to allow a negative number through i.e. before epoch numbers
- )
- ending_word_boundary = (
- r"(?=[\,\.\;\:\?\!\"\'\`\[\]\{\}\(\)\<\>]?" # Positive lookahead stating that these punctuation marks can appear after the pattern at most 1 time
- r"(?!\S))" # Don't allow any non-whitespace character after the punctuation
- )
- bounded_fmt_pattern = r"{}{}{}".format(
- starting_word_boundary, final_fmt_pattern, ending_word_boundary
- )
-
- return tokens, re.compile(bounded_fmt_pattern, flags=re.IGNORECASE)
-
- def _parse_token(self, token, value, parts):
-
- if token == "YYYY":
- parts["year"] = int(value)
-
- elif token == "YY":
- value = int(value)
- parts["year"] = 1900 + value if value > 68 else 2000 + value
-
- elif token in ["MMMM", "MMM"]:
- parts["month"] = self.locale.month_number(value.lower())
-
- elif token in ["MM", "M"]:
- parts["month"] = int(value)
-
- elif token in ["DDDD", "DDD"]:
- parts["day_of_year"] = int(value)
-
- elif token in ["DD", "D"]:
- parts["day"] = int(value)
-
- elif token == "Do":
- parts["day"] = int(value)
-
- elif token == "dddd":
- # locale day names are 1-indexed
- day_of_week = [x.lower() for x in self.locale.day_names].index(
- value.lower()
- )
- parts["day_of_week"] = day_of_week - 1
-
- elif token == "ddd":
- # locale day abbreviations are 1-indexed
- day_of_week = [x.lower() for x in self.locale.day_abbreviations].index(
- value.lower()
- )
- parts["day_of_week"] = day_of_week - 1
-
- elif token.upper() in ["HH", "H"]:
- parts["hour"] = int(value)
-
- elif token in ["mm", "m"]:
- parts["minute"] = int(value)
-
- elif token in ["ss", "s"]:
- parts["second"] = int(value)
-
- elif token == "S":
- # We have the *most significant* digits of an arbitrary-precision integer.
- # We want the six most significant digits as an integer, rounded.
- # IDEA: add nanosecond support somehow? Need datetime support for it first.
- value = value.ljust(7, str("0"))
-
- # floating-point (IEEE-754) defaults to half-to-even rounding
- seventh_digit = int(value[6])
- if seventh_digit == 5:
- rounding = int(value[5]) % 2
- elif seventh_digit > 5:
- rounding = 1
- else:
- rounding = 0
-
- parts["microsecond"] = int(value[:6]) + rounding
-
- elif token == "X":
- parts["timestamp"] = float(value)
-
- elif token == "x":
- parts["expanded_timestamp"] = int(value)
-
- elif token in ["ZZZ", "ZZ", "Z"]:
- parts["tzinfo"] = TzinfoParser.parse(value)
-
- elif token in ["a", "A"]:
- if value in (self.locale.meridians["am"], self.locale.meridians["AM"]):
- parts["am_pm"] = "am"
- elif value in (self.locale.meridians["pm"], self.locale.meridians["PM"]):
- parts["am_pm"] = "pm"
-
- elif token == "W":
- parts["weekdate"] = value
-
- @staticmethod
- def _build_datetime(parts):
-
- weekdate = parts.get("weekdate")
-
- if weekdate is not None:
- # we can use strptime (%G, %V, %u) in python 3.6 but these tokens aren't available before that
- year, week = int(weekdate[0]), int(weekdate[1])
-
- if weekdate[2] is not None:
- day = int(weekdate[2])
- else:
- # day not given, default to 1
- day = 1
-
- dt = iso_to_gregorian(year, week, day)
- parts["year"] = dt.year
- parts["month"] = dt.month
- parts["day"] = dt.day
-
- timestamp = parts.get("timestamp")
-
- if timestamp is not None:
- return datetime.fromtimestamp(timestamp, tz=tz.tzutc())
-
- expanded_timestamp = parts.get("expanded_timestamp")
-
- if expanded_timestamp is not None:
- return datetime.fromtimestamp(
- normalize_timestamp(expanded_timestamp),
- tz=tz.tzutc(),
- )
-
- day_of_year = parts.get("day_of_year")
-
- if day_of_year is not None:
- year = parts.get("year")
- month = parts.get("month")
- if year is None:
- raise ParserError(
- "Year component is required with the DDD and DDDD tokens."
- )
-
- if month is not None:
- raise ParserError(
- "Month component is not allowed with the DDD and DDDD tokens."
- )
-
- date_string = "{}-{}".format(year, day_of_year)
- try:
- dt = datetime.strptime(date_string, "%Y-%j")
- except ValueError:
- raise ParserError(
- "The provided day of year '{}' is invalid.".format(day_of_year)
- )
-
- parts["year"] = dt.year
- parts["month"] = dt.month
- parts["day"] = dt.day
-
- day_of_week = parts.get("day_of_week")
- day = parts.get("day")
-
- # If day is passed, ignore day of week
- if day_of_week is not None and day is None:
- year = parts.get("year", 1970)
- month = parts.get("month", 1)
- day = 1
-
- # dddd => first day of week after epoch
- # dddd YYYY => first day of week in specified year
- # dddd MM YYYY => first day of week in specified year and month
- # dddd MM => first day after epoch in specified month
- next_weekday_dt = next_weekday(datetime(year, month, day), day_of_week)
- parts["year"] = next_weekday_dt.year
- parts["month"] = next_weekday_dt.month
- parts["day"] = next_weekday_dt.day
-
- am_pm = parts.get("am_pm")
- hour = parts.get("hour", 0)
-
- if am_pm == "pm" and hour < 12:
- hour += 12
- elif am_pm == "am" and hour == 12:
- hour = 0
-
- # Support for midnight at the end of day
- if hour == 24:
- if parts.get("minute", 0) != 0:
- raise ParserError("Midnight at the end of day must not contain minutes")
- if parts.get("second", 0) != 0:
- raise ParserError("Midnight at the end of day must not contain seconds")
- if parts.get("microsecond", 0) != 0:
- raise ParserError(
- "Midnight at the end of day must not contain microseconds"
- )
- hour = 0
- day_increment = 1
- else:
- day_increment = 0
-
- # account for rounding up to 1000000
- microsecond = parts.get("microsecond", 0)
- if microsecond == 1000000:
- microsecond = 0
- second_increment = 1
- else:
- second_increment = 0
-
- increment = timedelta(days=day_increment, seconds=second_increment)
-
- return (
- datetime(
- year=parts.get("year", 1),
- month=parts.get("month", 1),
- day=parts.get("day", 1),
- hour=hour,
- minute=parts.get("minute", 0),
- second=parts.get("second", 0),
- microsecond=microsecond,
- tzinfo=parts.get("tzinfo"),
- )
- + increment
- )
-
- def _parse_multiformat(self, string, formats):
-
- _datetime = None
-
- for fmt in formats:
- try:
- _datetime = self.parse(string, fmt)
- break
- except ParserMatchError:
- pass
-
- if _datetime is None:
- raise ParserError(
- "Could not match input '{}' to any of the following formats: {}".format(
- string, ", ".join(formats)
- )
- )
-
- return _datetime
-
- # generates a capture group of choices separated by an OR operator
- @staticmethod
- def _generate_choice_re(choices, flags=0):
- return re.compile(r"({})".format("|".join(choices)), flags=flags)
-
-
-class TzinfoParser(object):
- _TZINFO_RE = re.compile(r"^([\+\-])?(\d{2})(?:\:?(\d{2}))?$")
-
- @classmethod
- def parse(cls, tzinfo_string):
-
- tzinfo = None
-
- if tzinfo_string == "local":
- tzinfo = tz.tzlocal()
-
- elif tzinfo_string in ["utc", "UTC", "Z"]:
- tzinfo = tz.tzutc()
-
- else:
-
- iso_match = cls._TZINFO_RE.match(tzinfo_string)
-
- if iso_match:
- sign, hours, minutes = iso_match.groups()
- if minutes is None:
- minutes = 0
- seconds = int(hours) * 3600 + int(minutes) * 60
-
- if sign == "-":
- seconds *= -1
-
- tzinfo = tz.tzoffset(None, seconds)
-
- else:
- tzinfo = tz.gettz(tzinfo_string)
-
- if tzinfo is None:
- raise ParserError(
- 'Could not parse timezone expression "{}"'.format(tzinfo_string)
- )
-
- return tzinfo
diff --git a/client/ayon_core/vendor/python/python_2/arrow/util.py b/client/ayon_core/vendor/python/python_2/arrow/util.py
deleted file mode 100644
index acce8878df..0000000000
--- a/client/ayon_core/vendor/python/python_2/arrow/util.py
+++ /dev/null
@@ -1,115 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import absolute_import
-
-import datetime
-import numbers
-
-from dateutil.rrule import WEEKLY, rrule
-
-from arrow.constants import MAX_TIMESTAMP, MAX_TIMESTAMP_MS, MAX_TIMESTAMP_US
-
-
-def next_weekday(start_date, weekday):
- """Get next weekday from the specified start date.
-
- :param start_date: Datetime object representing the start date.
- :param weekday: Next weekday to obtain. Can be a value between 0 (Monday) and 6 (Sunday).
- :return: Datetime object corresponding to the next weekday after start_date.
-
- Usage::
-
- # Get first Monday after epoch
- >>> next_weekday(datetime(1970, 1, 1), 0)
- 1970-01-05 00:00:00
-
- # Get first Thursday after epoch
- >>> next_weekday(datetime(1970, 1, 1), 3)
- 1970-01-01 00:00:00
-
- # Get first Sunday after epoch
- >>> next_weekday(datetime(1970, 1, 1), 6)
- 1970-01-04 00:00:00
- """
- if weekday < 0 or weekday > 6:
- raise ValueError("Weekday must be between 0 (Monday) and 6 (Sunday).")
- return rrule(freq=WEEKLY, dtstart=start_date, byweekday=weekday, count=1)[0]
-
-
-def total_seconds(td):
- """Get total seconds for timedelta."""
- return td.total_seconds()
-
-
-def is_timestamp(value):
- """Check if value is a valid timestamp."""
- if isinstance(value, bool):
- return False
- if not (
- isinstance(value, numbers.Integral)
- or isinstance(value, float)
- or isinstance(value, str)
- ):
- return False
- try:
- float(value)
- return True
- except ValueError:
- return False
-
-
-def normalize_timestamp(timestamp):
- """Normalize millisecond and microsecond timestamps into normal timestamps."""
- if timestamp > MAX_TIMESTAMP:
- if timestamp < MAX_TIMESTAMP_MS:
- timestamp /= 1e3
- elif timestamp < MAX_TIMESTAMP_US:
- timestamp /= 1e6
- else:
- raise ValueError(
- "The specified timestamp '{}' is too large.".format(timestamp)
- )
- return timestamp
-
-
-# Credit to https://stackoverflow.com/a/1700069
-def iso_to_gregorian(iso_year, iso_week, iso_day):
- """Converts an ISO week date tuple into a datetime object."""
-
- if not 1 <= iso_week <= 53:
- raise ValueError("ISO Calendar week value must be between 1-53.")
-
- if not 1 <= iso_day <= 7:
- raise ValueError("ISO Calendar day value must be between 1-7")
-
- # The first week of the year always contains 4 Jan.
- fourth_jan = datetime.date(iso_year, 1, 4)
- delta = datetime.timedelta(fourth_jan.isoweekday() - 1)
- year_start = fourth_jan - delta
- gregorian = year_start + datetime.timedelta(days=iso_day - 1, weeks=iso_week - 1)
-
- return gregorian
-
-
-def validate_bounds(bounds):
- if bounds != "()" and bounds != "(]" and bounds != "[)" and bounds != "[]":
- raise ValueError(
- 'Invalid bounds. Please select between "()", "(]", "[)", or "[]".'
- )
-
-
-# Python 2.7 / 3.0+ definitions for isstr function.
-
-try: # pragma: no cover
- basestring
-
- def isstr(s):
- return isinstance(s, basestring) # noqa: F821
-
-
-except NameError: # pragma: no cover
-
- def isstr(s):
- return isinstance(s, str)
-
-
-__all__ = ["next_weekday", "total_seconds", "is_timestamp", "isstr", "iso_to_gregorian"]
diff --git a/client/ayon_core/vendor/python/python_2/attr/__init__.py b/client/ayon_core/vendor/python/python_2/attr/__init__.py
deleted file mode 100644
index f95c96dd57..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/__init__.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from __future__ import absolute_import, division, print_function
-
-import sys
-
-from functools import partial
-
-from . import converters, exceptions, filters, setters, validators
-from ._cmp import cmp_using
-from ._config import get_run_validators, set_run_validators
-from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types
-from ._make import (
- NOTHING,
- Attribute,
- Factory,
- attrib,
- attrs,
- fields,
- fields_dict,
- make_class,
- validate,
-)
-from ._version_info import VersionInfo
-
-
-__version__ = "21.4.0"
-__version_info__ = VersionInfo._from_version_string(__version__)
-
-__title__ = "attrs"
-__description__ = "Classes Without Boilerplate"
-__url__ = "https://www.attrs.org/"
-__uri__ = __url__
-__doc__ = __description__ + " <" + __uri__ + ">"
-
-__author__ = "Hynek Schlawack"
-__email__ = "hs@ox.cx"
-
-__license__ = "MIT"
-__copyright__ = "Copyright (c) 2015 Hynek Schlawack"
-
-
-s = attributes = attrs
-ib = attr = attrib
-dataclass = partial(attrs, auto_attribs=True) # happy Easter ;)
-
-__all__ = [
- "Attribute",
- "Factory",
- "NOTHING",
- "asdict",
- "assoc",
- "astuple",
- "attr",
- "attrib",
- "attributes",
- "attrs",
- "cmp_using",
- "converters",
- "evolve",
- "exceptions",
- "fields",
- "fields_dict",
- "filters",
- "get_run_validators",
- "has",
- "ib",
- "make_class",
- "resolve_types",
- "s",
- "set_run_validators",
- "setters",
- "validate",
- "validators",
-]
-
-if sys.version_info[:2] >= (3, 6):
- from ._next_gen import define, field, frozen, mutable # noqa: F401
-
- __all__.extend(("define", "field", "frozen", "mutable"))
diff --git a/client/ayon_core/vendor/python/python_2/attr/__init__.pyi b/client/ayon_core/vendor/python/python_2/attr/__init__.pyi
deleted file mode 100644
index c0a2126503..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/__init__.pyi
+++ /dev/null
@@ -1,484 +0,0 @@
-import sys
-
-from typing import (
- Any,
- Callable,
- Dict,
- Generic,
- List,
- Mapping,
- Optional,
- Sequence,
- Tuple,
- Type,
- TypeVar,
- Union,
- overload,
-)
-
-# `import X as X` is required to make these public
-from . import converters as converters
-from . import exceptions as exceptions
-from . import filters as filters
-from . import setters as setters
-from . import validators as validators
-from ._version_info import VersionInfo
-
-__version__: str
-__version_info__: VersionInfo
-__title__: str
-__description__: str
-__url__: str
-__uri__: str
-__author__: str
-__email__: str
-__license__: str
-__copyright__: str
-
-_T = TypeVar("_T")
-_C = TypeVar("_C", bound=type)
-
-_EqOrderType = Union[bool, Callable[[Any], Any]]
-_ValidatorType = Callable[[Any, Attribute[_T], _T], Any]
-_ConverterType = Callable[[Any], Any]
-_FilterType = Callable[[Attribute[_T], _T], bool]
-_ReprType = Callable[[Any], str]
-_ReprArgType = Union[bool, _ReprType]
-_OnSetAttrType = Callable[[Any, Attribute[Any], Any], Any]
-_OnSetAttrArgType = Union[
- _OnSetAttrType, List[_OnSetAttrType], setters._NoOpType
-]
-_FieldTransformer = Callable[
- [type, List[Attribute[Any]]], List[Attribute[Any]]
-]
-_CompareWithType = Callable[[Any, Any], bool]
-# FIXME: in reality, if multiple validators are passed they must be in a list
-# or tuple, but those are invariant and so would prevent subtypes of
-# _ValidatorType from working when passed in a list or tuple.
-_ValidatorArgType = Union[_ValidatorType[_T], Sequence[_ValidatorType[_T]]]
-
-# _make --
-
-NOTHING: object
-
-# NOTE: Factory lies about its return type to make this possible:
-# `x: List[int] # = Factory(list)`
-# Work around mypy issue #4554 in the common case by using an overload.
-if sys.version_info >= (3, 8):
- from typing import Literal
- @overload
- def Factory(factory: Callable[[], _T]) -> _T: ...
- @overload
- def Factory(
- factory: Callable[[Any], _T],
- takes_self: Literal[True],
- ) -> _T: ...
- @overload
- def Factory(
- factory: Callable[[], _T],
- takes_self: Literal[False],
- ) -> _T: ...
-
-else:
- @overload
- def Factory(factory: Callable[[], _T]) -> _T: ...
- @overload
- def Factory(
- factory: Union[Callable[[Any], _T], Callable[[], _T]],
- takes_self: bool = ...,
- ) -> _T: ...
-
-# Static type inference support via __dataclass_transform__ implemented as per:
-# https://github.com/microsoft/pyright/blob/1.1.135/specs/dataclass_transforms.md
-# This annotation must be applied to all overloads of "define" and "attrs"
-#
-# NOTE: This is a typing construct and does not exist at runtime. Extensions
-# wrapping attrs decorators should declare a separate __dataclass_transform__
-# signature in the extension module using the specification linked above to
-# provide pyright support.
-def __dataclass_transform__(
- *,
- eq_default: bool = True,
- order_default: bool = False,
- kw_only_default: bool = False,
- field_descriptors: Tuple[Union[type, Callable[..., Any]], ...] = (()),
-) -> Callable[[_T], _T]: ...
-
-class Attribute(Generic[_T]):
- name: str
- default: Optional[_T]
- validator: Optional[_ValidatorType[_T]]
- repr: _ReprArgType
- cmp: _EqOrderType
- eq: _EqOrderType
- order: _EqOrderType
- hash: Optional[bool]
- init: bool
- converter: Optional[_ConverterType]
- metadata: Dict[Any, Any]
- type: Optional[Type[_T]]
- kw_only: bool
- on_setattr: _OnSetAttrType
- def evolve(self, **changes: Any) -> "Attribute[Any]": ...
-
-# NOTE: We had several choices for the annotation to use for type arg:
-# 1) Type[_T]
-# - Pros: Handles simple cases correctly
-# - Cons: Might produce less informative errors in the case of conflicting
-# TypeVars e.g. `attr.ib(default='bad', type=int)`
-# 2) Callable[..., _T]
-# - Pros: Better error messages than #1 for conflicting TypeVars
-# - Cons: Terrible error messages for validator checks.
-# e.g. attr.ib(type=int, validator=validate_str)
-# -> error: Cannot infer function type argument
-# 3) type (and do all of the work in the mypy plugin)
-# - Pros: Simple here, and we could customize the plugin with our own errors.
-# - Cons: Would need to write mypy plugin code to handle all the cases.
-# We chose option #1.
-
-# `attr` lies about its return type to make the following possible:
-# attr() -> Any
-# attr(8) -> int
-# attr(validator=) -> Whatever the callable expects.
-# This makes this type of assignments possible:
-# x: int = attr(8)
-#
-# This form catches explicit None or no default but with no other arguments
-# returns Any.
-@overload
-def attrib(
- default: None = ...,
- validator: None = ...,
- repr: _ReprArgType = ...,
- cmp: Optional[_EqOrderType] = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- metadata: Optional[Mapping[Any, Any]] = ...,
- type: None = ...,
- converter: None = ...,
- factory: None = ...,
- kw_only: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
-) -> Any: ...
-
-# This form catches an explicit None or no default and infers the type from the
-# other arguments.
-@overload
-def attrib(
- default: None = ...,
- validator: Optional[_ValidatorArgType[_T]] = ...,
- repr: _ReprArgType = ...,
- cmp: Optional[_EqOrderType] = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- metadata: Optional[Mapping[Any, Any]] = ...,
- type: Optional[Type[_T]] = ...,
- converter: Optional[_ConverterType] = ...,
- factory: Optional[Callable[[], _T]] = ...,
- kw_only: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
-) -> _T: ...
-
-# This form catches an explicit default argument.
-@overload
-def attrib(
- default: _T,
- validator: Optional[_ValidatorArgType[_T]] = ...,
- repr: _ReprArgType = ...,
- cmp: Optional[_EqOrderType] = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- metadata: Optional[Mapping[Any, Any]] = ...,
- type: Optional[Type[_T]] = ...,
- converter: Optional[_ConverterType] = ...,
- factory: Optional[Callable[[], _T]] = ...,
- kw_only: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
-) -> _T: ...
-
-# This form covers type=non-Type: e.g. forward references (str), Any
-@overload
-def attrib(
- default: Optional[_T] = ...,
- validator: Optional[_ValidatorArgType[_T]] = ...,
- repr: _ReprArgType = ...,
- cmp: Optional[_EqOrderType] = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- metadata: Optional[Mapping[Any, Any]] = ...,
- type: object = ...,
- converter: Optional[_ConverterType] = ...,
- factory: Optional[Callable[[], _T]] = ...,
- kw_only: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
-) -> Any: ...
-@overload
-def field(
- *,
- default: None = ...,
- validator: None = ...,
- repr: _ReprArgType = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- metadata: Optional[Mapping[Any, Any]] = ...,
- converter: None = ...,
- factory: None = ...,
- kw_only: bool = ...,
- eq: Optional[bool] = ...,
- order: Optional[bool] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
-) -> Any: ...
-
-# This form catches an explicit None or no default and infers the type from the
-# other arguments.
-@overload
-def field(
- *,
- default: None = ...,
- validator: Optional[_ValidatorArgType[_T]] = ...,
- repr: _ReprArgType = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- metadata: Optional[Mapping[Any, Any]] = ...,
- converter: Optional[_ConverterType] = ...,
- factory: Optional[Callable[[], _T]] = ...,
- kw_only: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
-) -> _T: ...
-
-# This form catches an explicit default argument.
-@overload
-def field(
- *,
- default: _T,
- validator: Optional[_ValidatorArgType[_T]] = ...,
- repr: _ReprArgType = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- metadata: Optional[Mapping[Any, Any]] = ...,
- converter: Optional[_ConverterType] = ...,
- factory: Optional[Callable[[], _T]] = ...,
- kw_only: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
-) -> _T: ...
-
-# This form covers type=non-Type: e.g. forward references (str), Any
-@overload
-def field(
- *,
- default: Optional[_T] = ...,
- validator: Optional[_ValidatorArgType[_T]] = ...,
- repr: _ReprArgType = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- metadata: Optional[Mapping[Any, Any]] = ...,
- converter: Optional[_ConverterType] = ...,
- factory: Optional[Callable[[], _T]] = ...,
- kw_only: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
-) -> Any: ...
-@overload
-@__dataclass_transform__(order_default=True, field_descriptors=(attrib, field))
-def attrs(
- maybe_cls: _C,
- these: Optional[Dict[str, Any]] = ...,
- repr_ns: Optional[str] = ...,
- repr: bool = ...,
- cmp: Optional[_EqOrderType] = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- slots: bool = ...,
- frozen: bool = ...,
- weakref_slot: bool = ...,
- str: bool = ...,
- auto_attribs: bool = ...,
- kw_only: bool = ...,
- cache_hash: bool = ...,
- auto_exc: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- auto_detect: bool = ...,
- collect_by_mro: bool = ...,
- getstate_setstate: Optional[bool] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
- field_transformer: Optional[_FieldTransformer] = ...,
- match_args: bool = ...,
-) -> _C: ...
-@overload
-@__dataclass_transform__(order_default=True, field_descriptors=(attrib, field))
-def attrs(
- maybe_cls: None = ...,
- these: Optional[Dict[str, Any]] = ...,
- repr_ns: Optional[str] = ...,
- repr: bool = ...,
- cmp: Optional[_EqOrderType] = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- slots: bool = ...,
- frozen: bool = ...,
- weakref_slot: bool = ...,
- str: bool = ...,
- auto_attribs: bool = ...,
- kw_only: bool = ...,
- cache_hash: bool = ...,
- auto_exc: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- auto_detect: bool = ...,
- collect_by_mro: bool = ...,
- getstate_setstate: Optional[bool] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
- field_transformer: Optional[_FieldTransformer] = ...,
- match_args: bool = ...,
-) -> Callable[[_C], _C]: ...
-@overload
-@__dataclass_transform__(field_descriptors=(attrib, field))
-def define(
- maybe_cls: _C,
- *,
- these: Optional[Dict[str, Any]] = ...,
- repr: bool = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- slots: bool = ...,
- frozen: bool = ...,
- weakref_slot: bool = ...,
- str: bool = ...,
- auto_attribs: bool = ...,
- kw_only: bool = ...,
- cache_hash: bool = ...,
- auto_exc: bool = ...,
- eq: Optional[bool] = ...,
- order: Optional[bool] = ...,
- auto_detect: bool = ...,
- getstate_setstate: Optional[bool] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
- field_transformer: Optional[_FieldTransformer] = ...,
- match_args: bool = ...,
-) -> _C: ...
-@overload
-@__dataclass_transform__(field_descriptors=(attrib, field))
-def define(
- maybe_cls: None = ...,
- *,
- these: Optional[Dict[str, Any]] = ...,
- repr: bool = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- slots: bool = ...,
- frozen: bool = ...,
- weakref_slot: bool = ...,
- str: bool = ...,
- auto_attribs: bool = ...,
- kw_only: bool = ...,
- cache_hash: bool = ...,
- auto_exc: bool = ...,
- eq: Optional[bool] = ...,
- order: Optional[bool] = ...,
- auto_detect: bool = ...,
- getstate_setstate: Optional[bool] = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
- field_transformer: Optional[_FieldTransformer] = ...,
- match_args: bool = ...,
-) -> Callable[[_C], _C]: ...
-
-mutable = define
-frozen = define # they differ only in their defaults
-
-# TODO: add support for returning NamedTuple from the mypy plugin
-class _Fields(Tuple[Attribute[Any], ...]):
- def __getattr__(self, name: str) -> Attribute[Any]: ...
-
-def fields(cls: type) -> _Fields: ...
-def fields_dict(cls: type) -> Dict[str, Attribute[Any]]: ...
-def validate(inst: Any) -> None: ...
-def resolve_types(
- cls: _C,
- globalns: Optional[Dict[str, Any]] = ...,
- localns: Optional[Dict[str, Any]] = ...,
- attribs: Optional[List[Attribute[Any]]] = ...,
-) -> _C: ...
-
-# TODO: add support for returning a proper attrs class from the mypy plugin
-# we use Any instead of _CountingAttr so that e.g. `make_class('Foo',
-# [attr.ib()])` is valid
-def make_class(
- name: str,
- attrs: Union[List[str], Tuple[str, ...], Dict[str, Any]],
- bases: Tuple[type, ...] = ...,
- repr_ns: Optional[str] = ...,
- repr: bool = ...,
- cmp: Optional[_EqOrderType] = ...,
- hash: Optional[bool] = ...,
- init: bool = ...,
- slots: bool = ...,
- frozen: bool = ...,
- weakref_slot: bool = ...,
- str: bool = ...,
- auto_attribs: bool = ...,
- kw_only: bool = ...,
- cache_hash: bool = ...,
- auto_exc: bool = ...,
- eq: Optional[_EqOrderType] = ...,
- order: Optional[_EqOrderType] = ...,
- collect_by_mro: bool = ...,
- on_setattr: Optional[_OnSetAttrArgType] = ...,
- field_transformer: Optional[_FieldTransformer] = ...,
-) -> type: ...
-
-# _funcs --
-
-# TODO: add support for returning TypedDict from the mypy plugin
-# FIXME: asdict/astuple do not honor their factory args. Waiting on one of
-# these:
-# https://github.com/python/mypy/issues/4236
-# https://github.com/python/typing/issues/253
-# XXX: remember to fix attrs.asdict/astuple too!
-def asdict(
- inst: Any,
- recurse: bool = ...,
- filter: Optional[_FilterType[Any]] = ...,
- dict_factory: Type[Mapping[Any, Any]] = ...,
- retain_collection_types: bool = ...,
- value_serializer: Optional[
- Callable[[type, Attribute[Any], Any], Any]
- ] = ...,
- tuple_keys: Optional[bool] = ...,
-) -> Dict[str, Any]: ...
-
-# TODO: add support for returning NamedTuple from the mypy plugin
-def astuple(
- inst: Any,
- recurse: bool = ...,
- filter: Optional[_FilterType[Any]] = ...,
- tuple_factory: Type[Sequence[Any]] = ...,
- retain_collection_types: bool = ...,
-) -> Tuple[Any, ...]: ...
-def has(cls: type) -> bool: ...
-def assoc(inst: _T, **changes: Any) -> _T: ...
-def evolve(inst: _T, **changes: Any) -> _T: ...
-
-# _config --
-
-def set_run_validators(run: bool) -> None: ...
-def get_run_validators() -> bool: ...
-
-# aliases --
-
-s = attributes = attrs
-ib = attr = attrib
-dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;)
diff --git a/client/ayon_core/vendor/python/python_2/attr/_cmp.py b/client/ayon_core/vendor/python/python_2/attr/_cmp.py
deleted file mode 100644
index 6cffa4dbab..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_cmp.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from __future__ import absolute_import, division, print_function
-
-import functools
-
-from ._compat import new_class
-from ._make import _make_ne
-
-
-_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "ge": ">="}
-
-
-def cmp_using(
- eq=None,
- lt=None,
- le=None,
- gt=None,
- ge=None,
- require_same_type=True,
- class_name="Comparable",
-):
- """
- Create a class that can be passed into `attr.ib`'s ``eq``, ``order``, and
- ``cmp`` arguments to customize field comparison.
-
- The resulting class will have a full set of ordering methods if
- at least one of ``{lt, le, gt, ge}`` and ``eq`` are provided.
-
- :param Optional[callable] eq: `callable` used to evaluate equality
- of two objects.
- :param Optional[callable] lt: `callable` used to evaluate whether
- one object is less than another object.
- :param Optional[callable] le: `callable` used to evaluate whether
- one object is less than or equal to another object.
- :param Optional[callable] gt: `callable` used to evaluate whether
- one object is greater than another object.
- :param Optional[callable] ge: `callable` used to evaluate whether
- one object is greater than or equal to another object.
-
- :param bool require_same_type: When `True`, equality and ordering methods
- will return `NotImplemented` if objects are not of the same type.
-
- :param Optional[str] class_name: Name of class. Defaults to 'Comparable'.
-
- See `comparison` for more details.
-
- .. versionadded:: 21.1.0
- """
-
- body = {
- "__slots__": ["value"],
- "__init__": _make_init(),
- "_requirements": [],
- "_is_comparable_to": _is_comparable_to,
- }
-
- # Add operations.
- num_order_functions = 0
- has_eq_function = False
-
- if eq is not None:
- has_eq_function = True
- body["__eq__"] = _make_operator("eq", eq)
- body["__ne__"] = _make_ne()
-
- if lt is not None:
- num_order_functions += 1
- body["__lt__"] = _make_operator("lt", lt)
-
- if le is not None:
- num_order_functions += 1
- body["__le__"] = _make_operator("le", le)
-
- if gt is not None:
- num_order_functions += 1
- body["__gt__"] = _make_operator("gt", gt)
-
- if ge is not None:
- num_order_functions += 1
- body["__ge__"] = _make_operator("ge", ge)
-
- type_ = new_class(class_name, (object,), {}, lambda ns: ns.update(body))
-
- # Add same type requirement.
- if require_same_type:
- type_._requirements.append(_check_same_type)
-
- # Add total ordering if at least one operation was defined.
- if 0 < num_order_functions < 4:
- if not has_eq_function:
- # functools.total_ordering requires __eq__ to be defined,
- # so raise early error here to keep a nice stack.
- raise ValueError(
- "eq must be define is order to complete ordering from "
- "lt, le, gt, ge."
- )
- type_ = functools.total_ordering(type_)
-
- return type_
-
-
-def _make_init():
- """
- Create __init__ method.
- """
-
- def __init__(self, value):
- """
- Initialize object with *value*.
- """
- self.value = value
-
- return __init__
-
-
-def _make_operator(name, func):
- """
- Create operator method.
- """
-
- def method(self, other):
- if not self._is_comparable_to(other):
- return NotImplemented
-
- result = func(self.value, other.value)
- if result is NotImplemented:
- return NotImplemented
-
- return result
-
- method.__name__ = "__%s__" % (name,)
- method.__doc__ = "Return a %s b. Computed by attrs." % (
- _operation_names[name],
- )
-
- return method
-
-
-def _is_comparable_to(self, other):
- """
- Check whether `other` is comparable to `self`.
- """
- for func in self._requirements:
- if not func(self, other):
- return False
- return True
-
-
-def _check_same_type(self, other):
- """
- Return True if *self* and *other* are of the same type, False otherwise.
- """
- return other.value.__class__ is self.value.__class__
diff --git a/client/ayon_core/vendor/python/python_2/attr/_cmp.pyi b/client/ayon_core/vendor/python/python_2/attr/_cmp.pyi
deleted file mode 100644
index e71aaff7a1..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_cmp.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-from typing import Type
-
-from . import _CompareWithType
-
-def cmp_using(
- eq: Optional[_CompareWithType],
- lt: Optional[_CompareWithType],
- le: Optional[_CompareWithType],
- gt: Optional[_CompareWithType],
- ge: Optional[_CompareWithType],
- require_same_type: bool,
- class_name: str,
-) -> Type: ...
diff --git a/client/ayon_core/vendor/python/python_2/attr/_compat.py b/client/ayon_core/vendor/python/python_2/attr/_compat.py
deleted file mode 100644
index dc0cb02b64..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_compat.py
+++ /dev/null
@@ -1,261 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from __future__ import absolute_import, division, print_function
-
-import platform
-import sys
-import threading
-import types
-import warnings
-
-
-PY2 = sys.version_info[0] == 2
-PYPY = platform.python_implementation() == "PyPy"
-PY36 = sys.version_info[:2] >= (3, 6)
-HAS_F_STRINGS = PY36
-PY310 = sys.version_info[:2] >= (3, 10)
-
-
-if PYPY or PY36:
- ordered_dict = dict
-else:
- from collections import OrderedDict
-
- ordered_dict = OrderedDict
-
-
-if PY2:
- from collections import Mapping, Sequence
-
- from UserDict import IterableUserDict
-
- # We 'bundle' isclass instead of using inspect as importing inspect is
- # fairly expensive (order of 10-15 ms for a modern machine in 2016)
- def isclass(klass):
- return isinstance(klass, (type, types.ClassType))
-
- def new_class(name, bases, kwds, exec_body):
- """
- A minimal stub of types.new_class that we need for make_class.
- """
- ns = {}
- exec_body(ns)
-
- return type(name, bases, ns)
-
- # TYPE is used in exceptions, repr(int) is different on Python 2 and 3.
- TYPE = "type"
-
- def iteritems(d):
- return d.iteritems()
-
- # Python 2 is bereft of a read-only dict proxy, so we make one!
- class ReadOnlyDict(IterableUserDict):
- """
- Best-effort read-only dict wrapper.
- """
-
- def __setitem__(self, key, val):
- # We gently pretend we're a Python 3 mappingproxy.
- raise TypeError(
- "'mappingproxy' object does not support item assignment"
- )
-
- def update(self, _):
- # We gently pretend we're a Python 3 mappingproxy.
- raise AttributeError(
- "'mappingproxy' object has no attribute 'update'"
- )
-
- def __delitem__(self, _):
- # We gently pretend we're a Python 3 mappingproxy.
- raise TypeError(
- "'mappingproxy' object does not support item deletion"
- )
-
- def clear(self):
- # We gently pretend we're a Python 3 mappingproxy.
- raise AttributeError(
- "'mappingproxy' object has no attribute 'clear'"
- )
-
- def pop(self, key, default=None):
- # We gently pretend we're a Python 3 mappingproxy.
- raise AttributeError(
- "'mappingproxy' object has no attribute 'pop'"
- )
-
- def popitem(self):
- # We gently pretend we're a Python 3 mappingproxy.
- raise AttributeError(
- "'mappingproxy' object has no attribute 'popitem'"
- )
-
- def setdefault(self, key, default=None):
- # We gently pretend we're a Python 3 mappingproxy.
- raise AttributeError(
- "'mappingproxy' object has no attribute 'setdefault'"
- )
-
- def __repr__(self):
- # Override to be identical to the Python 3 version.
- return "mappingproxy(" + repr(self.data) + ")"
-
- def metadata_proxy(d):
- res = ReadOnlyDict()
- res.data.update(d) # We blocked update, so we have to do it like this.
- return res
-
- def just_warn(*args, **kw): # pragma: no cover
- """
- We only warn on Python 3 because we are not aware of any concrete
- consequences of not setting the cell on Python 2.
- """
-
-else: # Python 3 and later.
- from collections.abc import Mapping, Sequence # noqa
-
- def just_warn(*args, **kw):
- """
- We only warn on Python 3 because we are not aware of any concrete
- consequences of not setting the cell on Python 2.
- """
- warnings.warn(
- "Running interpreter doesn't sufficiently support code object "
- "introspection. Some features like bare super() or accessing "
- "__class__ will not work with slotted classes.",
- RuntimeWarning,
- stacklevel=2,
- )
-
- def isclass(klass):
- return isinstance(klass, type)
-
- TYPE = "class"
-
- def iteritems(d):
- return d.items()
-
- new_class = types.new_class
-
- def metadata_proxy(d):
- return types.MappingProxyType(dict(d))
-
-
-def make_set_closure_cell():
- """Return a function of two arguments (cell, value) which sets
- the value stored in the closure cell `cell` to `value`.
- """
- # pypy makes this easy. (It also supports the logic below, but
- # why not do the easy/fast thing?)
- if PYPY:
-
- def set_closure_cell(cell, value):
- cell.__setstate__((value,))
-
- return set_closure_cell
-
- # Otherwise gotta do it the hard way.
-
- # Create a function that will set its first cellvar to `value`.
- def set_first_cellvar_to(value):
- x = value
- return
-
- # This function will be eliminated as dead code, but
- # not before its reference to `x` forces `x` to be
- # represented as a closure cell rather than a local.
- def force_x_to_be_a_cell(): # pragma: no cover
- return x
-
- try:
- # Extract the code object and make sure our assumptions about
- # the closure behavior are correct.
- if PY2:
- co = set_first_cellvar_to.func_code
- else:
- co = set_first_cellvar_to.__code__
- if co.co_cellvars != ("x",) or co.co_freevars != ():
- raise AssertionError # pragma: no cover
-
- # Convert this code object to a code object that sets the
- # function's first _freevar_ (not cellvar) to the argument.
- if sys.version_info >= (3, 8):
- # CPython 3.8+ has an incompatible CodeType signature
- # (added a posonlyargcount argument) but also added
- # CodeType.replace() to do this without counting parameters.
- set_first_freevar_code = co.replace(
- co_cellvars=co.co_freevars, co_freevars=co.co_cellvars
- )
- else:
- args = [co.co_argcount]
- if not PY2:
- args.append(co.co_kwonlyargcount)
- args.extend(
- [
- co.co_nlocals,
- co.co_stacksize,
- co.co_flags,
- co.co_code,
- co.co_consts,
- co.co_names,
- co.co_varnames,
- co.co_filename,
- co.co_name,
- co.co_firstlineno,
- co.co_lnotab,
- # These two arguments are reversed:
- co.co_cellvars,
- co.co_freevars,
- ]
- )
- set_first_freevar_code = types.CodeType(*args)
-
- def set_closure_cell(cell, value):
- # Create a function using the set_first_freevar_code,
- # whose first closure cell is `cell`. Calling it will
- # change the value of that cell.
- setter = types.FunctionType(
- set_first_freevar_code, {}, "setter", (), (cell,)
- )
- # And call it to set the cell.
- setter(value)
-
- # Make sure it works on this interpreter:
- def make_func_with_cell():
- x = None
-
- def func():
- return x # pragma: no cover
-
- return func
-
- if PY2:
- cell = make_func_with_cell().func_closure[0]
- else:
- cell = make_func_with_cell().__closure__[0]
- set_closure_cell(cell, 100)
- if cell.cell_contents != 100:
- raise AssertionError # pragma: no cover
-
- except Exception:
- return just_warn
- else:
- return set_closure_cell
-
-
-set_closure_cell = make_set_closure_cell()
-
-# Thread-local global to track attrs instances which are already being repr'd.
-# This is needed because there is no other (thread-safe) way to pass info
-# about the instances that are already being repr'd through the call stack
-# in order to ensure we don't perform infinite recursion.
-#
-# For instance, if an instance contains a dict which contains that instance,
-# we need to know that we're already repr'ing the outside instance from within
-# the dict's repr() call.
-#
-# This lives here rather than in _make.py so that the functions in _make.py
-# don't have a direct reference to the thread-local in their globals dict.
-# If they have such a reference, it breaks cloudpickle.
-repr_context = threading.local()
diff --git a/client/ayon_core/vendor/python/python_2/attr/_config.py b/client/ayon_core/vendor/python/python_2/attr/_config.py
deleted file mode 100644
index fc9be29d00..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_config.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from __future__ import absolute_import, division, print_function
-
-
-__all__ = ["set_run_validators", "get_run_validators"]
-
-_run_validators = True
-
-
-def set_run_validators(run):
- """
- Set whether or not validators are run. By default, they are run.
-
- .. deprecated:: 21.3.0 It will not be removed, but it also will not be
- moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()`
- instead.
- """
- if not isinstance(run, bool):
- raise TypeError("'run' must be bool.")
- global _run_validators
- _run_validators = run
-
-
-def get_run_validators():
- """
- Return whether or not validators are run.
-
- .. deprecated:: 21.3.0 It will not be removed, but it also will not be
- moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()`
- instead.
- """
- return _run_validators
diff --git a/client/ayon_core/vendor/python/python_2/attr/_funcs.py b/client/ayon_core/vendor/python/python_2/attr/_funcs.py
deleted file mode 100644
index 4c90085a40..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_funcs.py
+++ /dev/null
@@ -1,422 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from __future__ import absolute_import, division, print_function
-
-import copy
-
-from ._compat import iteritems
-from ._make import NOTHING, _obj_setattr, fields
-from .exceptions import AttrsAttributeNotFoundError
-
-
-def asdict(
- inst,
- recurse=True,
- filter=None,
- dict_factory=dict,
- retain_collection_types=False,
- value_serializer=None,
-):
- """
- Return the ``attrs`` attribute values of *inst* as a dict.
-
- Optionally recurse into other ``attrs``-decorated classes.
-
- :param inst: Instance of an ``attrs``-decorated class.
- :param bool recurse: Recurse into classes that are also
- ``attrs``-decorated.
- :param callable filter: A callable whose return code determines whether an
- attribute or element is included (``True``) or dropped (``False``). Is
- called with the `attrs.Attribute` as the first argument and the
- value as the second argument.
- :param callable dict_factory: A callable to produce dictionaries from. For
- example, to produce ordered dictionaries instead of normal Python
- dictionaries, pass in ``collections.OrderedDict``.
- :param bool retain_collection_types: Do not convert to ``list`` when
- encountering an attribute whose type is ``tuple`` or ``set``. Only
- meaningful if ``recurse`` is ``True``.
- :param Optional[callable] value_serializer: A hook that is called for every
- attribute or dict key/value. It receives the current instance, field
- and value and must return the (updated) value. The hook is run *after*
- the optional *filter* has been applied.
-
- :rtype: return type of *dict_factory*
-
- :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
- class.
-
- .. versionadded:: 16.0.0 *dict_factory*
- .. versionadded:: 16.1.0 *retain_collection_types*
- .. versionadded:: 20.3.0 *value_serializer*
- .. versionadded:: 21.3.0 If a dict has a collection for a key, it is
- serialized as a tuple.
- """
- attrs = fields(inst.__class__)
- rv = dict_factory()
- for a in attrs:
- v = getattr(inst, a.name)
- if filter is not None and not filter(a, v):
- continue
-
- if value_serializer is not None:
- v = value_serializer(inst, a, v)
-
- if recurse is True:
- if has(v.__class__):
- rv[a.name] = asdict(
- v,
- recurse=True,
- filter=filter,
- dict_factory=dict_factory,
- retain_collection_types=retain_collection_types,
- value_serializer=value_serializer,
- )
- elif isinstance(v, (tuple, list, set, frozenset)):
- cf = v.__class__ if retain_collection_types is True else list
- rv[a.name] = cf(
- [
- _asdict_anything(
- i,
- is_key=False,
- filter=filter,
- dict_factory=dict_factory,
- retain_collection_types=retain_collection_types,
- value_serializer=value_serializer,
- )
- for i in v
- ]
- )
- elif isinstance(v, dict):
- df = dict_factory
- rv[a.name] = df(
- (
- _asdict_anything(
- kk,
- is_key=True,
- filter=filter,
- dict_factory=df,
- retain_collection_types=retain_collection_types,
- value_serializer=value_serializer,
- ),
- _asdict_anything(
- vv,
- is_key=False,
- filter=filter,
- dict_factory=df,
- retain_collection_types=retain_collection_types,
- value_serializer=value_serializer,
- ),
- )
- for kk, vv in iteritems(v)
- )
- else:
- rv[a.name] = v
- else:
- rv[a.name] = v
- return rv
-
-
-def _asdict_anything(
- val,
- is_key,
- filter,
- dict_factory,
- retain_collection_types,
- value_serializer,
-):
- """
- ``asdict`` only works on attrs instances, this works on anything.
- """
- if getattr(val.__class__, "__attrs_attrs__", None) is not None:
- # Attrs class.
- rv = asdict(
- val,
- recurse=True,
- filter=filter,
- dict_factory=dict_factory,
- retain_collection_types=retain_collection_types,
- value_serializer=value_serializer,
- )
- elif isinstance(val, (tuple, list, set, frozenset)):
- if retain_collection_types is True:
- cf = val.__class__
- elif is_key:
- cf = tuple
- else:
- cf = list
-
- rv = cf(
- [
- _asdict_anything(
- i,
- is_key=False,
- filter=filter,
- dict_factory=dict_factory,
- retain_collection_types=retain_collection_types,
- value_serializer=value_serializer,
- )
- for i in val
- ]
- )
- elif isinstance(val, dict):
- df = dict_factory
- rv = df(
- (
- _asdict_anything(
- kk,
- is_key=True,
- filter=filter,
- dict_factory=df,
- retain_collection_types=retain_collection_types,
- value_serializer=value_serializer,
- ),
- _asdict_anything(
- vv,
- is_key=False,
- filter=filter,
- dict_factory=df,
- retain_collection_types=retain_collection_types,
- value_serializer=value_serializer,
- ),
- )
- for kk, vv in iteritems(val)
- )
- else:
- rv = val
- if value_serializer is not None:
- rv = value_serializer(None, None, rv)
-
- return rv
-
-
-def astuple(
- inst,
- recurse=True,
- filter=None,
- tuple_factory=tuple,
- retain_collection_types=False,
-):
- """
- Return the ``attrs`` attribute values of *inst* as a tuple.
-
- Optionally recurse into other ``attrs``-decorated classes.
-
- :param inst: Instance of an ``attrs``-decorated class.
- :param bool recurse: Recurse into classes that are also
- ``attrs``-decorated.
- :param callable filter: A callable whose return code determines whether an
- attribute or element is included (``True``) or dropped (``False``). Is
- called with the `attrs.Attribute` as the first argument and the
- value as the second argument.
- :param callable tuple_factory: A callable to produce tuples from. For
- example, to produce lists instead of tuples.
- :param bool retain_collection_types: Do not convert to ``list``
- or ``dict`` when encountering an attribute which type is
- ``tuple``, ``dict`` or ``set``. Only meaningful if ``recurse`` is
- ``True``.
-
- :rtype: return type of *tuple_factory*
-
- :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
- class.
-
- .. versionadded:: 16.2.0
- """
- attrs = fields(inst.__class__)
- rv = []
- retain = retain_collection_types # Very long. :/
- for a in attrs:
- v = getattr(inst, a.name)
- if filter is not None and not filter(a, v):
- continue
- if recurse is True:
- if has(v.__class__):
- rv.append(
- astuple(
- v,
- recurse=True,
- filter=filter,
- tuple_factory=tuple_factory,
- retain_collection_types=retain,
- )
- )
- elif isinstance(v, (tuple, list, set, frozenset)):
- cf = v.__class__ if retain is True else list
- rv.append(
- cf(
- [
- astuple(
- j,
- recurse=True,
- filter=filter,
- tuple_factory=tuple_factory,
- retain_collection_types=retain,
- )
- if has(j.__class__)
- else j
- for j in v
- ]
- )
- )
- elif isinstance(v, dict):
- df = v.__class__ if retain is True else dict
- rv.append(
- df(
- (
- astuple(
- kk,
- tuple_factory=tuple_factory,
- retain_collection_types=retain,
- )
- if has(kk.__class__)
- else kk,
- astuple(
- vv,
- tuple_factory=tuple_factory,
- retain_collection_types=retain,
- )
- if has(vv.__class__)
- else vv,
- )
- for kk, vv in iteritems(v)
- )
- )
- else:
- rv.append(v)
- else:
- rv.append(v)
-
- return rv if tuple_factory is list else tuple_factory(rv)
-
-
-def has(cls):
- """
- Check whether *cls* is a class with ``attrs`` attributes.
-
- :param type cls: Class to introspect.
- :raise TypeError: If *cls* is not a class.
-
- :rtype: bool
- """
- return getattr(cls, "__attrs_attrs__", None) is not None
-
-
-def assoc(inst, **changes):
- """
- Copy *inst* and apply *changes*.
-
- :param inst: Instance of a class with ``attrs`` attributes.
- :param changes: Keyword changes in the new copy.
-
- :return: A copy of inst with *changes* incorporated.
-
- :raise attr.exceptions.AttrsAttributeNotFoundError: If *attr_name* couldn't
- be found on *cls*.
- :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
- class.
-
- .. deprecated:: 17.1.0
- Use `attrs.evolve` instead if you can.
- This function will not be removed du to the slightly different approach
- compared to `attrs.evolve`.
- """
- import warnings
-
- warnings.warn(
- "assoc is deprecated and will be removed after 2018/01.",
- DeprecationWarning,
- stacklevel=2,
- )
- new = copy.copy(inst)
- attrs = fields(inst.__class__)
- for k, v in iteritems(changes):
- a = getattr(attrs, k, NOTHING)
- if a is NOTHING:
- raise AttrsAttributeNotFoundError(
- "{k} is not an attrs attribute on {cl}.".format(
- k=k, cl=new.__class__
- )
- )
- _obj_setattr(new, k, v)
- return new
-
-
-def evolve(inst, **changes):
- """
- Create a new instance, based on *inst* with *changes* applied.
-
- :param inst: Instance of a class with ``attrs`` attributes.
- :param changes: Keyword changes in the new copy.
-
- :return: A copy of inst with *changes* incorporated.
-
- :raise TypeError: If *attr_name* couldn't be found in the class
- ``__init__``.
- :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
- class.
-
- .. versionadded:: 17.1.0
- """
- cls = inst.__class__
- attrs = fields(cls)
- for a in attrs:
- if not a.init:
- continue
- attr_name = a.name # To deal with private attributes.
- init_name = attr_name if attr_name[0] != "_" else attr_name[1:]
- if init_name not in changes:
- changes[init_name] = getattr(inst, attr_name)
-
- return cls(**changes)
-
-
-def resolve_types(cls, globalns=None, localns=None, attribs=None):
- """
- Resolve any strings and forward annotations in type annotations.
-
- This is only required if you need concrete types in `Attribute`'s *type*
- field. In other words, you don't need to resolve your types if you only
- use them for static type checking.
-
- With no arguments, names will be looked up in the module in which the class
- was created. If this is not what you want, e.g. if the name only exists
- inside a method, you may pass *globalns* or *localns* to specify other
- dictionaries in which to look up these names. See the docs of
- `typing.get_type_hints` for more details.
-
- :param type cls: Class to resolve.
- :param Optional[dict] globalns: Dictionary containing global variables.
- :param Optional[dict] localns: Dictionary containing local variables.
- :param Optional[list] attribs: List of attribs for the given class.
- This is necessary when calling from inside a ``field_transformer``
- since *cls* is not an ``attrs`` class yet.
-
- :raise TypeError: If *cls* is not a class.
- :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
- class and you didn't pass any attribs.
- :raise NameError: If types cannot be resolved because of missing variables.
-
- :returns: *cls* so you can use this function also as a class decorator.
- Please note that you have to apply it **after** `attrs.define`. That
- means the decorator has to come in the line **before** `attrs.define`.
-
- .. versionadded:: 20.1.0
- .. versionadded:: 21.1.0 *attribs*
-
- """
- # Since calling get_type_hints is expensive we cache whether we've
- # done it already.
- if getattr(cls, "__attrs_types_resolved__", None) != cls:
- import typing
-
- hints = typing.get_type_hints(cls, globalns=globalns, localns=localns)
- for field in fields(cls) if attribs is None else attribs:
- if field.name in hints:
- # Since fields have been frozen we must work around it.
- _obj_setattr(field, "type", hints[field.name])
- # We store the class we resolved so that subclasses know they haven't
- # been resolved.
- cls.__attrs_types_resolved__ = cls
-
- # Return the class so you can use it as a decorator too.
- return cls
diff --git a/client/ayon_core/vendor/python/python_2/attr/_make.py b/client/ayon_core/vendor/python/python_2/attr/_make.py
deleted file mode 100644
index d46f8a3e7a..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_make.py
+++ /dev/null
@@ -1,3173 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from __future__ import absolute_import, division, print_function
-
-import copy
-import inspect
-import linecache
-import sys
-import warnings
-
-from operator import itemgetter
-
-# We need to import _compat itself in addition to the _compat members to avoid
-# having the thread-local in the globals here.
-from . import _compat, _config, setters
-from ._compat import (
- HAS_F_STRINGS,
- PY2,
- PY310,
- PYPY,
- isclass,
- iteritems,
- metadata_proxy,
- new_class,
- ordered_dict,
- set_closure_cell,
-)
-from .exceptions import (
- DefaultAlreadySetError,
- FrozenInstanceError,
- NotAnAttrsClassError,
- PythonTooOldError,
- UnannotatedAttributeError,
-)
-
-
-if not PY2:
- import typing
-
-
-# This is used at least twice, so cache it here.
-_obj_setattr = object.__setattr__
-_init_converter_pat = "__attr_converter_%s"
-_init_factory_pat = "__attr_factory_{}"
-_tuple_property_pat = (
- " {attr_name} = _attrs_property(_attrs_itemgetter({index}))"
-)
-_classvar_prefixes = (
- "typing.ClassVar",
- "t.ClassVar",
- "ClassVar",
- "typing_extensions.ClassVar",
-)
-# we don't use a double-underscore prefix because that triggers
-# name mangling when trying to create a slot for the field
-# (when slots=True)
-_hash_cache_field = "_attrs_cached_hash"
-
-_empty_metadata_singleton = metadata_proxy({})
-
-# Unique object for unequivocal getattr() defaults.
-_sentinel = object()
-
-_ng_default_on_setattr = setters.pipe(setters.convert, setters.validate)
-
-
-class _Nothing(object):
- """
- Sentinel class to indicate the lack of a value when ``None`` is ambiguous.
-
- ``_Nothing`` is a singleton. There is only ever one of it.
-
- .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False.
- """
-
- _singleton = None
-
- def __new__(cls):
- if _Nothing._singleton is None:
- _Nothing._singleton = super(_Nothing, cls).__new__(cls)
- return _Nothing._singleton
-
- def __repr__(self):
- return "NOTHING"
-
- def __bool__(self):
- return False
-
- def __len__(self):
- return 0 # __bool__ for Python 2
-
-
-NOTHING = _Nothing()
-"""
-Sentinel to indicate the lack of a value when ``None`` is ambiguous.
-"""
-
-
-class _CacheHashWrapper(int):
- """
- An integer subclass that pickles / copies as None
-
- This is used for non-slots classes with ``cache_hash=True``, to avoid
- serializing a potentially (even likely) invalid hash value. Since ``None``
- is the default value for uncalculated hashes, whenever this is copied,
- the copy's value for the hash should automatically reset.
-
- See GH #613 for more details.
- """
-
- if PY2:
- # For some reason `type(None)` isn't callable in Python 2, but we don't
- # actually need a constructor for None objects, we just need any
- # available function that returns None.
- def __reduce__(self, _none_constructor=getattr, _args=(0, "", None)):
- return _none_constructor, _args
-
- else:
-
- def __reduce__(self, _none_constructor=type(None), _args=()):
- return _none_constructor, _args
-
-
-def attrib(
- default=NOTHING,
- validator=None,
- repr=True,
- cmp=None,
- hash=None,
- init=True,
- metadata=None,
- type=None,
- converter=None,
- factory=None,
- kw_only=False,
- eq=None,
- order=None,
- on_setattr=None,
-):
- """
- Create a new attribute on a class.
-
- .. warning::
-
- Does *not* do anything unless the class is also decorated with
- `attr.s`!
-
- :param default: A value that is used if an ``attrs``-generated ``__init__``
- is used and no value is passed while instantiating or the attribute is
- excluded using ``init=False``.
-
- If the value is an instance of `attrs.Factory`, its callable will be
- used to construct a new value (useful for mutable data types like lists
- or dicts).
-
- If a default is not set (or set manually to `attrs.NOTHING`), a value
- *must* be supplied when instantiating; otherwise a `TypeError`
- will be raised.
-
- The default can also be set using decorator notation as shown below.
-
- :type default: Any value
-
- :param callable factory: Syntactic sugar for
- ``default=attr.Factory(factory)``.
-
- :param validator: `callable` that is called by ``attrs``-generated
- ``__init__`` methods after the instance has been initialized. They
- receive the initialized instance, the :func:`~attrs.Attribute`, and the
- passed value.
-
- The return value is *not* inspected so the validator has to throw an
- exception itself.
-
- If a `list` is passed, its items are treated as validators and must
- all pass.
-
- Validators can be globally disabled and re-enabled using
- `get_run_validators`.
-
- The validator can also be set using decorator notation as shown below.
-
- :type validator: `callable` or a `list` of `callable`\\ s.
-
- :param repr: Include this attribute in the generated ``__repr__``
- method. If ``True``, include the attribute; if ``False``, omit it. By
- default, the built-in ``repr()`` function is used. To override how the
- attribute value is formatted, pass a ``callable`` that takes a single
- value and returns a string. Note that the resulting string is used
- as-is, i.e. it will be used directly *instead* of calling ``repr()``
- (the default).
- :type repr: a `bool` or a `callable` to use a custom function.
-
- :param eq: If ``True`` (default), include this attribute in the
- generated ``__eq__`` and ``__ne__`` methods that check two instances
- for equality. To override how the attribute value is compared,
- pass a ``callable`` that takes a single value and returns the value
- to be compared.
- :type eq: a `bool` or a `callable`.
-
- :param order: If ``True`` (default), include this attributes in the
- generated ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods.
- To override how the attribute value is ordered,
- pass a ``callable`` that takes a single value and returns the value
- to be ordered.
- :type order: a `bool` or a `callable`.
-
- :param cmp: Setting *cmp* is equivalent to setting *eq* and *order* to the
- same value. Must not be mixed with *eq* or *order*.
- :type cmp: a `bool` or a `callable`.
-
- :param Optional[bool] hash: Include this attribute in the generated
- ``__hash__`` method. If ``None`` (default), mirror *eq*'s value. This
- is the correct behavior according the Python spec. Setting this value
- to anything else than ``None`` is *discouraged*.
- :param bool init: Include this attribute in the generated ``__init__``
- method. It is possible to set this to ``False`` and set a default
- value. In that case this attributed is unconditionally initialized
- with the specified default value or factory.
- :param callable converter: `callable` that is called by
- ``attrs``-generated ``__init__`` methods to convert attribute's value
- to the desired format. It is given the passed-in value, and the
- returned value will be used as the new value of the attribute. The
- value is converted before being passed to the validator, if any.
- :param metadata: An arbitrary mapping, to be used by third-party
- components. See `extending_metadata`.
- :param type: The type of the attribute. In Python 3.6 or greater, the
- preferred method to specify the type is using a variable annotation
- (see `PEP 526 `_).
- This argument is provided for backward compatibility.
- Regardless of the approach used, the type will be stored on
- ``Attribute.type``.
-
- Please note that ``attrs`` doesn't do anything with this metadata by
- itself. You can use it as part of your own code or for
- `static type checking `.
- :param kw_only: Make this attribute keyword-only (Python 3+)
- in the generated ``__init__`` (if ``init`` is ``False``, this
- parameter is ignored).
- :param on_setattr: Allows to overwrite the *on_setattr* setting from
- `attr.s`. If left `None`, the *on_setattr* value from `attr.s` is used.
- Set to `attrs.setters.NO_OP` to run **no** `setattr` hooks for this
- attribute -- regardless of the setting in `attr.s`.
- :type on_setattr: `callable`, or a list of callables, or `None`, or
- `attrs.setters.NO_OP`
-
- .. versionadded:: 15.2.0 *convert*
- .. versionadded:: 16.3.0 *metadata*
- .. versionchanged:: 17.1.0 *validator* can be a ``list`` now.
- .. versionchanged:: 17.1.0
- *hash* is ``None`` and therefore mirrors *eq* by default.
- .. versionadded:: 17.3.0 *type*
- .. deprecated:: 17.4.0 *convert*
- .. versionadded:: 17.4.0 *converter* as a replacement for the deprecated
- *convert* to achieve consistency with other noun-based arguments.
- .. versionadded:: 18.1.0
- ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``.
- .. versionadded:: 18.2.0 *kw_only*
- .. versionchanged:: 19.2.0 *convert* keyword argument removed.
- .. versionchanged:: 19.2.0 *repr* also accepts a custom callable.
- .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01.
- .. versionadded:: 19.2.0 *eq* and *order*
- .. versionadded:: 20.1.0 *on_setattr*
- .. versionchanged:: 20.3.0 *kw_only* backported to Python 2
- .. versionchanged:: 21.1.0
- *eq*, *order*, and *cmp* also accept a custom callable
- .. versionchanged:: 21.1.0 *cmp* undeprecated
- """
- eq, eq_key, order, order_key = _determine_attrib_eq_order(
- cmp, eq, order, True
- )
-
- if hash is not None and hash is not True and hash is not False:
- raise TypeError(
- "Invalid value for hash. Must be True, False, or None."
- )
-
- if factory is not None:
- if default is not NOTHING:
- raise ValueError(
- "The `default` and `factory` arguments are mutually "
- "exclusive."
- )
- if not callable(factory):
- raise ValueError("The `factory` argument must be a callable.")
- default = Factory(factory)
-
- if metadata is None:
- metadata = {}
-
- # Apply syntactic sugar by auto-wrapping.
- if isinstance(on_setattr, (list, tuple)):
- on_setattr = setters.pipe(*on_setattr)
-
- if validator and isinstance(validator, (list, tuple)):
- validator = and_(*validator)
-
- if converter and isinstance(converter, (list, tuple)):
- converter = pipe(*converter)
-
- return _CountingAttr(
- default=default,
- validator=validator,
- repr=repr,
- cmp=None,
- hash=hash,
- init=init,
- converter=converter,
- metadata=metadata,
- type=type,
- kw_only=kw_only,
- eq=eq,
- eq_key=eq_key,
- order=order,
- order_key=order_key,
- on_setattr=on_setattr,
- )
-
-
-def _compile_and_eval(script, globs, locs=None, filename=""):
- """
- "Exec" the script with the given global (globs) and local (locs) variables.
- """
- bytecode = compile(script, filename, "exec")
- eval(bytecode, globs, locs)
-
-
-def _make_method(name, script, filename, globs=None):
- """
- Create the method with the script given and return the method object.
- """
- locs = {}
- if globs is None:
- globs = {}
-
- # In order of debuggers like PDB being able to step through the code,
- # we add a fake linecache entry.
- count = 1
- base_filename = filename
- while True:
- linecache_tuple = (
- len(script),
- None,
- script.splitlines(True),
- filename,
- )
- old_val = linecache.cache.setdefault(filename, linecache_tuple)
- if old_val == linecache_tuple:
- break
- else:
- filename = "{}-{}>".format(base_filename[:-1], count)
- count += 1
-
- _compile_and_eval(script, globs, locs, filename)
-
- return locs[name]
-
-
-def _make_attr_tuple_class(cls_name, attr_names):
- """
- Create a tuple subclass to hold `Attribute`s for an `attrs` class.
-
- The subclass is a bare tuple with properties for names.
-
- class MyClassAttributes(tuple):
- __slots__ = ()
- x = property(itemgetter(0))
- """
- attr_class_name = "{}Attributes".format(cls_name)
- attr_class_template = [
- "class {}(tuple):".format(attr_class_name),
- " __slots__ = ()",
- ]
- if attr_names:
- for i, attr_name in enumerate(attr_names):
- attr_class_template.append(
- _tuple_property_pat.format(index=i, attr_name=attr_name)
- )
- else:
- attr_class_template.append(" pass")
- globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property}
- _compile_and_eval("\n".join(attr_class_template), globs)
- return globs[attr_class_name]
-
-
-# Tuple class for extracted attributes from a class definition.
-# `base_attrs` is a subset of `attrs`.
-_Attributes = _make_attr_tuple_class(
- "_Attributes",
- [
- # all attributes to build dunder methods for
- "attrs",
- # attributes that have been inherited
- "base_attrs",
- # map inherited attributes to their originating classes
- "base_attrs_map",
- ],
-)
-
-
-def _is_class_var(annot):
- """
- Check whether *annot* is a typing.ClassVar.
-
- The string comparison hack is used to avoid evaluating all string
- annotations which would put attrs-based classes at a performance
- disadvantage compared to plain old classes.
- """
- annot = str(annot)
-
- # Annotation can be quoted.
- if annot.startswith(("'", '"')) and annot.endswith(("'", '"')):
- annot = annot[1:-1]
-
- return annot.startswith(_classvar_prefixes)
-
-
-def _has_own_attribute(cls, attrib_name):
- """
- Check whether *cls* defines *attrib_name* (and doesn't just inherit it).
-
- Requires Python 3.
- """
- attr = getattr(cls, attrib_name, _sentinel)
- if attr is _sentinel:
- return False
-
- for base_cls in cls.__mro__[1:]:
- a = getattr(base_cls, attrib_name, None)
- if attr is a:
- return False
-
- return True
-
-
-def _get_annotations(cls):
- """
- Get annotations for *cls*.
- """
- if _has_own_attribute(cls, "__annotations__"):
- return cls.__annotations__
-
- return {}
-
-
-def _counter_getter(e):
- """
- Key function for sorting to avoid re-creating a lambda for every class.
- """
- return e[1].counter
-
-
-def _collect_base_attrs(cls, taken_attr_names):
- """
- Collect attr.ibs from base classes of *cls*, except *taken_attr_names*.
- """
- base_attrs = []
- base_attr_map = {} # A dictionary of base attrs to their classes.
-
- # Traverse the MRO and collect attributes.
- for base_cls in reversed(cls.__mro__[1:-1]):
- for a in getattr(base_cls, "__attrs_attrs__", []):
- if a.inherited or a.name in taken_attr_names:
- continue
-
- a = a.evolve(inherited=True)
- base_attrs.append(a)
- base_attr_map[a.name] = base_cls
-
- # For each name, only keep the freshest definition i.e. the furthest at the
- # back. base_attr_map is fine because it gets overwritten with every new
- # instance.
- filtered = []
- seen = set()
- for a in reversed(base_attrs):
- if a.name in seen:
- continue
- filtered.insert(0, a)
- seen.add(a.name)
-
- return filtered, base_attr_map
-
-
-def _collect_base_attrs_broken(cls, taken_attr_names):
- """
- Collect attr.ibs from base classes of *cls*, except *taken_attr_names*.
-
- N.B. *taken_attr_names* will be mutated.
-
- Adhere to the old incorrect behavior.
-
- Notably it collects from the front and considers inherited attributes which
- leads to the buggy behavior reported in #428.
- """
- base_attrs = []
- base_attr_map = {} # A dictionary of base attrs to their classes.
-
- # Traverse the MRO and collect attributes.
- for base_cls in cls.__mro__[1:-1]:
- for a in getattr(base_cls, "__attrs_attrs__", []):
- if a.name in taken_attr_names:
- continue
-
- a = a.evolve(inherited=True)
- taken_attr_names.add(a.name)
- base_attrs.append(a)
- base_attr_map[a.name] = base_cls
-
- return base_attrs, base_attr_map
-
-
-def _transform_attrs(
- cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer
-):
- """
- Transform all `_CountingAttr`s on a class into `Attribute`s.
-
- If *these* is passed, use that and don't look for them on the class.
-
- *collect_by_mro* is True, collect them in the correct MRO order, otherwise
- use the old -- incorrect -- order. See #428.
-
- Return an `_Attributes`.
- """
- cd = cls.__dict__
- anns = _get_annotations(cls)
-
- if these is not None:
- ca_list = [(name, ca) for name, ca in iteritems(these)]
-
- if not isinstance(these, ordered_dict):
- ca_list.sort(key=_counter_getter)
- elif auto_attribs is True:
- ca_names = {
- name
- for name, attr in cd.items()
- if isinstance(attr, _CountingAttr)
- }
- ca_list = []
- annot_names = set()
- for attr_name, type in anns.items():
- if _is_class_var(type):
- continue
- annot_names.add(attr_name)
- a = cd.get(attr_name, NOTHING)
-
- if not isinstance(a, _CountingAttr):
- if a is NOTHING:
- a = attrib()
- else:
- a = attrib(default=a)
- ca_list.append((attr_name, a))
-
- unannotated = ca_names - annot_names
- if len(unannotated) > 0:
- raise UnannotatedAttributeError(
- "The following `attr.ib`s lack a type annotation: "
- + ", ".join(
- sorted(unannotated, key=lambda n: cd.get(n).counter)
- )
- + "."
- )
- else:
- ca_list = sorted(
- (
- (name, attr)
- for name, attr in cd.items()
- if isinstance(attr, _CountingAttr)
- ),
- key=lambda e: e[1].counter,
- )
-
- own_attrs = [
- Attribute.from_counting_attr(
- name=attr_name, ca=ca, type=anns.get(attr_name)
- )
- for attr_name, ca in ca_list
- ]
-
- if collect_by_mro:
- base_attrs, base_attr_map = _collect_base_attrs(
- cls, {a.name for a in own_attrs}
- )
- else:
- base_attrs, base_attr_map = _collect_base_attrs_broken(
- cls, {a.name for a in own_attrs}
- )
-
- if kw_only:
- own_attrs = [a.evolve(kw_only=True) for a in own_attrs]
- base_attrs = [a.evolve(kw_only=True) for a in base_attrs]
-
- attrs = base_attrs + own_attrs
-
- # Mandatory vs non-mandatory attr order only matters when they are part of
- # the __init__ signature and when they aren't kw_only (which are moved to
- # the end and can be mandatory or non-mandatory in any order, as they will
- # be specified as keyword args anyway). Check the order of those attrs:
- had_default = False
- for a in (a for a in attrs if a.init is not False and a.kw_only is False):
- if had_default is True and a.default is NOTHING:
- raise ValueError(
- "No mandatory attributes allowed after an attribute with a "
- "default value or factory. Attribute in question: %r" % (a,)
- )
-
- if had_default is False and a.default is not NOTHING:
- had_default = True
-
- if field_transformer is not None:
- attrs = field_transformer(cls, attrs)
-
- # Create AttrsClass *after* applying the field_transformer since it may
- # add or remove attributes!
- attr_names = [a.name for a in attrs]
- AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names)
-
- return _Attributes((AttrsClass(attrs), base_attrs, base_attr_map))
-
-
-if PYPY:
-
- def _frozen_setattrs(self, name, value):
- """
- Attached to frozen classes as __setattr__.
- """
- if isinstance(self, BaseException) and name in (
- "__cause__",
- "__context__",
- ):
- BaseException.__setattr__(self, name, value)
- return
-
- raise FrozenInstanceError()
-
-else:
-
- def _frozen_setattrs(self, name, value):
- """
- Attached to frozen classes as __setattr__.
- """
- raise FrozenInstanceError()
-
-
-def _frozen_delattrs(self, name):
- """
- Attached to frozen classes as __delattr__.
- """
- raise FrozenInstanceError()
-
-
-class _ClassBuilder(object):
- """
- Iteratively build *one* class.
- """
-
- __slots__ = (
- "_attr_names",
- "_attrs",
- "_base_attr_map",
- "_base_names",
- "_cache_hash",
- "_cls",
- "_cls_dict",
- "_delete_attribs",
- "_frozen",
- "_has_pre_init",
- "_has_post_init",
- "_is_exc",
- "_on_setattr",
- "_slots",
- "_weakref_slot",
- "_wrote_own_setattr",
- "_has_custom_setattr",
- )
-
- def __init__(
- self,
- cls,
- these,
- slots,
- frozen,
- weakref_slot,
- getstate_setstate,
- auto_attribs,
- kw_only,
- cache_hash,
- is_exc,
- collect_by_mro,
- on_setattr,
- has_custom_setattr,
- field_transformer,
- ):
- attrs, base_attrs, base_map = _transform_attrs(
- cls,
- these,
- auto_attribs,
- kw_only,
- collect_by_mro,
- field_transformer,
- )
-
- self._cls = cls
- self._cls_dict = dict(cls.__dict__) if slots else {}
- self._attrs = attrs
- self._base_names = set(a.name for a in base_attrs)
- self._base_attr_map = base_map
- self._attr_names = tuple(a.name for a in attrs)
- self._slots = slots
- self._frozen = frozen
- self._weakref_slot = weakref_slot
- self._cache_hash = cache_hash
- self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False))
- self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False))
- self._delete_attribs = not bool(these)
- self._is_exc = is_exc
- self._on_setattr = on_setattr
-
- self._has_custom_setattr = has_custom_setattr
- self._wrote_own_setattr = False
-
- self._cls_dict["__attrs_attrs__"] = self._attrs
-
- if frozen:
- self._cls_dict["__setattr__"] = _frozen_setattrs
- self._cls_dict["__delattr__"] = _frozen_delattrs
-
- self._wrote_own_setattr = True
- elif on_setattr in (
- _ng_default_on_setattr,
- setters.validate,
- setters.convert,
- ):
- has_validator = has_converter = False
- for a in attrs:
- if a.validator is not None:
- has_validator = True
- if a.converter is not None:
- has_converter = True
-
- if has_validator and has_converter:
- break
- if (
- (
- on_setattr == _ng_default_on_setattr
- and not (has_validator or has_converter)
- )
- or (on_setattr == setters.validate and not has_validator)
- or (on_setattr == setters.convert and not has_converter)
- ):
- # If class-level on_setattr is set to convert + validate, but
- # there's no field to convert or validate, pretend like there's
- # no on_setattr.
- self._on_setattr = None
-
- if getstate_setstate:
- (
- self._cls_dict["__getstate__"],
- self._cls_dict["__setstate__"],
- ) = self._make_getstate_setstate()
-
- def __repr__(self):
- return "<_ClassBuilder(cls={cls})>".format(cls=self._cls.__name__)
-
- def build_class(self):
- """
- Finalize class based on the accumulated configuration.
-
- Builder cannot be used after calling this method.
- """
- if self._slots is True:
- return self._create_slots_class()
- else:
- return self._patch_original_class()
-
- def _patch_original_class(self):
- """
- Apply accumulated methods and return the class.
- """
- cls = self._cls
- base_names = self._base_names
-
- # Clean class of attribute definitions (`attr.ib()`s).
- if self._delete_attribs:
- for name in self._attr_names:
- if (
- name not in base_names
- and getattr(cls, name, _sentinel) is not _sentinel
- ):
- try:
- delattr(cls, name)
- except AttributeError:
- # This can happen if a base class defines a class
- # variable and we want to set an attribute with the
- # same name by using only a type annotation.
- pass
-
- # Attach our dunder methods.
- for name, value in self._cls_dict.items():
- setattr(cls, name, value)
-
- # If we've inherited an attrs __setattr__ and don't write our own,
- # reset it to object's.
- if not self._wrote_own_setattr and getattr(
- cls, "__attrs_own_setattr__", False
- ):
- cls.__attrs_own_setattr__ = False
-
- if not self._has_custom_setattr:
- cls.__setattr__ = object.__setattr__
-
- return cls
-
- def _create_slots_class(self):
- """
- Build and return a new class with a `__slots__` attribute.
- """
- cd = {
- k: v
- for k, v in iteritems(self._cls_dict)
- if k not in tuple(self._attr_names) + ("__dict__", "__weakref__")
- }
-
- # If our class doesn't have its own implementation of __setattr__
- # (either from the user or by us), check the bases, if one of them has
- # an attrs-made __setattr__, that needs to be reset. We don't walk the
- # MRO because we only care about our immediate base classes.
- # XXX: This can be confused by subclassing a slotted attrs class with
- # XXX: a non-attrs class and subclass the resulting class with an attrs
- # XXX: class. See `test_slotted_confused` for details. For now that's
- # XXX: OK with us.
- if not self._wrote_own_setattr:
- cd["__attrs_own_setattr__"] = False
-
- if not self._has_custom_setattr:
- for base_cls in self._cls.__bases__:
- if base_cls.__dict__.get("__attrs_own_setattr__", False):
- cd["__setattr__"] = object.__setattr__
- break
-
- # Traverse the MRO to collect existing slots
- # and check for an existing __weakref__.
- existing_slots = dict()
- weakref_inherited = False
- for base_cls in self._cls.__mro__[1:-1]:
- if base_cls.__dict__.get("__weakref__", None) is not None:
- weakref_inherited = True
- existing_slots.update(
- {
- name: getattr(base_cls, name)
- for name in getattr(base_cls, "__slots__", [])
- }
- )
-
- base_names = set(self._base_names)
-
- names = self._attr_names
- if (
- self._weakref_slot
- and "__weakref__" not in getattr(self._cls, "__slots__", ())
- and "__weakref__" not in names
- and not weakref_inherited
- ):
- names += ("__weakref__",)
-
- # We only add the names of attributes that aren't inherited.
- # Setting __slots__ to inherited attributes wastes memory.
- slot_names = [name for name in names if name not in base_names]
- # There are slots for attributes from current class
- # that are defined in parent classes.
- # As their descriptors may be overriden by a child class,
- # we collect them here and update the class dict
- reused_slots = {
- slot: slot_descriptor
- for slot, slot_descriptor in iteritems(existing_slots)
- if slot in slot_names
- }
- slot_names = [name for name in slot_names if name not in reused_slots]
- cd.update(reused_slots)
- if self._cache_hash:
- slot_names.append(_hash_cache_field)
- cd["__slots__"] = tuple(slot_names)
-
- qualname = getattr(self._cls, "__qualname__", None)
- if qualname is not None:
- cd["__qualname__"] = qualname
-
- # Create new class based on old class and our methods.
- cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd)
-
- # The following is a fix for
- # . On Python 3,
- # if a method mentions `__class__` or uses the no-arg super(), the
- # compiler will bake a reference to the class in the method itself
- # as `method.__closure__`. Since we replace the class with a
- # clone, we rewrite these references so it keeps working.
- for item in cls.__dict__.values():
- if isinstance(item, (classmethod, staticmethod)):
- # Class- and staticmethods hide their functions inside.
- # These might need to be rewritten as well.
- closure_cells = getattr(item.__func__, "__closure__", None)
- elif isinstance(item, property):
- # Workaround for property `super()` shortcut (PY3-only).
- # There is no universal way for other descriptors.
- closure_cells = getattr(item.fget, "__closure__", None)
- else:
- closure_cells = getattr(item, "__closure__", None)
-
- if not closure_cells: # Catch None or the empty list.
- continue
- for cell in closure_cells:
- try:
- match = cell.cell_contents is self._cls
- except ValueError: # ValueError: Cell is empty
- pass
- else:
- if match:
- set_closure_cell(cell, cls)
-
- return cls
-
- def add_repr(self, ns):
- self._cls_dict["__repr__"] = self._add_method_dunders(
- _make_repr(self._attrs, ns, self._cls)
- )
- return self
-
- def add_str(self):
- repr = self._cls_dict.get("__repr__")
- if repr is None:
- raise ValueError(
- "__str__ can only be generated if a __repr__ exists."
- )
-
- def __str__(self):
- return self.__repr__()
-
- self._cls_dict["__str__"] = self._add_method_dunders(__str__)
- return self
-
- def _make_getstate_setstate(self):
- """
- Create custom __setstate__ and __getstate__ methods.
- """
- # __weakref__ is not writable.
- state_attr_names = tuple(
- an for an in self._attr_names if an != "__weakref__"
- )
-
- def slots_getstate(self):
- """
- Automatically created by attrs.
- """
- return tuple(getattr(self, name) for name in state_attr_names)
-
- hash_caching_enabled = self._cache_hash
-
- def slots_setstate(self, state):
- """
- Automatically created by attrs.
- """
- __bound_setattr = _obj_setattr.__get__(self, Attribute)
- for name, value in zip(state_attr_names, state):
- __bound_setattr(name, value)
-
- # The hash code cache is not included when the object is
- # serialized, but it still needs to be initialized to None to
- # indicate that the first call to __hash__ should be a cache
- # miss.
- if hash_caching_enabled:
- __bound_setattr(_hash_cache_field, None)
-
- return slots_getstate, slots_setstate
-
- def make_unhashable(self):
- self._cls_dict["__hash__"] = None
- return self
-
- def add_hash(self):
- self._cls_dict["__hash__"] = self._add_method_dunders(
- _make_hash(
- self._cls,
- self._attrs,
- frozen=self._frozen,
- cache_hash=self._cache_hash,
- )
- )
-
- return self
-
- def add_init(self):
- self._cls_dict["__init__"] = self._add_method_dunders(
- _make_init(
- self._cls,
- self._attrs,
- self._has_pre_init,
- self._has_post_init,
- self._frozen,
- self._slots,
- self._cache_hash,
- self._base_attr_map,
- self._is_exc,
- self._on_setattr,
- attrs_init=False,
- )
- )
-
- return self
-
- def add_match_args(self):
- self._cls_dict["__match_args__"] = tuple(
- field.name
- for field in self._attrs
- if field.init and not field.kw_only
- )
-
- def add_attrs_init(self):
- self._cls_dict["__attrs_init__"] = self._add_method_dunders(
- _make_init(
- self._cls,
- self._attrs,
- self._has_pre_init,
- self._has_post_init,
- self._frozen,
- self._slots,
- self._cache_hash,
- self._base_attr_map,
- self._is_exc,
- self._on_setattr,
- attrs_init=True,
- )
- )
-
- return self
-
- def add_eq(self):
- cd = self._cls_dict
-
- cd["__eq__"] = self._add_method_dunders(
- _make_eq(self._cls, self._attrs)
- )
- cd["__ne__"] = self._add_method_dunders(_make_ne())
-
- return self
-
- def add_order(self):
- cd = self._cls_dict
-
- cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = (
- self._add_method_dunders(meth)
- for meth in _make_order(self._cls, self._attrs)
- )
-
- return self
-
- def add_setattr(self):
- if self._frozen:
- return self
-
- sa_attrs = {}
- for a in self._attrs:
- on_setattr = a.on_setattr or self._on_setattr
- if on_setattr and on_setattr is not setters.NO_OP:
- sa_attrs[a.name] = a, on_setattr
-
- if not sa_attrs:
- return self
-
- if self._has_custom_setattr:
- # We need to write a __setattr__ but there already is one!
- raise ValueError(
- "Can't combine custom __setattr__ with on_setattr hooks."
- )
-
- # docstring comes from _add_method_dunders
- def __setattr__(self, name, val):
- try:
- a, hook = sa_attrs[name]
- except KeyError:
- nval = val
- else:
- nval = hook(self, a, val)
-
- _obj_setattr(self, name, nval)
-
- self._cls_dict["__attrs_own_setattr__"] = True
- self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__)
- self._wrote_own_setattr = True
-
- return self
-
- def _add_method_dunders(self, method):
- """
- Add __module__ and __qualname__ to a *method* if possible.
- """
- try:
- method.__module__ = self._cls.__module__
- except AttributeError:
- pass
-
- try:
- method.__qualname__ = ".".join(
- (self._cls.__qualname__, method.__name__)
- )
- except AttributeError:
- pass
-
- try:
- method.__doc__ = "Method generated by attrs for class %s." % (
- self._cls.__qualname__,
- )
- except AttributeError:
- pass
-
- return method
-
-
-_CMP_DEPRECATION = (
- "The usage of `cmp` is deprecated and will be removed on or after "
- "2021-06-01. Please use `eq` and `order` instead."
-)
-
-
-def _determine_attrs_eq_order(cmp, eq, order, default_eq):
- """
- Validate the combination of *cmp*, *eq*, and *order*. Derive the effective
- values of eq and order. If *eq* is None, set it to *default_eq*.
- """
- if cmp is not None and any((eq is not None, order is not None)):
- raise ValueError("Don't mix `cmp` with `eq' and `order`.")
-
- # cmp takes precedence due to bw-compatibility.
- if cmp is not None:
- return cmp, cmp
-
- # If left None, equality is set to the specified default and ordering
- # mirrors equality.
- if eq is None:
- eq = default_eq
-
- if order is None:
- order = eq
-
- if eq is False and order is True:
- raise ValueError("`order` can only be True if `eq` is True too.")
-
- return eq, order
-
-
-def _determine_attrib_eq_order(cmp, eq, order, default_eq):
- """
- Validate the combination of *cmp*, *eq*, and *order*. Derive the effective
- values of eq and order. If *eq* is None, set it to *default_eq*.
- """
- if cmp is not None and any((eq is not None, order is not None)):
- raise ValueError("Don't mix `cmp` with `eq' and `order`.")
-
- def decide_callable_or_boolean(value):
- """
- Decide whether a key function is used.
- """
- if callable(value):
- value, key = True, value
- else:
- key = None
- return value, key
-
- # cmp takes precedence due to bw-compatibility.
- if cmp is not None:
- cmp, cmp_key = decide_callable_or_boolean(cmp)
- return cmp, cmp_key, cmp, cmp_key
-
- # If left None, equality is set to the specified default and ordering
- # mirrors equality.
- if eq is None:
- eq, eq_key = default_eq, None
- else:
- eq, eq_key = decide_callable_or_boolean(eq)
-
- if order is None:
- order, order_key = eq, eq_key
- else:
- order, order_key = decide_callable_or_boolean(order)
-
- if eq is False and order is True:
- raise ValueError("`order` can only be True if `eq` is True too.")
-
- return eq, eq_key, order, order_key
-
-
-def _determine_whether_to_implement(
- cls, flag, auto_detect, dunders, default=True
-):
- """
- Check whether we should implement a set of methods for *cls*.
-
- *flag* is the argument passed into @attr.s like 'init', *auto_detect* the
- same as passed into @attr.s and *dunders* is a tuple of attribute names
- whose presence signal that the user has implemented it themselves.
-
- Return *default* if no reason for either for or against is found.
-
- auto_detect must be False on Python 2.
- """
- if flag is True or flag is False:
- return flag
-
- if flag is None and auto_detect is False:
- return default
-
- # Logically, flag is None and auto_detect is True here.
- for dunder in dunders:
- if _has_own_attribute(cls, dunder):
- return False
-
- return default
-
-
-def attrs(
- maybe_cls=None,
- these=None,
- repr_ns=None,
- repr=None,
- cmp=None,
- hash=None,
- init=None,
- slots=False,
- frozen=False,
- weakref_slot=True,
- str=False,
- auto_attribs=False,
- kw_only=False,
- cache_hash=False,
- auto_exc=False,
- eq=None,
- order=None,
- auto_detect=False,
- collect_by_mro=False,
- getstate_setstate=None,
- on_setattr=None,
- field_transformer=None,
- match_args=True,
-):
- r"""
- A class decorator that adds `dunder
- `_\ -methods according to the
- specified attributes using `attr.ib` or the *these* argument.
-
- :param these: A dictionary of name to `attr.ib` mappings. This is
- useful to avoid the definition of your attributes within the class body
- because you can't (e.g. if you want to add ``__repr__`` methods to
- Django models) or don't want to.
-
- If *these* is not ``None``, ``attrs`` will *not* search the class body
- for attributes and will *not* remove any attributes from it.
-
- If *these* is an ordered dict (`dict` on Python 3.6+,
- `collections.OrderedDict` otherwise), the order is deduced from
- the order of the attributes inside *these*. Otherwise the order
- of the definition of the attributes is used.
-
- :type these: `dict` of `str` to `attr.ib`
-
- :param str repr_ns: When using nested classes, there's no way in Python 2
- to automatically detect that. Therefore it's possible to set the
- namespace explicitly for a more meaningful ``repr`` output.
- :param bool auto_detect: Instead of setting the *init*, *repr*, *eq*,
- *order*, and *hash* arguments explicitly, assume they are set to
- ``True`` **unless any** of the involved methods for one of the
- arguments is implemented in the *current* class (i.e. it is *not*
- inherited from some base class).
-
- So for example by implementing ``__eq__`` on a class yourself,
- ``attrs`` will deduce ``eq=False`` and will create *neither*
- ``__eq__`` *nor* ``__ne__`` (but Python classes come with a sensible
- ``__ne__`` by default, so it *should* be enough to only implement
- ``__eq__`` in most cases).
-
- .. warning::
-
- If you prevent ``attrs`` from creating the ordering methods for you
- (``order=False``, e.g. by implementing ``__le__``), it becomes
- *your* responsibility to make sure its ordering is sound. The best
- way is to use the `functools.total_ordering` decorator.
-
-
- Passing ``True`` or ``False`` to *init*, *repr*, *eq*, *order*,
- *cmp*, or *hash* overrides whatever *auto_detect* would determine.
-
- *auto_detect* requires Python 3. Setting it ``True`` on Python 2 raises
- an `attrs.exceptions.PythonTooOldError`.
-
- :param bool repr: Create a ``__repr__`` method with a human readable
- representation of ``attrs`` attributes..
- :param bool str: Create a ``__str__`` method that is identical to
- ``__repr__``. This is usually not necessary except for
- `Exception`\ s.
- :param Optional[bool] eq: If ``True`` or ``None`` (default), add ``__eq__``
- and ``__ne__`` methods that check two instances for equality.
-
- They compare the instances as if they were tuples of their ``attrs``
- attributes if and only if the types of both classes are *identical*!
- :param Optional[bool] order: If ``True``, add ``__lt__``, ``__le__``,
- ``__gt__``, and ``__ge__`` methods that behave like *eq* above and
- allow instances to be ordered. If ``None`` (default) mirror value of
- *eq*.
- :param Optional[bool] cmp: Setting *cmp* is equivalent to setting *eq*
- and *order* to the same value. Must not be mixed with *eq* or *order*.
- :param Optional[bool] hash: If ``None`` (default), the ``__hash__`` method
- is generated according how *eq* and *frozen* are set.
-
- 1. If *both* are True, ``attrs`` will generate a ``__hash__`` for you.
- 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set to
- None, marking it unhashable (which it is).
- 3. If *eq* is False, ``__hash__`` will be left untouched meaning the
- ``__hash__`` method of the base class will be used (if base class is
- ``object``, this means it will fall back to id-based hashing.).
-
- Although not recommended, you can decide for yourself and force
- ``attrs`` to create one (e.g. if the class is immutable even though you
- didn't freeze it programmatically) by passing ``True`` or not. Both of
- these cases are rather special and should be used carefully.
-
- See our documentation on `hashing`, Python's documentation on
- `object.__hash__`, and the `GitHub issue that led to the default \
- behavior `_ for more
- details.
- :param bool init: Create a ``__init__`` method that initializes the
- ``attrs`` attributes. Leading underscores are stripped for the argument
- name. If a ``__attrs_pre_init__`` method exists on the class, it will
- be called before the class is initialized. If a ``__attrs_post_init__``
- method exists on the class, it will be called after the class is fully
- initialized.
-
- If ``init`` is ``False``, an ``__attrs_init__`` method will be
- injected instead. This allows you to define a custom ``__init__``
- method that can do pre-init work such as ``super().__init__()``,
- and then call ``__attrs_init__()`` and ``__attrs_post_init__()``.
- :param bool slots: Create a `slotted class ` that's more
- memory-efficient. Slotted classes are generally superior to the default
- dict classes, but have some gotchas you should know about, so we
- encourage you to read the `glossary entry `.
- :param bool frozen: Make instances immutable after initialization. If
- someone attempts to modify a frozen instance,
- `attr.exceptions.FrozenInstanceError` is raised.
-
- .. note::
-
- 1. This is achieved by installing a custom ``__setattr__`` method
- on your class, so you can't implement your own.
-
- 2. True immutability is impossible in Python.
-
- 3. This *does* have a minor a runtime performance `impact
- ` when initializing new instances. In other words:
- ``__init__`` is slightly slower with ``frozen=True``.
-
- 4. If a class is frozen, you cannot modify ``self`` in
- ``__attrs_post_init__`` or a self-written ``__init__``. You can
- circumvent that limitation by using
- ``object.__setattr__(self, "attribute_name", value)``.
-
- 5. Subclasses of a frozen class are frozen too.
-
- :param bool weakref_slot: Make instances weak-referenceable. This has no
- effect unless ``slots`` is also enabled.
- :param bool auto_attribs: If ``True``, collect `PEP 526`_-annotated
- attributes (Python 3.6 and later only) from the class body.
-
- In this case, you **must** annotate every field. If ``attrs``
- encounters a field that is set to an `attr.ib` but lacks a type
- annotation, an `attr.exceptions.UnannotatedAttributeError` is
- raised. Use ``field_name: typing.Any = attr.ib(...)`` if you don't
- want to set a type.
-
- If you assign a value to those attributes (e.g. ``x: int = 42``), that
- value becomes the default value like if it were passed using
- ``attr.ib(default=42)``. Passing an instance of `attrs.Factory` also
- works as expected in most cases (see warning below).
-
- Attributes annotated as `typing.ClassVar`, and attributes that are
- neither annotated nor set to an `attr.ib` are **ignored**.
-
- .. warning::
- For features that use the attribute name to create decorators (e.g.
- `validators `), you still *must* assign `attr.ib` to
- them. Otherwise Python will either not find the name or try to use
- the default value to call e.g. ``validator`` on it.
-
- These errors can be quite confusing and probably the most common bug
- report on our bug tracker.
-
- .. _`PEP 526`: https://www.python.org/dev/peps/pep-0526/
- :param bool kw_only: Make all attributes keyword-only (Python 3+)
- in the generated ``__init__`` (if ``init`` is ``False``, this
- parameter is ignored).
- :param bool cache_hash: Ensure that the object's hash code is computed
- only once and stored on the object. If this is set to ``True``,
- hashing must be either explicitly or implicitly enabled for this
- class. If the hash code is cached, avoid any reassignments of
- fields involved in hash code computation or mutations of the objects
- those fields point to after object creation. If such changes occur,
- the behavior of the object's hash code is undefined.
- :param bool auto_exc: If the class subclasses `BaseException`
- (which implicitly includes any subclass of any exception), the
- following happens to behave like a well-behaved Python exceptions
- class:
-
- - the values for *eq*, *order*, and *hash* are ignored and the
- instances compare and hash by the instance's ids (N.B. ``attrs`` will
- *not* remove existing implementations of ``__hash__`` or the equality
- methods. It just won't add own ones.),
- - all attributes that are either passed into ``__init__`` or have a
- default value are additionally available as a tuple in the ``args``
- attribute,
- - the value of *str* is ignored leaving ``__str__`` to base classes.
- :param bool collect_by_mro: Setting this to `True` fixes the way ``attrs``
- collects attributes from base classes. The default behavior is
- incorrect in certain cases of multiple inheritance. It should be on by
- default but is kept off for backward-compatibility.
-
- See issue `#428 `_ for
- more details.
-
- :param Optional[bool] getstate_setstate:
- .. note::
- This is usually only interesting for slotted classes and you should
- probably just set *auto_detect* to `True`.
-
- If `True`, ``__getstate__`` and
- ``__setstate__`` are generated and attached to the class. This is
- necessary for slotted classes to be pickleable. If left `None`, it's
- `True` by default for slotted classes and ``False`` for dict classes.
-
- If *auto_detect* is `True`, and *getstate_setstate* is left `None`,
- and **either** ``__getstate__`` or ``__setstate__`` is detected directly
- on the class (i.e. not inherited), it is set to `False` (this is usually
- what you want).
-
- :param on_setattr: A callable that is run whenever the user attempts to set
- an attribute (either by assignment like ``i.x = 42`` or by using
- `setattr` like ``setattr(i, "x", 42)``). It receives the same arguments
- as validators: the instance, the attribute that is being modified, and
- the new value.
-
- If no exception is raised, the attribute is set to the return value of
- the callable.
-
- If a list of callables is passed, they're automatically wrapped in an
- `attrs.setters.pipe`.
-
- :param Optional[callable] field_transformer:
- A function that is called with the original class object and all
- fields right before ``attrs`` finalizes the class. You can use
- this, e.g., to automatically add converters or validators to
- fields based on their types. See `transform-fields` for more details.
-
- :param bool match_args:
- If `True` (default), set ``__match_args__`` on the class to support
- `PEP 634 `_ (Structural
- Pattern Matching). It is a tuple of all positional-only ``__init__``
- parameter names on Python 3.10 and later. Ignored on older Python
- versions.
-
- .. versionadded:: 16.0.0 *slots*
- .. versionadded:: 16.1.0 *frozen*
- .. versionadded:: 16.3.0 *str*
- .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``.
- .. versionchanged:: 17.1.0
- *hash* supports ``None`` as value which is also the default now.
- .. versionadded:: 17.3.0 *auto_attribs*
- .. versionchanged:: 18.1.0
- If *these* is passed, no attributes are deleted from the class body.
- .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained.
- .. versionadded:: 18.2.0 *weakref_slot*
- .. deprecated:: 18.2.0
- ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a
- `DeprecationWarning` if the classes compared are subclasses of
- each other. ``__eq`` and ``__ne__`` never tried to compared subclasses
- to each other.
- .. versionchanged:: 19.2.0
- ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider
- subclasses comparable anymore.
- .. versionadded:: 18.2.0 *kw_only*
- .. versionadded:: 18.2.0 *cache_hash*
- .. versionadded:: 19.1.0 *auto_exc*
- .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01.
- .. versionadded:: 19.2.0 *eq* and *order*
- .. versionadded:: 20.1.0 *auto_detect*
- .. versionadded:: 20.1.0 *collect_by_mro*
- .. versionadded:: 20.1.0 *getstate_setstate*
- .. versionadded:: 20.1.0 *on_setattr*
- .. versionadded:: 20.3.0 *field_transformer*
- .. versionchanged:: 21.1.0
- ``init=False`` injects ``__attrs_init__``
- .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__``
- .. versionchanged:: 21.1.0 *cmp* undeprecated
- .. versionadded:: 21.3.0 *match_args*
- """
- if auto_detect and PY2:
- raise PythonTooOldError(
- "auto_detect only works on Python 3 and later."
- )
-
- eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None)
- hash_ = hash # work around the lack of nonlocal
-
- if isinstance(on_setattr, (list, tuple)):
- on_setattr = setters.pipe(*on_setattr)
-
- def wrap(cls):
-
- if getattr(cls, "__class__", None) is None:
- raise TypeError("attrs only works with new-style classes.")
-
- is_frozen = frozen or _has_frozen_base_class(cls)
- is_exc = auto_exc is True and issubclass(cls, BaseException)
- has_own_setattr = auto_detect and _has_own_attribute(
- cls, "__setattr__"
- )
-
- if has_own_setattr and is_frozen:
- raise ValueError("Can't freeze a class with a custom __setattr__.")
-
- builder = _ClassBuilder(
- cls,
- these,
- slots,
- is_frozen,
- weakref_slot,
- _determine_whether_to_implement(
- cls,
- getstate_setstate,
- auto_detect,
- ("__getstate__", "__setstate__"),
- default=slots,
- ),
- auto_attribs,
- kw_only,
- cache_hash,
- is_exc,
- collect_by_mro,
- on_setattr,
- has_own_setattr,
- field_transformer,
- )
- if _determine_whether_to_implement(
- cls, repr, auto_detect, ("__repr__",)
- ):
- builder.add_repr(repr_ns)
- if str is True:
- builder.add_str()
-
- eq = _determine_whether_to_implement(
- cls, eq_, auto_detect, ("__eq__", "__ne__")
- )
- if not is_exc and eq is True:
- builder.add_eq()
- if not is_exc and _determine_whether_to_implement(
- cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__")
- ):
- builder.add_order()
-
- builder.add_setattr()
-
- if (
- hash_ is None
- and auto_detect is True
- and _has_own_attribute(cls, "__hash__")
- ):
- hash = False
- else:
- hash = hash_
- if hash is not True and hash is not False and hash is not None:
- # Can't use `hash in` because 1 == True for example.
- raise TypeError(
- "Invalid value for hash. Must be True, False, or None."
- )
- elif hash is False or (hash is None and eq is False) or is_exc:
- # Don't do anything. Should fall back to __object__'s __hash__
- # which is by id.
- if cache_hash:
- raise TypeError(
- "Invalid value for cache_hash. To use hash caching,"
- " hashing must be either explicitly or implicitly "
- "enabled."
- )
- elif hash is True or (
- hash is None and eq is True and is_frozen is True
- ):
- # Build a __hash__ if told so, or if it's safe.
- builder.add_hash()
- else:
- # Raise TypeError on attempts to hash.
- if cache_hash:
- raise TypeError(
- "Invalid value for cache_hash. To use hash caching,"
- " hashing must be either explicitly or implicitly "
- "enabled."
- )
- builder.make_unhashable()
-
- if _determine_whether_to_implement(
- cls, init, auto_detect, ("__init__",)
- ):
- builder.add_init()
- else:
- builder.add_attrs_init()
- if cache_hash:
- raise TypeError(
- "Invalid value for cache_hash. To use hash caching,"
- " init must be True."
- )
-
- if (
- PY310
- and match_args
- and not _has_own_attribute(cls, "__match_args__")
- ):
- builder.add_match_args()
-
- return builder.build_class()
-
- # maybe_cls's type depends on the usage of the decorator. It's a class
- # if it's used as `@attrs` but ``None`` if used as `@attrs()`.
- if maybe_cls is None:
- return wrap
- else:
- return wrap(maybe_cls)
-
-
-_attrs = attrs
-"""
-Internal alias so we can use it in functions that take an argument called
-*attrs*.
-"""
-
-
-if PY2:
-
- def _has_frozen_base_class(cls):
- """
- Check whether *cls* has a frozen ancestor by looking at its
- __setattr__.
- """
- return (
- getattr(cls.__setattr__, "__module__", None)
- == _frozen_setattrs.__module__
- and cls.__setattr__.__name__ == _frozen_setattrs.__name__
- )
-
-else:
-
- def _has_frozen_base_class(cls):
- """
- Check whether *cls* has a frozen ancestor by looking at its
- __setattr__.
- """
- return cls.__setattr__ == _frozen_setattrs
-
-
-def _generate_unique_filename(cls, func_name):
- """
- Create a "filename" suitable for a function being generated.
- """
- unique_filename = "".format(
- func_name,
- cls.__module__,
- getattr(cls, "__qualname__", cls.__name__),
- )
- return unique_filename
-
-
-def _make_hash(cls, attrs, frozen, cache_hash):
- attrs = tuple(
- a for a in attrs if a.hash is True or (a.hash is None and a.eq is True)
- )
-
- tab = " "
-
- unique_filename = _generate_unique_filename(cls, "hash")
- type_hash = hash(unique_filename)
-
- hash_def = "def __hash__(self"
- hash_func = "hash(("
- closing_braces = "))"
- if not cache_hash:
- hash_def += "):"
- else:
- if not PY2:
- hash_def += ", *"
-
- hash_def += (
- ", _cache_wrapper="
- + "__import__('attr._make')._make._CacheHashWrapper):"
- )
- hash_func = "_cache_wrapper(" + hash_func
- closing_braces += ")"
-
- method_lines = [hash_def]
-
- def append_hash_computation_lines(prefix, indent):
- """
- Generate the code for actually computing the hash code.
- Below this will either be returned directly or used to compute
- a value which is then cached, depending on the value of cache_hash
- """
-
- method_lines.extend(
- [
- indent + prefix + hash_func,
- indent + " %d," % (type_hash,),
- ]
- )
-
- for a in attrs:
- method_lines.append(indent + " self.%s," % a.name)
-
- method_lines.append(indent + " " + closing_braces)
-
- if cache_hash:
- method_lines.append(tab + "if self.%s is None:" % _hash_cache_field)
- if frozen:
- append_hash_computation_lines(
- "object.__setattr__(self, '%s', " % _hash_cache_field, tab * 2
- )
- method_lines.append(tab * 2 + ")") # close __setattr__
- else:
- append_hash_computation_lines(
- "self.%s = " % _hash_cache_field, tab * 2
- )
- method_lines.append(tab + "return self.%s" % _hash_cache_field)
- else:
- append_hash_computation_lines("return ", tab)
-
- script = "\n".join(method_lines)
- return _make_method("__hash__", script, unique_filename)
-
-
-def _add_hash(cls, attrs):
- """
- Add a hash method to *cls*.
- """
- cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False)
- return cls
-
-
-def _make_ne():
- """
- Create __ne__ method.
- """
-
- def __ne__(self, other):
- """
- Check equality and either forward a NotImplemented or
- return the result negated.
- """
- result = self.__eq__(other)
- if result is NotImplemented:
- return NotImplemented
-
- return not result
-
- return __ne__
-
-
-def _make_eq(cls, attrs):
- """
- Create __eq__ method for *cls* with *attrs*.
- """
- attrs = [a for a in attrs if a.eq]
-
- unique_filename = _generate_unique_filename(cls, "eq")
- lines = [
- "def __eq__(self, other):",
- " if other.__class__ is not self.__class__:",
- " return NotImplemented",
- ]
-
- # We can't just do a big self.x = other.x and... clause due to
- # irregularities like nan == nan is false but (nan,) == (nan,) is true.
- globs = {}
- if attrs:
- lines.append(" return (")
- others = [" ) == ("]
- for a in attrs:
- if a.eq_key:
- cmp_name = "_%s_key" % (a.name,)
- # Add the key function to the global namespace
- # of the evaluated function.
- globs[cmp_name] = a.eq_key
- lines.append(
- " %s(self.%s),"
- % (
- cmp_name,
- a.name,
- )
- )
- others.append(
- " %s(other.%s),"
- % (
- cmp_name,
- a.name,
- )
- )
- else:
- lines.append(" self.%s," % (a.name,))
- others.append(" other.%s," % (a.name,))
-
- lines += others + [" )"]
- else:
- lines.append(" return True")
-
- script = "\n".join(lines)
-
- return _make_method("__eq__", script, unique_filename, globs)
-
-
-def _make_order(cls, attrs):
- """
- Create ordering methods for *cls* with *attrs*.
- """
- attrs = [a for a in attrs if a.order]
-
- def attrs_to_tuple(obj):
- """
- Save us some typing.
- """
- return tuple(
- key(value) if key else value
- for value, key in (
- (getattr(obj, a.name), a.order_key) for a in attrs
- )
- )
-
- def __lt__(self, other):
- """
- Automatically created by attrs.
- """
- if other.__class__ is self.__class__:
- return attrs_to_tuple(self) < attrs_to_tuple(other)
-
- return NotImplemented
-
- def __le__(self, other):
- """
- Automatically created by attrs.
- """
- if other.__class__ is self.__class__:
- return attrs_to_tuple(self) <= attrs_to_tuple(other)
-
- return NotImplemented
-
- def __gt__(self, other):
- """
- Automatically created by attrs.
- """
- if other.__class__ is self.__class__:
- return attrs_to_tuple(self) > attrs_to_tuple(other)
-
- return NotImplemented
-
- def __ge__(self, other):
- """
- Automatically created by attrs.
- """
- if other.__class__ is self.__class__:
- return attrs_to_tuple(self) >= attrs_to_tuple(other)
-
- return NotImplemented
-
- return __lt__, __le__, __gt__, __ge__
-
-
-def _add_eq(cls, attrs=None):
- """
- Add equality methods to *cls* with *attrs*.
- """
- if attrs is None:
- attrs = cls.__attrs_attrs__
-
- cls.__eq__ = _make_eq(cls, attrs)
- cls.__ne__ = _make_ne()
-
- return cls
-
-
-if HAS_F_STRINGS:
-
- def _make_repr(attrs, ns, cls):
- unique_filename = _generate_unique_filename(cls, "repr")
- # Figure out which attributes to include, and which function to use to
- # format them. The a.repr value can be either bool or a custom
- # callable.
- attr_names_with_reprs = tuple(
- (a.name, (repr if a.repr is True else a.repr), a.init)
- for a in attrs
- if a.repr is not False
- )
- globs = {
- name + "_repr": r
- for name, r, _ in attr_names_with_reprs
- if r != repr
- }
- globs["_compat"] = _compat
- globs["AttributeError"] = AttributeError
- globs["NOTHING"] = NOTHING
- attribute_fragments = []
- for name, r, i in attr_names_with_reprs:
- accessor = (
- "self." + name
- if i
- else 'getattr(self, "' + name + '", NOTHING)'
- )
- fragment = (
- "%s={%s!r}" % (name, accessor)
- if r == repr
- else "%s={%s_repr(%s)}" % (name, name, accessor)
- )
- attribute_fragments.append(fragment)
- repr_fragment = ", ".join(attribute_fragments)
-
- if ns is None:
- cls_name_fragment = (
- '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}'
- )
- else:
- cls_name_fragment = ns + ".{self.__class__.__name__}"
-
- lines = [
- "def __repr__(self):",
- " try:",
- " already_repring = _compat.repr_context.already_repring",
- " except AttributeError:",
- " already_repring = {id(self),}",
- " _compat.repr_context.already_repring = already_repring",
- " else:",
- " if id(self) in already_repring:",
- " return '...'",
- " else:",
- " already_repring.add(id(self))",
- " try:",
- " return f'%s(%s)'" % (cls_name_fragment, repr_fragment),
- " finally:",
- " already_repring.remove(id(self))",
- ]
-
- return _make_method(
- "__repr__", "\n".join(lines), unique_filename, globs=globs
- )
-
-else:
-
- def _make_repr(attrs, ns, _):
- """
- Make a repr method that includes relevant *attrs*, adding *ns* to the
- full name.
- """
-
- # Figure out which attributes to include, and which function to use to
- # format them. The a.repr value can be either bool or a custom
- # callable.
- attr_names_with_reprs = tuple(
- (a.name, repr if a.repr is True else a.repr)
- for a in attrs
- if a.repr is not False
- )
-
- def __repr__(self):
- """
- Automatically created by attrs.
- """
- try:
- already_repring = _compat.repr_context.already_repring
- except AttributeError:
- already_repring = set()
- _compat.repr_context.already_repring = already_repring
-
- if id(self) in already_repring:
- return "..."
- real_cls = self.__class__
- if ns is None:
- qualname = getattr(real_cls, "__qualname__", None)
- if qualname is not None: # pragma: no cover
- # This case only happens on Python 3.5 and 3.6. We exclude
- # it from coverage, because we don't want to slow down our
- # test suite by running them under coverage too for this
- # one line.
- class_name = qualname.rsplit(">.", 1)[-1]
- else:
- class_name = real_cls.__name__
- else:
- class_name = ns + "." + real_cls.__name__
-
- # Since 'self' remains on the stack (i.e.: strongly referenced)
- # for the duration of this call, it's safe to depend on id(...)
- # stability, and not need to track the instance and therefore
- # worry about properties like weakref- or hash-ability.
- already_repring.add(id(self))
- try:
- result = [class_name, "("]
- first = True
- for name, attr_repr in attr_names_with_reprs:
- if first:
- first = False
- else:
- result.append(", ")
- result.extend(
- (name, "=", attr_repr(getattr(self, name, NOTHING)))
- )
- return "".join(result) + ")"
- finally:
- already_repring.remove(id(self))
-
- return __repr__
-
-
-def _add_repr(cls, ns=None, attrs=None):
- """
- Add a repr method to *cls*.
- """
- if attrs is None:
- attrs = cls.__attrs_attrs__
-
- cls.__repr__ = _make_repr(attrs, ns, cls)
- return cls
-
-
-def fields(cls):
- """
- Return the tuple of ``attrs`` attributes for a class.
-
- The tuple also allows accessing the fields by their names (see below for
- examples).
-
- :param type cls: Class to introspect.
-
- :raise TypeError: If *cls* is not a class.
- :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
- class.
-
- :rtype: tuple (with name accessors) of `attrs.Attribute`
-
- .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields
- by name.
- """
- if not isclass(cls):
- raise TypeError("Passed object must be a class.")
- attrs = getattr(cls, "__attrs_attrs__", None)
- if attrs is None:
- raise NotAnAttrsClassError(
- "{cls!r} is not an attrs-decorated class.".format(cls=cls)
- )
- return attrs
-
-
-def fields_dict(cls):
- """
- Return an ordered dictionary of ``attrs`` attributes for a class, whose
- keys are the attribute names.
-
- :param type cls: Class to introspect.
-
- :raise TypeError: If *cls* is not a class.
- :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
- class.
-
- :rtype: an ordered dict where keys are attribute names and values are
- `attrs.Attribute`\\ s. This will be a `dict` if it's
- naturally ordered like on Python 3.6+ or an
- :class:`~collections.OrderedDict` otherwise.
-
- .. versionadded:: 18.1.0
- """
- if not isclass(cls):
- raise TypeError("Passed object must be a class.")
- attrs = getattr(cls, "__attrs_attrs__", None)
- if attrs is None:
- raise NotAnAttrsClassError(
- "{cls!r} is not an attrs-decorated class.".format(cls=cls)
- )
- return ordered_dict(((a.name, a) for a in attrs))
-
-
-def validate(inst):
- """
- Validate all attributes on *inst* that have a validator.
-
- Leaves all exceptions through.
-
- :param inst: Instance of a class with ``attrs`` attributes.
- """
- if _config._run_validators is False:
- return
-
- for a in fields(inst.__class__):
- v = a.validator
- if v is not None:
- v(inst, a, getattr(inst, a.name))
-
-
-def _is_slot_cls(cls):
- return "__slots__" in cls.__dict__
-
-
-def _is_slot_attr(a_name, base_attr_map):
- """
- Check if the attribute name comes from a slot class.
- """
- return a_name in base_attr_map and _is_slot_cls(base_attr_map[a_name])
-
-
-def _make_init(
- cls,
- attrs,
- pre_init,
- post_init,
- frozen,
- slots,
- cache_hash,
- base_attr_map,
- is_exc,
- cls_on_setattr,
- attrs_init,
-):
- has_cls_on_setattr = (
- cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP
- )
-
- if frozen and has_cls_on_setattr:
- raise ValueError("Frozen classes can't use on_setattr.")
-
- needs_cached_setattr = cache_hash or frozen
- filtered_attrs = []
- attr_dict = {}
- for a in attrs:
- if not a.init and a.default is NOTHING:
- continue
-
- filtered_attrs.append(a)
- attr_dict[a.name] = a
-
- if a.on_setattr is not None:
- if frozen is True:
- raise ValueError("Frozen classes can't use on_setattr.")
-
- needs_cached_setattr = True
- elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP:
- needs_cached_setattr = True
-
- unique_filename = _generate_unique_filename(cls, "init")
-
- script, globs, annotations = _attrs_to_init_script(
- filtered_attrs,
- frozen,
- slots,
- pre_init,
- post_init,
- cache_hash,
- base_attr_map,
- is_exc,
- needs_cached_setattr,
- has_cls_on_setattr,
- attrs_init,
- )
- if cls.__module__ in sys.modules:
- # This makes typing.get_type_hints(CLS.__init__) resolve string types.
- globs.update(sys.modules[cls.__module__].__dict__)
-
- globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict})
-
- if needs_cached_setattr:
- # Save the lookup overhead in __init__ if we need to circumvent
- # setattr hooks.
- globs["_cached_setattr"] = _obj_setattr
-
- init = _make_method(
- "__attrs_init__" if attrs_init else "__init__",
- script,
- unique_filename,
- globs,
- )
- init.__annotations__ = annotations
-
- return init
-
-
-def _setattr(attr_name, value_var, has_on_setattr):
- """
- Use the cached object.setattr to set *attr_name* to *value_var*.
- """
- return "_setattr('%s', %s)" % (attr_name, value_var)
-
-
-def _setattr_with_converter(attr_name, value_var, has_on_setattr):
- """
- Use the cached object.setattr to set *attr_name* to *value_var*, but run
- its converter first.
- """
- return "_setattr('%s', %s(%s))" % (
- attr_name,
- _init_converter_pat % (attr_name,),
- value_var,
- )
-
-
-def _assign(attr_name, value, has_on_setattr):
- """
- Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise
- relegate to _setattr.
- """
- if has_on_setattr:
- return _setattr(attr_name, value, True)
-
- return "self.%s = %s" % (attr_name, value)
-
-
-def _assign_with_converter(attr_name, value_var, has_on_setattr):
- """
- Unless *attr_name* has an on_setattr hook, use normal assignment after
- conversion. Otherwise relegate to _setattr_with_converter.
- """
- if has_on_setattr:
- return _setattr_with_converter(attr_name, value_var, True)
-
- return "self.%s = %s(%s)" % (
- attr_name,
- _init_converter_pat % (attr_name,),
- value_var,
- )
-
-
-if PY2:
-
- def _unpack_kw_only_py2(attr_name, default=None):
- """
- Unpack *attr_name* from _kw_only dict.
- """
- if default is not None:
- arg_default = ", %s" % default
- else:
- arg_default = ""
- return "%s = _kw_only.pop('%s'%s)" % (
- attr_name,
- attr_name,
- arg_default,
- )
-
- def _unpack_kw_only_lines_py2(kw_only_args):
- """
- Unpack all *kw_only_args* from _kw_only dict and handle errors.
-
- Given a list of strings "{attr_name}" and "{attr_name}={default}"
- generates list of lines of code that pop attrs from _kw_only dict and
- raise TypeError similar to builtin if required attr is missing or
- extra key is passed.
-
- >>> print("\n".join(_unpack_kw_only_lines_py2(["a", "b=42"])))
- try:
- a = _kw_only.pop('a')
- b = _kw_only.pop('b', 42)
- except KeyError as _key_error:
- raise TypeError(
- ...
- if _kw_only:
- raise TypeError(
- ...
- """
- lines = ["try:"]
- lines.extend(
- " " + _unpack_kw_only_py2(*arg.split("="))
- for arg in kw_only_args
- )
- lines += """\
-except KeyError as _key_error:
- raise TypeError(
- '__init__() missing required keyword-only argument: %s' % _key_error
- )
-if _kw_only:
- raise TypeError(
- '__init__() got an unexpected keyword argument %r'
- % next(iter(_kw_only))
- )
-""".split(
- "\n"
- )
- return lines
-
-
-def _attrs_to_init_script(
- attrs,
- frozen,
- slots,
- pre_init,
- post_init,
- cache_hash,
- base_attr_map,
- is_exc,
- needs_cached_setattr,
- has_cls_on_setattr,
- attrs_init,
-):
- """
- Return a script of an initializer for *attrs* and a dict of globals.
-
- The globals are expected by the generated script.
-
- If *frozen* is True, we cannot set the attributes directly so we use
- a cached ``object.__setattr__``.
- """
- lines = []
- if pre_init:
- lines.append("self.__attrs_pre_init__()")
-
- if needs_cached_setattr:
- lines.append(
- # Circumvent the __setattr__ descriptor to save one lookup per
- # assignment.
- # Note _setattr will be used again below if cache_hash is True
- "_setattr = _cached_setattr.__get__(self, self.__class__)"
- )
-
- if frozen is True:
- if slots is True:
- fmt_setter = _setattr
- fmt_setter_with_converter = _setattr_with_converter
- else:
- # Dict frozen classes assign directly to __dict__.
- # But only if the attribute doesn't come from an ancestor slot
- # class.
- # Note _inst_dict will be used again below if cache_hash is True
- lines.append("_inst_dict = self.__dict__")
-
- def fmt_setter(attr_name, value_var, has_on_setattr):
- if _is_slot_attr(attr_name, base_attr_map):
- return _setattr(attr_name, value_var, has_on_setattr)
-
- return "_inst_dict['%s'] = %s" % (attr_name, value_var)
-
- def fmt_setter_with_converter(
- attr_name, value_var, has_on_setattr
- ):
- if has_on_setattr or _is_slot_attr(attr_name, base_attr_map):
- return _setattr_with_converter(
- attr_name, value_var, has_on_setattr
- )
-
- return "_inst_dict['%s'] = %s(%s)" % (
- attr_name,
- _init_converter_pat % (attr_name,),
- value_var,
- )
-
- else:
- # Not frozen.
- fmt_setter = _assign
- fmt_setter_with_converter = _assign_with_converter
-
- args = []
- kw_only_args = []
- attrs_to_validate = []
-
- # This is a dictionary of names to validator and converter callables.
- # Injecting this into __init__ globals lets us avoid lookups.
- names_for_globals = {}
- annotations = {"return": None}
-
- for a in attrs:
- if a.validator:
- attrs_to_validate.append(a)
-
- attr_name = a.name
- has_on_setattr = a.on_setattr is not None or (
- a.on_setattr is not setters.NO_OP and has_cls_on_setattr
- )
- arg_name = a.name.lstrip("_")
-
- has_factory = isinstance(a.default, Factory)
- if has_factory and a.default.takes_self:
- maybe_self = "self"
- else:
- maybe_self = ""
-
- if a.init is False:
- if has_factory:
- init_factory_name = _init_factory_pat.format(a.name)
- if a.converter is not None:
- lines.append(
- fmt_setter_with_converter(
- attr_name,
- init_factory_name + "(%s)" % (maybe_self,),
- has_on_setattr,
- )
- )
- conv_name = _init_converter_pat % (a.name,)
- names_for_globals[conv_name] = a.converter
- else:
- lines.append(
- fmt_setter(
- attr_name,
- init_factory_name + "(%s)" % (maybe_self,),
- has_on_setattr,
- )
- )
- names_for_globals[init_factory_name] = a.default.factory
- else:
- if a.converter is not None:
- lines.append(
- fmt_setter_with_converter(
- attr_name,
- "attr_dict['%s'].default" % (attr_name,),
- has_on_setattr,
- )
- )
- conv_name = _init_converter_pat % (a.name,)
- names_for_globals[conv_name] = a.converter
- else:
- lines.append(
- fmt_setter(
- attr_name,
- "attr_dict['%s'].default" % (attr_name,),
- has_on_setattr,
- )
- )
- elif a.default is not NOTHING and not has_factory:
- arg = "%s=attr_dict['%s'].default" % (arg_name, attr_name)
- if a.kw_only:
- kw_only_args.append(arg)
- else:
- args.append(arg)
-
- if a.converter is not None:
- lines.append(
- fmt_setter_with_converter(
- attr_name, arg_name, has_on_setattr
- )
- )
- names_for_globals[
- _init_converter_pat % (a.name,)
- ] = a.converter
- else:
- lines.append(fmt_setter(attr_name, arg_name, has_on_setattr))
-
- elif has_factory:
- arg = "%s=NOTHING" % (arg_name,)
- if a.kw_only:
- kw_only_args.append(arg)
- else:
- args.append(arg)
- lines.append("if %s is not NOTHING:" % (arg_name,))
-
- init_factory_name = _init_factory_pat.format(a.name)
- if a.converter is not None:
- lines.append(
- " "
- + fmt_setter_with_converter(
- attr_name, arg_name, has_on_setattr
- )
- )
- lines.append("else:")
- lines.append(
- " "
- + fmt_setter_with_converter(
- attr_name,
- init_factory_name + "(" + maybe_self + ")",
- has_on_setattr,
- )
- )
- names_for_globals[
- _init_converter_pat % (a.name,)
- ] = a.converter
- else:
- lines.append(
- " " + fmt_setter(attr_name, arg_name, has_on_setattr)
- )
- lines.append("else:")
- lines.append(
- " "
- + fmt_setter(
- attr_name,
- init_factory_name + "(" + maybe_self + ")",
- has_on_setattr,
- )
- )
- names_for_globals[init_factory_name] = a.default.factory
- else:
- if a.kw_only:
- kw_only_args.append(arg_name)
- else:
- args.append(arg_name)
-
- if a.converter is not None:
- lines.append(
- fmt_setter_with_converter(
- attr_name, arg_name, has_on_setattr
- )
- )
- names_for_globals[
- _init_converter_pat % (a.name,)
- ] = a.converter
- else:
- lines.append(fmt_setter(attr_name, arg_name, has_on_setattr))
-
- if a.init is True:
- if a.type is not None and a.converter is None:
- annotations[arg_name] = a.type
- elif a.converter is not None and not PY2:
- # Try to get the type from the converter.
- sig = None
- try:
- sig = inspect.signature(a.converter)
- except (ValueError, TypeError): # inspect failed
- pass
- if sig:
- sig_params = list(sig.parameters.values())
- if (
- sig_params
- and sig_params[0].annotation
- is not inspect.Parameter.empty
- ):
- annotations[arg_name] = sig_params[0].annotation
-
- if attrs_to_validate: # we can skip this if there are no validators.
- names_for_globals["_config"] = _config
- lines.append("if _config._run_validators is True:")
- for a in attrs_to_validate:
- val_name = "__attr_validator_" + a.name
- attr_name = "__attr_" + a.name
- lines.append(
- " %s(self, %s, self.%s)" % (val_name, attr_name, a.name)
- )
- names_for_globals[val_name] = a.validator
- names_for_globals[attr_name] = a
-
- if post_init:
- lines.append("self.__attrs_post_init__()")
-
- # because this is set only after __attrs_post_init is called, a crash
- # will result if post-init tries to access the hash code. This seemed
- # preferable to setting this beforehand, in which case alteration to
- # field values during post-init combined with post-init accessing the
- # hash code would result in silent bugs.
- if cache_hash:
- if frozen:
- if slots:
- # if frozen and slots, then _setattr defined above
- init_hash_cache = "_setattr('%s', %s)"
- else:
- # if frozen and not slots, then _inst_dict defined above
- init_hash_cache = "_inst_dict['%s'] = %s"
- else:
- init_hash_cache = "self.%s = %s"
- lines.append(init_hash_cache % (_hash_cache_field, "None"))
-
- # For exceptions we rely on BaseException.__init__ for proper
- # initialization.
- if is_exc:
- vals = ",".join("self." + a.name for a in attrs if a.init)
-
- lines.append("BaseException.__init__(self, %s)" % (vals,))
-
- args = ", ".join(args)
- if kw_only_args:
- if PY2:
- lines = _unpack_kw_only_lines_py2(kw_only_args) + lines
-
- args += "%s**_kw_only" % (", " if args else "",) # leading comma
- else:
- args += "%s*, %s" % (
- ", " if args else "", # leading comma
- ", ".join(kw_only_args), # kw_only args
- )
- return (
- """\
-def {init_name}(self, {args}):
- {lines}
-""".format(
- init_name=("__attrs_init__" if attrs_init else "__init__"),
- args=args,
- lines="\n ".join(lines) if lines else "pass",
- ),
- names_for_globals,
- annotations,
- )
-
-
-class Attribute(object):
- """
- *Read-only* representation of an attribute.
-
- The class has *all* arguments of `attr.ib` (except for ``factory``
- which is only syntactic sugar for ``default=Factory(...)`` plus the
- following:
-
- - ``name`` (`str`): The name of the attribute.
- - ``inherited`` (`bool`): Whether or not that attribute has been inherited
- from a base class.
- - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The callables
- that are used for comparing and ordering objects by this attribute,
- respectively. These are set by passing a callable to `attr.ib`'s ``eq``,
- ``order``, or ``cmp`` arguments. See also :ref:`comparison customization
- `.
-
- Instances of this class are frequently used for introspection purposes
- like:
-
- - `fields` returns a tuple of them.
- - Validators get them passed as the first argument.
- - The :ref:`field transformer ` hook receives a list of
- them.
-
- .. versionadded:: 20.1.0 *inherited*
- .. versionadded:: 20.1.0 *on_setattr*
- .. versionchanged:: 20.2.0 *inherited* is not taken into account for
- equality checks and hashing anymore.
- .. versionadded:: 21.1.0 *eq_key* and *order_key*
-
- For the full version history of the fields, see `attr.ib`.
- """
-
- __slots__ = (
- "name",
- "default",
- "validator",
- "repr",
- "eq",
- "eq_key",
- "order",
- "order_key",
- "hash",
- "init",
- "metadata",
- "type",
- "converter",
- "kw_only",
- "inherited",
- "on_setattr",
- )
-
- def __init__(
- self,
- name,
- default,
- validator,
- repr,
- cmp, # XXX: unused, remove along with other cmp code.
- hash,
- init,
- inherited,
- metadata=None,
- type=None,
- converter=None,
- kw_only=False,
- eq=None,
- eq_key=None,
- order=None,
- order_key=None,
- on_setattr=None,
- ):
- eq, eq_key, order, order_key = _determine_attrib_eq_order(
- cmp, eq_key or eq, order_key or order, True
- )
-
- # Cache this descriptor here to speed things up later.
- bound_setattr = _obj_setattr.__get__(self, Attribute)
-
- # Despite the big red warning, people *do* instantiate `Attribute`
- # themselves.
- bound_setattr("name", name)
- bound_setattr("default", default)
- bound_setattr("validator", validator)
- bound_setattr("repr", repr)
- bound_setattr("eq", eq)
- bound_setattr("eq_key", eq_key)
- bound_setattr("order", order)
- bound_setattr("order_key", order_key)
- bound_setattr("hash", hash)
- bound_setattr("init", init)
- bound_setattr("converter", converter)
- bound_setattr(
- "metadata",
- (
- metadata_proxy(metadata)
- if metadata
- else _empty_metadata_singleton
- ),
- )
- bound_setattr("type", type)
- bound_setattr("kw_only", kw_only)
- bound_setattr("inherited", inherited)
- bound_setattr("on_setattr", on_setattr)
-
- def __setattr__(self, name, value):
- raise FrozenInstanceError()
-
- @classmethod
- def from_counting_attr(cls, name, ca, type=None):
- # type holds the annotated value. deal with conflicts:
- if type is None:
- type = ca.type
- elif ca.type is not None:
- raise ValueError(
- "Type annotation and type argument cannot both be present"
- )
- inst_dict = {
- k: getattr(ca, k)
- for k in Attribute.__slots__
- if k
- not in (
- "name",
- "validator",
- "default",
- "type",
- "inherited",
- ) # exclude methods and deprecated alias
- }
- return cls(
- name=name,
- validator=ca._validator,
- default=ca._default,
- type=type,
- cmp=None,
- inherited=False,
- **inst_dict
- )
-
- @property
- def cmp(self):
- """
- Simulate the presence of a cmp attribute and warn.
- """
- warnings.warn(_CMP_DEPRECATION, DeprecationWarning, stacklevel=2)
-
- return self.eq and self.order
-
- # Don't use attr.evolve since fields(Attribute) doesn't work
- def evolve(self, **changes):
- """
- Copy *self* and apply *changes*.
-
- This works similarly to `attr.evolve` but that function does not work
- with ``Attribute``.
-
- It is mainly meant to be used for `transform-fields`.
-
- .. versionadded:: 20.3.0
- """
- new = copy.copy(self)
-
- new._setattrs(changes.items())
-
- return new
-
- # Don't use _add_pickle since fields(Attribute) doesn't work
- def __getstate__(self):
- """
- Play nice with pickle.
- """
- return tuple(
- getattr(self, name) if name != "metadata" else dict(self.metadata)
- for name in self.__slots__
- )
-
- def __setstate__(self, state):
- """
- Play nice with pickle.
- """
- self._setattrs(zip(self.__slots__, state))
-
- def _setattrs(self, name_values_pairs):
- bound_setattr = _obj_setattr.__get__(self, Attribute)
- for name, value in name_values_pairs:
- if name != "metadata":
- bound_setattr(name, value)
- else:
- bound_setattr(
- name,
- metadata_proxy(value)
- if value
- else _empty_metadata_singleton,
- )
-
-
-_a = [
- Attribute(
- name=name,
- default=NOTHING,
- validator=None,
- repr=True,
- cmp=None,
- eq=True,
- order=False,
- hash=(name != "metadata"),
- init=True,
- inherited=False,
- )
- for name in Attribute.__slots__
-]
-
-Attribute = _add_hash(
- _add_eq(
- _add_repr(Attribute, attrs=_a),
- attrs=[a for a in _a if a.name != "inherited"],
- ),
- attrs=[a for a in _a if a.hash and a.name != "inherited"],
-)
-
-
-class _CountingAttr(object):
- """
- Intermediate representation of attributes that uses a counter to preserve
- the order in which the attributes have been defined.
-
- *Internal* data structure of the attrs library. Running into is most
- likely the result of a bug like a forgotten `@attr.s` decorator.
- """
-
- __slots__ = (
- "counter",
- "_default",
- "repr",
- "eq",
- "eq_key",
- "order",
- "order_key",
- "hash",
- "init",
- "metadata",
- "_validator",
- "converter",
- "type",
- "kw_only",
- "on_setattr",
- )
- __attrs_attrs__ = tuple(
- Attribute(
- name=name,
- default=NOTHING,
- validator=None,
- repr=True,
- cmp=None,
- hash=True,
- init=True,
- kw_only=False,
- eq=True,
- eq_key=None,
- order=False,
- order_key=None,
- inherited=False,
- on_setattr=None,
- )
- for name in (
- "counter",
- "_default",
- "repr",
- "eq",
- "order",
- "hash",
- "init",
- "on_setattr",
- )
- ) + (
- Attribute(
- name="metadata",
- default=None,
- validator=None,
- repr=True,
- cmp=None,
- hash=False,
- init=True,
- kw_only=False,
- eq=True,
- eq_key=None,
- order=False,
- order_key=None,
- inherited=False,
- on_setattr=None,
- ),
- )
- cls_counter = 0
-
- def __init__(
- self,
- default,
- validator,
- repr,
- cmp,
- hash,
- init,
- converter,
- metadata,
- type,
- kw_only,
- eq,
- eq_key,
- order,
- order_key,
- on_setattr,
- ):
- _CountingAttr.cls_counter += 1
- self.counter = _CountingAttr.cls_counter
- self._default = default
- self._validator = validator
- self.converter = converter
- self.repr = repr
- self.eq = eq
- self.eq_key = eq_key
- self.order = order
- self.order_key = order_key
- self.hash = hash
- self.init = init
- self.metadata = metadata
- self.type = type
- self.kw_only = kw_only
- self.on_setattr = on_setattr
-
- def validator(self, meth):
- """
- Decorator that adds *meth* to the list of validators.
-
- Returns *meth* unchanged.
-
- .. versionadded:: 17.1.0
- """
- if self._validator is None:
- self._validator = meth
- else:
- self._validator = and_(self._validator, meth)
- return meth
-
- def default(self, meth):
- """
- Decorator that allows to set the default for an attribute.
-
- Returns *meth* unchanged.
-
- :raises DefaultAlreadySetError: If default has been set before.
-
- .. versionadded:: 17.1.0
- """
- if self._default is not NOTHING:
- raise DefaultAlreadySetError()
-
- self._default = Factory(meth, takes_self=True)
-
- return meth
-
-
-_CountingAttr = _add_eq(_add_repr(_CountingAttr))
-
-
-class Factory(object):
- """
- Stores a factory callable.
-
- If passed as the default value to `attrs.field`, the factory is used to
- generate a new value.
-
- :param callable factory: A callable that takes either none or exactly one
- mandatory positional argument depending on *takes_self*.
- :param bool takes_self: Pass the partially initialized instance that is
- being initialized as a positional argument.
-
- .. versionadded:: 17.1.0 *takes_self*
- """
-
- __slots__ = ("factory", "takes_self")
-
- def __init__(self, factory, takes_self=False):
- """
- `Factory` is part of the default machinery so if we want a default
- value here, we have to implement it ourselves.
- """
- self.factory = factory
- self.takes_self = takes_self
-
- def __getstate__(self):
- """
- Play nice with pickle.
- """
- return tuple(getattr(self, name) for name in self.__slots__)
-
- def __setstate__(self, state):
- """
- Play nice with pickle.
- """
- for name, value in zip(self.__slots__, state):
- setattr(self, name, value)
-
-
-_f = [
- Attribute(
- name=name,
- default=NOTHING,
- validator=None,
- repr=True,
- cmp=None,
- eq=True,
- order=False,
- hash=True,
- init=True,
- inherited=False,
- )
- for name in Factory.__slots__
-]
-
-Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f)
-
-
-def make_class(name, attrs, bases=(object,), **attributes_arguments):
- """
- A quick way to create a new class called *name* with *attrs*.
-
- :param str name: The name for the new class.
-
- :param attrs: A list of names or a dictionary of mappings of names to
- attributes.
-
- If *attrs* is a list or an ordered dict (`dict` on Python 3.6+,
- `collections.OrderedDict` otherwise), the order is deduced from
- the order of the names or attributes inside *attrs*. Otherwise the
- order of the definition of the attributes is used.
- :type attrs: `list` or `dict`
-
- :param tuple bases: Classes that the new class will subclass.
-
- :param attributes_arguments: Passed unmodified to `attr.s`.
-
- :return: A new class with *attrs*.
- :rtype: type
-
- .. versionadded:: 17.1.0 *bases*
- .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained.
- """
- if isinstance(attrs, dict):
- cls_dict = attrs
- elif isinstance(attrs, (list, tuple)):
- cls_dict = dict((a, attrib()) for a in attrs)
- else:
- raise TypeError("attrs argument must be a dict or a list.")
-
- pre_init = cls_dict.pop("__attrs_pre_init__", None)
- post_init = cls_dict.pop("__attrs_post_init__", None)
- user_init = cls_dict.pop("__init__", None)
-
- body = {}
- if pre_init is not None:
- body["__attrs_pre_init__"] = pre_init
- if post_init is not None:
- body["__attrs_post_init__"] = post_init
- if user_init is not None:
- body["__init__"] = user_init
-
- type_ = new_class(name, bases, {}, lambda ns: ns.update(body))
-
- # For pickling to work, the __module__ variable needs to be set to the
- # frame where the class is created. Bypass this step in environments where
- # sys._getframe is not defined (Jython for example) or sys._getframe is not
- # defined for arguments greater than 0 (IronPython).
- try:
- type_.__module__ = sys._getframe(1).f_globals.get(
- "__name__", "__main__"
- )
- except (AttributeError, ValueError):
- pass
-
- # We do it here for proper warnings with meaningful stacklevel.
- cmp = attributes_arguments.pop("cmp", None)
- (
- attributes_arguments["eq"],
- attributes_arguments["order"],
- ) = _determine_attrs_eq_order(
- cmp,
- attributes_arguments.get("eq"),
- attributes_arguments.get("order"),
- True,
- )
-
- return _attrs(these=cls_dict, **attributes_arguments)(type_)
-
-
-# These are required by within this module so we define them here and merely
-# import into .validators / .converters.
-
-
-@attrs(slots=True, hash=True)
-class _AndValidator(object):
- """
- Compose many validators to a single one.
- """
-
- _validators = attrib()
-
- def __call__(self, inst, attr, value):
- for v in self._validators:
- v(inst, attr, value)
-
-
-def and_(*validators):
- """
- A validator that composes multiple validators into one.
-
- When called on a value, it runs all wrapped validators.
-
- :param callables validators: Arbitrary number of validators.
-
- .. versionadded:: 17.1.0
- """
- vals = []
- for validator in validators:
- vals.extend(
- validator._validators
- if isinstance(validator, _AndValidator)
- else [validator]
- )
-
- return _AndValidator(tuple(vals))
-
-
-def pipe(*converters):
- """
- A converter that composes multiple converters into one.
-
- When called on a value, it runs all wrapped converters, returning the
- *last* value.
-
- Type annotations will be inferred from the wrapped converters', if
- they have any.
-
- :param callables converters: Arbitrary number of converters.
-
- .. versionadded:: 20.1.0
- """
-
- def pipe_converter(val):
- for converter in converters:
- val = converter(val)
-
- return val
-
- if not PY2:
- if not converters:
- # If the converter list is empty, pipe_converter is the identity.
- A = typing.TypeVar("A")
- pipe_converter.__annotations__ = {"val": A, "return": A}
- else:
- # Get parameter type.
- sig = None
- try:
- sig = inspect.signature(converters[0])
- except (ValueError, TypeError): # inspect failed
- pass
- if sig:
- params = list(sig.parameters.values())
- if (
- params
- and params[0].annotation is not inspect.Parameter.empty
- ):
- pipe_converter.__annotations__["val"] = params[
- 0
- ].annotation
- # Get return type.
- sig = None
- try:
- sig = inspect.signature(converters[-1])
- except (ValueError, TypeError): # inspect failed
- pass
- if sig and sig.return_annotation is not inspect.Signature().empty:
- pipe_converter.__annotations__[
- "return"
- ] = sig.return_annotation
-
- return pipe_converter
diff --git a/client/ayon_core/vendor/python/python_2/attr/_next_gen.py b/client/ayon_core/vendor/python/python_2/attr/_next_gen.py
deleted file mode 100644
index 068253688c..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_next_gen.py
+++ /dev/null
@@ -1,216 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-"""
-These are Python 3.6+-only and keyword-only APIs that call `attr.s` and
-`attr.ib` with different default values.
-"""
-
-
-from functools import partial
-
-from . import setters
-from ._funcs import asdict as _asdict
-from ._funcs import astuple as _astuple
-from ._make import (
- NOTHING,
- _frozen_setattrs,
- _ng_default_on_setattr,
- attrib,
- attrs,
-)
-from .exceptions import UnannotatedAttributeError
-
-
-def define(
- maybe_cls=None,
- *,
- these=None,
- repr=None,
- hash=None,
- init=None,
- slots=True,
- frozen=False,
- weakref_slot=True,
- str=False,
- auto_attribs=None,
- kw_only=False,
- cache_hash=False,
- auto_exc=True,
- eq=None,
- order=False,
- auto_detect=True,
- getstate_setstate=None,
- on_setattr=None,
- field_transformer=None,
- match_args=True,
-):
- r"""
- Define an ``attrs`` class.
-
- Differences to the classic `attr.s` that it uses underneath:
-
- - Automatically detect whether or not *auto_attribs* should be `True`
- (c.f. *auto_attribs* parameter).
- - If *frozen* is `False`, run converters and validators when setting an
- attribute by default.
- - *slots=True* (see :term:`slotted classes` for potentially surprising
- behaviors)
- - *auto_exc=True*
- - *auto_detect=True*
- - *order=False*
- - *match_args=True*
- - Some options that were only relevant on Python 2 or were kept around for
- backwards-compatibility have been removed.
-
- Please note that these are all defaults and you can change them as you
- wish.
-
- :param Optional[bool] auto_attribs: If set to `True` or `False`, it behaves
- exactly like `attr.s`. If left `None`, `attr.s` will try to guess:
-
- 1. If any attributes are annotated and no unannotated `attrs.fields`\ s
- are found, it assumes *auto_attribs=True*.
- 2. Otherwise it assumes *auto_attribs=False* and tries to collect
- `attrs.fields`\ s.
-
- For now, please refer to `attr.s` for the rest of the parameters.
-
- .. versionadded:: 20.1.0
- .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``.
- """
-
- def do_it(cls, auto_attribs):
- return attrs(
- maybe_cls=cls,
- these=these,
- repr=repr,
- hash=hash,
- init=init,
- slots=slots,
- frozen=frozen,
- weakref_slot=weakref_slot,
- str=str,
- auto_attribs=auto_attribs,
- kw_only=kw_only,
- cache_hash=cache_hash,
- auto_exc=auto_exc,
- eq=eq,
- order=order,
- auto_detect=auto_detect,
- collect_by_mro=True,
- getstate_setstate=getstate_setstate,
- on_setattr=on_setattr,
- field_transformer=field_transformer,
- match_args=match_args,
- )
-
- def wrap(cls):
- """
- Making this a wrapper ensures this code runs during class creation.
-
- We also ensure that frozen-ness of classes is inherited.
- """
- nonlocal frozen, on_setattr
-
- had_on_setattr = on_setattr not in (None, setters.NO_OP)
-
- # By default, mutable classes convert & validate on setattr.
- if frozen is False and on_setattr is None:
- on_setattr = _ng_default_on_setattr
-
- # However, if we subclass a frozen class, we inherit the immutability
- # and disable on_setattr.
- for base_cls in cls.__bases__:
- if base_cls.__setattr__ is _frozen_setattrs:
- if had_on_setattr:
- raise ValueError(
- "Frozen classes can't use on_setattr "
- "(frozen-ness was inherited)."
- )
-
- on_setattr = setters.NO_OP
- break
-
- if auto_attribs is not None:
- return do_it(cls, auto_attribs)
-
- try:
- return do_it(cls, True)
- except UnannotatedAttributeError:
- return do_it(cls, False)
-
- # maybe_cls's type depends on the usage of the decorator. It's a class
- # if it's used as `@attrs` but ``None`` if used as `@attrs()`.
- if maybe_cls is None:
- return wrap
- else:
- return wrap(maybe_cls)
-
-
-mutable = define
-frozen = partial(define, frozen=True, on_setattr=None)
-
-
-def field(
- *,
- default=NOTHING,
- validator=None,
- repr=True,
- hash=None,
- init=True,
- metadata=None,
- converter=None,
- factory=None,
- kw_only=False,
- eq=None,
- order=None,
- on_setattr=None,
-):
- """
- Identical to `attr.ib`, except keyword-only and with some arguments
- removed.
-
- .. versionadded:: 20.1.0
- """
- return attrib(
- default=default,
- validator=validator,
- repr=repr,
- hash=hash,
- init=init,
- metadata=metadata,
- converter=converter,
- factory=factory,
- kw_only=kw_only,
- eq=eq,
- order=order,
- on_setattr=on_setattr,
- )
-
-
-def asdict(inst, *, recurse=True, filter=None, value_serializer=None):
- """
- Same as `attr.asdict`, except that collections types are always retained
- and dict is always used as *dict_factory*.
-
- .. versionadded:: 21.3.0
- """
- return _asdict(
- inst=inst,
- recurse=recurse,
- filter=filter,
- value_serializer=value_serializer,
- retain_collection_types=True,
- )
-
-
-def astuple(inst, *, recurse=True, filter=None):
- """
- Same as `attr.astuple`, except that collections types are always retained
- and `tuple` is always used as the *tuple_factory*.
-
- .. versionadded:: 21.3.0
- """
- return _astuple(
- inst=inst, recurse=recurse, filter=filter, retain_collection_types=True
- )
diff --git a/client/ayon_core/vendor/python/python_2/attr/_version_info.py b/client/ayon_core/vendor/python/python_2/attr/_version_info.py
deleted file mode 100644
index cdaeec37a1..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_version_info.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from __future__ import absolute_import, division, print_function
-
-from functools import total_ordering
-
-from ._funcs import astuple
-from ._make import attrib, attrs
-
-
-@total_ordering
-@attrs(eq=False, order=False, slots=True, frozen=True)
-class VersionInfo(object):
- """
- A version object that can be compared to tuple of length 1--4:
-
- >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2)
- True
- >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1)
- True
- >>> vi = attr.VersionInfo(19, 2, 0, "final")
- >>> vi < (19, 1, 1)
- False
- >>> vi < (19,)
- False
- >>> vi == (19, 2,)
- True
- >>> vi == (19, 2, 1)
- False
-
- .. versionadded:: 19.2
- """
-
- year = attrib(type=int)
- minor = attrib(type=int)
- micro = attrib(type=int)
- releaselevel = attrib(type=str)
-
- @classmethod
- def _from_version_string(cls, s):
- """
- Parse *s* and return a _VersionInfo.
- """
- v = s.split(".")
- if len(v) == 3:
- v.append("final")
-
- return cls(
- year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3]
- )
-
- def _ensure_tuple(self, other):
- """
- Ensure *other* is a tuple of a valid length.
-
- Returns a possibly transformed *other* and ourselves as a tuple of
- the same length as *other*.
- """
-
- if self.__class__ is other.__class__:
- other = astuple(other)
-
- if not isinstance(other, tuple):
- raise NotImplementedError
-
- if not (1 <= len(other) <= 4):
- raise NotImplementedError
-
- return astuple(self)[: len(other)], other
-
- def __eq__(self, other):
- try:
- us, them = self._ensure_tuple(other)
- except NotImplementedError:
- return NotImplemented
-
- return us == them
-
- def __lt__(self, other):
- try:
- us, them = self._ensure_tuple(other)
- except NotImplementedError:
- return NotImplemented
-
- # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't
- # have to do anything special with releaselevel for now.
- return us < them
diff --git a/client/ayon_core/vendor/python/python_2/attr/_version_info.pyi b/client/ayon_core/vendor/python/python_2/attr/_version_info.pyi
deleted file mode 100644
index 45ced08633..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/_version_info.pyi
+++ /dev/null
@@ -1,9 +0,0 @@
-class VersionInfo:
- @property
- def year(self) -> int: ...
- @property
- def minor(self) -> int: ...
- @property
- def micro(self) -> int: ...
- @property
- def releaselevel(self) -> str: ...
diff --git a/client/ayon_core/vendor/python/python_2/attr/converters.py b/client/ayon_core/vendor/python/python_2/attr/converters.py
deleted file mode 100644
index 1fb6c05d7b..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/converters.py
+++ /dev/null
@@ -1,155 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-"""
-Commonly useful converters.
-"""
-
-from __future__ import absolute_import, division, print_function
-
-from ._compat import PY2
-from ._make import NOTHING, Factory, pipe
-
-
-if not PY2:
- import inspect
- import typing
-
-
-__all__ = [
- "default_if_none",
- "optional",
- "pipe",
- "to_bool",
-]
-
-
-def optional(converter):
- """
- A converter that allows an attribute to be optional. An optional attribute
- is one which can be set to ``None``.
-
- Type annotations will be inferred from the wrapped converter's, if it
- has any.
-
- :param callable converter: the converter that is used for non-``None``
- values.
-
- .. versionadded:: 17.1.0
- """
-
- def optional_converter(val):
- if val is None:
- return None
- return converter(val)
-
- if not PY2:
- sig = None
- try:
- sig = inspect.signature(converter)
- except (ValueError, TypeError): # inspect failed
- pass
- if sig:
- params = list(sig.parameters.values())
- if params and params[0].annotation is not inspect.Parameter.empty:
- optional_converter.__annotations__["val"] = typing.Optional[
- params[0].annotation
- ]
- if sig.return_annotation is not inspect.Signature.empty:
- optional_converter.__annotations__["return"] = typing.Optional[
- sig.return_annotation
- ]
-
- return optional_converter
-
-
-def default_if_none(default=NOTHING, factory=None):
- """
- A converter that allows to replace ``None`` values by *default* or the
- result of *factory*.
-
- :param default: Value to be used if ``None`` is passed. Passing an instance
- of `attrs.Factory` is supported, however the ``takes_self`` option
- is *not*.
- :param callable factory: A callable that takes no parameters whose result
- is used if ``None`` is passed.
-
- :raises TypeError: If **neither** *default* or *factory* is passed.
- :raises TypeError: If **both** *default* and *factory* are passed.
- :raises ValueError: If an instance of `attrs.Factory` is passed with
- ``takes_self=True``.
-
- .. versionadded:: 18.2.0
- """
- if default is NOTHING and factory is None:
- raise TypeError("Must pass either `default` or `factory`.")
-
- if default is not NOTHING and factory is not None:
- raise TypeError(
- "Must pass either `default` or `factory` but not both."
- )
-
- if factory is not None:
- default = Factory(factory)
-
- if isinstance(default, Factory):
- if default.takes_self:
- raise ValueError(
- "`takes_self` is not supported by default_if_none."
- )
-
- def default_if_none_converter(val):
- if val is not None:
- return val
-
- return default.factory()
-
- else:
-
- def default_if_none_converter(val):
- if val is not None:
- return val
-
- return default
-
- return default_if_none_converter
-
-
-def to_bool(val):
- """
- Convert "boolean" strings (e.g., from env. vars.) to real booleans.
-
- Values mapping to :code:`True`:
-
- - :code:`True`
- - :code:`"true"` / :code:`"t"`
- - :code:`"yes"` / :code:`"y"`
- - :code:`"on"`
- - :code:`"1"`
- - :code:`1`
-
- Values mapping to :code:`False`:
-
- - :code:`False`
- - :code:`"false"` / :code:`"f"`
- - :code:`"no"` / :code:`"n"`
- - :code:`"off"`
- - :code:`"0"`
- - :code:`0`
-
- :raises ValueError: for any other value.
-
- .. versionadded:: 21.3.0
- """
- if isinstance(val, str):
- val = val.lower()
- truthy = {True, "true", "t", "yes", "y", "on", "1", 1}
- falsy = {False, "false", "f", "no", "n", "off", "0", 0}
- try:
- if val in truthy:
- return True
- if val in falsy:
- return False
- except TypeError:
- # Raised when "val" is not hashable (e.g., lists)
- pass
- raise ValueError("Cannot convert value to bool: {}".format(val))
diff --git a/client/ayon_core/vendor/python/python_2/attr/converters.pyi b/client/ayon_core/vendor/python/python_2/attr/converters.pyi
deleted file mode 100644
index 0f58088a37..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/converters.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-from typing import Callable, Optional, TypeVar, overload
-
-from . import _ConverterType
-
-_T = TypeVar("_T")
-
-def pipe(*validators: _ConverterType) -> _ConverterType: ...
-def optional(converter: _ConverterType) -> _ConverterType: ...
-@overload
-def default_if_none(default: _T) -> _ConverterType: ...
-@overload
-def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType: ...
-def to_bool(val: str) -> bool: ...
diff --git a/client/ayon_core/vendor/python/python_2/attr/exceptions.py b/client/ayon_core/vendor/python/python_2/attr/exceptions.py
deleted file mode 100644
index b2f1edc32a..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/exceptions.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from __future__ import absolute_import, division, print_function
-
-
-class FrozenError(AttributeError):
- """
- A frozen/immutable instance or attribute have been attempted to be
- modified.
-
- It mirrors the behavior of ``namedtuples`` by using the same error message
- and subclassing `AttributeError`.
-
- .. versionadded:: 20.1.0
- """
-
- msg = "can't set attribute"
- args = [msg]
-
-
-class FrozenInstanceError(FrozenError):
- """
- A frozen instance has been attempted to be modified.
-
- .. versionadded:: 16.1.0
- """
-
-
-class FrozenAttributeError(FrozenError):
- """
- A frozen attribute has been attempted to be modified.
-
- .. versionadded:: 20.1.0
- """
-
-
-class AttrsAttributeNotFoundError(ValueError):
- """
- An ``attrs`` function couldn't find an attribute that the user asked for.
-
- .. versionadded:: 16.2.0
- """
-
-
-class NotAnAttrsClassError(ValueError):
- """
- A non-``attrs`` class has been passed into an ``attrs`` function.
-
- .. versionadded:: 16.2.0
- """
-
-
-class DefaultAlreadySetError(RuntimeError):
- """
- A default has been set using ``attr.ib()`` and is attempted to be reset
- using the decorator.
-
- .. versionadded:: 17.1.0
- """
-
-
-class UnannotatedAttributeError(RuntimeError):
- """
- A class with ``auto_attribs=True`` has an ``attr.ib()`` without a type
- annotation.
-
- .. versionadded:: 17.3.0
- """
-
-
-class PythonTooOldError(RuntimeError):
- """
- It was attempted to use an ``attrs`` feature that requires a newer Python
- version.
-
- .. versionadded:: 18.2.0
- """
-
-
-class NotCallableError(TypeError):
- """
- A ``attr.ib()`` requiring a callable has been set with a value
- that is not callable.
-
- .. versionadded:: 19.2.0
- """
-
- def __init__(self, msg, value):
- super(TypeError, self).__init__(msg, value)
- self.msg = msg
- self.value = value
-
- def __str__(self):
- return str(self.msg)
diff --git a/client/ayon_core/vendor/python/python_2/attr/exceptions.pyi b/client/ayon_core/vendor/python/python_2/attr/exceptions.pyi
deleted file mode 100644
index f2680118b4..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/exceptions.pyi
+++ /dev/null
@@ -1,17 +0,0 @@
-from typing import Any
-
-class FrozenError(AttributeError):
- msg: str = ...
-
-class FrozenInstanceError(FrozenError): ...
-class FrozenAttributeError(FrozenError): ...
-class AttrsAttributeNotFoundError(ValueError): ...
-class NotAnAttrsClassError(ValueError): ...
-class DefaultAlreadySetError(RuntimeError): ...
-class UnannotatedAttributeError(RuntimeError): ...
-class PythonTooOldError(RuntimeError): ...
-
-class NotCallableError(TypeError):
- msg: str = ...
- value: Any = ...
- def __init__(self, msg: str, value: Any) -> None: ...
diff --git a/client/ayon_core/vendor/python/python_2/attr/filters.py b/client/ayon_core/vendor/python/python_2/attr/filters.py
deleted file mode 100644
index a1978a8775..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/filters.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-"""
-Commonly useful filters for `attr.asdict`.
-"""
-
-from __future__ import absolute_import, division, print_function
-
-from ._compat import isclass
-from ._make import Attribute
-
-
-def _split_what(what):
- """
- Returns a tuple of `frozenset`s of classes and attributes.
- """
- return (
- frozenset(cls for cls in what if isclass(cls)),
- frozenset(cls for cls in what if isinstance(cls, Attribute)),
- )
-
-
-def include(*what):
- """
- Include *what*.
-
- :param what: What to include.
- :type what: `list` of `type` or `attrs.Attribute`\\ s
-
- :rtype: `callable`
- """
- cls, attrs = _split_what(what)
-
- def include_(attribute, value):
- return value.__class__ in cls or attribute in attrs
-
- return include_
-
-
-def exclude(*what):
- """
- Exclude *what*.
-
- :param what: What to exclude.
- :type what: `list` of classes or `attrs.Attribute`\\ s.
-
- :rtype: `callable`
- """
- cls, attrs = _split_what(what)
-
- def exclude_(attribute, value):
- return value.__class__ not in cls and attribute not in attrs
-
- return exclude_
diff --git a/client/ayon_core/vendor/python/python_2/attr/filters.pyi b/client/ayon_core/vendor/python/python_2/attr/filters.pyi
deleted file mode 100644
index 993866865e..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/filters.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-from typing import Any, Union
-
-from . import Attribute, _FilterType
-
-def include(*what: Union[type, Attribute[Any]]) -> _FilterType[Any]: ...
-def exclude(*what: Union[type, Attribute[Any]]) -> _FilterType[Any]: ...
diff --git a/client/ayon_core/vendor/python/python_2/attr/py.typed b/client/ayon_core/vendor/python/python_2/attr/py.typed
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/client/ayon_core/vendor/python/python_2/attr/setters.py b/client/ayon_core/vendor/python/python_2/attr/setters.py
deleted file mode 100644
index b1cbb5d83e..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/setters.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-"""
-Commonly used hooks for on_setattr.
-"""
-
-from __future__ import absolute_import, division, print_function
-
-from . import _config
-from .exceptions import FrozenAttributeError
-
-
-def pipe(*setters):
- """
- Run all *setters* and return the return value of the last one.
-
- .. versionadded:: 20.1.0
- """
-
- def wrapped_pipe(instance, attrib, new_value):
- rv = new_value
-
- for setter in setters:
- rv = setter(instance, attrib, rv)
-
- return rv
-
- return wrapped_pipe
-
-
-def frozen(_, __, ___):
- """
- Prevent an attribute to be modified.
-
- .. versionadded:: 20.1.0
- """
- raise FrozenAttributeError()
-
-
-def validate(instance, attrib, new_value):
- """
- Run *attrib*'s validator on *new_value* if it has one.
-
- .. versionadded:: 20.1.0
- """
- if _config._run_validators is False:
- return new_value
-
- v = attrib.validator
- if not v:
- return new_value
-
- v(instance, attrib, new_value)
-
- return new_value
-
-
-def convert(instance, attrib, new_value):
- """
- Run *attrib*'s converter -- if it has one -- on *new_value* and return the
- result.
-
- .. versionadded:: 20.1.0
- """
- c = attrib.converter
- if c:
- return c(new_value)
-
- return new_value
-
-
-NO_OP = object()
-"""
-Sentinel for disabling class-wide *on_setattr* hooks for certain attributes.
-
-Does not work in `pipe` or within lists.
-
-.. versionadded:: 20.1.0
-"""
diff --git a/client/ayon_core/vendor/python/python_2/attr/setters.pyi b/client/ayon_core/vendor/python/python_2/attr/setters.pyi
deleted file mode 100644
index 3f5603c2b0..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/setters.pyi
+++ /dev/null
@@ -1,19 +0,0 @@
-from typing import Any, NewType, NoReturn, TypeVar, cast
-
-from . import Attribute, _OnSetAttrType
-
-_T = TypeVar("_T")
-
-def frozen(
- instance: Any, attribute: Attribute[Any], new_value: Any
-) -> NoReturn: ...
-def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ...
-def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ...
-
-# convert is allowed to return Any, because they can be chained using pipe.
-def convert(
- instance: Any, attribute: Attribute[Any], new_value: Any
-) -> Any: ...
-
-_NoOpType = NewType("_NoOpType", object)
-NO_OP: _NoOpType
diff --git a/client/ayon_core/vendor/python/python_2/attr/validators.py b/client/ayon_core/vendor/python/python_2/attr/validators.py
deleted file mode 100644
index 0b0c8342f2..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/validators.py
+++ /dev/null
@@ -1,561 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-"""
-Commonly useful validators.
-"""
-
-from __future__ import absolute_import, division, print_function
-
-import operator
-import re
-
-from contextlib import contextmanager
-
-from ._config import get_run_validators, set_run_validators
-from ._make import _AndValidator, and_, attrib, attrs
-from .exceptions import NotCallableError
-
-
-try:
- Pattern = re.Pattern
-except AttributeError: # Python <3.7 lacks a Pattern type.
- Pattern = type(re.compile(""))
-
-
-__all__ = [
- "and_",
- "deep_iterable",
- "deep_mapping",
- "disabled",
- "ge",
- "get_disabled",
- "gt",
- "in_",
- "instance_of",
- "is_callable",
- "le",
- "lt",
- "matches_re",
- "max_len",
- "optional",
- "provides",
- "set_disabled",
-]
-
-
-def set_disabled(disabled):
- """
- Globally disable or enable running validators.
-
- By default, they are run.
-
- :param disabled: If ``True``, disable running all validators.
- :type disabled: bool
-
- .. warning::
-
- This function is not thread-safe!
-
- .. versionadded:: 21.3.0
- """
- set_run_validators(not disabled)
-
-
-def get_disabled():
- """
- Return a bool indicating whether validators are currently disabled or not.
-
- :return: ``True`` if validators are currently disabled.
- :rtype: bool
-
- .. versionadded:: 21.3.0
- """
- return not get_run_validators()
-
-
-@contextmanager
-def disabled():
- """
- Context manager that disables running validators within its context.
-
- .. warning::
-
- This context manager is not thread-safe!
-
- .. versionadded:: 21.3.0
- """
- set_run_validators(False)
- try:
- yield
- finally:
- set_run_validators(True)
-
-
-@attrs(repr=False, slots=True, hash=True)
-class _InstanceOfValidator(object):
- type = attrib()
-
- def __call__(self, inst, attr, value):
- """
- We use a callable class to be able to change the ``__repr__``.
- """
- if not isinstance(value, self.type):
- raise TypeError(
- "'{name}' must be {type!r} (got {value!r} that is a "
- "{actual!r}).".format(
- name=attr.name,
- type=self.type,
- actual=value.__class__,
- value=value,
- ),
- attr,
- self.type,
- value,
- )
-
- def __repr__(self):
- return "".format(
- type=self.type
- )
-
-
-def instance_of(type):
- """
- A validator that raises a `TypeError` if the initializer is called
- with a wrong type for this particular attribute (checks are performed using
- `isinstance` therefore it's also valid to pass a tuple of types).
-
- :param type: The type to check for.
- :type type: type or tuple of types
-
- :raises TypeError: With a human readable error message, the attribute
- (of type `attrs.Attribute`), the expected type, and the value it
- got.
- """
- return _InstanceOfValidator(type)
-
-
-@attrs(repr=False, frozen=True, slots=True)
-class _MatchesReValidator(object):
- pattern = attrib()
- match_func = attrib()
-
- def __call__(self, inst, attr, value):
- """
- We use a callable class to be able to change the ``__repr__``.
- """
- if not self.match_func(value):
- raise ValueError(
- "'{name}' must match regex {pattern!r}"
- " ({value!r} doesn't)".format(
- name=attr.name, pattern=self.pattern.pattern, value=value
- ),
- attr,
- self.pattern,
- value,
- )
-
- def __repr__(self):
- return "".format(
- pattern=self.pattern
- )
-
-
-def matches_re(regex, flags=0, func=None):
- r"""
- A validator that raises `ValueError` if the initializer is called
- with a string that doesn't match *regex*.
-
- :param regex: a regex string or precompiled pattern to match against
- :param int flags: flags that will be passed to the underlying re function
- (default 0)
- :param callable func: which underlying `re` function to call (options
- are `re.fullmatch`, `re.search`, `re.match`, default
- is ``None`` which means either `re.fullmatch` or an emulation of
- it on Python 2). For performance reasons, they won't be used directly
- but on a pre-`re.compile`\ ed pattern.
-
- .. versionadded:: 19.2.0
- .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern.
- """
- fullmatch = getattr(re, "fullmatch", None)
- valid_funcs = (fullmatch, None, re.search, re.match)
- if func not in valid_funcs:
- raise ValueError(
- "'func' must be one of {}.".format(
- ", ".join(
- sorted(
- e and e.__name__ or "None" for e in set(valid_funcs)
- )
- )
- )
- )
-
- if isinstance(regex, Pattern):
- if flags:
- raise TypeError(
- "'flags' can only be used with a string pattern; "
- "pass flags to re.compile() instead"
- )
- pattern = regex
- else:
- pattern = re.compile(regex, flags)
-
- if func is re.match:
- match_func = pattern.match
- elif func is re.search:
- match_func = pattern.search
- elif fullmatch:
- match_func = pattern.fullmatch
- else: # Python 2 fullmatch emulation (https://bugs.python.org/issue16203)
- pattern = re.compile(
- r"(?:{})\Z".format(pattern.pattern), pattern.flags
- )
- match_func = pattern.match
-
- return _MatchesReValidator(pattern, match_func)
-
-
-@attrs(repr=False, slots=True, hash=True)
-class _ProvidesValidator(object):
- interface = attrib()
-
- def __call__(self, inst, attr, value):
- """
- We use a callable class to be able to change the ``__repr__``.
- """
- if not self.interface.providedBy(value):
- raise TypeError(
- "'{name}' must provide {interface!r} which {value!r} "
- "doesn't.".format(
- name=attr.name, interface=self.interface, value=value
- ),
- attr,
- self.interface,
- value,
- )
-
- def __repr__(self):
- return "".format(
- interface=self.interface
- )
-
-
-def provides(interface):
- """
- A validator that raises a `TypeError` if the initializer is called
- with an object that does not provide the requested *interface* (checks are
- performed using ``interface.providedBy(value)`` (see `zope.interface
- `_).
-
- :param interface: The interface to check for.
- :type interface: ``zope.interface.Interface``
-
- :raises TypeError: With a human readable error message, the attribute
- (of type `attrs.Attribute`), the expected interface, and the
- value it got.
- """
- return _ProvidesValidator(interface)
-
-
-@attrs(repr=False, slots=True, hash=True)
-class _OptionalValidator(object):
- validator = attrib()
-
- def __call__(self, inst, attr, value):
- if value is None:
- return
-
- self.validator(inst, attr, value)
-
- def __repr__(self):
- return "".format(
- what=repr(self.validator)
- )
-
-
-def optional(validator):
- """
- A validator that makes an attribute optional. An optional attribute is one
- which can be set to ``None`` in addition to satisfying the requirements of
- the sub-validator.
-
- :param validator: A validator (or a list of validators) that is used for
- non-``None`` values.
- :type validator: callable or `list` of callables.
-
- .. versionadded:: 15.1.0
- .. versionchanged:: 17.1.0 *validator* can be a list of validators.
- """
- if isinstance(validator, list):
- return _OptionalValidator(_AndValidator(validator))
- return _OptionalValidator(validator)
-
-
-@attrs(repr=False, slots=True, hash=True)
-class _InValidator(object):
- options = attrib()
-
- def __call__(self, inst, attr, value):
- try:
- in_options = value in self.options
- except TypeError: # e.g. `1 in "abc"`
- in_options = False
-
- if not in_options:
- raise ValueError(
- "'{name}' must be in {options!r} (got {value!r})".format(
- name=attr.name, options=self.options, value=value
- )
- )
-
- def __repr__(self):
- return "".format(
- options=self.options
- )
-
-
-def in_(options):
- """
- A validator that raises a `ValueError` if the initializer is called
- with a value that does not belong in the options provided. The check is
- performed using ``value in options``.
-
- :param options: Allowed options.
- :type options: list, tuple, `enum.Enum`, ...
-
- :raises ValueError: With a human readable error message, the attribute (of
- type `attrs.Attribute`), the expected options, and the value it
- got.
-
- .. versionadded:: 17.1.0
- """
- return _InValidator(options)
-
-
-@attrs(repr=False, slots=False, hash=True)
-class _IsCallableValidator(object):
- def __call__(self, inst, attr, value):
- """
- We use a callable class to be able to change the ``__repr__``.
- """
- if not callable(value):
- message = (
- "'{name}' must be callable "
- "(got {value!r} that is a {actual!r})."
- )
- raise NotCallableError(
- msg=message.format(
- name=attr.name, value=value, actual=value.__class__
- ),
- value=value,
- )
-
- def __repr__(self):
- return ""
-
-
-def is_callable():
- """
- A validator that raises a `attr.exceptions.NotCallableError` if the
- initializer is called with a value for this particular attribute
- that is not callable.
-
- .. versionadded:: 19.1.0
-
- :raises `attr.exceptions.NotCallableError`: With a human readable error
- message containing the attribute (`attrs.Attribute`) name,
- and the value it got.
- """
- return _IsCallableValidator()
-
-
-@attrs(repr=False, slots=True, hash=True)
-class _DeepIterable(object):
- member_validator = attrib(validator=is_callable())
- iterable_validator = attrib(
- default=None, validator=optional(is_callable())
- )
-
- def __call__(self, inst, attr, value):
- """
- We use a callable class to be able to change the ``__repr__``.
- """
- if self.iterable_validator is not None:
- self.iterable_validator(inst, attr, value)
-
- for member in value:
- self.member_validator(inst, attr, member)
-
- def __repr__(self):
- iterable_identifier = (
- ""
- if self.iterable_validator is None
- else " {iterable!r}".format(iterable=self.iterable_validator)
- )
- return (
- ""
- ).format(
- iterable_identifier=iterable_identifier,
- member=self.member_validator,
- )
-
-
-def deep_iterable(member_validator, iterable_validator=None):
- """
- A validator that performs deep validation of an iterable.
-
- :param member_validator: Validator to apply to iterable members
- :param iterable_validator: Validator to apply to iterable itself
- (optional)
-
- .. versionadded:: 19.1.0
-
- :raises TypeError: if any sub-validators fail
- """
- return _DeepIterable(member_validator, iterable_validator)
-
-
-@attrs(repr=False, slots=True, hash=True)
-class _DeepMapping(object):
- key_validator = attrib(validator=is_callable())
- value_validator = attrib(validator=is_callable())
- mapping_validator = attrib(default=None, validator=optional(is_callable()))
-
- def __call__(self, inst, attr, value):
- """
- We use a callable class to be able to change the ``__repr__``.
- """
- if self.mapping_validator is not None:
- self.mapping_validator(inst, attr, value)
-
- for key in value:
- self.key_validator(inst, attr, key)
- self.value_validator(inst, attr, value[key])
-
- def __repr__(self):
- return (
- ""
- ).format(key=self.key_validator, value=self.value_validator)
-
-
-def deep_mapping(key_validator, value_validator, mapping_validator=None):
- """
- A validator that performs deep validation of a dictionary.
-
- :param key_validator: Validator to apply to dictionary keys
- :param value_validator: Validator to apply to dictionary values
- :param mapping_validator: Validator to apply to top-level mapping
- attribute (optional)
-
- .. versionadded:: 19.1.0
-
- :raises TypeError: if any sub-validators fail
- """
- return _DeepMapping(key_validator, value_validator, mapping_validator)
-
-
-@attrs(repr=False, frozen=True, slots=True)
-class _NumberValidator(object):
- bound = attrib()
- compare_op = attrib()
- compare_func = attrib()
-
- def __call__(self, inst, attr, value):
- """
- We use a callable class to be able to change the ``__repr__``.
- """
- if not self.compare_func(value, self.bound):
- raise ValueError(
- "'{name}' must be {op} {bound}: {value}".format(
- name=attr.name,
- op=self.compare_op,
- bound=self.bound,
- value=value,
- )
- )
-
- def __repr__(self):
- return "".format(
- op=self.compare_op, bound=self.bound
- )
-
-
-def lt(val):
- """
- A validator that raises `ValueError` if the initializer is called
- with a number larger or equal to *val*.
-
- :param val: Exclusive upper bound for values
-
- .. versionadded:: 21.3.0
- """
- return _NumberValidator(val, "<", operator.lt)
-
-
-def le(val):
- """
- A validator that raises `ValueError` if the initializer is called
- with a number greater than *val*.
-
- :param val: Inclusive upper bound for values
-
- .. versionadded:: 21.3.0
- """
- return _NumberValidator(val, "<=", operator.le)
-
-
-def ge(val):
- """
- A validator that raises `ValueError` if the initializer is called
- with a number smaller than *val*.
-
- :param val: Inclusive lower bound for values
-
- .. versionadded:: 21.3.0
- """
- return _NumberValidator(val, ">=", operator.ge)
-
-
-def gt(val):
- """
- A validator that raises `ValueError` if the initializer is called
- with a number smaller or equal to *val*.
-
- :param val: Exclusive lower bound for values
-
- .. versionadded:: 21.3.0
- """
- return _NumberValidator(val, ">", operator.gt)
-
-
-@attrs(repr=False, frozen=True, slots=True)
-class _MaxLengthValidator(object):
- max_length = attrib()
-
- def __call__(self, inst, attr, value):
- """
- We use a callable class to be able to change the ``__repr__``.
- """
- if len(value) > self.max_length:
- raise ValueError(
- "Length of '{name}' must be <= {max}: {len}".format(
- name=attr.name, max=self.max_length, len=len(value)
- )
- )
-
- def __repr__(self):
- return "".format(max=self.max_length)
-
-
-def max_len(length):
- """
- A validator that raises `ValueError` if the initializer is called
- with a string or iterable that is longer than *length*.
-
- :param int length: Maximum length of the string or iterable
-
- .. versionadded:: 21.3.0
- """
- return _MaxLengthValidator(length)
diff --git a/client/ayon_core/vendor/python/python_2/attr/validators.pyi b/client/ayon_core/vendor/python/python_2/attr/validators.pyi
deleted file mode 100644
index 5e00b85433..0000000000
--- a/client/ayon_core/vendor/python/python_2/attr/validators.pyi
+++ /dev/null
@@ -1,78 +0,0 @@
-from typing import (
- Any,
- AnyStr,
- Callable,
- Container,
- ContextManager,
- Iterable,
- List,
- Mapping,
- Match,
- Optional,
- Pattern,
- Tuple,
- Type,
- TypeVar,
- Union,
- overload,
-)
-
-from . import _ValidatorType
-
-_T = TypeVar("_T")
-_T1 = TypeVar("_T1")
-_T2 = TypeVar("_T2")
-_T3 = TypeVar("_T3")
-_I = TypeVar("_I", bound=Iterable)
-_K = TypeVar("_K")
-_V = TypeVar("_V")
-_M = TypeVar("_M", bound=Mapping)
-
-def set_disabled(run: bool) -> None: ...
-def get_disabled() -> bool: ...
-def disabled() -> ContextManager[None]: ...
-
-# To be more precise on instance_of use some overloads.
-# If there are more than 3 items in the tuple then we fall back to Any
-@overload
-def instance_of(type: Type[_T]) -> _ValidatorType[_T]: ...
-@overload
-def instance_of(type: Tuple[Type[_T]]) -> _ValidatorType[_T]: ...
-@overload
-def instance_of(
- type: Tuple[Type[_T1], Type[_T2]]
-) -> _ValidatorType[Union[_T1, _T2]]: ...
-@overload
-def instance_of(
- type: Tuple[Type[_T1], Type[_T2], Type[_T3]]
-) -> _ValidatorType[Union[_T1, _T2, _T3]]: ...
-@overload
-def instance_of(type: Tuple[type, ...]) -> _ValidatorType[Any]: ...
-def provides(interface: Any) -> _ValidatorType[Any]: ...
-def optional(
- validator: Union[_ValidatorType[_T], List[_ValidatorType[_T]]]
-) -> _ValidatorType[Optional[_T]]: ...
-def in_(options: Container[_T]) -> _ValidatorType[_T]: ...
-def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ...
-def matches_re(
- regex: Union[Pattern[AnyStr], AnyStr],
- flags: int = ...,
- func: Optional[
- Callable[[AnyStr, AnyStr, int], Optional[Match[AnyStr]]]
- ] = ...,
-) -> _ValidatorType[AnyStr]: ...
-def deep_iterable(
- member_validator: _ValidatorType[_T],
- iterable_validator: Optional[_ValidatorType[_I]] = ...,
-) -> _ValidatorType[_I]: ...
-def deep_mapping(
- key_validator: _ValidatorType[_K],
- value_validator: _ValidatorType[_V],
- mapping_validator: Optional[_ValidatorType[_M]] = ...,
-) -> _ValidatorType[_M]: ...
-def is_callable() -> _ValidatorType[_T]: ...
-def lt(val: _T) -> _ValidatorType[_T]: ...
-def le(val: _T) -> _ValidatorType[_T]: ...
-def ge(val: _T) -> _ValidatorType[_T]: ...
-def gt(val: _T) -> _ValidatorType[_T]: ...
-def max_len(length: int) -> _ValidatorType[_T]: ...
diff --git a/client/ayon_core/vendor/python/python_2/attrs/__init__.py b/client/ayon_core/vendor/python/python_2/attrs/__init__.py
deleted file mode 100644
index a704b8b56b..0000000000
--- a/client/ayon_core/vendor/python/python_2/attrs/__init__.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from attr import (
- NOTHING,
- Attribute,
- Factory,
- __author__,
- __copyright__,
- __description__,
- __doc__,
- __email__,
- __license__,
- __title__,
- __url__,
- __version__,
- __version_info__,
- assoc,
- cmp_using,
- define,
- evolve,
- field,
- fields,
- fields_dict,
- frozen,
- has,
- make_class,
- mutable,
- resolve_types,
- validate,
-)
-from attr._next_gen import asdict, astuple
-
-from . import converters, exceptions, filters, setters, validators
-
-
-__all__ = [
- "__author__",
- "__copyright__",
- "__description__",
- "__doc__",
- "__email__",
- "__license__",
- "__title__",
- "__url__",
- "__version__",
- "__version_info__",
- "asdict",
- "assoc",
- "astuple",
- "Attribute",
- "cmp_using",
- "converters",
- "define",
- "evolve",
- "exceptions",
- "Factory",
- "field",
- "fields_dict",
- "fields",
- "filters",
- "frozen",
- "has",
- "make_class",
- "mutable",
- "NOTHING",
- "resolve_types",
- "setters",
- "validate",
- "validators",
-]
diff --git a/client/ayon_core/vendor/python/python_2/attrs/__init__.pyi b/client/ayon_core/vendor/python/python_2/attrs/__init__.pyi
deleted file mode 100644
index 7426fa5ddb..0000000000
--- a/client/ayon_core/vendor/python/python_2/attrs/__init__.pyi
+++ /dev/null
@@ -1,63 +0,0 @@
-from typing import (
- Any,
- Callable,
- Dict,
- Mapping,
- Optional,
- Sequence,
- Tuple,
- Type,
-)
-
-# Because we need to type our own stuff, we have to make everything from
-# attr explicitly public too.
-from attr import __author__ as __author__
-from attr import __copyright__ as __copyright__
-from attr import __description__ as __description__
-from attr import __email__ as __email__
-from attr import __license__ as __license__
-from attr import __title__ as __title__
-from attr import __url__ as __url__
-from attr import __version__ as __version__
-from attr import __version_info__ as __version_info__
-from attr import _FilterType
-from attr import assoc as assoc
-from attr import Attribute as Attribute
-from attr import define as define
-from attr import evolve as evolve
-from attr import Factory as Factory
-from attr import exceptions as exceptions
-from attr import field as field
-from attr import fields as fields
-from attr import fields_dict as fields_dict
-from attr import frozen as frozen
-from attr import has as has
-from attr import make_class as make_class
-from attr import mutable as mutable
-from attr import NOTHING as NOTHING
-from attr import resolve_types as resolve_types
-from attr import setters as setters
-from attr import validate as validate
-from attr import validators as validators
-
-# TODO: see definition of attr.asdict/astuple
-def asdict(
- inst: Any,
- recurse: bool = ...,
- filter: Optional[_FilterType[Any]] = ...,
- dict_factory: Type[Mapping[Any, Any]] = ...,
- retain_collection_types: bool = ...,
- value_serializer: Optional[
- Callable[[type, Attribute[Any], Any], Any]
- ] = ...,
- tuple_keys: bool = ...,
-) -> Dict[str, Any]: ...
-
-# TODO: add support for returning NamedTuple from the mypy plugin
-def astuple(
- inst: Any,
- recurse: bool = ...,
- filter: Optional[_FilterType[Any]] = ...,
- tuple_factory: Type[Sequence[Any]] = ...,
- retain_collection_types: bool = ...,
-) -> Tuple[Any, ...]: ...
diff --git a/client/ayon_core/vendor/python/python_2/attrs/converters.py b/client/ayon_core/vendor/python/python_2/attrs/converters.py
deleted file mode 100644
index edfa8d3c16..0000000000
--- a/client/ayon_core/vendor/python/python_2/attrs/converters.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from attr.converters import * # noqa
diff --git a/client/ayon_core/vendor/python/python_2/attrs/exceptions.py b/client/ayon_core/vendor/python/python_2/attrs/exceptions.py
deleted file mode 100644
index bd9efed202..0000000000
--- a/client/ayon_core/vendor/python/python_2/attrs/exceptions.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from attr.exceptions import * # noqa
diff --git a/client/ayon_core/vendor/python/python_2/attrs/filters.py b/client/ayon_core/vendor/python/python_2/attrs/filters.py
deleted file mode 100644
index 52959005b0..0000000000
--- a/client/ayon_core/vendor/python/python_2/attrs/filters.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from attr.filters import * # noqa
diff --git a/client/ayon_core/vendor/python/python_2/attrs/py.typed b/client/ayon_core/vendor/python/python_2/attrs/py.typed
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/client/ayon_core/vendor/python/python_2/attrs/setters.py b/client/ayon_core/vendor/python/python_2/attrs/setters.py
deleted file mode 100644
index 9b50770804..0000000000
--- a/client/ayon_core/vendor/python/python_2/attrs/setters.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from attr.setters import * # noqa
diff --git a/client/ayon_core/vendor/python/python_2/attrs/validators.py b/client/ayon_core/vendor/python/python_2/attrs/validators.py
deleted file mode 100644
index ab2c9b3024..0000000000
--- a/client/ayon_core/vendor/python/python_2/attrs/validators.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# SPDX-License-Identifier: MIT
-
-from attr.validators import * # noqa
diff --git a/client/ayon_core/vendor/python/python_2/backports/__init__.py b/client/ayon_core/vendor/python/python_2/backports/__init__.py
deleted file mode 100644
index 69e3be50da..0000000000
--- a/client/ayon_core/vendor/python/python_2/backports/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-__path__ = __import__('pkgutil').extend_path(__path__, __name__)
diff --git a/client/ayon_core/vendor/python/python_2/backports/configparser/__init__.py b/client/ayon_core/vendor/python/python_2/backports/configparser/__init__.py
deleted file mode 100644
index 06d7a0855f..0000000000
--- a/client/ayon_core/vendor/python/python_2/backports/configparser/__init__.py
+++ /dev/null
@@ -1,1390 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-"""Configuration file parser.
-
-A configuration file consists of sections, lead by a "[section]" header,
-and followed by "name: value" entries, with continuations and such in
-the style of RFC 822.
-
-Intrinsic defaults can be specified by passing them into the
-ConfigParser constructor as a dictionary.
-
-class:
-
-ConfigParser -- responsible for parsing a list of
- configuration files, and managing the parsed database.
-
- methods:
-
- __init__(defaults=None, dict_type=_default_dict, allow_no_value=False,
- delimiters=('=', ':'), comment_prefixes=('#', ';'),
- inline_comment_prefixes=None, strict=True,
- empty_lines_in_values=True, default_section='DEFAULT',
- interpolation=, converters=):
- Create the parser. When `defaults' is given, it is initialized into the
- dictionary or intrinsic defaults. The keys must be strings, the values
- must be appropriate for %()s string interpolation.
-
- When `dict_type' is given, it will be used to create the dictionary
- objects for the list of sections, for the options within a section, and
- for the default values.
-
- When `delimiters' is given, it will be used as the set of substrings
- that divide keys from values.
-
- When `comment_prefixes' is given, it will be used as the set of
- substrings that prefix comments in empty lines. Comments can be
- indented.
-
- When `inline_comment_prefixes' is given, it will be used as the set of
- substrings that prefix comments in non-empty lines.
-
- When `strict` is True, the parser won't allow for any section or option
- duplicates while reading from a single source (file, string or
- dictionary). Default is True.
-
- When `empty_lines_in_values' is False (default: True), each empty line
- marks the end of an option. Otherwise, internal empty lines of
- a multiline option are kept as part of the value.
-
- When `allow_no_value' is True (default: False), options without
- values are accepted; the value presented for these is None.
-
- sections()
- Return all the configuration section names, sans DEFAULT.
-
- has_section(section)
- Return whether the given section exists.
-
- has_option(section, option)
- Return whether the given option exists in the given section.
-
- options(section)
- Return list of configuration options for the named section.
-
- read(filenames, encoding=None)
- Read and parse the list of named configuration files, given by
- name. A single filename is also allowed. Non-existing files
- are ignored. Return list of successfully read files.
-
- read_file(f, filename=None)
- Read and parse one configuration file, given as a file object.
- The filename defaults to f.name; it is only used in error
- messages (if f has no `name' attribute, the string `??>' is used).
-
- read_string(string)
- Read configuration from a given string.
-
- read_dict(dictionary)
- Read configuration from a dictionary. Keys are section names,
- values are dictionaries with keys and values that should be present
- in the section. If the used dictionary type preserves order, sections
- and their keys will be added in order. Values are automatically
- converted to strings.
-
- get(section, option, raw=False, vars=None, fallback=_UNSET)
- Return a string value for the named option. All % interpolations are
- expanded in the return values, based on the defaults passed into the
- constructor and the DEFAULT section. Additional substitutions may be
- provided using the `vars' argument, which must be a dictionary whose
- contents override any pre-existing defaults. If `option' is a key in
- `vars', the value from `vars' is used.
-
- getint(section, options, raw=False, vars=None, fallback=_UNSET)
- Like get(), but convert value to an integer.
-
- getfloat(section, options, raw=False, vars=None, fallback=_UNSET)
- Like get(), but convert value to a float.
-
- getboolean(section, options, raw=False, vars=None, fallback=_UNSET)
- Like get(), but convert value to a boolean (currently case
- insensitively defined as 0, false, no, off for False, and 1, true,
- yes, on for True). Returns False or True.
-
- items(section=_UNSET, raw=False, vars=None)
- If section is given, return a list of tuples with (name, value) for
- each option in the section. Otherwise, return a list of tuples with
- (section_name, section_proxy) for each section, including DEFAULTSECT.
-
- remove_section(section)
- Remove the given file section and all its options.
-
- remove_option(section, option)
- Remove the given option from the given section.
-
- set(section, option, value)
- Set the given option.
-
- write(fp, space_around_delimiters=True)
- Write the configuration state in .ini format. If
- `space_around_delimiters' is True (the default), delimiters
- between keys and values are surrounded by spaces.
-"""
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-from __future__ import unicode_literals
-
-from collections import MutableMapping
-import functools
-import io
-import itertools
-import re
-import sys
-import warnings
-
-from backports.configparser.helpers import OrderedDict as _default_dict
-from backports.configparser.helpers import ChainMap as _ChainMap
-from backports.configparser.helpers import from_none, open, str, PY2
-
-__all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError",
- "NoOptionError", "InterpolationError", "InterpolationDepthError",
- "InterpolationMissingOptionError", "InterpolationSyntaxError",
- "ParsingError", "MissingSectionHeaderError",
- "ConfigParser", "SafeConfigParser", "RawConfigParser",
- "Interpolation", "BasicInterpolation", "ExtendedInterpolation",
- "LegacyInterpolation", "SectionProxy", "ConverterMapping",
- "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"]
-
-DEFAULTSECT = "DEFAULT"
-
-MAX_INTERPOLATION_DEPTH = 10
-
-
-# exception classes
-class Error(Exception):
- """Base class for ConfigParser exceptions."""
-
- def __init__(self, msg=''):
- self.message = msg
- Exception.__init__(self, msg)
-
- def __repr__(self):
- return self.message
-
- __str__ = __repr__
-
-
-class NoSectionError(Error):
- """Raised when no section matches a requested option."""
-
- def __init__(self, section):
- Error.__init__(self, 'No section: %r' % (section,))
- self.section = section
- self.args = (section, )
-
-
-class DuplicateSectionError(Error):
- """Raised when a section is repeated in an input source.
-
- Possible repetitions that raise this exception are: multiple creation
- using the API or in strict parsers when a section is found more than once
- in a single input file, string or dictionary.
- """
-
- def __init__(self, section, source=None, lineno=None):
- msg = [repr(section), " already exists"]
- if source is not None:
- message = ["While reading from ", repr(source)]
- if lineno is not None:
- message.append(" [line {0:2d}]".format(lineno))
- message.append(": section ")
- message.extend(msg)
- msg = message
- else:
- msg.insert(0, "Section ")
- Error.__init__(self, "".join(msg))
- self.section = section
- self.source = source
- self.lineno = lineno
- self.args = (section, source, lineno)
-
-
-class DuplicateOptionError(Error):
- """Raised by strict parsers when an option is repeated in an input source.
-
- Current implementation raises this exception only when an option is found
- more than once in a single file, string or dictionary.
- """
-
- def __init__(self, section, option, source=None, lineno=None):
- msg = [repr(option), " in section ", repr(section),
- " already exists"]
- if source is not None:
- message = ["While reading from ", repr(source)]
- if lineno is not None:
- message.append(" [line {0:2d}]".format(lineno))
- message.append(": option ")
- message.extend(msg)
- msg = message
- else:
- msg.insert(0, "Option ")
- Error.__init__(self, "".join(msg))
- self.section = section
- self.option = option
- self.source = source
- self.lineno = lineno
- self.args = (section, option, source, lineno)
-
-
-class NoOptionError(Error):
- """A requested option was not found."""
-
- def __init__(self, option, section):
- Error.__init__(self, "No option %r in section: %r" %
- (option, section))
- self.option = option
- self.section = section
- self.args = (option, section)
-
-
-class InterpolationError(Error):
- """Base class for interpolation-related exceptions."""
-
- def __init__(self, option, section, msg):
- Error.__init__(self, msg)
- self.option = option
- self.section = section
- self.args = (option, section, msg)
-
-
-class InterpolationMissingOptionError(InterpolationError):
- """A string substitution required a setting which was not available."""
-
- def __init__(self, option, section, rawval, reference):
- msg = ("Bad value substitution: option {0!r} in section {1!r} contains "
- "an interpolation key {2!r} which is not a valid option name. "
- "Raw value: {3!r}".format(option, section, reference, rawval))
- InterpolationError.__init__(self, option, section, msg)
- self.reference = reference
- self.args = (option, section, rawval, reference)
-
-
-class InterpolationSyntaxError(InterpolationError):
- """Raised when the source text contains invalid syntax.
-
- Current implementation raises this exception when the source text into
- which substitutions are made does not conform to the required syntax.
- """
-
-
-class InterpolationDepthError(InterpolationError):
- """Raised when substitutions are nested too deeply."""
-
- def __init__(self, option, section, rawval):
- msg = ("Recursion limit exceeded in value substitution: option {0!r} "
- "in section {1!r} contains an interpolation key which "
- "cannot be substituted in {2} steps. Raw value: {3!r}"
- "".format(option, section, MAX_INTERPOLATION_DEPTH,
- rawval))
- InterpolationError.__init__(self, option, section, msg)
- self.args = (option, section, rawval)
-
-
-class ParsingError(Error):
- """Raised when a configuration file does not follow legal syntax."""
-
- def __init__(self, source=None, filename=None):
- # Exactly one of `source'/`filename' arguments has to be given.
- # `filename' kept for compatibility.
- if filename and source:
- raise ValueError("Cannot specify both `filename' and `source'. "
- "Use `source'.")
- elif not filename and not source:
- raise ValueError("Required argument `source' not given.")
- elif filename:
- source = filename
- Error.__init__(self, 'Source contains parsing errors: %r' % source)
- self.source = source
- self.errors = []
- self.args = (source, )
-
- @property
- def filename(self):
- """Deprecated, use `source'."""
- warnings.warn(
- "The 'filename' attribute will be removed in future versions. "
- "Use 'source' instead.",
- DeprecationWarning, stacklevel=2
- )
- return self.source
-
- @filename.setter
- def filename(self, value):
- """Deprecated, user `source'."""
- warnings.warn(
- "The 'filename' attribute will be removed in future versions. "
- "Use 'source' instead.",
- DeprecationWarning, stacklevel=2
- )
- self.source = value
-
- def append(self, lineno, line):
- self.errors.append((lineno, line))
- self.message += '\n\t[line %2d]: %s' % (lineno, line)
-
-
-class MissingSectionHeaderError(ParsingError):
- """Raised when a key-value pair is found before any section header."""
-
- def __init__(self, filename, lineno, line):
- Error.__init__(
- self,
- 'File contains no section headers.\nfile: %r, line: %d\n%r' %
- (filename, lineno, line))
- self.source = filename
- self.lineno = lineno
- self.line = line
- self.args = (filename, lineno, line)
-
-
-# Used in parser getters to indicate the default behaviour when a specific
-# option is not found it to raise an exception. Created to enable `None' as
-# a valid fallback value.
-_UNSET = object()
-
-
-class Interpolation(object):
- """Dummy interpolation that passes the value through with no changes."""
-
- def before_get(self, parser, section, option, value, defaults):
- return value
-
- def before_set(self, parser, section, option, value):
- return value
-
- def before_read(self, parser, section, option, value):
- return value
-
- def before_write(self, parser, section, option, value):
- return value
-
-
-class BasicInterpolation(Interpolation):
- """Interpolation as implemented in the classic ConfigParser.
-
- The option values can contain format strings which refer to other values in
- the same section, or values in the special default section.
-
- For example:
-
- something: %(dir)s/whatever
-
- would resolve the "%(dir)s" to the value of dir. All reference
- expansions are done late, on demand. If a user needs to use a bare % in
- a configuration file, she can escape it by writing %%. Other % usage
- is considered a user error and raises `InterpolationSyntaxError'."""
-
- _KEYCRE = re.compile(r"%\(([^)]+)\)s")
-
- def before_get(self, parser, section, option, value, defaults):
- L = []
- self._interpolate_some(parser, option, L, value, section, defaults, 1)
- return ''.join(L)
-
- def before_set(self, parser, section, option, value):
- tmp_value = value.replace('%%', '') # escaped percent signs
- tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax
- if '%' in tmp_value:
- raise ValueError("invalid interpolation syntax in %r at "
- "position %d" % (value, tmp_value.find('%')))
- return value
-
- def _interpolate_some(self, parser, option, accum, rest, section, map,
- depth):
- rawval = parser.get(section, option, raw=True, fallback=rest)
- if depth > MAX_INTERPOLATION_DEPTH:
- raise InterpolationDepthError(option, section, rawval)
- while rest:
- p = rest.find("%")
- if p < 0:
- accum.append(rest)
- return
- if p > 0:
- accum.append(rest[:p])
- rest = rest[p:]
- # p is no longer used
- c = rest[1:2]
- if c == "%":
- accum.append("%")
- rest = rest[2:]
- elif c == "(":
- m = self._KEYCRE.match(rest)
- if m is None:
- raise InterpolationSyntaxError(option, section,
- "bad interpolation variable reference %r" % rest)
- var = parser.optionxform(m.group(1))
- rest = rest[m.end():]
- try:
- v = map[var]
- except KeyError:
- raise from_none(InterpolationMissingOptionError(
- option, section, rawval, var))
- if "%" in v:
- self._interpolate_some(parser, option, accum, v,
- section, map, depth + 1)
- else:
- accum.append(v)
- else:
- raise InterpolationSyntaxError(
- option, section,
- "'%%' must be followed by '%%' or '(', "
- "found: %r" % (rest,))
-
-
-class ExtendedInterpolation(Interpolation):
- """Advanced variant of interpolation, supports the syntax used by
- `zc.buildout'. Enables interpolation between sections."""
-
- _KEYCRE = re.compile(r"\$\{([^}]+)\}")
-
- def before_get(self, parser, section, option, value, defaults):
- L = []
- self._interpolate_some(parser, option, L, value, section, defaults, 1)
- return ''.join(L)
-
- def before_set(self, parser, section, option, value):
- tmp_value = value.replace('$$', '') # escaped dollar signs
- tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax
- if '$' in tmp_value:
- raise ValueError("invalid interpolation syntax in %r at "
- "position %d" % (value, tmp_value.find('$')))
- return value
-
- def _interpolate_some(self, parser, option, accum, rest, section, map,
- depth):
- rawval = parser.get(section, option, raw=True, fallback=rest)
- if depth > MAX_INTERPOLATION_DEPTH:
- raise InterpolationDepthError(option, section, rawval)
- while rest:
- p = rest.find("$")
- if p < 0:
- accum.append(rest)
- return
- if p > 0:
- accum.append(rest[:p])
- rest = rest[p:]
- # p is no longer used
- c = rest[1:2]
- if c == "$":
- accum.append("$")
- rest = rest[2:]
- elif c == "{":
- m = self._KEYCRE.match(rest)
- if m is None:
- raise InterpolationSyntaxError(option, section,
- "bad interpolation variable reference %r" % rest)
- path = m.group(1).split(':')
- rest = rest[m.end():]
- sect = section
- opt = option
- try:
- if len(path) == 1:
- opt = parser.optionxform(path[0])
- v = map[opt]
- elif len(path) == 2:
- sect = path[0]
- opt = parser.optionxform(path[1])
- v = parser.get(sect, opt, raw=True)
- else:
- raise InterpolationSyntaxError(
- option, section,
- "More than one ':' found: %r" % (rest,))
- except (KeyError, NoSectionError, NoOptionError):
- raise from_none(InterpolationMissingOptionError(
- option, section, rawval, ":".join(path)))
- if "$" in v:
- self._interpolate_some(parser, opt, accum, v, sect,
- dict(parser.items(sect, raw=True)),
- depth + 1)
- else:
- accum.append(v)
- else:
- raise InterpolationSyntaxError(
- option, section,
- "'$' must be followed by '$' or '{', "
- "found: %r" % (rest,))
-
-
-class LegacyInterpolation(Interpolation):
- """Deprecated interpolation used in old versions of ConfigParser.
- Use BasicInterpolation or ExtendedInterpolation instead."""
-
- _KEYCRE = re.compile(r"%\(([^)]*)\)s|.")
-
- def before_get(self, parser, section, option, value, vars):
- rawval = value
- depth = MAX_INTERPOLATION_DEPTH
- while depth: # Loop through this until it's done
- depth -= 1
- if value and "%(" in value:
- replace = functools.partial(self._interpolation_replace,
- parser=parser)
- value = self._KEYCRE.sub(replace, value)
- try:
- value = value % vars
- except KeyError as e:
- raise from_none(InterpolationMissingOptionError(
- option, section, rawval, e.args[0]))
- else:
- break
- if value and "%(" in value:
- raise InterpolationDepthError(option, section, rawval)
- return value
-
- def before_set(self, parser, section, option, value):
- return value
-
- @staticmethod
- def _interpolation_replace(match, parser):
- s = match.group(1)
- if s is None:
- return match.group()
- else:
- return "%%(%s)s" % parser.optionxform(s)
-
-
-class RawConfigParser(MutableMapping):
- """ConfigParser that does not do interpolation."""
-
- # Regular expressions for parsing section headers and options
- _SECT_TMPL = r"""
- \[ # [
- (?P[^]]+) # very permissive!
- \] # ]
- """
- _OPT_TMPL = r"""
- (?P.*?) # very permissive!
- \s*(?P{delim})\s* # any number of space/tab,
- # followed by any of the
- # allowed delimiters,
- # followed by any space/tab
- (?P.*)$ # everything up to eol
- """
- _OPT_NV_TMPL = r"""
- (?P.*?) # very permissive!
- \s*(?: # any number of space/tab,
- (?P{delim})\s* # optionally followed by
- # any of the allowed
- # delimiters, followed by any
- # space/tab
- (?P.*))?$ # everything up to eol
- """
- # Interpolation algorithm to be used if the user does not specify another
- _DEFAULT_INTERPOLATION = Interpolation()
- # Compiled regular expression for matching sections
- SECTCRE = re.compile(_SECT_TMPL, re.VERBOSE)
- # Compiled regular expression for matching options with typical separators
- OPTCRE = re.compile(_OPT_TMPL.format(delim="=|:"), re.VERBOSE)
- # Compiled regular expression for matching options with optional values
- # delimited using typical separators
- OPTCRE_NV = re.compile(_OPT_NV_TMPL.format(delim="=|:"), re.VERBOSE)
- # Compiled regular expression for matching leading whitespace in a line
- NONSPACECRE = re.compile(r"\S")
- # Possible boolean values in the configuration.
- BOOLEAN_STATES = {'1': True, 'yes': True, 'true': True, 'on': True,
- '0': False, 'no': False, 'false': False, 'off': False}
-
- def __init__(self, defaults=None, dict_type=_default_dict,
- allow_no_value=False, **kwargs):
-
- # keyword-only arguments
- delimiters = kwargs.get('delimiters', ('=', ':'))
- comment_prefixes = kwargs.get('comment_prefixes', ('#', ';'))
- inline_comment_prefixes = kwargs.get('inline_comment_prefixes', None)
- strict = kwargs.get('strict', True)
- empty_lines_in_values = kwargs.get('empty_lines_in_values', True)
- default_section = kwargs.get('default_section', DEFAULTSECT)
- interpolation = kwargs.get('interpolation', _UNSET)
- converters = kwargs.get('converters', _UNSET)
-
- self._dict = dict_type
- self._sections = self._dict()
- self._defaults = self._dict()
- self._converters = ConverterMapping(self)
- self._proxies = self._dict()
- self._proxies[default_section] = SectionProxy(self, default_section)
- if defaults:
- for key, value in defaults.items():
- self._defaults[self.optionxform(key)] = value
- self._delimiters = tuple(delimiters)
- if delimiters == ('=', ':'):
- self._optcre = self.OPTCRE_NV if allow_no_value else self.OPTCRE
- else:
- d = "|".join(re.escape(d) for d in delimiters)
- if allow_no_value:
- self._optcre = re.compile(self._OPT_NV_TMPL.format(delim=d),
- re.VERBOSE)
- else:
- self._optcre = re.compile(self._OPT_TMPL.format(delim=d),
- re.VERBOSE)
- self._comment_prefixes = tuple(comment_prefixes or ())
- self._inline_comment_prefixes = tuple(inline_comment_prefixes or ())
- self._strict = strict
- self._allow_no_value = allow_no_value
- self._empty_lines_in_values = empty_lines_in_values
- self.default_section=default_section
- self._interpolation = interpolation
- if self._interpolation is _UNSET:
- self._interpolation = self._DEFAULT_INTERPOLATION
- if self._interpolation is None:
- self._interpolation = Interpolation()
- if converters is not _UNSET:
- self._converters.update(converters)
-
- def defaults(self):
- return self._defaults
-
- def sections(self):
- """Return a list of section names, excluding [DEFAULT]"""
- # self._sections will never have [DEFAULT] in it
- return list(self._sections.keys())
-
- def add_section(self, section):
- """Create a new section in the configuration.
-
- Raise DuplicateSectionError if a section by the specified name
- already exists. Raise ValueError if name is DEFAULT.
- """
- if section == self.default_section:
- raise ValueError('Invalid section name: %r' % section)
-
- if section in self._sections:
- raise DuplicateSectionError(section)
- self._sections[section] = self._dict()
- self._proxies[section] = SectionProxy(self, section)
-
- def has_section(self, section):
- """Indicate whether the named section is present in the configuration.
-
- The DEFAULT section is not acknowledged.
- """
- return section in self._sections
-
- def options(self, section):
- """Return a list of option names for the given section name."""
- try:
- opts = self._sections[section].copy()
- except KeyError:
- raise from_none(NoSectionError(section))
- opts.update(self._defaults)
- return list(opts.keys())
-
- def read(self, filenames, encoding=None):
- """Read and parse a filename or a list of filenames.
-
- Files that cannot be opened are silently ignored; this is
- designed so that you can specify a list of potential
- configuration file locations (e.g. current directory, user's
- home directory, systemwide directory), and all existing
- configuration files in the list will be read. A single
- filename may also be given.
-
- Return list of successfully read files.
- """
- if PY2 and isinstance(filenames, bytes):
- # we allow for a little unholy magic for Python 2 so that
- # people not using unicode_literals can still use the library
- # conveniently
- warnings.warn(
- "You passed a bytestring as `filenames`. This will not work"
- " on Python 3. Use `cp.read_file()` or switch to using Unicode"
- " strings across the board.",
- DeprecationWarning,
- stacklevel=2,
- )
- filenames = [filenames]
- elif isinstance(filenames, str):
- filenames = [filenames]
- read_ok = []
- for filename in filenames:
- try:
- with open(filename, encoding=encoding) as fp:
- self._read(fp, filename)
- except IOError:
- continue
- read_ok.append(filename)
- return read_ok
-
- def read_file(self, f, source=None):
- """Like read() but the argument must be a file-like object.
-
- The `f' argument must be iterable, returning one line at a time.
- Optional second argument is the `source' specifying the name of the
- file being read. If not given, it is taken from f.name. If `f' has no
- `name' attribute, `??>' is used.
- """
- if source is None:
- try:
- source = f.name
- except AttributeError:
- source = '??>'
- self._read(f, source)
-
- def read_string(self, string, source=''):
- """Read configuration from a given string."""
- sfile = io.StringIO(string)
- self.read_file(sfile, source)
-
- def read_dict(self, dictionary, source=''):
- """Read configuration from a dictionary.
-
- Keys are section names, values are dictionaries with keys and values
- that should be present in the section. If the used dictionary type
- preserves order, sections and their keys will be added in order.
-
- All types held in the dictionary are converted to strings during
- reading, including section names, option names and keys.
-
- Optional second argument is the `source' specifying the name of the
- dictionary being read.
- """
- elements_added = set()
- for section, keys in dictionary.items():
- section = str(section)
- try:
- self.add_section(section)
- except (DuplicateSectionError, ValueError):
- if self._strict and section in elements_added:
- raise
- elements_added.add(section)
- for key, value in keys.items():
- key = self.optionxform(str(key))
- if value is not None:
- value = str(value)
- if self._strict and (section, key) in elements_added:
- raise DuplicateOptionError(section, key, source)
- elements_added.add((section, key))
- self.set(section, key, value)
-
- def readfp(self, fp, filename=None):
- """Deprecated, use read_file instead."""
- warnings.warn(
- "This method will be removed in future versions. "
- "Use 'parser.read_file()' instead.",
- DeprecationWarning, stacklevel=2
- )
- self.read_file(fp, source=filename)
-
- def get(self, section, option, **kwargs):
- """Get an option value for a given section.
-
- If `vars' is provided, it must be a dictionary. The option is looked up
- in `vars' (if provided), `section', and in `DEFAULTSECT' in that order.
- If the key is not found and `fallback' is provided, it is used as
- a fallback value. `None' can be provided as a `fallback' value.
-
- If interpolation is enabled and the optional argument `raw' is False,
- all interpolations are expanded in the return values.
-
- Arguments `raw', `vars', and `fallback' are keyword only.
-
- The section DEFAULT is special.
- """
- # keyword-only arguments
- raw = kwargs.get('raw', False)
- vars = kwargs.get('vars', None)
- fallback = kwargs.get('fallback', _UNSET)
-
- try:
- d = self._unify_values(section, vars)
- except NoSectionError:
- if fallback is _UNSET:
- raise
- else:
- return fallback
- option = self.optionxform(option)
- try:
- value = d[option]
- except KeyError:
- if fallback is _UNSET:
- raise NoOptionError(option, section)
- else:
- return fallback
-
- if raw or value is None:
- return value
- else:
- return self._interpolation.before_get(self, section, option, value,
- d)
-
- def _get(self, section, conv, option, **kwargs):
- return conv(self.get(section, option, **kwargs))
-
- def _get_conv(self, section, option, conv, **kwargs):
- # keyword-only arguments
- kwargs.setdefault('raw', False)
- kwargs.setdefault('vars', None)
- fallback = kwargs.pop('fallback', _UNSET)
- try:
- return self._get(section, conv, option, **kwargs)
- except (NoSectionError, NoOptionError):
- if fallback is _UNSET:
- raise
- return fallback
-
- # getint, getfloat and getboolean provided directly for backwards compat
- def getint(self, section, option, **kwargs):
- # keyword-only arguments
- kwargs.setdefault('raw', False)
- kwargs.setdefault('vars', None)
- kwargs.setdefault('fallback', _UNSET)
- return self._get_conv(section, option, int, **kwargs)
-
- def getfloat(self, section, option, **kwargs):
- # keyword-only arguments
- kwargs.setdefault('raw', False)
- kwargs.setdefault('vars', None)
- kwargs.setdefault('fallback', _UNSET)
- return self._get_conv(section, option, float, **kwargs)
-
- def getboolean(self, section, option, **kwargs):
- # keyword-only arguments
- kwargs.setdefault('raw', False)
- kwargs.setdefault('vars', None)
- kwargs.setdefault('fallback', _UNSET)
- return self._get_conv(section, option, self._convert_to_boolean,
- **kwargs)
-
- def items(self, section=_UNSET, raw=False, vars=None):
- """Return a list of (name, value) tuples for each option in a section.
-
- All % interpolations are expanded in the return values, based on the
- defaults passed into the constructor, unless the optional argument
- `raw' is true. Additional substitutions may be provided using the
- `vars' argument, which must be a dictionary whose contents overrides
- any pre-existing defaults.
-
- The section DEFAULT is special.
- """
- if section is _UNSET:
- return super(RawConfigParser, self).items()
- d = self._defaults.copy()
- try:
- d.update(self._sections[section])
- except KeyError:
- if section != self.default_section:
- raise NoSectionError(section)
- # Update with the entry specific variables
- if vars:
- for key, value in vars.items():
- d[self.optionxform(key)] = value
- value_getter = lambda option: self._interpolation.before_get(self,
- section, option, d[option], d)
- if raw:
- value_getter = lambda option: d[option]
- return [(option, value_getter(option)) for option in d.keys()]
-
- def popitem(self):
- """Remove a section from the parser and return it as
- a (section_name, section_proxy) tuple. If no section is present, raise
- KeyError.
-
- The section DEFAULT is never returned because it cannot be removed.
- """
- for key in self.sections():
- value = self[key]
- del self[key]
- return key, value
- raise KeyError
-
- def optionxform(self, optionstr):
- return optionstr.lower()
-
- def has_option(self, section, option):
- """Check for the existence of a given option in a given section.
- If the specified `section' is None or an empty string, DEFAULT is
- assumed. If the specified `section' does not exist, returns False."""
- if not section or section == self.default_section:
- option = self.optionxform(option)
- return option in self._defaults
- elif section not in self._sections:
- return False
- else:
- option = self.optionxform(option)
- return (option in self._sections[section]
- or option in self._defaults)
-
- def set(self, section, option, value=None):
- """Set an option."""
- if value:
- value = self._interpolation.before_set(self, section, option,
- value)
- if not section or section == self.default_section:
- sectdict = self._defaults
- else:
- try:
- sectdict = self._sections[section]
- except KeyError:
- raise from_none(NoSectionError(section))
- sectdict[self.optionxform(option)] = value
-
- def write(self, fp, space_around_delimiters=True):
- """Write an .ini-format representation of the configuration state.
-
- If `space_around_delimiters' is True (the default), delimiters
- between keys and values are surrounded by spaces.
- """
- if space_around_delimiters:
- d = " {0} ".format(self._delimiters[0])
- else:
- d = self._delimiters[0]
- if self._defaults:
- self._write_section(fp, self.default_section,
- self._defaults.items(), d)
- for section in self._sections:
- self._write_section(fp, section,
- self._sections[section].items(), d)
-
- def _write_section(self, fp, section_name, section_items, delimiter):
- """Write a single section to the specified `fp'."""
- fp.write("[{0}]\n".format(section_name))
- for key, value in section_items:
- value = self._interpolation.before_write(self, section_name, key,
- value)
- if value is not None or not self._allow_no_value:
- value = delimiter + str(value).replace('\n', '\n\t')
- else:
- value = ""
- fp.write("{0}{1}\n".format(key, value))
- fp.write("\n")
-
- def remove_option(self, section, option):
- """Remove an option."""
- if not section or section == self.default_section:
- sectdict = self._defaults
- else:
- try:
- sectdict = self._sections[section]
- except KeyError:
- raise from_none(NoSectionError(section))
- option = self.optionxform(option)
- existed = option in sectdict
- if existed:
- del sectdict[option]
- return existed
-
- def remove_section(self, section):
- """Remove a file section."""
- existed = section in self._sections
- if existed:
- del self._sections[section]
- del self._proxies[section]
- return existed
-
- def __getitem__(self, key):
- if key != self.default_section and not self.has_section(key):
- raise KeyError(key)
- return self._proxies[key]
-
- def __setitem__(self, key, value):
- # To conform with the mapping protocol, overwrites existing values in
- # the section.
-
- # XXX this is not atomic if read_dict fails at any point. Then again,
- # no update method in configparser is atomic in this implementation.
- if key == self.default_section:
- self._defaults.clear()
- elif key in self._sections:
- self._sections[key].clear()
- self.read_dict({key: value})
-
- def __delitem__(self, key):
- if key == self.default_section:
- raise ValueError("Cannot remove the default section.")
- if not self.has_section(key):
- raise KeyError(key)
- self.remove_section(key)
-
- def __contains__(self, key):
- return key == self.default_section or self.has_section(key)
-
- def __len__(self):
- return len(self._sections) + 1 # the default section
-
- def __iter__(self):
- # XXX does it break when underlying container state changed?
- return itertools.chain((self.default_section,), self._sections.keys())
-
- def _read(self, fp, fpname):
- """Parse a sectioned configuration file.
-
- Each section in a configuration file contains a header, indicated by
- a name in square brackets (`[]'), plus key/value options, indicated by
- `name' and `value' delimited with a specific substring (`=' or `:' by
- default).
-
- Values can span multiple lines, as long as they are indented deeper
- than the first line of the value. Depending on the parser's mode, blank
- lines may be treated as parts of multiline values or ignored.
-
- Configuration files may include comments, prefixed by specific
- characters (`#' and `;' by default). Comments may appear on their own
- in an otherwise empty line or may be entered in lines holding values or
- section names.
- """
- elements_added = set()
- cursect = None # None, or a dictionary
- sectname = None
- optname = None
- lineno = 0
- indent_level = 0
- e = None # None, or an exception
- for lineno, line in enumerate(fp, start=1):
- comment_start = sys.maxsize
- # strip inline comments
- inline_prefixes = dict(
- (p, -1) for p in self._inline_comment_prefixes)
- while comment_start == sys.maxsize and inline_prefixes:
- next_prefixes = {}
- for prefix, index in inline_prefixes.items():
- index = line.find(prefix, index+1)
- if index == -1:
- continue
- next_prefixes[prefix] = index
- if index == 0 or (index > 0 and line[index-1].isspace()):
- comment_start = min(comment_start, index)
- inline_prefixes = next_prefixes
- # strip full line comments
- for prefix in self._comment_prefixes:
- if line.strip().startswith(prefix):
- comment_start = 0
- break
- if comment_start == sys.maxsize:
- comment_start = None
- value = line[:comment_start].strip()
- if not value:
- if self._empty_lines_in_values:
- # add empty line to the value, but only if there was no
- # comment on the line
- if (comment_start is None and
- cursect is not None and
- optname and
- cursect[optname] is not None):
- cursect[optname].append('') # newlines added at join
- else:
- # empty line marks end of value
- indent_level = sys.maxsize
- continue
- # continuation line?
- first_nonspace = self.NONSPACECRE.search(line)
- cur_indent_level = first_nonspace.start() if first_nonspace else 0
- if (cursect is not None and optname and
- cur_indent_level > indent_level):
- cursect[optname].append(value)
- # a section header or option header?
- else:
- indent_level = cur_indent_level
- # is it a section header?
- mo = self.SECTCRE.match(value)
- if mo:
- sectname = mo.group('header')
- if sectname in self._sections:
- if self._strict and sectname in elements_added:
- raise DuplicateSectionError(sectname, fpname,
- lineno)
- cursect = self._sections[sectname]
- elements_added.add(sectname)
- elif sectname == self.default_section:
- cursect = self._defaults
- else:
- cursect = self._dict()
- self._sections[sectname] = cursect
- self._proxies[sectname] = SectionProxy(self, sectname)
- elements_added.add(sectname)
- # So sections can't start with a continuation line
- optname = None
- # no section header in the file?
- elif cursect is None:
- raise MissingSectionHeaderError(fpname, lineno, line)
- # an option line?
- else:
- mo = self._optcre.match(value)
- if mo:
- optname, vi, optval = mo.group('option', 'vi', 'value')
- if not optname:
- e = self._handle_error(e, fpname, lineno, line)
- optname = self.optionxform(optname.rstrip())
- if (self._strict and
- (sectname, optname) in elements_added):
- raise DuplicateOptionError(sectname, optname,
- fpname, lineno)
- elements_added.add((sectname, optname))
- # This check is fine because the OPTCRE cannot
- # match if it would set optval to None
- if optval is not None:
- optval = optval.strip()
- cursect[optname] = [optval]
- else:
- # valueless option handling
- cursect[optname] = None
- else:
- # a non-fatal parsing error occurred. set up the
- # exception but keep going. the exception will be
- # raised at the end of the file and will contain a
- # list of all bogus lines
- e = self._handle_error(e, fpname, lineno, line)
- # if any parsing errors occurred, raise an exception
- if e:
- raise e
- self._join_multiline_values()
-
- def _join_multiline_values(self):
- defaults = self.default_section, self._defaults
- all_sections = itertools.chain((defaults,),
- self._sections.items())
- for section, options in all_sections:
- for name, val in options.items():
- if isinstance(val, list):
- val = '\n'.join(val).rstrip()
- options[name] = self._interpolation.before_read(self,
- section,
- name, val)
-
- def _handle_error(self, exc, fpname, lineno, line):
- if not exc:
- exc = ParsingError(fpname)
- exc.append(lineno, repr(line))
- return exc
-
- def _unify_values(self, section, vars):
- """Create a sequence of lookups with 'vars' taking priority over
- the 'section' which takes priority over the DEFAULTSECT.
-
- """
- sectiondict = {}
- try:
- sectiondict = self._sections[section]
- except KeyError:
- if section != self.default_section:
- raise NoSectionError(section)
- # Update with the entry specific variables
- vardict = {}
- if vars:
- for key, value in vars.items():
- if value is not None:
- value = str(value)
- vardict[self.optionxform(key)] = value
- return _ChainMap(vardict, sectiondict, self._defaults)
-
- def _convert_to_boolean(self, value):
- """Return a boolean value translating from other types if necessary.
- """
- if value.lower() not in self.BOOLEAN_STATES:
- raise ValueError('Not a boolean: %s' % value)
- return self.BOOLEAN_STATES[value.lower()]
-
- def _validate_value_types(self, **kwargs):
- """Raises a TypeError for non-string values.
-
- The only legal non-string value if we allow valueless
- options is None, so we need to check if the value is a
- string if:
- - we do not allow valueless options, or
- - we allow valueless options but the value is not None
-
- For compatibility reasons this method is not used in classic set()
- for RawConfigParsers. It is invoked in every case for mapping protocol
- access and in ConfigParser.set().
- """
- # keyword-only arguments
- section = kwargs.get('section', "")
- option = kwargs.get('option', "")
- value = kwargs.get('value', "")
-
- if PY2 and bytes in (type(section), type(option), type(value)):
- # we allow for a little unholy magic for Python 2 so that
- # people not using unicode_literals can still use the library
- # conveniently
- warnings.warn(
- "You passed a bytestring. Implicitly decoding as UTF-8 string."
- " This will not work on Python 3. Please switch to using"
- " Unicode strings across the board.",
- DeprecationWarning,
- stacklevel=2,
- )
- if isinstance(section, bytes):
- section = section.decode('utf8')
- if isinstance(option, bytes):
- option = option.decode('utf8')
- if isinstance(value, bytes):
- value = value.decode('utf8')
-
- if not isinstance(section, str):
- raise TypeError("section names must be strings")
- if not isinstance(option, str):
- raise TypeError("option keys must be strings")
- if not self._allow_no_value or value:
- if not isinstance(value, str):
- raise TypeError("option values must be strings")
-
- return section, option, value
-
- @property
- def converters(self):
- return self._converters
-
-
-class ConfigParser(RawConfigParser):
- """ConfigParser implementing interpolation."""
-
- _DEFAULT_INTERPOLATION = BasicInterpolation()
-
- def set(self, section, option, value=None):
- """Set an option. Extends RawConfigParser.set by validating type and
- interpolation syntax on the value."""
- _, option, value = self._validate_value_types(option=option, value=value)
- super(ConfigParser, self).set(section, option, value)
-
- def add_section(self, section):
- """Create a new section in the configuration. Extends
- RawConfigParser.add_section by validating if the section name is
- a string."""
- section, _, _ = self._validate_value_types(section=section)
- super(ConfigParser, self).add_section(section)
-
-
-class SafeConfigParser(ConfigParser):
- """ConfigParser alias for backwards compatibility purposes."""
-
- def __init__(self, *args, **kwargs):
- super(SafeConfigParser, self).__init__(*args, **kwargs)
- warnings.warn(
- "The SafeConfigParser class has been renamed to ConfigParser "
- "in Python 3.2. This alias will be removed in future versions."
- " Use ConfigParser directly instead.",
- DeprecationWarning, stacklevel=2
- )
-
-
-class SectionProxy(MutableMapping):
- """A proxy for a single section from a parser."""
-
- def __init__(self, parser, name):
- """Creates a view on a section of the specified `name` in `parser`."""
- self._parser = parser
- self._name = name
- for conv in parser.converters:
- key = 'get' + conv
- getter = functools.partial(self.get, _impl=getattr(parser, key))
- setattr(self, key, getter)
-
- def __repr__(self):
- return ''.format(self._name)
-
- def __getitem__(self, key):
- if not self._parser.has_option(self._name, key):
- raise KeyError(key)
- return self._parser.get(self._name, key)
-
- def __setitem__(self, key, value):
- _, key, value = self._parser._validate_value_types(option=key, value=value)
- return self._parser.set(self._name, key, value)
-
- def __delitem__(self, key):
- if not (self._parser.has_option(self._name, key) and
- self._parser.remove_option(self._name, key)):
- raise KeyError(key)
-
- def __contains__(self, key):
- return self._parser.has_option(self._name, key)
-
- def __len__(self):
- return len(self._options())
-
- def __iter__(self):
- return self._options().__iter__()
-
- def _options(self):
- if self._name != self._parser.default_section:
- return self._parser.options(self._name)
- else:
- return self._parser.defaults()
-
- @property
- def parser(self):
- # The parser object of the proxy is read-only.
- return self._parser
-
- @property
- def name(self):
- # The name of the section on a proxy is read-only.
- return self._name
-
- def get(self, option, fallback=None, **kwargs):
- """Get an option value.
-
- Unless `fallback` is provided, `None` will be returned if the option
- is not found.
-
- """
- # keyword-only arguments
- kwargs.setdefault('raw', False)
- kwargs.setdefault('vars', None)
- _impl = kwargs.pop('_impl', None)
- # If `_impl` is provided, it should be a getter method on the parser
- # object that provides the desired type conversion.
- if not _impl:
- _impl = self._parser.get
- return _impl(self._name, option, fallback=fallback, **kwargs)
-
-
-class ConverterMapping(MutableMapping):
- """Enables reuse of get*() methods between the parser and section proxies.
-
- If a parser class implements a getter directly, the value for the given
- key will be ``None``. The presence of the converter name here enables
- section proxies to find and use the implementation on the parser class.
- """
-
- GETTERCRE = re.compile(r"^get(?P.+)$")
-
- def __init__(self, parser):
- self._parser = parser
- self._data = {}
- for getter in dir(self._parser):
- m = self.GETTERCRE.match(getter)
- if not m or not callable(getattr(self._parser, getter)):
- continue
- self._data[m.group('name')] = None # See class docstring.
-
- def __getitem__(self, key):
- return self._data[key]
-
- def __setitem__(self, key, value):
- try:
- k = 'get' + key
- except TypeError:
- raise ValueError('Incompatible key: {} (type: {})'
- ''.format(key, type(key)))
- if k == 'get':
- raise ValueError('Incompatible key: cannot use "" as a name')
- self._data[key] = value
- func = functools.partial(self._parser._get_conv, conv=value)
- func.converter = value
- setattr(self._parser, k, func)
- for proxy in self._parser.values():
- getter = functools.partial(proxy.get, _impl=func)
- setattr(proxy, k, getter)
-
- def __delitem__(self, key):
- try:
- k = 'get' + (key or None)
- except TypeError:
- raise KeyError(key)
- del self._data[key]
- for inst in itertools.chain((self._parser,), self._parser.values()):
- try:
- delattr(inst, k)
- except AttributeError:
- # don't raise since the entry was present in _data, silently
- # clean up
- continue
-
- def __iter__(self):
- return iter(self._data)
-
- def __len__(self):
- return len(self._data)
diff --git a/client/ayon_core/vendor/python/python_2/backports/configparser/helpers.py b/client/ayon_core/vendor/python/python_2/backports/configparser/helpers.py
deleted file mode 100644
index c47662f3c9..0000000000
--- a/client/ayon_core/vendor/python/python_2/backports/configparser/helpers.py
+++ /dev/null
@@ -1,171 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-from __future__ import unicode_literals
-
-from collections import MutableMapping
-try:
- from collections import UserDict
-except ImportError:
- from UserDict import UserDict
-
-try:
- from collections import OrderedDict
-except ImportError:
- from ordereddict import OrderedDict
-
-from io import open
-import sys
-try:
- from thread import get_ident
-except ImportError:
- try:
- from _thread import get_ident
- except ImportError:
- from _dummy_thread import get_ident
-
-
-PY2 = sys.version_info[0] == 2
-PY3 = sys.version_info[0] == 3
-
-str = type('str')
-
-
-def from_none(exc):
- """raise from_none(ValueError('a')) == raise ValueError('a') from None"""
- exc.__cause__ = None
- exc.__suppress_context__ = True
- return exc
-
-
-# from reprlib 3.2.1
-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
-
-# from collections 3.2.1
-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)
-
- @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 collections import ChainMap
-except ImportError:
- ChainMap = _ChainMap
diff --git a/client/ayon_core/vendor/python/python_2/backports/functools_lru_cache.py b/client/ayon_core/vendor/python/python_2/backports/functools_lru_cache.py
deleted file mode 100644
index 707c6c766d..0000000000
--- a/client/ayon_core/vendor/python/python_2/backports/functools_lru_cache.py
+++ /dev/null
@@ -1,184 +0,0 @@
-from __future__ import absolute_import
-
-import functools
-from collections import namedtuple
-from threading import RLock
-
-_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])
-
-
-@functools.wraps(functools.update_wrapper)
-def update_wrapper(wrapper,
- wrapped,
- assigned = functools.WRAPPER_ASSIGNMENTS,
- updated = functools.WRAPPER_UPDATES):
- """
- Patch two bugs in functools.update_wrapper.
- """
- # workaround for http://bugs.python.org/issue3445
- assigned = tuple(attr for attr in assigned if hasattr(wrapped, attr))
- wrapper = functools.update_wrapper(wrapper, wrapped, assigned, updated)
- # workaround for https://bugs.python.org/issue17482
- wrapper.__wrapped__ = wrapped
- return wrapper
-
-
-class _HashedSeq(list):
- __slots__ = 'hashvalue'
-
- def __init__(self, tup, hash=hash):
- self[:] = tup
- self.hashvalue = hash(tup)
-
- def __hash__(self):
- return self.hashvalue
-
-
-def _make_key(args, kwds, typed,
- kwd_mark=(object(),),
- fasttypes=set([int, str, frozenset, type(None)]),
- sorted=sorted, tuple=tuple, type=type, len=len):
- 'Make a cache key from optionally typed positional and keyword arguments'
- key = args
- if kwds:
- sorted_items = sorted(kwds.items())
- key += kwd_mark
- for item in sorted_items:
- key += item
- if typed:
- key += tuple(type(v) for v in args)
- if kwds:
- key += tuple(type(v) for k, v in sorted_items)
- elif len(key) == 1 and type(key[0]) in fasttypes:
- return key[0]
- return _HashedSeq(key)
-
-
-def lru_cache(maxsize=100, typed=False):
- """Least-recently-used cache decorator.
-
- If *maxsize* is set to None, the LRU features are disabled and the cache
- can grow without bound.
-
- If *typed* is True, arguments of different types will be cached separately.
- For example, f(3.0) and f(3) will be treated as distinct calls with
- distinct results.
-
- Arguments to the cached function must be hashable.
-
- View the cache statistics named tuple (hits, misses, maxsize, currsize) with
- f.cache_info(). Clear the cache and statistics with f.cache_clear().
- Access the underlying function with f.__wrapped__.
-
- See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
-
- """
-
- # Users should only access the lru_cache through its public API:
- # cache_info, cache_clear, and f.__wrapped__
- # The internals of the lru_cache are encapsulated for thread safety and
- # to allow the implementation to change (including a possible C version).
-
- def decorating_function(user_function):
-
- cache = dict()
- stats = [0, 0] # make statistics updateable non-locally
- HITS, MISSES = 0, 1 # names for the stats fields
- make_key = _make_key
- cache_get = cache.get # bound method to lookup key or return None
- _len = len # localize the global len() function
- lock = RLock() # because linkedlist updates aren't threadsafe
- root = [] # root of the circular doubly linked list
- root[:] = [root, root, None, None] # initialize by pointing to self
- nonlocal_root = [root] # make updateable non-locally
- PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
-
- if maxsize == 0:
-
- def wrapper(*args, **kwds):
- # no caching, just do a statistics update after a successful call
- result = user_function(*args, **kwds)
- stats[MISSES] += 1
- return result
-
- elif maxsize is None:
-
- def wrapper(*args, **kwds):
- # simple caching without ordering or size limit
- key = make_key(args, kwds, typed)
- result = cache_get(key, root) # root used here as a unique not-found sentinel
- if result is not root:
- stats[HITS] += 1
- return result
- result = user_function(*args, **kwds)
- cache[key] = result
- stats[MISSES] += 1
- return result
-
- else:
-
- def wrapper(*args, **kwds):
- # size limited caching that tracks accesses by recency
- key = make_key(args, kwds, typed) if kwds or typed else args
- with lock:
- link = cache_get(key)
- if link is not None:
- # record recent use of the key by moving it to the front of the list
- root, = nonlocal_root
- link_prev, link_next, key, result = link
- link_prev[NEXT] = link_next
- link_next[PREV] = link_prev
- last = root[PREV]
- last[NEXT] = root[PREV] = link
- link[PREV] = last
- link[NEXT] = root
- stats[HITS] += 1
- return result
- result = user_function(*args, **kwds)
- with lock:
- root, = nonlocal_root
- if key in cache:
- # getting here means that this same key was added to the
- # cache while the lock was released. since the link
- # update is already done, we need only return the
- # computed result and update the count of misses.
- pass
- elif _len(cache) >= maxsize:
- # use the old root to store the new key and result
- oldroot = root
- oldroot[KEY] = key
- oldroot[RESULT] = result
- # empty the oldest link and make it the new root
- root = nonlocal_root[0] = oldroot[NEXT]
- oldkey = root[KEY]
- root[KEY] = root[RESULT] = None
- # now update the cache dictionary for the new links
- del cache[oldkey]
- cache[key] = oldroot
- else:
- # put result in a new link at the front of the list
- last = root[PREV]
- link = [last, root, key, result]
- last[NEXT] = root[PREV] = cache[key] = link
- stats[MISSES] += 1
- return result
-
- def cache_info():
- """Report cache statistics"""
- with lock:
- return _CacheInfo(stats[HITS], stats[MISSES], maxsize, len(cache))
-
- def cache_clear():
- """Clear the cache and cache statistics"""
- with lock:
- cache.clear()
- root = nonlocal_root[0]
- root[:] = [root, root, None, None]
- stats[:] = [0, 0]
-
- wrapper.__wrapped__ = user_function
- wrapper.cache_info = cache_info
- wrapper.cache_clear = cache_clear
- return update_wrapper(wrapper, user_function)
-
- return decorating_function
diff --git a/client/ayon_core/vendor/python/python_2/builtins/__init__.py b/client/ayon_core/vendor/python/python_2/builtins/__init__.py
deleted file mode 100644
index 4f936f2844..0000000000
--- a/client/ayon_core/vendor/python/python_2/builtins/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from __future__ import absolute_import
-import sys
-__future_module__ = True
-
-if sys.version_info[0] < 3:
- from __builtin__ import *
- # Overwrite any old definitions with the equivalent future.builtins ones:
- from future.builtins import *
-else:
- raise ImportError('This package should not be accessible on Python 3. '
- 'Either you are trying to run from the python-future src folder '
- 'or your installation of python-future is corrupted.')
diff --git a/client/ayon_core/vendor/python/python_2/certifi/__init__.py b/client/ayon_core/vendor/python/python_2/certifi/__init__.py
deleted file mode 100644
index 8db1a0e554..0000000000
--- a/client/ayon_core/vendor/python/python_2/certifi/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from .core import contents, where
-
-__version__ = "2021.10.08"
diff --git a/client/ayon_core/vendor/python/python_2/certifi/__main__.py b/client/ayon_core/vendor/python/python_2/certifi/__main__.py
deleted file mode 100644
index 8945b5da85..0000000000
--- a/client/ayon_core/vendor/python/python_2/certifi/__main__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import argparse
-
-from 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/client/ayon_core/vendor/python/python_2/certifi/cacert.pem b/client/ayon_core/vendor/python/python_2/certifi/cacert.pem
deleted file mode 100644
index 6d0ccc0d1c..0000000000
--- a/client/ayon_core/vendor/python/python_2/certifi/cacert.pem
+++ /dev/null
@@ -1,4362 +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 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=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=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=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: 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 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-----
-
-# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres
-# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres
-# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS"
-# Serial: 131542671362353147877283741781055151509
-# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb
-# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a
-# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb
------BEGIN CERTIFICATE-----
-MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw
-CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw
-FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S
-Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5
-MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL
-DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS
-QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH
-sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK
-Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu
-SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC
-MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy
-v+c=
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa
-# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa
-# Label: "GlobalSign Root R46"
-# Serial: 1552617688466950547958867513931858518042577
-# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef
-# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90
-# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA
-MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD
-VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy
-MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt
-c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ
-OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG
-vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud
-316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo
-0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE
-y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF
-zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE
-+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN
-I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs
-x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa
-ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC
-4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4
-7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
-JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti
-2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk
-pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF
-FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt
-rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk
-ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5
-u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP
-4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6
-N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3
-vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa
-# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa
-# Label: "GlobalSign Root E46"
-# Serial: 1552617690338932563915843282459653771421763
-# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f
-# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84
-# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58
------BEGIN CERTIFICATE-----
-MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx
-CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD
-ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw
-MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
-HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq
-R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd
-yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
-DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ
-7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8
-+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A=
------END CERTIFICATE-----
-
-# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH
-# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH
-# Label: "GLOBALTRUST 2020"
-# Serial: 109160994242082918454945253
-# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8
-# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2
-# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a
------BEGIN CERTIFICATE-----
-MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG
-A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw
-FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx
-MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u
-aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq
-hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b
-RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z
-YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3
-QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw
-yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+
-BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ
-SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH
-r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0
-4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me
-dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw
-q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2
-nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu
-H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
-VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC
-XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd
-6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf
-+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi
-kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7
-wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB
-TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C
-MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn
-4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I
-aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy
-qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
------END CERTIFICATE-----
-
-# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz
-# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz
-# Label: "ANF Secure Server Root CA"
-# Serial: 996390341000653745
-# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96
-# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74
-# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99
------BEGIN CERTIFICATE-----
-MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV
-BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk
-YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV
-BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN
-MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF
-UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD
-VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v
-dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj
-cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q
-yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH
-2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX
-H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL
-zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR
-p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz
-W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/
-SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn
-LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3
-n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B
-u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj
-o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO
-BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
-AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L
-9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej
-rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK
-pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0
-vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq
-OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ
-/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9
-2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI
-+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2
-MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo
-tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw=
------END CERTIFICATE-----
-
-# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority
-# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority
-# Label: "Certum EC-384 CA"
-# Serial: 160250656287871593594747141429395092468
-# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1
-# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed
-# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6
------BEGIN CERTIFICATE-----
-MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw
-CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw
-JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT
-EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0
-WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT
-LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX
-BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE
-KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm
-Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8
-EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J
-UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn
-nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
------END CERTIFICATE-----
-
-# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority
-# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority
-# Label: "Certum Trusted Root CA"
-# Serial: 40870380103424195783807378461123655149
-# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29
-# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5
-# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd
------BEGIN CERTIFICATE-----
-MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6
-MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu
-MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV
-BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw
-MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg
-U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ
-n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q
-p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq
-NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF
-8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3
-HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa
-mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi
-7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF
-ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P
-qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ
-v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6
-Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1
-vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD
-ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4
-WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo
-zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR
-5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ
-GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf
-5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq
-0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D
-P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM
-qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP
-0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf
-E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb
------END CERTIFICATE-----
-
-# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique
-# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique
-# Label: "TunTrust Root CA"
-# Serial: 108534058042236574382096126452369648152337120275
-# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4
-# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb
-# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41
------BEGIN CERTIFICATE-----
-MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL
-BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg
-Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv
-b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG
-EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u
-IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ
-n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd
-2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF
-VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ
-GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF
-li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU
-r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2
-eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb
-MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg
-jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB
-7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW
-5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE
-ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0
-90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z
-xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu
-QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4
-FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH
-22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP
-xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn
-dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5
-Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b
-nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ
-CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH
-u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj
-d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=
------END CERTIFICATE-----
-
-# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA
-# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA
-# Label: "HARICA TLS RSA Root CA 2021"
-# Serial: 76817823531813593706434026085292783742
-# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91
-# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d
-# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs
-MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg
-Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL
-MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
-YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv
-b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l
-mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE
-4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv
-a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M
-pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw
-Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b
-LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY
-AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB
-AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq
-E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr
-W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ
-CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU
-X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3
-f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja
-H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP
-JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P
-zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt
-jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0
-/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT
-BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79
-aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW
-xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU
-63ZTGI0RmLo=
------END CERTIFICATE-----
-
-# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA
-# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA
-# Label: "HARICA TLS ECC Root CA 2021"
-# Serial: 137515985548005187474074462014555733966
-# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0
-# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48
-# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01
------BEGIN CERTIFICATE-----
-MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw
-CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh
-cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v
-dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG
-A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
-aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg
-Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7
-KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y
-STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD
-AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw
-SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN
-nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
------END CERTIFICATE-----
diff --git a/client/ayon_core/vendor/python/python_2/certifi/core.py b/client/ayon_core/vendor/python/python_2/certifi/core.py
deleted file mode 100644
index 5d2b8cd32f..0000000000
--- a/client/ayon_core/vendor/python/python_2/certifi/core.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-certifi.py
-~~~~~~~~~~
-
-This module returns the installation location of cacert.pem or its contents.
-"""
-import os
-
-try:
- 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("certifi", "cacert.pem")
- _CACERT_PATH = str(_CACERT_CTX.__enter__())
-
- return _CACERT_PATH
-
-
-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/client/ayon_core/vendor/python/python_2/chardet/__init__.py b/client/ayon_core/vendor/python/python_2/chardet/__init__.py
deleted file mode 100644
index 80ad2546d7..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/big5freq.py b/client/ayon_core/vendor/python/python_2/chardet/big5freq.py
deleted file mode 100644
index 38f32517aa..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/big5prober.py b/client/ayon_core/vendor/python/python_2/chardet/big5prober.py
deleted file mode 100644
index 98f9970122..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/chardistribution.py b/client/ayon_core/vendor/python/python_2/chardet/chardistribution.py
deleted file mode 100644
index c0395f4a45..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/charsetgroupprober.py b/client/ayon_core/vendor/python/python_2/chardet/charsetgroupprober.py
deleted file mode 100644
index 5812cef0b5..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/charsetprober.py b/client/ayon_core/vendor/python/python_2/chardet/charsetprober.py
deleted file mode 100644
index eac4e59865..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/cli/__init__.py b/client/ayon_core/vendor/python/python_2/chardet/cli/__init__.py
deleted file mode 100644
index 8b13789179..0000000000
--- a/client/ayon_core/vendor/python/python_2/chardet/cli/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/client/ayon_core/vendor/python/python_2/chardet/cli/chardetect.py b/client/ayon_core/vendor/python/python_2/chardet/cli/chardetect.py
deleted file mode 100644
index e1d8cd69ac..0000000000
--- a/client/ayon_core/vendor/python/python_2/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 chardet import __version__
-from chardet.compat import PY2
-from 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/client/ayon_core/vendor/python/python_2/chardet/codingstatemachine.py b/client/ayon_core/vendor/python/python_2/chardet/codingstatemachine.py
deleted file mode 100644
index 68fba44f14..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/compat.py b/client/ayon_core/vendor/python/python_2/chardet/compat.py
deleted file mode 100644
index 8941572b3e..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/cp949prober.py b/client/ayon_core/vendor/python/python_2/chardet/cp949prober.py
deleted file mode 100644
index efd793abca..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/enums.py b/client/ayon_core/vendor/python/python_2/chardet/enums.py
deleted file mode 100644
index 0451207225..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/escprober.py b/client/ayon_core/vendor/python/python_2/chardet/escprober.py
deleted file mode 100644
index c70493f2b1..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/escsm.py b/client/ayon_core/vendor/python/python_2/chardet/escsm.py
deleted file mode 100644
index 0069523a04..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/eucjpprober.py b/client/ayon_core/vendor/python/python_2/chardet/eucjpprober.py
deleted file mode 100644
index 20ce8f7d15..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/euckrfreq.py b/client/ayon_core/vendor/python/python_2/chardet/euckrfreq.py
deleted file mode 100644
index b68078cb96..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/euckrprober.py b/client/ayon_core/vendor/python/python_2/chardet/euckrprober.py
deleted file mode 100644
index 345a060d02..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/euctwfreq.py b/client/ayon_core/vendor/python/python_2/chardet/euctwfreq.py
deleted file mode 100644
index ed7a995a3a..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/euctwprober.py b/client/ayon_core/vendor/python/python_2/chardet/euctwprober.py
deleted file mode 100644
index 35669cc4dd..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/gb2312freq.py b/client/ayon_core/vendor/python/python_2/chardet/gb2312freq.py
deleted file mode 100644
index 697837bd9a..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/gb2312prober.py b/client/ayon_core/vendor/python/python_2/chardet/gb2312prober.py
deleted file mode 100644
index 8446d2dd95..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/hebrewprober.py b/client/ayon_core/vendor/python/python_2/chardet/hebrewprober.py
deleted file mode 100644
index b0e1bf4926..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/jisfreq.py b/client/ayon_core/vendor/python/python_2/chardet/jisfreq.py
deleted file mode 100644
index 83fc082b54..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/jpcntx.py b/client/ayon_core/vendor/python/python_2/chardet/jpcntx.py
deleted file mode 100644
index 20044e4bc8..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/langbulgarianmodel.py b/client/ayon_core/vendor/python/python_2/chardet/langbulgarianmodel.py
deleted file mode 100644
index 561bfd9051..0000000000
--- a/client/ayon_core/vendor/python/python_2/chardet/langbulgarianmodel.py
+++ /dev/null
@@ -1,4650 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from 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/client/ayon_core/vendor/python/python_2/chardet/langgreekmodel.py b/client/ayon_core/vendor/python/python_2/chardet/langgreekmodel.py
deleted file mode 100644
index 02b94de655..0000000000
--- a/client/ayon_core/vendor/python/python_2/chardet/langgreekmodel.py
+++ /dev/null
@@ -1,4398 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from 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/client/ayon_core/vendor/python/python_2/chardet/langhebrewmodel.py b/client/ayon_core/vendor/python/python_2/chardet/langhebrewmodel.py
deleted file mode 100644
index 40fd674c4a..0000000000
--- a/client/ayon_core/vendor/python/python_2/chardet/langhebrewmodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from 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/client/ayon_core/vendor/python/python_2/chardet/langhungarianmodel.py b/client/ayon_core/vendor/python/python_2/chardet/langhungarianmodel.py
deleted file mode 100644
index 24a097f520..0000000000
--- a/client/ayon_core/vendor/python/python_2/chardet/langhungarianmodel.py
+++ /dev/null
@@ -1,4650 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from 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/client/ayon_core/vendor/python/python_2/chardet/langrussianmodel.py b/client/ayon_core/vendor/python/python_2/chardet/langrussianmodel.py
deleted file mode 100644
index 569689d0f5..0000000000
--- a/client/ayon_core/vendor/python/python_2/chardet/langrussianmodel.py
+++ /dev/null
@@ -1,5718 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from 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/client/ayon_core/vendor/python/python_2/chardet/langthaimodel.py b/client/ayon_core/vendor/python/python_2/chardet/langthaimodel.py
deleted file mode 100644
index d0191f241d..0000000000
--- a/client/ayon_core/vendor/python/python_2/chardet/langthaimodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from 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/client/ayon_core/vendor/python/python_2/chardet/langturkishmodel.py b/client/ayon_core/vendor/python/python_2/chardet/langturkishmodel.py
deleted file mode 100644
index 8ba93224de..0000000000
--- a/client/ayon_core/vendor/python/python_2/chardet/langturkishmodel.py
+++ /dev/null
@@ -1,4383 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from 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/client/ayon_core/vendor/python/python_2/chardet/latin1prober.py b/client/ayon_core/vendor/python/python_2/chardet/latin1prober.py
deleted file mode 100644
index 7d1e8c20fb..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/mbcharsetprober.py b/client/ayon_core/vendor/python/python_2/chardet/mbcharsetprober.py
deleted file mode 100644
index 6256ecfd1e..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/mbcsgroupprober.py b/client/ayon_core/vendor/python/python_2/chardet/mbcsgroupprober.py
deleted file mode 100644
index 530abe75e0..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/mbcssm.py b/client/ayon_core/vendor/python/python_2/chardet/mbcssm.py
deleted file mode 100644
index 8360d0f284..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/metadata/__init__.py b/client/ayon_core/vendor/python/python_2/chardet/metadata/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/client/ayon_core/vendor/python/python_2/chardet/metadata/languages.py b/client/ayon_core/vendor/python/python_2/chardet/metadata/languages.py
deleted file mode 100644
index 3237d5abf6..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/sbcharsetprober.py b/client/ayon_core/vendor/python/python_2/chardet/sbcharsetprober.py
deleted file mode 100644
index 46ba835c66..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/sbcsgroupprober.py b/client/ayon_core/vendor/python/python_2/chardet/sbcsgroupprober.py
deleted file mode 100644
index bdeef4e15b..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/sjisprober.py b/client/ayon_core/vendor/python/python_2/chardet/sjisprober.py
deleted file mode 100644
index 9e29623bdc..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/universaldetector.py b/client/ayon_core/vendor/python/python_2/chardet/universaldetector.py
deleted file mode 100644
index 055a8ac1b1..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/utf8prober.py b/client/ayon_core/vendor/python/python_2/chardet/utf8prober.py
deleted file mode 100644
index 6c3196cc2d..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/chardet/version.py b/client/ayon_core/vendor/python/python_2/chardet/version.py
deleted file mode 100644
index 70369b9d66..0000000000
--- a/client/ayon_core/vendor/python/python_2/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/client/ayon_core/vendor/python/python_2/charset_normalizer.py b/client/ayon_core/vendor/python/python_2/charset_normalizer.py
deleted file mode 100644
index 84ec661759..0000000000
--- a/client/ayon_core/vendor/python/python_2/charset_normalizer.py
+++ /dev/null
@@ -1,8 +0,0 @@
-"""Fake 'charset_normalizer' for Python 2 to raise ImportError.
-
-Needed for 'requests' module which first checks for existence of
-'charset_normalizer' (Python 3) but does not raise 'ImportError' but
-'SyntaxError'.
-"""
-
-raise ImportError("charset_normalizer not available")
diff --git a/client/ayon_core/vendor/python/python_2/click/__init__.py b/client/ayon_core/vendor/python/python_2/click/__init__.py
deleted file mode 100644
index 2b6008f2dd..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/__init__.py
+++ /dev/null
@@ -1,79 +0,0 @@
-"""
-Click is a simple Python module inspired by the stdlib optparse to make
-writing command line scripts fun. Unlike other modules, it's based
-around a simple API that does not come with too much magic and is
-composable.
-"""
-from .core import Argument
-from .core import BaseCommand
-from .core import Command
-from .core import CommandCollection
-from .core import Context
-from .core import Group
-from .core import MultiCommand
-from .core import Option
-from .core import Parameter
-from .decorators import argument
-from .decorators import command
-from .decorators import confirmation_option
-from .decorators import group
-from .decorators import help_option
-from .decorators import make_pass_decorator
-from .decorators import option
-from .decorators import pass_context
-from .decorators import pass_obj
-from .decorators import password_option
-from .decorators import version_option
-from .exceptions import Abort
-from .exceptions import BadArgumentUsage
-from .exceptions import BadOptionUsage
-from .exceptions import BadParameter
-from .exceptions import ClickException
-from .exceptions import FileError
-from .exceptions import MissingParameter
-from .exceptions import NoSuchOption
-from .exceptions import UsageError
-from .formatting import HelpFormatter
-from .formatting import wrap_text
-from .globals import get_current_context
-from .parser import OptionParser
-from .termui import clear
-from .termui import confirm
-from .termui import echo_via_pager
-from .termui import edit
-from .termui import get_terminal_size
-from .termui import getchar
-from .termui import launch
-from .termui import pause
-from .termui import progressbar
-from .termui import prompt
-from .termui import secho
-from .termui import style
-from .termui import unstyle
-from .types import BOOL
-from .types import Choice
-from .types import DateTime
-from .types import File
-from .types import FLOAT
-from .types import FloatRange
-from .types import INT
-from .types import IntRange
-from .types import ParamType
-from .types import Path
-from .types import STRING
-from .types import Tuple
-from .types import UNPROCESSED
-from .types import UUID
-from .utils import echo
-from .utils import format_filename
-from .utils import get_app_dir
-from .utils import get_binary_stream
-from .utils import get_os_args
-from .utils import get_text_stream
-from .utils import open_file
-
-# Controls if click should emit the warning about the use of unicode
-# literals.
-disable_unicode_literals_warning = False
-
-__version__ = "7.1.2"
diff --git a/client/ayon_core/vendor/python/python_2/click/_bashcomplete.py b/client/ayon_core/vendor/python/python_2/click/_bashcomplete.py
deleted file mode 100644
index 8bca24480f..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/_bashcomplete.py
+++ /dev/null
@@ -1,375 +0,0 @@
-import copy
-import os
-import re
-
-from .core import Argument
-from .core import MultiCommand
-from .core import Option
-from .parser import split_arg_string
-from .types import Choice
-from .utils import echo
-
-try:
- from collections import abc
-except ImportError:
- import collections as abc
-
-WORDBREAK = "="
-
-# Note, only BASH version 4.4 and later have the nosort option.
-COMPLETION_SCRIPT_BASH = """
-%(complete_func)s() {
- local IFS=$'\n'
- COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\
- COMP_CWORD=$COMP_CWORD \\
- %(autocomplete_var)s=complete $1 ) )
- return 0
-}
-
-%(complete_func)setup() {
- local COMPLETION_OPTIONS=""
- local BASH_VERSION_ARR=(${BASH_VERSION//./ })
- # Only BASH version 4.4 and later have the nosort option.
- if [ ${BASH_VERSION_ARR[0]} -gt 4 ] || ([ ${BASH_VERSION_ARR[0]} -eq 4 ] \
-&& [ ${BASH_VERSION_ARR[1]} -ge 4 ]); then
- COMPLETION_OPTIONS="-o nosort"
- fi
-
- complete $COMPLETION_OPTIONS -F %(complete_func)s %(script_names)s
-}
-
-%(complete_func)setup
-"""
-
-COMPLETION_SCRIPT_ZSH = """
-#compdef %(script_names)s
-
-%(complete_func)s() {
- local -a completions
- local -a completions_with_descriptions
- local -a response
- (( ! $+commands[%(script_names)s] )) && return 1
-
- response=("${(@f)$( env COMP_WORDS=\"${words[*]}\" \\
- COMP_CWORD=$((CURRENT-1)) \\
- %(autocomplete_var)s=\"complete_zsh\" \\
- %(script_names)s )}")
-
- for key descr in ${(kv)response}; do
- if [[ "$descr" == "_" ]]; then
- completions+=("$key")
- else
- completions_with_descriptions+=("$key":"$descr")
- fi
- done
-
- if [ -n "$completions_with_descriptions" ]; then
- _describe -V unsorted completions_with_descriptions -U
- fi
-
- if [ -n "$completions" ]; then
- compadd -U -V unsorted -a completions
- fi
- compstate[insert]="automenu"
-}
-
-compdef %(complete_func)s %(script_names)s
-"""
-
-COMPLETION_SCRIPT_FISH = (
- "complete --no-files --command %(script_names)s --arguments"
- ' "(env %(autocomplete_var)s=complete_fish'
- " COMP_WORDS=(commandline -cp) COMP_CWORD=(commandline -t)"
- ' %(script_names)s)"'
-)
-
-_completion_scripts = {
- "bash": COMPLETION_SCRIPT_BASH,
- "zsh": COMPLETION_SCRIPT_ZSH,
- "fish": COMPLETION_SCRIPT_FISH,
-}
-
-_invalid_ident_char_re = re.compile(r"[^a-zA-Z0-9_]")
-
-
-def get_completion_script(prog_name, complete_var, shell):
- cf_name = _invalid_ident_char_re.sub("", prog_name.replace("-", "_"))
- script = _completion_scripts.get(shell, COMPLETION_SCRIPT_BASH)
- return (
- script
- % {
- "complete_func": "_{}_completion".format(cf_name),
- "script_names": prog_name,
- "autocomplete_var": complete_var,
- }
- ).strip() + ";"
-
-
-def resolve_ctx(cli, prog_name, args):
- """Parse into a hierarchy of contexts. Contexts are connected
- through the parent variable.
-
- :param cli: command definition
- :param prog_name: the program that is running
- :param args: full list of args
- :return: the final context/command parsed
- """
- ctx = cli.make_context(prog_name, args, resilient_parsing=True)
- args = ctx.protected_args + ctx.args
- while args:
- if isinstance(ctx.command, MultiCommand):
- if not ctx.command.chain:
- cmd_name, cmd, args = ctx.command.resolve_command(ctx, args)
- if cmd is None:
- return ctx
- ctx = cmd.make_context(
- cmd_name, args, parent=ctx, resilient_parsing=True
- )
- args = ctx.protected_args + ctx.args
- else:
- # Walk chained subcommand contexts saving the last one.
- while args:
- cmd_name, cmd, args = ctx.command.resolve_command(ctx, args)
- if cmd is None:
- return ctx
- sub_ctx = cmd.make_context(
- cmd_name,
- args,
- parent=ctx,
- allow_extra_args=True,
- allow_interspersed_args=False,
- resilient_parsing=True,
- )
- args = sub_ctx.args
- ctx = sub_ctx
- args = sub_ctx.protected_args + sub_ctx.args
- else:
- break
- return ctx
-
-
-def start_of_option(param_str):
- """
- :param param_str: param_str to check
- :return: whether or not this is the start of an option declaration
- (i.e. starts "-" or "--")
- """
- return param_str and param_str[:1] == "-"
-
-
-def is_incomplete_option(all_args, cmd_param):
- """
- :param all_args: the full original list of args supplied
- :param cmd_param: the current command paramter
- :return: whether or not the last option declaration (i.e. starts
- "-" or "--") is incomplete and corresponds to this cmd_param. In
- other words whether this cmd_param option can still accept
- values
- """
- if not isinstance(cmd_param, Option):
- return False
- if cmd_param.is_flag:
- return False
- last_option = None
- for index, arg_str in enumerate(
- reversed([arg for arg in all_args if arg != WORDBREAK])
- ):
- if index + 1 > cmd_param.nargs:
- break
- if start_of_option(arg_str):
- last_option = arg_str
-
- return True if last_option and last_option in cmd_param.opts else False
-
-
-def is_incomplete_argument(current_params, cmd_param):
- """
- :param current_params: the current params and values for this
- argument as already entered
- :param cmd_param: the current command parameter
- :return: whether or not the last argument is incomplete and
- corresponds to this cmd_param. In other words whether or not the
- this cmd_param argument can still accept values
- """
- if not isinstance(cmd_param, Argument):
- return False
- current_param_values = current_params[cmd_param.name]
- if current_param_values is None:
- return True
- if cmd_param.nargs == -1:
- return True
- if (
- isinstance(current_param_values, abc.Iterable)
- and cmd_param.nargs > 1
- and len(current_param_values) < cmd_param.nargs
- ):
- return True
- return False
-
-
-def get_user_autocompletions(ctx, args, incomplete, cmd_param):
- """
- :param ctx: context associated with the parsed command
- :param args: full list of args
- :param incomplete: the incomplete text to autocomplete
- :param cmd_param: command definition
- :return: all the possible user-specified completions for the param
- """
- results = []
- if isinstance(cmd_param.type, Choice):
- # Choices don't support descriptions.
- results = [
- (c, None) for c in cmd_param.type.choices if str(c).startswith(incomplete)
- ]
- elif cmd_param.autocompletion is not None:
- dynamic_completions = cmd_param.autocompletion(
- ctx=ctx, args=args, incomplete=incomplete
- )
- results = [
- c if isinstance(c, tuple) else (c, None) for c in dynamic_completions
- ]
- return results
-
-
-def get_visible_commands_starting_with(ctx, starts_with):
- """
- :param ctx: context associated with the parsed command
- :starts_with: string that visible commands must start with.
- :return: all visible (not hidden) commands that start with starts_with.
- """
- for c in ctx.command.list_commands(ctx):
- if c.startswith(starts_with):
- command = ctx.command.get_command(ctx, c)
- if not command.hidden:
- yield command
-
-
-def add_subcommand_completions(ctx, incomplete, completions_out):
- # Add subcommand completions.
- if isinstance(ctx.command, MultiCommand):
- completions_out.extend(
- [
- (c.name, c.get_short_help_str())
- for c in get_visible_commands_starting_with(ctx, incomplete)
- ]
- )
-
- # Walk up the context list and add any other completion
- # possibilities from chained commands
- while ctx.parent is not None:
- ctx = ctx.parent
- if isinstance(ctx.command, MultiCommand) and ctx.command.chain:
- remaining_commands = [
- c
- for c in get_visible_commands_starting_with(ctx, incomplete)
- if c.name not in ctx.protected_args
- ]
- completions_out.extend(
- [(c.name, c.get_short_help_str()) for c in remaining_commands]
- )
-
-
-def get_choices(cli, prog_name, args, incomplete):
- """
- :param cli: command definition
- :param prog_name: the program that is running
- :param args: full list of args
- :param incomplete: the incomplete text to autocomplete
- :return: all the possible completions for the incomplete
- """
- all_args = copy.deepcopy(args)
-
- ctx = resolve_ctx(cli, prog_name, args)
- if ctx is None:
- return []
-
- has_double_dash = "--" in all_args
-
- # In newer versions of bash long opts with '='s are partitioned, but
- # it's easier to parse without the '='
- if start_of_option(incomplete) and WORDBREAK in incomplete:
- partition_incomplete = incomplete.partition(WORDBREAK)
- all_args.append(partition_incomplete[0])
- incomplete = partition_incomplete[2]
- elif incomplete == WORDBREAK:
- incomplete = ""
-
- completions = []
- if not has_double_dash and start_of_option(incomplete):
- # completions for partial options
- for param in ctx.command.params:
- if isinstance(param, Option) and not param.hidden:
- param_opts = [
- param_opt
- for param_opt in param.opts + param.secondary_opts
- if param_opt not in all_args or param.multiple
- ]
- completions.extend(
- [(o, param.help) for o in param_opts if o.startswith(incomplete)]
- )
- return completions
- # completion for option values from user supplied values
- for param in ctx.command.params:
- if is_incomplete_option(all_args, param):
- return get_user_autocompletions(ctx, all_args, incomplete, param)
- # completion for argument values from user supplied values
- for param in ctx.command.params:
- if is_incomplete_argument(ctx.params, param):
- return get_user_autocompletions(ctx, all_args, incomplete, param)
-
- add_subcommand_completions(ctx, incomplete, completions)
- # Sort before returning so that proper ordering can be enforced in custom types.
- return sorted(completions)
-
-
-def do_complete(cli, prog_name, include_descriptions):
- cwords = split_arg_string(os.environ["COMP_WORDS"])
- cword = int(os.environ["COMP_CWORD"])
- args = cwords[1:cword]
- try:
- incomplete = cwords[cword]
- except IndexError:
- incomplete = ""
-
- for item in get_choices(cli, prog_name, args, incomplete):
- echo(item[0])
- if include_descriptions:
- # ZSH has trouble dealing with empty array parameters when
- # returned from commands, use '_' to indicate no description
- # is present.
- echo(item[1] if item[1] else "_")
-
- return True
-
-
-def do_complete_fish(cli, prog_name):
- cwords = split_arg_string(os.environ["COMP_WORDS"])
- incomplete = os.environ["COMP_CWORD"]
- args = cwords[1:]
-
- for item in get_choices(cli, prog_name, args, incomplete):
- if item[1]:
- echo("{arg}\t{desc}".format(arg=item[0], desc=item[1]))
- else:
- echo(item[0])
-
- return True
-
-
-def bashcomplete(cli, prog_name, complete_var, complete_instr):
- if "_" in complete_instr:
- command, shell = complete_instr.split("_", 1)
- else:
- command = complete_instr
- shell = "bash"
-
- if command == "source":
- echo(get_completion_script(prog_name, complete_var, shell))
- return True
- elif command == "complete":
- if shell == "fish":
- return do_complete_fish(cli, prog_name)
- elif shell in {"bash", "zsh"}:
- return do_complete(cli, prog_name, shell == "zsh")
-
- return False
diff --git a/client/ayon_core/vendor/python/python_2/click/_compat.py b/client/ayon_core/vendor/python/python_2/click/_compat.py
deleted file mode 100644
index 60cb115bc5..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/_compat.py
+++ /dev/null
@@ -1,786 +0,0 @@
-# flake8: noqa
-import codecs
-import io
-import os
-import re
-import sys
-from weakref import WeakKeyDictionary
-
-PY2 = sys.version_info[0] == 2
-CYGWIN = sys.platform.startswith("cygwin")
-MSYS2 = sys.platform.startswith("win") and ("GCC" in sys.version)
-# Determine local App Engine environment, per Google's own suggestion
-APP_ENGINE = "APPENGINE_RUNTIME" in os.environ and "Development/" in os.environ.get(
- "SERVER_SOFTWARE", ""
-)
-WIN = sys.platform.startswith("win") and not APP_ENGINE and not MSYS2
-DEFAULT_COLUMNS = 80
-
-
-_ansi_re = re.compile(r"\033\[[;?0-9]*[a-zA-Z]")
-
-
-def get_filesystem_encoding():
- return sys.getfilesystemencoding() or sys.getdefaultencoding()
-
-
-def _make_text_stream(
- stream, encoding, errors, force_readable=False, force_writable=False
-):
- if encoding is None:
- encoding = get_best_encoding(stream)
- if errors is None:
- errors = "replace"
- return _NonClosingTextIOWrapper(
- stream,
- encoding,
- errors,
- line_buffering=True,
- force_readable=force_readable,
- force_writable=force_writable,
- )
-
-
-def is_ascii_encoding(encoding):
- """Checks if a given encoding is ascii."""
- try:
- return codecs.lookup(encoding).name == "ascii"
- except LookupError:
- return False
-
-
-def get_best_encoding(stream):
- """Returns the default stream encoding if not found."""
- rv = getattr(stream, "encoding", None) or sys.getdefaultencoding()
- if is_ascii_encoding(rv):
- return "utf-8"
- return rv
-
-
-class _NonClosingTextIOWrapper(io.TextIOWrapper):
- def __init__(
- self,
- stream,
- encoding,
- errors,
- force_readable=False,
- force_writable=False,
- **extra
- ):
- self._stream = stream = _FixupStream(stream, force_readable, force_writable)
- io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra)
-
- # The io module is a place where the Python 3 text behavior
- # was forced upon Python 2, so we need to unbreak
- # it to look like Python 2.
- if PY2:
-
- def write(self, x):
- if isinstance(x, str) or is_bytes(x):
- try:
- self.flush()
- except Exception:
- pass
- return self.buffer.write(str(x))
- return io.TextIOWrapper.write(self, x)
-
- def writelines(self, lines):
- for line in lines:
- self.write(line)
-
- def __del__(self):
- try:
- self.detach()
- except Exception:
- pass
-
- def isatty(self):
- # https://bitbucket.org/pypy/pypy/issue/1803
- return self._stream.isatty()
-
-
-class _FixupStream(object):
- """The new io interface needs more from streams than streams
- traditionally implement. As such, this fix-up code is necessary in
- some circumstances.
-
- The forcing of readable and writable flags are there because some tools
- put badly patched objects on sys (one such offender are certain version
- of jupyter notebook).
- """
-
- def __init__(self, stream, force_readable=False, force_writable=False):
- self._stream = stream
- self._force_readable = force_readable
- self._force_writable = force_writable
-
- def __getattr__(self, name):
- return getattr(self._stream, name)
-
- def read1(self, size):
- f = getattr(self._stream, "read1", None)
- if f is not None:
- return f(size)
- # We only dispatch to readline instead of read in Python 2 as we
- # do not want cause problems with the different implementation
- # of line buffering.
- if PY2:
- return self._stream.readline(size)
- return self._stream.read(size)
-
- def readable(self):
- if self._force_readable:
- return True
- x = getattr(self._stream, "readable", None)
- if x is not None:
- return x()
- try:
- self._stream.read(0)
- except Exception:
- return False
- return True
-
- def writable(self):
- if self._force_writable:
- return True
- x = getattr(self._stream, "writable", None)
- if x is not None:
- return x()
- try:
- self._stream.write("")
- except Exception:
- try:
- self._stream.write(b"")
- except Exception:
- return False
- return True
-
- def seekable(self):
- x = getattr(self._stream, "seekable", None)
- if x is not None:
- return x()
- try:
- self._stream.seek(self._stream.tell())
- except Exception:
- return False
- return True
-
-
-if PY2:
- text_type = unicode
- raw_input = raw_input
- string_types = (str, unicode)
- int_types = (int, long)
- iteritems = lambda x: x.iteritems()
- range_type = xrange
-
- def is_bytes(x):
- return isinstance(x, (buffer, bytearray))
-
- _identifier_re = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$")
-
- # For Windows, we need to force stdout/stdin/stderr to binary if it's
- # fetched for that. This obviously is not the most correct way to do
- # it as it changes global state. Unfortunately, there does not seem to
- # be a clear better way to do it as just reopening the file in binary
- # mode does not change anything.
- #
- # An option would be to do what Python 3 does and to open the file as
- # binary only, patch it back to the system, and then use a wrapper
- # stream that converts newlines. It's not quite clear what's the
- # correct option here.
- #
- # This code also lives in _winconsole for the fallback to the console
- # emulation stream.
- #
- # There are also Windows environments where the `msvcrt` module is not
- # available (which is why we use try-catch instead of the WIN variable
- # here), such as the Google App Engine development server on Windows. In
- # those cases there is just nothing we can do.
- def set_binary_mode(f):
- return f
-
- try:
- import msvcrt
- except ImportError:
- pass
- else:
-
- def set_binary_mode(f):
- try:
- fileno = f.fileno()
- except Exception:
- pass
- else:
- msvcrt.setmode(fileno, os.O_BINARY)
- return f
-
- try:
- import fcntl
- except ImportError:
- pass
- else:
-
- def set_binary_mode(f):
- try:
- fileno = f.fileno()
- except Exception:
- pass
- else:
- flags = fcntl.fcntl(fileno, fcntl.F_GETFL)
- fcntl.fcntl(fileno, fcntl.F_SETFL, flags & ~os.O_NONBLOCK)
- return f
-
- def isidentifier(x):
- return _identifier_re.search(x) is not None
-
- def get_binary_stdin():
- return set_binary_mode(sys.stdin)
-
- def get_binary_stdout():
- _wrap_std_stream("stdout")
- return set_binary_mode(sys.stdout)
-
- def get_binary_stderr():
- _wrap_std_stream("stderr")
- return set_binary_mode(sys.stderr)
-
- def get_text_stdin(encoding=None, errors=None):
- rv = _get_windows_console_stream(sys.stdin, encoding, errors)
- if rv is not None:
- return rv
- return _make_text_stream(sys.stdin, encoding, errors, force_readable=True)
-
- def get_text_stdout(encoding=None, errors=None):
- _wrap_std_stream("stdout")
- rv = _get_windows_console_stream(sys.stdout, encoding, errors)
- if rv is not None:
- return rv
- return _make_text_stream(sys.stdout, encoding, errors, force_writable=True)
-
- def get_text_stderr(encoding=None, errors=None):
- _wrap_std_stream("stderr")
- rv = _get_windows_console_stream(sys.stderr, encoding, errors)
- if rv is not None:
- return rv
- return _make_text_stream(sys.stderr, encoding, errors, force_writable=True)
-
- def filename_to_ui(value):
- if isinstance(value, bytes):
- value = value.decode(get_filesystem_encoding(), "replace")
- return value
-
-
-else:
- import io
-
- text_type = str
- raw_input = input
- string_types = (str,)
- int_types = (int,)
- range_type = range
- isidentifier = lambda x: x.isidentifier()
- iteritems = lambda x: iter(x.items())
-
- def is_bytes(x):
- return isinstance(x, (bytes, memoryview, bytearray))
-
- def _is_binary_reader(stream, default=False):
- try:
- return isinstance(stream.read(0), bytes)
- except Exception:
- return default
- # This happens in some cases where the stream was already
- # closed. In this case, we assume the default.
-
- def _is_binary_writer(stream, default=False):
- try:
- stream.write(b"")
- except Exception:
- try:
- stream.write("")
- return False
- except Exception:
- pass
- return default
- return True
-
- def _find_binary_reader(stream):
- # We need to figure out if the given stream is already binary.
- # This can happen because the official docs recommend detaching
- # the streams to get binary streams. Some code might do this, so
- # we need to deal with this case explicitly.
- if _is_binary_reader(stream, False):
- return stream
-
- buf = getattr(stream, "buffer", None)
-
- # Same situation here; this time we assume that the buffer is
- # actually binary in case it's closed.
- if buf is not None and _is_binary_reader(buf, True):
- return buf
-
- def _find_binary_writer(stream):
- # We need to figure out if the given stream is already binary.
- # This can happen because the official docs recommend detatching
- # the streams to get binary streams. Some code might do this, so
- # we need to deal with this case explicitly.
- if _is_binary_writer(stream, False):
- return stream
-
- buf = getattr(stream, "buffer", None)
-
- # Same situation here; this time we assume that the buffer is
- # actually binary in case it's closed.
- if buf is not None and _is_binary_writer(buf, True):
- return buf
-
- def _stream_is_misconfigured(stream):
- """A stream is misconfigured if its encoding is ASCII."""
- # If the stream does not have an encoding set, we assume it's set
- # to ASCII. This appears to happen in certain unittest
- # environments. It's not quite clear what the correct behavior is
- # but this at least will force Click to recover somehow.
- return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii")
-
- def _is_compat_stream_attr(stream, attr, value):
- """A stream attribute is compatible if it is equal to the
- desired value or the desired value is unset and the attribute
- has a value.
- """
- stream_value = getattr(stream, attr, None)
- return stream_value == value or (value is None and stream_value is not None)
-
- def _is_compatible_text_stream(stream, encoding, errors):
- """Check if a stream's encoding and errors attributes are
- compatible with the desired values.
- """
- return _is_compat_stream_attr(
- stream, "encoding", encoding
- ) and _is_compat_stream_attr(stream, "errors", errors)
-
- def _force_correct_text_stream(
- text_stream,
- encoding,
- errors,
- is_binary,
- find_binary,
- force_readable=False,
- force_writable=False,
- ):
- if is_binary(text_stream, False):
- binary_reader = text_stream
- else:
- # If the stream looks compatible, and won't default to a
- # misconfigured ascii encoding, return it as-is.
- if _is_compatible_text_stream(text_stream, encoding, errors) and not (
- encoding is None and _stream_is_misconfigured(text_stream)
- ):
- return text_stream
-
- # Otherwise, get the underlying binary reader.
- binary_reader = find_binary(text_stream)
-
- # If that's not possible, silently use the original reader
- # and get mojibake instead of exceptions.
- if binary_reader is None:
- return text_stream
-
- # Default errors to replace instead of strict in order to get
- # something that works.
- if errors is None:
- errors = "replace"
-
- # Wrap the binary stream in a text stream with the correct
- # encoding parameters.
- return _make_text_stream(
- binary_reader,
- encoding,
- errors,
- force_readable=force_readable,
- force_writable=force_writable,
- )
-
- def _force_correct_text_reader(text_reader, encoding, errors, force_readable=False):
- return _force_correct_text_stream(
- text_reader,
- encoding,
- errors,
- _is_binary_reader,
- _find_binary_reader,
- force_readable=force_readable,
- )
-
- def _force_correct_text_writer(text_writer, encoding, errors, force_writable=False):
- return _force_correct_text_stream(
- text_writer,
- encoding,
- errors,
- _is_binary_writer,
- _find_binary_writer,
- force_writable=force_writable,
- )
-
- def get_binary_stdin():
- reader = _find_binary_reader(sys.stdin)
- if reader is None:
- raise RuntimeError("Was not able to determine binary stream for sys.stdin.")
- return reader
-
- def get_binary_stdout():
- writer = _find_binary_writer(sys.stdout)
- if writer is None:
- raise RuntimeError(
- "Was not able to determine binary stream for sys.stdout."
- )
- return writer
-
- def get_binary_stderr():
- writer = _find_binary_writer(sys.stderr)
- if writer is None:
- raise RuntimeError(
- "Was not able to determine binary stream for sys.stderr."
- )
- return writer
-
- def get_text_stdin(encoding=None, errors=None):
- rv = _get_windows_console_stream(sys.stdin, encoding, errors)
- if rv is not None:
- return rv
- return _force_correct_text_reader(
- sys.stdin, encoding, errors, force_readable=True
- )
-
- def get_text_stdout(encoding=None, errors=None):
- rv = _get_windows_console_stream(sys.stdout, encoding, errors)
- if rv is not None:
- return rv
- return _force_correct_text_writer(
- sys.stdout, encoding, errors, force_writable=True
- )
-
- def get_text_stderr(encoding=None, errors=None):
- rv = _get_windows_console_stream(sys.stderr, encoding, errors)
- if rv is not None:
- return rv
- return _force_correct_text_writer(
- sys.stderr, encoding, errors, force_writable=True
- )
-
- def filename_to_ui(value):
- if isinstance(value, bytes):
- value = value.decode(get_filesystem_encoding(), "replace")
- else:
- value = value.encode("utf-8", "surrogateescape").decode("utf-8", "replace")
- return value
-
-
-def get_streerror(e, default=None):
- if hasattr(e, "strerror"):
- msg = e.strerror
- else:
- if default is not None:
- msg = default
- else:
- msg = str(e)
- if isinstance(msg, bytes):
- msg = msg.decode("utf-8", "replace")
- return msg
-
-
-def _wrap_io_open(file, mode, encoding, errors):
- """On Python 2, :func:`io.open` returns a text file wrapper that
- requires passing ``unicode`` to ``write``. Need to open the file in
- binary mode then wrap it in a subclass that can write ``str`` and
- ``unicode``.
-
- Also handles not passing ``encoding`` and ``errors`` in binary mode.
- """
- binary = "b" in mode
-
- if binary:
- kwargs = {}
- else:
- kwargs = {"encoding": encoding, "errors": errors}
-
- if not PY2 or binary:
- return io.open(file, mode, **kwargs)
-
- f = io.open(file, "{}b".format(mode.replace("t", "")))
- return _make_text_stream(f, **kwargs)
-
-
-def open_stream(filename, mode="r", encoding=None, errors="strict", atomic=False):
- binary = "b" in mode
-
- # Standard streams first. These are simple because they don't need
- # special handling for the atomic flag. It's entirely ignored.
- if filename == "-":
- if any(m in mode for m in ["w", "a", "x"]):
- if binary:
- return get_binary_stdout(), False
- return get_text_stdout(encoding=encoding, errors=errors), False
- if binary:
- return get_binary_stdin(), False
- return get_text_stdin(encoding=encoding, errors=errors), False
-
- # Non-atomic writes directly go out through the regular open functions.
- if not atomic:
- return _wrap_io_open(filename, mode, encoding, errors), True
-
- # Some usability stuff for atomic writes
- if "a" in mode:
- raise ValueError(
- "Appending to an existing file is not supported, because that"
- " would involve an expensive `copy`-operation to a temporary"
- " file. Open the file in normal `w`-mode and copy explicitly"
- " if that's what you're after."
- )
- if "x" in mode:
- raise ValueError("Use the `overwrite`-parameter instead.")
- if "w" not in mode:
- raise ValueError("Atomic writes only make sense with `w`-mode.")
-
- # Atomic writes are more complicated. They work by opening a file
- # as a proxy in the same folder and then using the fdopen
- # functionality to wrap it in a Python file. Then we wrap it in an
- # atomic file that moves the file over on close.
- import errno
- import random
-
- try:
- perm = os.stat(filename).st_mode
- except OSError:
- perm = None
-
- flags = os.O_RDWR | os.O_CREAT | os.O_EXCL
-
- if binary:
- flags |= getattr(os, "O_BINARY", 0)
-
- while True:
- tmp_filename = os.path.join(
- os.path.dirname(filename),
- ".__atomic-write{:08x}".format(random.randrange(1 << 32)),
- )
- try:
- fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm)
- break
- except OSError as e:
- if e.errno == errno.EEXIST or (
- os.name == "nt"
- and e.errno == errno.EACCES
- and os.path.isdir(e.filename)
- and os.access(e.filename, os.W_OK)
- ):
- continue
- raise
-
- if perm is not None:
- os.chmod(tmp_filename, perm) # in case perm includes bits in umask
-
- f = _wrap_io_open(fd, mode, encoding, errors)
- return _AtomicFile(f, tmp_filename, os.path.realpath(filename)), True
-
-
-# Used in a destructor call, needs extra protection from interpreter cleanup.
-if hasattr(os, "replace"):
- _replace = os.replace
- _can_replace = True
-else:
- _replace = os.rename
- _can_replace = not WIN
-
-
-class _AtomicFile(object):
- def __init__(self, f, tmp_filename, real_filename):
- self._f = f
- self._tmp_filename = tmp_filename
- self._real_filename = real_filename
- self.closed = False
-
- @property
- def name(self):
- return self._real_filename
-
- def close(self, delete=False):
- if self.closed:
- return
- self._f.close()
- if not _can_replace:
- try:
- os.remove(self._real_filename)
- except OSError:
- pass
- _replace(self._tmp_filename, self._real_filename)
- self.closed = True
-
- def __getattr__(self, name):
- return getattr(self._f, name)
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_value, tb):
- self.close(delete=exc_type is not None)
-
- def __repr__(self):
- return repr(self._f)
-
-
-auto_wrap_for_ansi = None
-colorama = None
-get_winterm_size = None
-
-
-def strip_ansi(value):
- return _ansi_re.sub("", value)
-
-
-def _is_jupyter_kernel_output(stream):
- if WIN:
- # TODO: Couldn't test on Windows, should't try to support until
- # someone tests the details wrt colorama.
- return
-
- while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)):
- stream = stream._stream
-
- return stream.__class__.__module__.startswith("ipykernel.")
-
-
-def should_strip_ansi(stream=None, color=None):
- if color is None:
- if stream is None:
- stream = sys.stdin
- return not isatty(stream) and not _is_jupyter_kernel_output(stream)
- return not color
-
-
-# If we're on Windows, we provide transparent integration through
-# colorama. This will make ANSI colors through the echo function
-# work automatically.
-if WIN:
- # Windows has a smaller terminal
- DEFAULT_COLUMNS = 79
-
- from ._winconsole import _get_windows_console_stream, _wrap_std_stream
-
- def _get_argv_encoding():
- import locale
-
- return locale.getpreferredencoding()
-
- if PY2:
-
- def raw_input(prompt=""):
- sys.stderr.flush()
- if prompt:
- stdout = _default_text_stdout()
- stdout.write(prompt)
- stdin = _default_text_stdin()
- return stdin.readline().rstrip("\r\n")
-
- try:
- import colorama
- except ImportError:
- pass
- else:
- _ansi_stream_wrappers = WeakKeyDictionary()
-
- def auto_wrap_for_ansi(stream, color=None):
- """This function wraps a stream so that calls through colorama
- are issued to the win32 console API to recolor on demand. It
- also ensures to reset the colors if a write call is interrupted
- to not destroy the console afterwards.
- """
- try:
- cached = _ansi_stream_wrappers.get(stream)
- except Exception:
- cached = None
- if cached is not None:
- return cached
- strip = should_strip_ansi(stream, color)
- ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip)
- rv = ansi_wrapper.stream
- _write = rv.write
-
- def _safe_write(s):
- try:
- return _write(s)
- except:
- ansi_wrapper.reset_all()
- raise
-
- rv.write = _safe_write
- try:
- _ansi_stream_wrappers[stream] = rv
- except Exception:
- pass
- return rv
-
- def get_winterm_size():
- win = colorama.win32.GetConsoleScreenBufferInfo(
- colorama.win32.STDOUT
- ).srWindow
- return win.Right - win.Left, win.Bottom - win.Top
-
-
-else:
-
- def _get_argv_encoding():
- return getattr(sys.stdin, "encoding", None) or get_filesystem_encoding()
-
- _get_windows_console_stream = lambda *x: None
- _wrap_std_stream = lambda *x: None
-
-
-def term_len(x):
- return len(strip_ansi(x))
-
-
-def isatty(stream):
- try:
- return stream.isatty()
- except Exception:
- return False
-
-
-def _make_cached_stream_func(src_func, wrapper_func):
- cache = WeakKeyDictionary()
-
- def func():
- stream = src_func()
- try:
- rv = cache.get(stream)
- except Exception:
- rv = None
- if rv is not None:
- return rv
- rv = wrapper_func()
- try:
- stream = src_func() # In case wrapper_func() modified the stream
- cache[stream] = rv
- except Exception:
- pass
- return rv
-
- return func
-
-
-_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin)
-_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout)
-_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr)
-
-
-binary_streams = {
- "stdin": get_binary_stdin,
- "stdout": get_binary_stdout,
- "stderr": get_binary_stderr,
-}
-
-text_streams = {
- "stdin": get_text_stdin,
- "stdout": get_text_stdout,
- "stderr": get_text_stderr,
-}
diff --git a/client/ayon_core/vendor/python/python_2/click/_termui_impl.py b/client/ayon_core/vendor/python/python_2/click/_termui_impl.py
deleted file mode 100644
index 88bec37701..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/_termui_impl.py
+++ /dev/null
@@ -1,657 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-This module contains implementations for the termui module. To keep the
-import time of Click down, some infrequently used functionality is
-placed in this module and only imported as needed.
-"""
-import contextlib
-import math
-import os
-import sys
-import time
-
-from ._compat import _default_text_stdout
-from ._compat import CYGWIN
-from ._compat import get_best_encoding
-from ._compat import int_types
-from ._compat import isatty
-from ._compat import open_stream
-from ._compat import range_type
-from ._compat import strip_ansi
-from ._compat import term_len
-from ._compat import WIN
-from .exceptions import ClickException
-from .utils import echo
-
-if os.name == "nt":
- BEFORE_BAR = "\r"
- AFTER_BAR = "\n"
-else:
- BEFORE_BAR = "\r\033[?25l"
- AFTER_BAR = "\033[?25h\n"
-
-
-def _length_hint(obj):
- """Returns the length hint of an object."""
- try:
- return len(obj)
- except (AttributeError, TypeError):
- try:
- get_hint = type(obj).__length_hint__
- except AttributeError:
- return None
- try:
- hint = get_hint(obj)
- except TypeError:
- return None
- if hint is NotImplemented or not isinstance(hint, int_types) or hint < 0:
- return None
- return hint
-
-
-class ProgressBar(object):
- def __init__(
- self,
- iterable,
- length=None,
- fill_char="#",
- empty_char=" ",
- bar_template="%(bar)s",
- info_sep=" ",
- show_eta=True,
- show_percent=None,
- show_pos=False,
- item_show_func=None,
- label=None,
- file=None,
- color=None,
- width=30,
- ):
- self.fill_char = fill_char
- self.empty_char = empty_char
- self.bar_template = bar_template
- self.info_sep = info_sep
- self.show_eta = show_eta
- self.show_percent = show_percent
- self.show_pos = show_pos
- self.item_show_func = item_show_func
- self.label = label or ""
- if file is None:
- file = _default_text_stdout()
- self.file = file
- self.color = color
- self.width = width
- self.autowidth = width == 0
-
- if length is None:
- length = _length_hint(iterable)
- if iterable is None:
- if length is None:
- raise TypeError("iterable or length is required")
- iterable = range_type(length)
- self.iter = iter(iterable)
- self.length = length
- self.length_known = length is not None
- self.pos = 0
- self.avg = []
- self.start = self.last_eta = time.time()
- self.eta_known = False
- self.finished = False
- self.max_width = None
- self.entered = False
- self.current_item = None
- self.is_hidden = not isatty(self.file)
- self._last_line = None
- self.short_limit = 0.5
-
- def __enter__(self):
- self.entered = True
- self.render_progress()
- return self
-
- def __exit__(self, exc_type, exc_value, tb):
- self.render_finish()
-
- def __iter__(self):
- if not self.entered:
- raise RuntimeError("You need to use progress bars in a with block.")
- self.render_progress()
- return self.generator()
-
- def __next__(self):
- # Iteration is defined in terms of a generator function,
- # returned by iter(self); use that to define next(). This works
- # because `self.iter` is an iterable consumed by that generator,
- # so it is re-entry safe. Calling `next(self.generator())`
- # twice works and does "what you want".
- return next(iter(self))
-
- # Python 2 compat
- next = __next__
-
- def is_fast(self):
- return time.time() - self.start <= self.short_limit
-
- def render_finish(self):
- if self.is_hidden or self.is_fast():
- return
- self.file.write(AFTER_BAR)
- self.file.flush()
-
- @property
- def pct(self):
- if self.finished:
- return 1.0
- return min(self.pos / (float(self.length) or 1), 1.0)
-
- @property
- def time_per_iteration(self):
- if not self.avg:
- return 0.0
- return sum(self.avg) / float(len(self.avg))
-
- @property
- def eta(self):
- if self.length_known and not self.finished:
- return self.time_per_iteration * (self.length - self.pos)
- return 0.0
-
- def format_eta(self):
- if self.eta_known:
- t = int(self.eta)
- seconds = t % 60
- t //= 60
- minutes = t % 60
- t //= 60
- hours = t % 24
- t //= 24
- if t > 0:
- return "{}d {:02}:{:02}:{:02}".format(t, hours, minutes, seconds)
- else:
- return "{:02}:{:02}:{:02}".format(hours, minutes, seconds)
- return ""
-
- def format_pos(self):
- pos = str(self.pos)
- if self.length_known:
- pos += "/{}".format(self.length)
- return pos
-
- def format_pct(self):
- return "{: 4}%".format(int(self.pct * 100))[1:]
-
- def format_bar(self):
- if self.length_known:
- bar_length = int(self.pct * self.width)
- bar = self.fill_char * bar_length
- bar += self.empty_char * (self.width - bar_length)
- elif self.finished:
- bar = self.fill_char * self.width
- else:
- bar = list(self.empty_char * (self.width or 1))
- if self.time_per_iteration != 0:
- bar[
- int(
- (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5)
- * self.width
- )
- ] = self.fill_char
- bar = "".join(bar)
- return bar
-
- def format_progress_line(self):
- show_percent = self.show_percent
-
- info_bits = []
- if self.length_known and show_percent is None:
- show_percent = not self.show_pos
-
- if self.show_pos:
- info_bits.append(self.format_pos())
- if show_percent:
- info_bits.append(self.format_pct())
- if self.show_eta and self.eta_known and not self.finished:
- info_bits.append(self.format_eta())
- if self.item_show_func is not None:
- item_info = self.item_show_func(self.current_item)
- if item_info is not None:
- info_bits.append(item_info)
-
- return (
- self.bar_template
- % {
- "label": self.label,
- "bar": self.format_bar(),
- "info": self.info_sep.join(info_bits),
- }
- ).rstrip()
-
- def render_progress(self):
- from .termui import get_terminal_size
-
- if self.is_hidden:
- return
-
- buf = []
- # Update width in case the terminal has been resized
- if self.autowidth:
- old_width = self.width
- self.width = 0
- clutter_length = term_len(self.format_progress_line())
- new_width = max(0, get_terminal_size()[0] - clutter_length)
- if new_width < old_width:
- buf.append(BEFORE_BAR)
- buf.append(" " * self.max_width)
- self.max_width = new_width
- self.width = new_width
-
- clear_width = self.width
- if self.max_width is not None:
- clear_width = self.max_width
-
- buf.append(BEFORE_BAR)
- line = self.format_progress_line()
- line_len = term_len(line)
- if self.max_width is None or self.max_width < line_len:
- self.max_width = line_len
-
- buf.append(line)
- buf.append(" " * (clear_width - line_len))
- line = "".join(buf)
- # Render the line only if it changed.
-
- if line != self._last_line and not self.is_fast():
- self._last_line = line
- echo(line, file=self.file, color=self.color, nl=False)
- self.file.flush()
-
- def make_step(self, n_steps):
- self.pos += n_steps
- if self.length_known and self.pos >= self.length:
- self.finished = True
-
- if (time.time() - self.last_eta) < 1.0:
- return
-
- self.last_eta = time.time()
-
- # self.avg is a rolling list of length <= 7 of steps where steps are
- # defined as time elapsed divided by the total progress through
- # self.length.
- if self.pos:
- step = (time.time() - self.start) / self.pos
- else:
- step = time.time() - self.start
-
- self.avg = self.avg[-6:] + [step]
-
- self.eta_known = self.length_known
-
- def update(self, n_steps):
- self.make_step(n_steps)
- self.render_progress()
-
- def finish(self):
- self.eta_known = 0
- self.current_item = None
- self.finished = True
-
- def generator(self):
- """Return a generator which yields the items added to the bar
- during construction, and updates the progress bar *after* the
- yielded block returns.
- """
- # WARNING: the iterator interface for `ProgressBar` relies on
- # this and only works because this is a simple generator which
- # doesn't create or manage additional state. If this function
- # changes, the impact should be evaluated both against
- # `iter(bar)` and `next(bar)`. `next()` in particular may call
- # `self.generator()` repeatedly, and this must remain safe in
- # order for that interface to work.
- if not self.entered:
- raise RuntimeError("You need to use progress bars in a with block.")
-
- if self.is_hidden:
- for rv in self.iter:
- yield rv
- else:
- for rv in self.iter:
- self.current_item = rv
- yield rv
- self.update(1)
- self.finish()
- self.render_progress()
-
-
-def pager(generator, color=None):
- """Decide what method to use for paging through text."""
- stdout = _default_text_stdout()
- if not isatty(sys.stdin) or not isatty(stdout):
- return _nullpager(stdout, generator, color)
- pager_cmd = (os.environ.get("PAGER", None) or "").strip()
- if pager_cmd:
- if WIN:
- return _tempfilepager(generator, pager_cmd, color)
- return _pipepager(generator, pager_cmd, color)
- if os.environ.get("TERM") in ("dumb", "emacs"):
- return _nullpager(stdout, generator, color)
- if WIN or sys.platform.startswith("os2"):
- return _tempfilepager(generator, "more <", color)
- if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0:
- return _pipepager(generator, "less", color)
-
- import tempfile
-
- fd, filename = tempfile.mkstemp()
- os.close(fd)
- try:
- if hasattr(os, "system") and os.system('more "{}"'.format(filename)) == 0:
- return _pipepager(generator, "more", color)
- return _nullpager(stdout, generator, color)
- finally:
- os.unlink(filename)
-
-
-def _pipepager(generator, cmd, color):
- """Page through text by feeding it to another program. Invoking a
- pager through this might support colors.
- """
- import subprocess
-
- env = dict(os.environ)
-
- # If we're piping to less we might support colors under the
- # condition that
- cmd_detail = cmd.rsplit("/", 1)[-1].split()
- if color is None and cmd_detail[0] == "less":
- less_flags = "{}{}".format(os.environ.get("LESS", ""), " ".join(cmd_detail[1:]))
- if not less_flags:
- env["LESS"] = "-R"
- color = True
- elif "r" in less_flags or "R" in less_flags:
- color = True
-
- c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env)
- encoding = get_best_encoding(c.stdin)
- try:
- for text in generator:
- if not color:
- text = strip_ansi(text)
-
- c.stdin.write(text.encode(encoding, "replace"))
- except (IOError, KeyboardInterrupt):
- pass
- else:
- c.stdin.close()
-
- # Less doesn't respect ^C, but catches it for its own UI purposes (aborting
- # search or other commands inside less).
- #
- # That means when the user hits ^C, the parent process (click) terminates,
- # but less is still alive, paging the output and messing up the terminal.
- #
- # If the user wants to make the pager exit on ^C, they should set
- # `LESS='-K'`. It's not our decision to make.
- while True:
- try:
- c.wait()
- except KeyboardInterrupt:
- pass
- else:
- break
-
-
-def _tempfilepager(generator, cmd, color):
- """Page through text by invoking a program on a temporary file."""
- import tempfile
-
- filename = tempfile.mktemp()
- # TODO: This never terminates if the passed generator never terminates.
- text = "".join(generator)
- if not color:
- text = strip_ansi(text)
- encoding = get_best_encoding(sys.stdout)
- with open_stream(filename, "wb")[0] as f:
- f.write(text.encode(encoding))
- try:
- os.system('{} "{}"'.format(cmd, filename))
- finally:
- os.unlink(filename)
-
-
-def _nullpager(stream, generator, color):
- """Simply print unformatted text. This is the ultimate fallback."""
- for text in generator:
- if not color:
- text = strip_ansi(text)
- stream.write(text)
-
-
-class Editor(object):
- def __init__(self, editor=None, env=None, require_save=True, extension=".txt"):
- self.editor = editor
- self.env = env
- self.require_save = require_save
- self.extension = extension
-
- def get_editor(self):
- if self.editor is not None:
- return self.editor
- for key in "VISUAL", "EDITOR":
- rv = os.environ.get(key)
- if rv:
- return rv
- if WIN:
- return "notepad"
- for editor in "sensible-editor", "vim", "nano":
- if os.system("which {} >/dev/null 2>&1".format(editor)) == 0:
- return editor
- return "vi"
-
- def edit_file(self, filename):
- import subprocess
-
- editor = self.get_editor()
- if self.env:
- environ = os.environ.copy()
- environ.update(self.env)
- else:
- environ = None
- try:
- c = subprocess.Popen(
- '{} "{}"'.format(editor, filename), env=environ, shell=True,
- )
- exit_code = c.wait()
- if exit_code != 0:
- raise ClickException("{}: Editing failed!".format(editor))
- except OSError as e:
- raise ClickException("{}: Editing failed: {}".format(editor, e))
-
- def edit(self, text):
- import tempfile
-
- text = text or ""
- if text and not text.endswith("\n"):
- text += "\n"
-
- fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension)
- try:
- if WIN:
- encoding = "utf-8-sig"
- text = text.replace("\n", "\r\n")
- else:
- encoding = "utf-8"
- text = text.encode(encoding)
-
- f = os.fdopen(fd, "wb")
- f.write(text)
- f.close()
- timestamp = os.path.getmtime(name)
-
- self.edit_file(name)
-
- if self.require_save and os.path.getmtime(name) == timestamp:
- return None
-
- f = open(name, "rb")
- try:
- rv = f.read()
- finally:
- f.close()
- return rv.decode("utf-8-sig").replace("\r\n", "\n")
- finally:
- os.unlink(name)
-
-
-def open_url(url, wait=False, locate=False):
- import subprocess
-
- def _unquote_file(url):
- try:
- import urllib
- except ImportError:
- import urllib
- if url.startswith("file://"):
- url = urllib.unquote(url[7:])
- return url
-
- if sys.platform == "darwin":
- args = ["open"]
- if wait:
- args.append("-W")
- if locate:
- args.append("-R")
- args.append(_unquote_file(url))
- null = open("/dev/null", "w")
- try:
- return subprocess.Popen(args, stderr=null).wait()
- finally:
- null.close()
- elif WIN:
- if locate:
- url = _unquote_file(url)
- args = 'explorer /select,"{}"'.format(_unquote_file(url.replace('"', "")))
- else:
- args = 'start {} "" "{}"'.format(
- "/WAIT" if wait else "", url.replace('"', "")
- )
- return os.system(args)
- elif CYGWIN:
- if locate:
- url = _unquote_file(url)
- args = 'cygstart "{}"'.format(os.path.dirname(url).replace('"', ""))
- else:
- args = 'cygstart {} "{}"'.format("-w" if wait else "", url.replace('"', ""))
- return os.system(args)
-
- try:
- if locate:
- url = os.path.dirname(_unquote_file(url)) or "."
- else:
- url = _unquote_file(url)
- c = subprocess.Popen(["xdg-open", url])
- if wait:
- return c.wait()
- return 0
- except OSError:
- if url.startswith(("http://", "https://")) and not locate and not wait:
- import webbrowser
-
- webbrowser.open(url)
- return 0
- return 1
-
-
-def _translate_ch_to_exc(ch):
- if ch == u"\x03":
- raise KeyboardInterrupt()
- if ch == u"\x04" and not WIN: # Unix-like, Ctrl+D
- raise EOFError()
- if ch == u"\x1a" and WIN: # Windows, Ctrl+Z
- raise EOFError()
-
-
-if WIN:
- import msvcrt
-
- @contextlib.contextmanager
- def raw_terminal():
- yield
-
- def getchar(echo):
- # The function `getch` will return a bytes object corresponding to
- # the pressed character. Since Windows 10 build 1803, it will also
- # return \x00 when called a second time after pressing a regular key.
- #
- # `getwch` does not share this probably-bugged behavior. Moreover, it
- # returns a Unicode object by default, which is what we want.
- #
- # Either of these functions will return \x00 or \xe0 to indicate
- # a special key, and you need to call the same function again to get
- # the "rest" of the code. The fun part is that \u00e0 is
- # "latin small letter a with grave", so if you type that on a French
- # keyboard, you _also_ get a \xe0.
- # E.g., consider the Up arrow. This returns \xe0 and then \x48. The
- # resulting Unicode string reads as "a with grave" + "capital H".
- # This is indistinguishable from when the user actually types
- # "a with grave" and then "capital H".
- #
- # When \xe0 is returned, we assume it's part of a special-key sequence
- # and call `getwch` again, but that means that when the user types
- # the \u00e0 character, `getchar` doesn't return until a second
- # character is typed.
- # The alternative is returning immediately, but that would mess up
- # cross-platform handling of arrow keys and others that start with
- # \xe0. Another option is using `getch`, but then we can't reliably
- # read non-ASCII characters, because return values of `getch` are
- # limited to the current 8-bit codepage.
- #
- # Anyway, Click doesn't claim to do this Right(tm), and using `getwch`
- # is doing the right thing in more situations than with `getch`.
- if echo:
- func = msvcrt.getwche
- else:
- func = msvcrt.getwch
-
- rv = func()
- if rv in (u"\x00", u"\xe0"):
- # \x00 and \xe0 are control characters that indicate special key,
- # see above.
- rv += func()
- _translate_ch_to_exc(rv)
- return rv
-
-
-else:
- import tty
- import termios
-
- @contextlib.contextmanager
- def raw_terminal():
- if not isatty(sys.stdin):
- f = open("/dev/tty")
- fd = f.fileno()
- else:
- fd = sys.stdin.fileno()
- f = None
- try:
- old_settings = termios.tcgetattr(fd)
- try:
- tty.setraw(fd)
- yield fd
- finally:
- termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
- sys.stdout.flush()
- if f is not None:
- f.close()
- except termios.error:
- pass
-
- def getchar(echo):
- with raw_terminal() as fd:
- ch = os.read(fd, 32)
- ch = ch.decode(get_best_encoding(sys.stdin), "replace")
- if echo and isatty(sys.stdout):
- sys.stdout.write(ch)
- _translate_ch_to_exc(ch)
- return ch
diff --git a/client/ayon_core/vendor/python/python_2/click/_textwrap.py b/client/ayon_core/vendor/python/python_2/click/_textwrap.py
deleted file mode 100644
index 6959087b7f..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/_textwrap.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import textwrap
-from contextlib import contextmanager
-
-
-class TextWrapper(textwrap.TextWrapper):
- def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):
- space_left = max(width - cur_len, 1)
-
- if self.break_long_words:
- last = reversed_chunks[-1]
- cut = last[:space_left]
- res = last[space_left:]
- cur_line.append(cut)
- reversed_chunks[-1] = res
- elif not cur_line:
- cur_line.append(reversed_chunks.pop())
-
- @contextmanager
- def extra_indent(self, indent):
- old_initial_indent = self.initial_indent
- old_subsequent_indent = self.subsequent_indent
- self.initial_indent += indent
- self.subsequent_indent += indent
- try:
- yield
- finally:
- self.initial_indent = old_initial_indent
- self.subsequent_indent = old_subsequent_indent
-
- def indent_only(self, text):
- rv = []
- for idx, line in enumerate(text.splitlines()):
- indent = self.initial_indent
- if idx > 0:
- indent = self.subsequent_indent
- rv.append(indent + line)
- return "\n".join(rv)
diff --git a/client/ayon_core/vendor/python/python_2/click/_unicodefun.py b/client/ayon_core/vendor/python/python_2/click/_unicodefun.py
deleted file mode 100644
index 781c365227..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/_unicodefun.py
+++ /dev/null
@@ -1,131 +0,0 @@
-import codecs
-import os
-import sys
-
-from ._compat import PY2
-
-
-def _find_unicode_literals_frame():
- import __future__
-
- if not hasattr(sys, "_getframe"): # not all Python implementations have it
- return 0
- frm = sys._getframe(1)
- idx = 1
- while frm is not None:
- if frm.f_globals.get("__name__", "").startswith("click."):
- frm = frm.f_back
- idx += 1
- elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag:
- return idx
- else:
- break
- return 0
-
-
-def _check_for_unicode_literals():
- if not __debug__:
- return
-
- from . import disable_unicode_literals_warning
-
- if not PY2 or disable_unicode_literals_warning:
- return
- bad_frame = _find_unicode_literals_frame()
- if bad_frame <= 0:
- return
- from warnings import warn
-
- warn(
- Warning(
- "Click detected the use of the unicode_literals __future__"
- " import. This is heavily discouraged because it can"
- " introduce subtle bugs in your code. You should instead"
- ' use explicit u"" literals for your unicode strings. For'
- " more information see"
- " https://click.palletsprojects.com/python3/"
- ),
- stacklevel=bad_frame,
- )
-
-
-def _verify_python3_env():
- """Ensures that the environment is good for unicode on Python 3."""
- if PY2:
- return
- try:
- import locale
-
- fs_enc = codecs.lookup(locale.getpreferredencoding()).name
- except Exception:
- fs_enc = "ascii"
- if fs_enc != "ascii":
- return
-
- extra = ""
- if os.name == "posix":
- import subprocess
-
- try:
- rv = subprocess.Popen(
- ["locale", "-a"], stdout=subprocess.PIPE, stderr=subprocess.PIPE
- ).communicate()[0]
- except OSError:
- rv = b""
- good_locales = set()
- has_c_utf8 = False
-
- # Make sure we're operating on text here.
- if isinstance(rv, bytes):
- rv = rv.decode("ascii", "replace")
-
- for line in rv.splitlines():
- locale = line.strip()
- if locale.lower().endswith((".utf-8", ".utf8")):
- good_locales.add(locale)
- if locale.lower() in ("c.utf8", "c.utf-8"):
- has_c_utf8 = True
-
- extra += "\n\n"
- if not good_locales:
- extra += (
- "Additional information: on this system no suitable"
- " UTF-8 locales were discovered. This most likely"
- " requires resolving by reconfiguring the locale"
- " system."
- )
- elif has_c_utf8:
- extra += (
- "This system supports the C.UTF-8 locale which is"
- " recommended. You might be able to resolve your issue"
- " by exporting the following environment variables:\n\n"
- " export LC_ALL=C.UTF-8\n"
- " export LANG=C.UTF-8"
- )
- else:
- extra += (
- "This system lists a couple of UTF-8 supporting locales"
- " that you can pick from. The following suitable"
- " locales were discovered: {}".format(", ".join(sorted(good_locales)))
- )
-
- bad_locale = None
- for locale in os.environ.get("LC_ALL"), os.environ.get("LANG"):
- if locale and locale.lower().endswith((".utf-8", ".utf8")):
- bad_locale = locale
- if locale is not None:
- break
- if bad_locale is not None:
- extra += (
- "\n\nClick discovered that you exported a UTF-8 locale"
- " but the locale system could not pick up from it"
- " because it does not exist. The exported locale is"
- " '{}' but it is not supported".format(bad_locale)
- )
-
- raise RuntimeError(
- "Click will abort further execution because Python 3 was"
- " configured to use ASCII as encoding for the environment."
- " Consult https://click.palletsprojects.com/python3/ for"
- " mitigation steps.{}".format(extra)
- )
diff --git a/client/ayon_core/vendor/python/python_2/click/_winconsole.py b/client/ayon_core/vendor/python/python_2/click/_winconsole.py
deleted file mode 100644
index b6c4274af0..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/_winconsole.py
+++ /dev/null
@@ -1,370 +0,0 @@
-# -*- coding: utf-8 -*-
-# This module is based on the excellent work by Adam Bartoš who
-# provided a lot of what went into the implementation here in
-# the discussion to issue1602 in the Python bug tracker.
-#
-# There are some general differences in regards to how this works
-# compared to the original patches as we do not need to patch
-# the entire interpreter but just work in our little world of
-# echo and prmopt.
-import ctypes
-import io
-import os
-import sys
-import time
-import zlib
-from ctypes import byref
-from ctypes import c_char
-from ctypes import c_char_p
-from ctypes import c_int
-from ctypes import c_ssize_t
-from ctypes import c_ulong
-from ctypes import c_void_p
-from ctypes import POINTER
-from ctypes import py_object
-from ctypes import windll
-from ctypes import WinError
-from ctypes import WINFUNCTYPE
-from ctypes.wintypes import DWORD
-from ctypes.wintypes import HANDLE
-from ctypes.wintypes import LPCWSTR
-from ctypes.wintypes import LPWSTR
-
-import msvcrt
-
-from ._compat import _NonClosingTextIOWrapper
-from ._compat import PY2
-from ._compat import text_type
-
-try:
- from ctypes import pythonapi
-
- PyObject_GetBuffer = pythonapi.PyObject_GetBuffer
- PyBuffer_Release = pythonapi.PyBuffer_Release
-except ImportError:
- pythonapi = None
-
-
-c_ssize_p = POINTER(c_ssize_t)
-
-kernel32 = windll.kernel32
-GetStdHandle = kernel32.GetStdHandle
-ReadConsoleW = kernel32.ReadConsoleW
-WriteConsoleW = kernel32.WriteConsoleW
-GetConsoleMode = kernel32.GetConsoleMode
-GetLastError = kernel32.GetLastError
-GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32))
-CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))(
- ("CommandLineToArgvW", windll.shell32)
-)
-LocalFree = WINFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p)(
- ("LocalFree", windll.kernel32)
-)
-
-
-STDIN_HANDLE = GetStdHandle(-10)
-STDOUT_HANDLE = GetStdHandle(-11)
-STDERR_HANDLE = GetStdHandle(-12)
-
-
-PyBUF_SIMPLE = 0
-PyBUF_WRITABLE = 1
-
-ERROR_SUCCESS = 0
-ERROR_NOT_ENOUGH_MEMORY = 8
-ERROR_OPERATION_ABORTED = 995
-
-STDIN_FILENO = 0
-STDOUT_FILENO = 1
-STDERR_FILENO = 2
-
-EOF = b"\x1a"
-MAX_BYTES_WRITTEN = 32767
-
-
-class Py_buffer(ctypes.Structure):
- _fields_ = [
- ("buf", c_void_p),
- ("obj", py_object),
- ("len", c_ssize_t),
- ("itemsize", c_ssize_t),
- ("readonly", c_int),
- ("ndim", c_int),
- ("format", c_char_p),
- ("shape", c_ssize_p),
- ("strides", c_ssize_p),
- ("suboffsets", c_ssize_p),
- ("internal", c_void_p),
- ]
-
- if PY2:
- _fields_.insert(-1, ("smalltable", c_ssize_t * 2))
-
-
-# On PyPy we cannot get buffers so our ability to operate here is
-# serverly limited.
-if pythonapi is None:
- get_buffer = None
-else:
-
- def get_buffer(obj, writable=False):
- buf = Py_buffer()
- flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE
- PyObject_GetBuffer(py_object(obj), byref(buf), flags)
- try:
- buffer_type = c_char * buf.len
- return buffer_type.from_address(buf.buf)
- finally:
- PyBuffer_Release(byref(buf))
-
-
-class _WindowsConsoleRawIOBase(io.RawIOBase):
- def __init__(self, handle):
- self.handle = handle
-
- def isatty(self):
- io.RawIOBase.isatty(self)
- return True
-
-
-class _WindowsConsoleReader(_WindowsConsoleRawIOBase):
- def readable(self):
- return True
-
- def readinto(self, b):
- bytes_to_be_read = len(b)
- if not bytes_to_be_read:
- return 0
- elif bytes_to_be_read % 2:
- raise ValueError(
- "cannot read odd number of bytes from UTF-16-LE encoded console"
- )
-
- buffer = get_buffer(b, writable=True)
- code_units_to_be_read = bytes_to_be_read // 2
- code_units_read = c_ulong()
-
- rv = ReadConsoleW(
- HANDLE(self.handle),
- buffer,
- code_units_to_be_read,
- byref(code_units_read),
- None,
- )
- if GetLastError() == ERROR_OPERATION_ABORTED:
- # wait for KeyboardInterrupt
- time.sleep(0.1)
- if not rv:
- raise OSError("Windows error: {}".format(GetLastError()))
-
- if buffer[0] == EOF:
- return 0
- return 2 * code_units_read.value
-
-
-class _WindowsConsoleWriter(_WindowsConsoleRawIOBase):
- def writable(self):
- return True
-
- @staticmethod
- def _get_error_message(errno):
- if errno == ERROR_SUCCESS:
- return "ERROR_SUCCESS"
- elif errno == ERROR_NOT_ENOUGH_MEMORY:
- return "ERROR_NOT_ENOUGH_MEMORY"
- return "Windows error {}".format(errno)
-
- def write(self, b):
- bytes_to_be_written = len(b)
- buf = get_buffer(b)
- code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2
- code_units_written = c_ulong()
-
- WriteConsoleW(
- HANDLE(self.handle),
- buf,
- code_units_to_be_written,
- byref(code_units_written),
- None,
- )
- bytes_written = 2 * code_units_written.value
-
- if bytes_written == 0 and bytes_to_be_written > 0:
- raise OSError(self._get_error_message(GetLastError()))
- return bytes_written
-
-
-class ConsoleStream(object):
- def __init__(self, text_stream, byte_stream):
- self._text_stream = text_stream
- self.buffer = byte_stream
-
- @property
- def name(self):
- return self.buffer.name
-
- def write(self, x):
- if isinstance(x, text_type):
- return self._text_stream.write(x)
- try:
- self.flush()
- except Exception:
- pass
- return self.buffer.write(x)
-
- def writelines(self, lines):
- for line in lines:
- self.write(line)
-
- def __getattr__(self, name):
- return getattr(self._text_stream, name)
-
- def isatty(self):
- return self.buffer.isatty()
-
- def __repr__(self):
- return "".format(
- self.name, self.encoding
- )
-
-
-class WindowsChunkedWriter(object):
- """
- Wraps a stream (such as stdout), acting as a transparent proxy for all
- attribute access apart from method 'write()' which we wrap to write in
- limited chunks due to a Windows limitation on binary console streams.
- """
-
- def __init__(self, wrapped):
- # double-underscore everything to prevent clashes with names of
- # attributes on the wrapped stream object.
- self.__wrapped = wrapped
-
- def __getattr__(self, name):
- return getattr(self.__wrapped, name)
-
- def write(self, text):
- total_to_write = len(text)
- written = 0
-
- while written < total_to_write:
- to_write = min(total_to_write - written, MAX_BYTES_WRITTEN)
- self.__wrapped.write(text[written : written + to_write])
- written += to_write
-
-
-_wrapped_std_streams = set()
-
-
-def _wrap_std_stream(name):
- # Python 2 & Windows 7 and below
- if (
- PY2
- and sys.getwindowsversion()[:2] <= (6, 1)
- and name not in _wrapped_std_streams
- ):
- setattr(sys, name, WindowsChunkedWriter(getattr(sys, name)))
- _wrapped_std_streams.add(name)
-
-
-def _get_text_stdin(buffer_stream):
- text_stream = _NonClosingTextIOWrapper(
- io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)),
- "utf-16-le",
- "strict",
- line_buffering=True,
- )
- return ConsoleStream(text_stream, buffer_stream)
-
-
-def _get_text_stdout(buffer_stream):
- text_stream = _NonClosingTextIOWrapper(
- io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)),
- "utf-16-le",
- "strict",
- line_buffering=True,
- )
- return ConsoleStream(text_stream, buffer_stream)
-
-
-def _get_text_stderr(buffer_stream):
- text_stream = _NonClosingTextIOWrapper(
- io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)),
- "utf-16-le",
- "strict",
- line_buffering=True,
- )
- return ConsoleStream(text_stream, buffer_stream)
-
-
-if PY2:
-
- def _hash_py_argv():
- return zlib.crc32("\x00".join(sys.argv[1:]))
-
- _initial_argv_hash = _hash_py_argv()
-
- def _get_windows_argv():
- argc = c_int(0)
- argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc))
- if not argv_unicode:
- raise WinError()
- try:
- argv = [argv_unicode[i] for i in range(0, argc.value)]
- finally:
- LocalFree(argv_unicode)
- del argv_unicode
-
- if not hasattr(sys, "frozen"):
- argv = argv[1:]
- while len(argv) > 0:
- arg = argv[0]
- if not arg.startswith("-") or arg == "-":
- break
- argv = argv[1:]
- if arg.startswith(("-c", "-m")):
- break
-
- return argv[1:]
-
-
-_stream_factories = {
- 0: _get_text_stdin,
- 1: _get_text_stdout,
- 2: _get_text_stderr,
-}
-
-
-def _is_console(f):
- if not hasattr(f, "fileno"):
- return False
-
- try:
- fileno = f.fileno()
- except OSError:
- return False
-
- handle = msvcrt.get_osfhandle(fileno)
- return bool(GetConsoleMode(handle, byref(DWORD())))
-
-
-def _get_windows_console_stream(f, encoding, errors):
- if (
- get_buffer is not None
- and encoding in ("utf-16-le", None)
- and errors in ("strict", None)
- and _is_console(f)
- ):
- func = _stream_factories.get(f.fileno())
- if func is not None:
- if not PY2:
- f = getattr(f, "buffer", None)
- if f is None:
- return None
- else:
- # If we are on Python 2 we need to set the stream that we
- # deal with to binary mode as otherwise the exercise if a
- # bit moot. The same problems apply as for
- # get_binary_stdin and friends from _compat.
- msvcrt.setmode(f.fileno(), os.O_BINARY)
- return func(f)
diff --git a/client/ayon_core/vendor/python/python_2/click/core.py b/client/ayon_core/vendor/python/python_2/click/core.py
deleted file mode 100644
index f58bf26d2f..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/core.py
+++ /dev/null
@@ -1,2030 +0,0 @@
-import errno
-import inspect
-import os
-import sys
-from contextlib import contextmanager
-from functools import update_wrapper
-from itertools import repeat
-
-from ._compat import isidentifier
-from ._compat import iteritems
-from ._compat import PY2
-from ._compat import string_types
-from ._unicodefun import _check_for_unicode_literals
-from ._unicodefun import _verify_python3_env
-from .exceptions import Abort
-from .exceptions import BadParameter
-from .exceptions import ClickException
-from .exceptions import Exit
-from .exceptions import MissingParameter
-from .exceptions import UsageError
-from .formatting import HelpFormatter
-from .formatting import join_options
-from .globals import pop_context
-from .globals import push_context
-from .parser import OptionParser
-from .parser import split_opt
-from .termui import confirm
-from .termui import prompt
-from .termui import style
-from .types import BOOL
-from .types import convert_type
-from .types import IntRange
-from .utils import echo
-from .utils import get_os_args
-from .utils import make_default_short_help
-from .utils import make_str
-from .utils import PacifyFlushWrapper
-
-_missing = object()
-
-SUBCOMMAND_METAVAR = "COMMAND [ARGS]..."
-SUBCOMMANDS_METAVAR = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..."
-
-DEPRECATED_HELP_NOTICE = " (DEPRECATED)"
-DEPRECATED_INVOKE_NOTICE = "DeprecationWarning: The command %(name)s is deprecated."
-
-
-def _maybe_show_deprecated_notice(cmd):
- if cmd.deprecated:
- echo(style(DEPRECATED_INVOKE_NOTICE % {"name": cmd.name}, fg="red"), err=True)
-
-
-def fast_exit(code):
- """Exit without garbage collection, this speeds up exit by about 10ms for
- things like bash completion.
- """
- sys.stdout.flush()
- sys.stderr.flush()
- os._exit(code)
-
-
-def _bashcomplete(cmd, prog_name, complete_var=None):
- """Internal handler for the bash completion support."""
- if complete_var is None:
- complete_var = "_{}_COMPLETE".format(prog_name.replace("-", "_").upper())
- complete_instr = os.environ.get(complete_var)
- if not complete_instr:
- return
-
- from ._bashcomplete import bashcomplete
-
- if bashcomplete(cmd, prog_name, complete_var, complete_instr):
- fast_exit(1)
-
-
-def _check_multicommand(base_command, cmd_name, cmd, register=False):
- if not base_command.chain or not isinstance(cmd, MultiCommand):
- return
- if register:
- hint = (
- "It is not possible to add multi commands as children to"
- " another multi command that is in chain mode."
- )
- else:
- hint = (
- "Found a multi command as subcommand to a multi command"
- " that is in chain mode. This is not supported."
- )
- raise RuntimeError(
- "{}. Command '{}' is set to chain and '{}' was added as"
- " subcommand but it in itself is a multi command. ('{}' is a {}"
- " within a chained {} named '{}').".format(
- hint,
- base_command.name,
- cmd_name,
- cmd_name,
- cmd.__class__.__name__,
- base_command.__class__.__name__,
- base_command.name,
- )
- )
-
-
-def batch(iterable, batch_size):
- return list(zip(*repeat(iter(iterable), batch_size)))
-
-
-def invoke_param_callback(callback, ctx, param, value):
- code = getattr(callback, "__code__", None)
- args = getattr(code, "co_argcount", 3)
-
- if args < 3:
- from warnings import warn
-
- warn(
- "Parameter callbacks take 3 args, (ctx, param, value). The"
- " 2-arg style is deprecated and will be removed in 8.0.".format(callback),
- DeprecationWarning,
- stacklevel=3,
- )
- return callback(ctx, value)
-
- return callback(ctx, param, value)
-
-
-@contextmanager
-def augment_usage_errors(ctx, param=None):
- """Context manager that attaches extra information to exceptions."""
- try:
- yield
- except BadParameter as e:
- if e.ctx is None:
- e.ctx = ctx
- if param is not None and e.param is None:
- e.param = param
- raise
- except UsageError as e:
- if e.ctx is None:
- e.ctx = ctx
- raise
-
-
-def iter_params_for_processing(invocation_order, declaration_order):
- """Given a sequence of parameters in the order as should be considered
- for processing and an iterable of parameters that exist, this returns
- a list in the correct order as they should be processed.
- """
-
- def sort_key(item):
- try:
- idx = invocation_order.index(item)
- except ValueError:
- idx = float("inf")
- return (not item.is_eager, idx)
-
- return sorted(declaration_order, key=sort_key)
-
-
-class Context(object):
- """The context is a special internal object that holds state relevant
- for the script execution at every single level. It's normally invisible
- to commands unless they opt-in to getting access to it.
-
- The context is useful as it can pass internal objects around and can
- control special execution features such as reading data from
- environment variables.
-
- A context can be used as context manager in which case it will call
- :meth:`close` on teardown.
-
- .. versionadded:: 2.0
- Added the `resilient_parsing`, `help_option_names`,
- `token_normalize_func` parameters.
-
- .. versionadded:: 3.0
- Added the `allow_extra_args` and `allow_interspersed_args`
- parameters.
-
- .. versionadded:: 4.0
- Added the `color`, `ignore_unknown_options`, and
- `max_content_width` parameters.
-
- .. versionadded:: 7.1
- Added the `show_default` parameter.
-
- :param command: the command class for this context.
- :param parent: the parent context.
- :param info_name: the info name for this invocation. Generally this
- is the most descriptive name for the script or
- command. For the toplevel script it is usually
- the name of the script, for commands below it it's
- the name of the script.
- :param obj: an arbitrary object of user data.
- :param auto_envvar_prefix: the prefix to use for automatic environment
- variables. If this is `None` then reading
- from environment variables is disabled. This
- does not affect manually set environment
- variables which are always read.
- :param default_map: a dictionary (like object) with default values
- for parameters.
- :param terminal_width: the width of the terminal. The default is
- inherit from parent context. If no context
- defines the terminal width then auto
- detection will be applied.
- :param max_content_width: the maximum width for content rendered by
- Click (this currently only affects help
- pages). This defaults to 80 characters if
- not overridden. In other words: even if the
- terminal is larger than that, Click will not
- format things wider than 80 characters by
- default. In addition to that, formatters might
- add some safety mapping on the right.
- :param resilient_parsing: if this flag is enabled then Click will
- parse without any interactivity or callback
- invocation. Default values will also be
- ignored. This is useful for implementing
- things such as completion support.
- :param allow_extra_args: if this is set to `True` then extra arguments
- at the end will not raise an error and will be
- kept on the context. The default is to inherit
- from the command.
- :param allow_interspersed_args: if this is set to `False` then options
- and arguments cannot be mixed. The
- default is to inherit from the command.
- :param ignore_unknown_options: instructs click to ignore options it does
- not know and keeps them for later
- processing.
- :param help_option_names: optionally a list of strings that define how
- the default help parameter is named. The
- default is ``['--help']``.
- :param token_normalize_func: an optional function that is used to
- normalize tokens (options, choices,
- etc.). This for instance can be used to
- implement case insensitive behavior.
- :param color: controls if the terminal supports ANSI colors or not. The
- default is autodetection. This is only needed if ANSI
- codes are used in texts that Click prints which is by
- default not the case. This for instance would affect
- help output.
- :param show_default: if True, shows defaults for all options.
- Even if an option is later created with show_default=False,
- this command-level setting overrides it.
- """
-
- def __init__(
- self,
- command,
- parent=None,
- info_name=None,
- obj=None,
- auto_envvar_prefix=None,
- default_map=None,
- terminal_width=None,
- max_content_width=None,
- resilient_parsing=False,
- allow_extra_args=None,
- allow_interspersed_args=None,
- ignore_unknown_options=None,
- help_option_names=None,
- token_normalize_func=None,
- color=None,
- show_default=None,
- ):
- #: the parent context or `None` if none exists.
- self.parent = parent
- #: the :class:`Command` for this context.
- self.command = command
- #: the descriptive information name
- self.info_name = info_name
- #: the parsed parameters except if the value is hidden in which
- #: case it's not remembered.
- self.params = {}
- #: the leftover arguments.
- self.args = []
- #: protected arguments. These are arguments that are prepended
- #: to `args` when certain parsing scenarios are encountered but
- #: must be never propagated to another arguments. This is used
- #: to implement nested parsing.
- self.protected_args = []
- if obj is None and parent is not None:
- obj = parent.obj
- #: the user object stored.
- self.obj = obj
- self._meta = getattr(parent, "meta", {})
-
- #: A dictionary (-like object) with defaults for parameters.
- if (
- default_map is None
- and parent is not None
- and parent.default_map is not None
- ):
- default_map = parent.default_map.get(info_name)
- self.default_map = default_map
-
- #: This flag indicates if a subcommand is going to be executed. A
- #: group callback can use this information to figure out if it's
- #: being executed directly or because the execution flow passes
- #: onwards to a subcommand. By default it's None, but it can be
- #: the name of the subcommand to execute.
- #:
- #: If chaining is enabled this will be set to ``'*'`` in case
- #: any commands are executed. It is however not possible to
- #: figure out which ones. If you require this knowledge you
- #: should use a :func:`resultcallback`.
- self.invoked_subcommand = None
-
- if terminal_width is None and parent is not None:
- terminal_width = parent.terminal_width
- #: The width of the terminal (None is autodetection).
- self.terminal_width = terminal_width
-
- if max_content_width is None and parent is not None:
- max_content_width = parent.max_content_width
- #: The maximum width of formatted content (None implies a sensible
- #: default which is 80 for most things).
- self.max_content_width = max_content_width
-
- if allow_extra_args is None:
- allow_extra_args = command.allow_extra_args
- #: Indicates if the context allows extra args or if it should
- #: fail on parsing.
- #:
- #: .. versionadded:: 3.0
- self.allow_extra_args = allow_extra_args
-
- if allow_interspersed_args is None:
- allow_interspersed_args = command.allow_interspersed_args
- #: Indicates if the context allows mixing of arguments and
- #: options or not.
- #:
- #: .. versionadded:: 3.0
- self.allow_interspersed_args = allow_interspersed_args
-
- if ignore_unknown_options is None:
- ignore_unknown_options = command.ignore_unknown_options
- #: Instructs click to ignore options that a command does not
- #: understand and will store it on the context for later
- #: processing. This is primarily useful for situations where you
- #: want to call into external programs. Generally this pattern is
- #: strongly discouraged because it's not possibly to losslessly
- #: forward all arguments.
- #:
- #: .. versionadded:: 4.0
- self.ignore_unknown_options = ignore_unknown_options
-
- if help_option_names is None:
- if parent is not None:
- help_option_names = parent.help_option_names
- else:
- help_option_names = ["--help"]
-
- #: The names for the help options.
- self.help_option_names = help_option_names
-
- if token_normalize_func is None and parent is not None:
- token_normalize_func = parent.token_normalize_func
-
- #: An optional normalization function for tokens. This is
- #: options, choices, commands etc.
- self.token_normalize_func = token_normalize_func
-
- #: Indicates if resilient parsing is enabled. In that case Click
- #: will do its best to not cause any failures and default values
- #: will be ignored. Useful for completion.
- self.resilient_parsing = resilient_parsing
-
- # If there is no envvar prefix yet, but the parent has one and
- # the command on this level has a name, we can expand the envvar
- # prefix automatically.
- if auto_envvar_prefix is None:
- if (
- parent is not None
- and parent.auto_envvar_prefix is not None
- and self.info_name is not None
- ):
- auto_envvar_prefix = "{}_{}".format(
- parent.auto_envvar_prefix, self.info_name.upper()
- )
- else:
- auto_envvar_prefix = auto_envvar_prefix.upper()
- if auto_envvar_prefix is not None:
- auto_envvar_prefix = auto_envvar_prefix.replace("-", "_")
- self.auto_envvar_prefix = auto_envvar_prefix
-
- if color is None and parent is not None:
- color = parent.color
-
- #: Controls if styling output is wanted or not.
- self.color = color
-
- self.show_default = show_default
-
- self._close_callbacks = []
- self._depth = 0
-
- def __enter__(self):
- self._depth += 1
- push_context(self)
- return self
-
- def __exit__(self, exc_type, exc_value, tb):
- self._depth -= 1
- if self._depth == 0:
- self.close()
- pop_context()
-
- @contextmanager
- def scope(self, cleanup=True):
- """This helper method can be used with the context object to promote
- it to the current thread local (see :func:`get_current_context`).
- The default behavior of this is to invoke the cleanup functions which
- can be disabled by setting `cleanup` to `False`. The cleanup
- functions are typically used for things such as closing file handles.
-
- If the cleanup is intended the context object can also be directly
- used as a context manager.
-
- Example usage::
-
- with ctx.scope():
- assert get_current_context() is ctx
-
- This is equivalent::
-
- with ctx:
- assert get_current_context() is ctx
-
- .. versionadded:: 5.0
-
- :param cleanup: controls if the cleanup functions should be run or
- not. The default is to run these functions. In
- some situations the context only wants to be
- temporarily pushed in which case this can be disabled.
- Nested pushes automatically defer the cleanup.
- """
- if not cleanup:
- self._depth += 1
- try:
- with self as rv:
- yield rv
- finally:
- if not cleanup:
- self._depth -= 1
-
- @property
- def meta(self):
- """This is a dictionary which is shared with all the contexts
- that are nested. It exists so that click utilities can store some
- state here if they need to. It is however the responsibility of
- that code to manage this dictionary well.
-
- The keys are supposed to be unique dotted strings. For instance
- module paths are a good choice for it. What is stored in there is
- irrelevant for the operation of click. However what is important is
- that code that places data here adheres to the general semantics of
- the system.
-
- Example usage::
-
- LANG_KEY = f'{__name__}.lang'
-
- def set_language(value):
- ctx = get_current_context()
- ctx.meta[LANG_KEY] = value
-
- def get_language():
- return get_current_context().meta.get(LANG_KEY, 'en_US')
-
- .. versionadded:: 5.0
- """
- return self._meta
-
- def make_formatter(self):
- """Creates the formatter for the help and usage output."""
- return HelpFormatter(
- width=self.terminal_width, max_width=self.max_content_width
- )
-
- def call_on_close(self, f):
- """This decorator remembers a function as callback that should be
- executed when the context tears down. This is most useful to bind
- resource handling to the script execution. For instance, file objects
- opened by the :class:`File` type will register their close callbacks
- here.
-
- :param f: the function to execute on teardown.
- """
- self._close_callbacks.append(f)
- return f
-
- def close(self):
- """Invokes all close callbacks."""
- for cb in self._close_callbacks:
- cb()
- self._close_callbacks = []
-
- @property
- def command_path(self):
- """The computed command path. This is used for the ``usage``
- information on the help page. It's automatically created by
- combining the info names of the chain of contexts to the root.
- """
- rv = ""
- if self.info_name is not None:
- rv = self.info_name
- if self.parent is not None:
- rv = "{} {}".format(self.parent.command_path, rv)
- return rv.lstrip()
-
- def find_root(self):
- """Finds the outermost context."""
- node = self
- while node.parent is not None:
- node = node.parent
- return node
-
- def find_object(self, object_type):
- """Finds the closest object of a given type."""
- node = self
- while node is not None:
- if isinstance(node.obj, object_type):
- return node.obj
- node = node.parent
-
- def ensure_object(self, object_type):
- """Like :meth:`find_object` but sets the innermost object to a
- new instance of `object_type` if it does not exist.
- """
- rv = self.find_object(object_type)
- if rv is None:
- self.obj = rv = object_type()
- return rv
-
- def lookup_default(self, name):
- """Looks up the default for a parameter name. This by default
- looks into the :attr:`default_map` if available.
- """
- if self.default_map is not None:
- rv = self.default_map.get(name)
- if callable(rv):
- rv = rv()
- return rv
-
- def fail(self, message):
- """Aborts the execution of the program with a specific error
- message.
-
- :param message: the error message to fail with.
- """
- raise UsageError(message, self)
-
- def abort(self):
- """Aborts the script."""
- raise Abort()
-
- def exit(self, code=0):
- """Exits the application with a given exit code."""
- raise Exit(code)
-
- def get_usage(self):
- """Helper method to get formatted usage string for the current
- context and command.
- """
- return self.command.get_usage(self)
-
- def get_help(self):
- """Helper method to get formatted help page for the current
- context and command.
- """
- return self.command.get_help(self)
-
- def invoke(*args, **kwargs): # noqa: B902
- """Invokes a command callback in exactly the way it expects. There
- are two ways to invoke this method:
-
- 1. the first argument can be a callback and all other arguments and
- keyword arguments are forwarded directly to the function.
- 2. the first argument is a click command object. In that case all
- arguments are forwarded as well but proper click parameters
- (options and click arguments) must be keyword arguments and Click
- will fill in defaults.
-
- Note that before Click 3.2 keyword arguments were not properly filled
- in against the intention of this code and no context was created. For
- more information about this change and why it was done in a bugfix
- release see :ref:`upgrade-to-3.2`.
- """
- self, callback = args[:2]
- ctx = self
-
- # It's also possible to invoke another command which might or
- # might not have a callback. In that case we also fill
- # in defaults and make a new context for this command.
- if isinstance(callback, Command):
- other_cmd = callback
- callback = other_cmd.callback
- ctx = Context(other_cmd, info_name=other_cmd.name, parent=self)
- if callback is None:
- raise TypeError(
- "The given command does not have a callback that can be invoked."
- )
-
- for param in other_cmd.params:
- if param.name not in kwargs and param.expose_value:
- kwargs[param.name] = param.get_default(ctx)
-
- args = args[2:]
- with augment_usage_errors(self):
- with ctx:
- return callback(*args, **kwargs)
-
- def forward(*args, **kwargs): # noqa: B902
- """Similar to :meth:`invoke` but fills in default keyword
- arguments from the current context if the other command expects
- it. This cannot invoke callbacks directly, only other commands.
- """
- self, cmd = args[:2]
-
- # It's also possible to invoke another command which might or
- # might not have a callback.
- if not isinstance(cmd, Command):
- raise TypeError("Callback is not a command.")
-
- for param in self.params:
- if param not in kwargs:
- kwargs[param] = self.params[param]
-
- return self.invoke(cmd, **kwargs)
-
-
-class BaseCommand(object):
- """The base command implements the minimal API contract of commands.
- Most code will never use this as it does not implement a lot of useful
- functionality but it can act as the direct subclass of alternative
- parsing methods that do not depend on the Click parser.
-
- For instance, this can be used to bridge Click and other systems like
- argparse or docopt.
-
- Because base commands do not implement a lot of the API that other
- parts of Click take for granted, they are not supported for all
- operations. For instance, they cannot be used with the decorators
- usually and they have no built-in callback system.
-
- .. versionchanged:: 2.0
- Added the `context_settings` parameter.
-
- :param name: the name of the command to use unless a group overrides it.
- :param context_settings: an optional dictionary with defaults that are
- passed to the context object.
- """
-
- #: the default for the :attr:`Context.allow_extra_args` flag.
- allow_extra_args = False
- #: the default for the :attr:`Context.allow_interspersed_args` flag.
- allow_interspersed_args = True
- #: the default for the :attr:`Context.ignore_unknown_options` flag.
- ignore_unknown_options = False
-
- def __init__(self, name, context_settings=None):
- #: the name the command thinks it has. Upon registering a command
- #: on a :class:`Group` the group will default the command name
- #: with this information. You should instead use the
- #: :class:`Context`\'s :attr:`~Context.info_name` attribute.
- self.name = name
- if context_settings is None:
- context_settings = {}
- #: an optional dictionary with defaults passed to the context.
- self.context_settings = context_settings
-
- def __repr__(self):
- return "<{} {}>".format(self.__class__.__name__, self.name)
-
- def get_usage(self, ctx):
- raise NotImplementedError("Base commands cannot get usage")
-
- def get_help(self, ctx):
- raise NotImplementedError("Base commands cannot get help")
-
- def make_context(self, info_name, args, parent=None, **extra):
- """This function when given an info name and arguments will kick
- off the parsing and create a new :class:`Context`. It does not
- invoke the actual command callback though.
-
- :param info_name: the info name for this invokation. Generally this
- is the most descriptive name for the script or
- command. For the toplevel script it's usually
- the name of the script, for commands below it it's
- the name of the script.
- :param args: the arguments to parse as list of strings.
- :param parent: the parent context if available.
- :param extra: extra keyword arguments forwarded to the context
- constructor.
- """
- for key, value in iteritems(self.context_settings):
- if key not in extra:
- extra[key] = value
- ctx = Context(self, info_name=info_name, parent=parent, **extra)
- with ctx.scope(cleanup=False):
- self.parse_args(ctx, args)
- return ctx
-
- def parse_args(self, ctx, args):
- """Given a context and a list of arguments this creates the parser
- and parses the arguments, then modifies the context as necessary.
- This is automatically invoked by :meth:`make_context`.
- """
- raise NotImplementedError("Base commands do not know how to parse arguments.")
-
- def invoke(self, ctx):
- """Given a context, this invokes the command. The default
- implementation is raising a not implemented error.
- """
- raise NotImplementedError("Base commands are not invokable by default")
-
- def main(
- self,
- args=None,
- prog_name=None,
- complete_var=None,
- standalone_mode=True,
- **extra
- ):
- """This is the way to invoke a script with all the bells and
- whistles as a command line application. This will always terminate
- the application after a call. If this is not wanted, ``SystemExit``
- needs to be caught.
-
- This method is also available by directly calling the instance of
- a :class:`Command`.
-
- .. versionadded:: 3.0
- Added the `standalone_mode` flag to control the standalone mode.
-
- :param args: the arguments that should be used for parsing. If not
- provided, ``sys.argv[1:]`` is used.
- :param prog_name: the program name that should be used. By default
- the program name is constructed by taking the file
- name from ``sys.argv[0]``.
- :param complete_var: the environment variable that controls the
- bash completion support. The default is
- ``"__COMPLETE"`` with prog_name in
- uppercase.
- :param standalone_mode: the default behavior is to invoke the script
- in standalone mode. Click will then
- handle exceptions and convert them into
- error messages and the function will never
- return but shut down the interpreter. If
- this is set to `False` they will be
- propagated to the caller and the return
- value of this function is the return value
- of :meth:`invoke`.
- :param extra: extra keyword arguments are forwarded to the context
- constructor. See :class:`Context` for more information.
- """
- # If we are in Python 3, we will verify that the environment is
- # sane at this point or reject further execution to avoid a
- # broken script.
- if not PY2:
- _verify_python3_env()
- else:
- _check_for_unicode_literals()
-
- if args is None:
- args = get_os_args()
- else:
- args = list(args)
-
- if prog_name is None:
- prog_name = make_str(
- os.path.basename(sys.argv[0] if sys.argv else __file__)
- )
-
- # Hook for the Bash completion. This only activates if the Bash
- # completion is actually enabled, otherwise this is quite a fast
- # noop.
- _bashcomplete(self, prog_name, complete_var)
-
- try:
- try:
- with self.make_context(prog_name, args, **extra) as ctx:
- rv = self.invoke(ctx)
- if not standalone_mode:
- return rv
- # it's not safe to `ctx.exit(rv)` here!
- # note that `rv` may actually contain data like "1" which
- # has obvious effects
- # more subtle case: `rv=[None, None]` can come out of
- # chained commands which all returned `None` -- so it's not
- # even always obvious that `rv` indicates success/failure
- # by its truthiness/falsiness
- ctx.exit()
- except (EOFError, KeyboardInterrupt):
- echo(file=sys.stderr)
- raise Abort()
- except ClickException as e:
- if not standalone_mode:
- raise
- e.show()
- sys.exit(e.exit_code)
- except IOError as e:
- if e.errno == errno.EPIPE:
- sys.stdout = PacifyFlushWrapper(sys.stdout)
- sys.stderr = PacifyFlushWrapper(sys.stderr)
- sys.exit(1)
- else:
- raise
- except Exit as e:
- if standalone_mode:
- sys.exit(e.exit_code)
- else:
- # in non-standalone mode, return the exit code
- # note that this is only reached if `self.invoke` above raises
- # an Exit explicitly -- thus bypassing the check there which
- # would return its result
- # the results of non-standalone execution may therefore be
- # somewhat ambiguous: if there are codepaths which lead to
- # `ctx.exit(1)` and to `return 1`, the caller won't be able to
- # tell the difference between the two
- return e.exit_code
- except Abort:
- if not standalone_mode:
- raise
- echo("Aborted!", file=sys.stderr)
- sys.exit(1)
-
- def __call__(self, *args, **kwargs):
- """Alias for :meth:`main`."""
- return self.main(*args, **kwargs)
-
-
-class Command(BaseCommand):
- """Commands are the basic building block of command line interfaces in
- Click. A basic command handles command line parsing and might dispatch
- more parsing to commands nested below it.
-
- .. versionchanged:: 2.0
- Added the `context_settings` parameter.
- .. versionchanged:: 7.1
- Added the `no_args_is_help` parameter.
-
- :param name: the name of the command to use unless a group overrides it.
- :param context_settings: an optional dictionary with defaults that are
- passed to the context object.
- :param callback: the callback to invoke. This is optional.
- :param params: the parameters to register with this command. This can
- be either :class:`Option` or :class:`Argument` objects.
- :param help: the help string to use for this command.
- :param epilog: like the help string but it's printed at the end of the
- help page after everything else.
- :param short_help: the short help to use for this command. This is
- shown on the command listing of the parent command.
- :param add_help_option: by default each command registers a ``--help``
- option. This can be disabled by this parameter.
- :param no_args_is_help: this controls what happens if no arguments are
- provided. This option is disabled by default.
- If enabled this will add ``--help`` as argument
- if no arguments are passed
- :param hidden: hide this command from help outputs.
-
- :param deprecated: issues a message indicating that
- the command is deprecated.
- """
-
- def __init__(
- self,
- name,
- context_settings=None,
- callback=None,
- params=None,
- help=None,
- epilog=None,
- short_help=None,
- options_metavar="[OPTIONS]",
- add_help_option=True,
- no_args_is_help=False,
- hidden=False,
- deprecated=False,
- ):
- BaseCommand.__init__(self, name, context_settings)
- #: the callback to execute when the command fires. This might be
- #: `None` in which case nothing happens.
- self.callback = callback
- #: the list of parameters for this command in the order they
- #: should show up in the help page and execute. Eager parameters
- #: will automatically be handled before non eager ones.
- self.params = params or []
- # if a form feed (page break) is found in the help text, truncate help
- # text to the content preceding the first form feed
- if help and "\f" in help:
- help = help.split("\f", 1)[0]
- self.help = help
- self.epilog = epilog
- self.options_metavar = options_metavar
- self.short_help = short_help
- self.add_help_option = add_help_option
- self.no_args_is_help = no_args_is_help
- self.hidden = hidden
- self.deprecated = deprecated
-
- def get_usage(self, ctx):
- """Formats the usage line into a string and returns it.
-
- Calls :meth:`format_usage` internally.
- """
- formatter = ctx.make_formatter()
- self.format_usage(ctx, formatter)
- return formatter.getvalue().rstrip("\n")
-
- def get_params(self, ctx):
- rv = self.params
- help_option = self.get_help_option(ctx)
- if help_option is not None:
- rv = rv + [help_option]
- return rv
-
- def format_usage(self, ctx, formatter):
- """Writes the usage line into the formatter.
-
- This is a low-level method called by :meth:`get_usage`.
- """
- pieces = self.collect_usage_pieces(ctx)
- formatter.write_usage(ctx.command_path, " ".join(pieces))
-
- def collect_usage_pieces(self, ctx):
- """Returns all the pieces that go into the usage line and returns
- it as a list of strings.
- """
- rv = [self.options_metavar]
- for param in self.get_params(ctx):
- rv.extend(param.get_usage_pieces(ctx))
- return rv
-
- def get_help_option_names(self, ctx):
- """Returns the names for the help option."""
- all_names = set(ctx.help_option_names)
- for param in self.params:
- all_names.difference_update(param.opts)
- all_names.difference_update(param.secondary_opts)
- return all_names
-
- def get_help_option(self, ctx):
- """Returns the help option object."""
- help_options = self.get_help_option_names(ctx)
- if not help_options or not self.add_help_option:
- return
-
- def show_help(ctx, param, value):
- if value and not ctx.resilient_parsing:
- echo(ctx.get_help(), color=ctx.color)
- ctx.exit()
-
- return Option(
- help_options,
- is_flag=True,
- is_eager=True,
- expose_value=False,
- callback=show_help,
- help="Show this message and exit.",
- )
-
- def make_parser(self, ctx):
- """Creates the underlying option parser for this command."""
- parser = OptionParser(ctx)
- for param in self.get_params(ctx):
- param.add_to_parser(parser, ctx)
- return parser
-
- def get_help(self, ctx):
- """Formats the help into a string and returns it.
-
- Calls :meth:`format_help` internally.
- """
- formatter = ctx.make_formatter()
- self.format_help(ctx, formatter)
- return formatter.getvalue().rstrip("\n")
-
- def get_short_help_str(self, limit=45):
- """Gets short help for the command or makes it by shortening the
- long help string.
- """
- return (
- self.short_help
- or self.help
- and make_default_short_help(self.help, limit)
- or ""
- )
-
- def format_help(self, ctx, formatter):
- """Writes the help into the formatter if it exists.
-
- This is a low-level method called by :meth:`get_help`.
-
- This calls the following methods:
-
- - :meth:`format_usage`
- - :meth:`format_help_text`
- - :meth:`format_options`
- - :meth:`format_epilog`
- """
- self.format_usage(ctx, formatter)
- self.format_help_text(ctx, formatter)
- self.format_options(ctx, formatter)
- self.format_epilog(ctx, formatter)
-
- def format_help_text(self, ctx, formatter):
- """Writes the help text to the formatter if it exists."""
- if self.help:
- formatter.write_paragraph()
- with formatter.indentation():
- help_text = self.help
- if self.deprecated:
- help_text += DEPRECATED_HELP_NOTICE
- formatter.write_text(help_text)
- elif self.deprecated:
- formatter.write_paragraph()
- with formatter.indentation():
- formatter.write_text(DEPRECATED_HELP_NOTICE)
-
- def format_options(self, ctx, formatter):
- """Writes all the options into the formatter if they exist."""
- opts = []
- for param in self.get_params(ctx):
- rv = param.get_help_record(ctx)
- if rv is not None:
- opts.append(rv)
-
- if opts:
- with formatter.section("Options"):
- formatter.write_dl(opts)
-
- def format_epilog(self, ctx, formatter):
- """Writes the epilog into the formatter if it exists."""
- if self.epilog:
- formatter.write_paragraph()
- with formatter.indentation():
- formatter.write_text(self.epilog)
-
- def parse_args(self, ctx, args):
- if not args and self.no_args_is_help and not ctx.resilient_parsing:
- echo(ctx.get_help(), color=ctx.color)
- ctx.exit()
-
- parser = self.make_parser(ctx)
- opts, args, param_order = parser.parse_args(args=args)
-
- for param in iter_params_for_processing(param_order, self.get_params(ctx)):
- value, args = param.handle_parse_result(ctx, opts, args)
-
- if args and not ctx.allow_extra_args and not ctx.resilient_parsing:
- ctx.fail(
- "Got unexpected extra argument{} ({})".format(
- "s" if len(args) != 1 else "", " ".join(map(make_str, args))
- )
- )
-
- ctx.args = args
- return args
-
- def invoke(self, ctx):
- """Given a context, this invokes the attached callback (if it exists)
- in the right way.
- """
- _maybe_show_deprecated_notice(self)
- if self.callback is not None:
- return ctx.invoke(self.callback, **ctx.params)
-
-
-class MultiCommand(Command):
- """A multi command is the basic implementation of a command that
- dispatches to subcommands. The most common version is the
- :class:`Group`.
-
- :param invoke_without_command: this controls how the multi command itself
- is invoked. By default it's only invoked
- if a subcommand is provided.
- :param no_args_is_help: this controls what happens if no arguments are
- provided. This option is enabled by default if
- `invoke_without_command` is disabled or disabled
- if it's enabled. If enabled this will add
- ``--help`` as argument if no arguments are
- passed.
- :param subcommand_metavar: the string that is used in the documentation
- to indicate the subcommand place.
- :param chain: if this is set to `True` chaining of multiple subcommands
- is enabled. This restricts the form of commands in that
- they cannot have optional arguments but it allows
- multiple commands to be chained together.
- :param result_callback: the result callback to attach to this multi
- command.
- """
-
- allow_extra_args = True
- allow_interspersed_args = False
-
- def __init__(
- self,
- name=None,
- invoke_without_command=False,
- no_args_is_help=None,
- subcommand_metavar=None,
- chain=False,
- result_callback=None,
- **attrs
- ):
- Command.__init__(self, name, **attrs)
- if no_args_is_help is None:
- no_args_is_help = not invoke_without_command
- self.no_args_is_help = no_args_is_help
- self.invoke_without_command = invoke_without_command
- if subcommand_metavar is None:
- if chain:
- subcommand_metavar = SUBCOMMANDS_METAVAR
- else:
- subcommand_metavar = SUBCOMMAND_METAVAR
- self.subcommand_metavar = subcommand_metavar
- self.chain = chain
- #: The result callback that is stored. This can be set or
- #: overridden with the :func:`resultcallback` decorator.
- self.result_callback = result_callback
-
- if self.chain:
- for param in self.params:
- if isinstance(param, Argument) and not param.required:
- raise RuntimeError(
- "Multi commands in chain mode cannot have"
- " optional arguments."
- )
-
- def collect_usage_pieces(self, ctx):
- rv = Command.collect_usage_pieces(self, ctx)
- rv.append(self.subcommand_metavar)
- return rv
-
- def format_options(self, ctx, formatter):
- Command.format_options(self, ctx, formatter)
- self.format_commands(ctx, formatter)
-
- def resultcallback(self, replace=False):
- """Adds a result callback to the chain command. By default if a
- result callback is already registered this will chain them but
- this can be disabled with the `replace` parameter. The result
- callback is invoked with the return value of the subcommand
- (or the list of return values from all subcommands if chaining
- is enabled) as well as the parameters as they would be passed
- to the main callback.
-
- Example::
-
- @click.group()
- @click.option('-i', '--input', default=23)
- def cli(input):
- return 42
-
- @cli.resultcallback()
- def process_result(result, input):
- return result + input
-
- .. versionadded:: 3.0
-
- :param replace: if set to `True` an already existing result
- callback will be removed.
- """
-
- def decorator(f):
- old_callback = self.result_callback
- if old_callback is None or replace:
- self.result_callback = f
- return f
-
- def function(__value, *args, **kwargs):
- return f(old_callback(__value, *args, **kwargs), *args, **kwargs)
-
- self.result_callback = rv = update_wrapper(function, f)
- return rv
-
- return decorator
-
- def format_commands(self, ctx, formatter):
- """Extra format methods for multi methods that adds all the commands
- after the options.
- """
- commands = []
- for subcommand in self.list_commands(ctx):
- cmd = self.get_command(ctx, subcommand)
- # What is this, the tool lied about a command. Ignore it
- if cmd is None:
- continue
- if cmd.hidden:
- continue
-
- commands.append((subcommand, cmd))
-
- # allow for 3 times the default spacing
- if len(commands):
- limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands)
-
- rows = []
- for subcommand, cmd in commands:
- help = cmd.get_short_help_str(limit)
- rows.append((subcommand, help))
-
- if rows:
- with formatter.section("Commands"):
- formatter.write_dl(rows)
-
- def parse_args(self, ctx, args):
- if not args and self.no_args_is_help and not ctx.resilient_parsing:
- echo(ctx.get_help(), color=ctx.color)
- ctx.exit()
-
- rest = Command.parse_args(self, ctx, args)
- if self.chain:
- ctx.protected_args = rest
- ctx.args = []
- elif rest:
- ctx.protected_args, ctx.args = rest[:1], rest[1:]
-
- return ctx.args
-
- def invoke(self, ctx):
- def _process_result(value):
- if self.result_callback is not None:
- value = ctx.invoke(self.result_callback, value, **ctx.params)
- return value
-
- if not ctx.protected_args:
- # If we are invoked without command the chain flag controls
- # how this happens. If we are not in chain mode, the return
- # value here is the return value of the command.
- # If however we are in chain mode, the return value is the
- # return value of the result processor invoked with an empty
- # list (which means that no subcommand actually was executed).
- if self.invoke_without_command:
- if not self.chain:
- return Command.invoke(self, ctx)
- with ctx:
- Command.invoke(self, ctx)
- return _process_result([])
- ctx.fail("Missing command.")
-
- # Fetch args back out
- args = ctx.protected_args + ctx.args
- ctx.args = []
- ctx.protected_args = []
-
- # If we're not in chain mode, we only allow the invocation of a
- # single command but we also inform the current context about the
- # name of the command to invoke.
- if not self.chain:
- # Make sure the context is entered so we do not clean up
- # resources until the result processor has worked.
- with ctx:
- cmd_name, cmd, args = self.resolve_command(ctx, args)
- ctx.invoked_subcommand = cmd_name
- Command.invoke(self, ctx)
- sub_ctx = cmd.make_context(cmd_name, args, parent=ctx)
- with sub_ctx:
- return _process_result(sub_ctx.command.invoke(sub_ctx))
-
- # In chain mode we create the contexts step by step, but after the
- # base command has been invoked. Because at that point we do not
- # know the subcommands yet, the invoked subcommand attribute is
- # set to ``*`` to inform the command that subcommands are executed
- # but nothing else.
- with ctx:
- ctx.invoked_subcommand = "*" if args else None
- Command.invoke(self, ctx)
-
- # Otherwise we make every single context and invoke them in a
- # chain. In that case the return value to the result processor
- # is the list of all invoked subcommand's results.
- contexts = []
- while args:
- cmd_name, cmd, args = self.resolve_command(ctx, args)
- sub_ctx = cmd.make_context(
- cmd_name,
- args,
- parent=ctx,
- allow_extra_args=True,
- allow_interspersed_args=False,
- )
- contexts.append(sub_ctx)
- args, sub_ctx.args = sub_ctx.args, []
-
- rv = []
- for sub_ctx in contexts:
- with sub_ctx:
- rv.append(sub_ctx.command.invoke(sub_ctx))
- return _process_result(rv)
-
- def resolve_command(self, ctx, args):
- cmd_name = make_str(args[0])
- original_cmd_name = cmd_name
-
- # Get the command
- cmd = self.get_command(ctx, cmd_name)
-
- # If we can't find the command but there is a normalization
- # function available, we try with that one.
- if cmd is None and ctx.token_normalize_func is not None:
- cmd_name = ctx.token_normalize_func(cmd_name)
- cmd = self.get_command(ctx, cmd_name)
-
- # If we don't find the command we want to show an error message
- # to the user that it was not provided. However, there is
- # something else we should do: if the first argument looks like
- # an option we want to kick off parsing again for arguments to
- # resolve things like --help which now should go to the main
- # place.
- if cmd is None and not ctx.resilient_parsing:
- if split_opt(cmd_name)[0]:
- self.parse_args(ctx, ctx.args)
- ctx.fail("No such command '{}'.".format(original_cmd_name))
-
- return cmd_name, cmd, args[1:]
-
- def get_command(self, ctx, cmd_name):
- """Given a context and a command name, this returns a
- :class:`Command` object if it exists or returns `None`.
- """
- raise NotImplementedError()
-
- def list_commands(self, ctx):
- """Returns a list of subcommand names in the order they should
- appear.
- """
- return []
-
-
-class Group(MultiCommand):
- """A group allows a command to have subcommands attached. This is the
- most common way to implement nesting in Click.
-
- :param commands: a dictionary of commands.
- """
-
- def __init__(self, name=None, commands=None, **attrs):
- MultiCommand.__init__(self, name, **attrs)
- #: the registered subcommands by their exported names.
- self.commands = commands or {}
-
- def add_command(self, cmd, name=None):
- """Registers another :class:`Command` with this group. If the name
- is not provided, the name of the command is used.
- """
- name = name or cmd.name
- if name is None:
- raise TypeError("Command has no name.")
- _check_multicommand(self, name, cmd, register=True)
- self.commands[name] = cmd
-
- def command(self, *args, **kwargs):
- """A shortcut decorator for declaring and attaching a command to
- the group. This takes the same arguments as :func:`command` but
- immediately registers the created command with this instance by
- calling into :meth:`add_command`.
- """
- from .decorators import command
-
- def decorator(f):
- cmd = command(*args, **kwargs)(f)
- self.add_command(cmd)
- return cmd
-
- return decorator
-
- def group(self, *args, **kwargs):
- """A shortcut decorator for declaring and attaching a group to
- the group. This takes the same arguments as :func:`group` but
- immediately registers the created command with this instance by
- calling into :meth:`add_command`.
- """
- from .decorators import group
-
- def decorator(f):
- cmd = group(*args, **kwargs)(f)
- self.add_command(cmd)
- return cmd
-
- return decorator
-
- def get_command(self, ctx, cmd_name):
- return self.commands.get(cmd_name)
-
- def list_commands(self, ctx):
- return sorted(self.commands)
-
-
-class CommandCollection(MultiCommand):
- """A command collection is a multi command that merges multiple multi
- commands together into one. This is a straightforward implementation
- that accepts a list of different multi commands as sources and
- provides all the commands for each of them.
- """
-
- def __init__(self, name=None, sources=None, **attrs):
- MultiCommand.__init__(self, name, **attrs)
- #: The list of registered multi commands.
- self.sources = sources or []
-
- def add_source(self, multi_cmd):
- """Adds a new multi command to the chain dispatcher."""
- self.sources.append(multi_cmd)
-
- def get_command(self, ctx, cmd_name):
- for source in self.sources:
- rv = source.get_command(ctx, cmd_name)
- if rv is not None:
- if self.chain:
- _check_multicommand(self, cmd_name, rv)
- return rv
-
- def list_commands(self, ctx):
- rv = set()
- for source in self.sources:
- rv.update(source.list_commands(ctx))
- return sorted(rv)
-
-
-class Parameter(object):
- r"""A parameter to a command comes in two versions: they are either
- :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently
- not supported by design as some of the internals for parsing are
- intentionally not finalized.
-
- Some settings are supported by both options and arguments.
-
- :param param_decls: the parameter declarations for this option or
- argument. This is a list of flags or argument
- names.
- :param type: the type that should be used. Either a :class:`ParamType`
- or a Python type. The later is converted into the former
- automatically if supported.
- :param required: controls if this is optional or not.
- :param default: the default value if omitted. This can also be a callable,
- in which case it's invoked when the default is needed
- without any arguments.
- :param callback: a callback that should be executed after the parameter
- was matched. This is called as ``fn(ctx, param,
- value)`` and needs to return the value.
- :param nargs: the number of arguments to match. If not ``1`` the return
- value is a tuple instead of single value. The default for
- nargs is ``1`` (except if the type is a tuple, then it's
- the arity of the tuple).
- :param metavar: how the value is represented in the help page.
- :param expose_value: if this is `True` then the value is passed onwards
- to the command callback and stored on the context,
- otherwise it's skipped.
- :param is_eager: eager values are processed before non eager ones. This
- should not be set for arguments or it will inverse the
- order of processing.
- :param envvar: a string or list of strings that are environment variables
- that should be checked.
-
- .. versionchanged:: 7.1
- Empty environment variables are ignored rather than taking the
- empty string value. This makes it possible for scripts to clear
- variables if they can't unset them.
-
- .. versionchanged:: 2.0
- Changed signature for parameter callback to also be passed the
- parameter. The old callback format will still work, but it will
- raise a warning to give you a chance to migrate the code easier.
- """
- param_type_name = "parameter"
-
- def __init__(
- self,
- param_decls=None,
- type=None,
- required=False,
- default=None,
- callback=None,
- nargs=None,
- metavar=None,
- expose_value=True,
- is_eager=False,
- envvar=None,
- autocompletion=None,
- ):
- self.name, self.opts, self.secondary_opts = self._parse_decls(
- param_decls or (), expose_value
- )
-
- self.type = convert_type(type, default)
-
- # Default nargs to what the type tells us if we have that
- # information available.
- if nargs is None:
- if self.type.is_composite:
- nargs = self.type.arity
- else:
- nargs = 1
-
- self.required = required
- self.callback = callback
- self.nargs = nargs
- self.multiple = False
- self.expose_value = expose_value
- self.default = default
- self.is_eager = is_eager
- self.metavar = metavar
- self.envvar = envvar
- self.autocompletion = autocompletion
-
- def __repr__(self):
- return "<{} {}>".format(self.__class__.__name__, self.name)
-
- @property
- def human_readable_name(self):
- """Returns the human readable name of this parameter. This is the
- same as the name for options, but the metavar for arguments.
- """
- return self.name
-
- def make_metavar(self):
- if self.metavar is not None:
- return self.metavar
- metavar = self.type.get_metavar(self)
- if metavar is None:
- metavar = self.type.name.upper()
- if self.nargs != 1:
- metavar += "..."
- return metavar
-
- def get_default(self, ctx):
- """Given a context variable this calculates the default value."""
- # Otherwise go with the regular default.
- if callable(self.default):
- rv = self.default()
- else:
- rv = self.default
- return self.type_cast_value(ctx, rv)
-
- def add_to_parser(self, parser, ctx):
- pass
-
- def consume_value(self, ctx, opts):
- value = opts.get(self.name)
- if value is None:
- value = self.value_from_envvar(ctx)
- if value is None:
- value = ctx.lookup_default(self.name)
- return value
-
- def type_cast_value(self, ctx, value):
- """Given a value this runs it properly through the type system.
- This automatically handles things like `nargs` and `multiple` as
- well as composite types.
- """
- if self.type.is_composite:
- if self.nargs <= 1:
- raise TypeError(
- "Attempted to invoke composite type but nargs has"
- " been set to {}. This is not supported; nargs"
- " needs to be set to a fixed value > 1.".format(self.nargs)
- )
- if self.multiple:
- return tuple(self.type(x or (), self, ctx) for x in value or ())
- return self.type(value or (), self, ctx)
-
- def _convert(value, level):
- if level == 0:
- return self.type(value, self, ctx)
- return tuple(_convert(x, level - 1) for x in value or ())
-
- return _convert(value, (self.nargs != 1) + bool(self.multiple))
-
- def process_value(self, ctx, value):
- """Given a value and context this runs the logic to convert the
- value as necessary.
- """
- # If the value we were given is None we do nothing. This way
- # code that calls this can easily figure out if something was
- # not provided. Otherwise it would be converted into an empty
- # tuple for multiple invocations which is inconvenient.
- if value is not None:
- return self.type_cast_value(ctx, value)
-
- def value_is_missing(self, value):
- if value is None:
- return True
- if (self.nargs != 1 or self.multiple) and value == ():
- return True
- return False
-
- def full_process_value(self, ctx, value):
- value = self.process_value(ctx, value)
-
- if value is None and not ctx.resilient_parsing:
- value = self.get_default(ctx)
-
- if self.required and self.value_is_missing(value):
- raise MissingParameter(ctx=ctx, param=self)
-
- return value
-
- def resolve_envvar_value(self, ctx):
- if self.envvar is None:
- return
- if isinstance(self.envvar, (tuple, list)):
- for envvar in self.envvar:
- rv = os.environ.get(envvar)
- if rv is not None:
- return rv
- else:
- rv = os.environ.get(self.envvar)
-
- if rv != "":
- return rv
-
- def value_from_envvar(self, ctx):
- rv = self.resolve_envvar_value(ctx)
- if rv is not None and self.nargs != 1:
- rv = self.type.split_envvar_value(rv)
- return rv
-
- def handle_parse_result(self, ctx, opts, args):
- with augment_usage_errors(ctx, param=self):
- value = self.consume_value(ctx, opts)
- try:
- value = self.full_process_value(ctx, value)
- except Exception:
- if not ctx.resilient_parsing:
- raise
- value = None
- if self.callback is not None:
- try:
- value = invoke_param_callback(self.callback, ctx, self, value)
- except Exception:
- if not ctx.resilient_parsing:
- raise
-
- if self.expose_value:
- ctx.params[self.name] = value
- return value, args
-
- def get_help_record(self, ctx):
- pass
-
- def get_usage_pieces(self, ctx):
- return []
-
- def get_error_hint(self, ctx):
- """Get a stringified version of the param for use in error messages to
- indicate which param caused the error.
- """
- hint_list = self.opts or [self.human_readable_name]
- return " / ".join(repr(x) for x in hint_list)
-
-
-class Option(Parameter):
- """Options are usually optional values on the command line and
- have some extra features that arguments don't have.
-
- All other parameters are passed onwards to the parameter constructor.
-
- :param show_default: controls if the default value should be shown on the
- help page. Normally, defaults are not shown. If this
- value is a string, it shows the string instead of the
- value. This is particularly useful for dynamic options.
- :param show_envvar: controls if an environment variable should be shown on
- the help page. Normally, environment variables
- are not shown.
- :param prompt: if set to `True` or a non empty string then the user will be
- prompted for input. If set to `True` the prompt will be the
- option name capitalized.
- :param confirmation_prompt: if set then the value will need to be confirmed
- if it was prompted for.
- :param hide_input: if this is `True` then the input on the prompt will be
- hidden from the user. This is useful for password
- input.
- :param is_flag: forces this option to act as a flag. The default is
- auto detection.
- :param flag_value: which value should be used for this flag if it's
- enabled. This is set to a boolean automatically if
- the option string contains a slash to mark two options.
- :param multiple: if this is set to `True` then the argument is accepted
- multiple times and recorded. This is similar to ``nargs``
- in how it works but supports arbitrary number of
- arguments.
- :param count: this flag makes an option increment an integer.
- :param allow_from_autoenv: if this is enabled then the value of this
- parameter will be pulled from an environment
- variable in case a prefix is defined on the
- context.
- :param help: the help string.
- :param hidden: hide this option from help outputs.
- """
-
- param_type_name = "option"
-
- def __init__(
- self,
- param_decls=None,
- show_default=False,
- prompt=False,
- confirmation_prompt=False,
- hide_input=False,
- is_flag=None,
- flag_value=None,
- multiple=False,
- count=False,
- allow_from_autoenv=True,
- type=None,
- help=None,
- hidden=False,
- show_choices=True,
- show_envvar=False,
- **attrs
- ):
- default_is_missing = attrs.get("default", _missing) is _missing
- Parameter.__init__(self, param_decls, type=type, **attrs)
-
- if prompt is True:
- prompt_text = self.name.replace("_", " ").capitalize()
- elif prompt is False:
- prompt_text = None
- else:
- prompt_text = prompt
- self.prompt = prompt_text
- self.confirmation_prompt = confirmation_prompt
- self.hide_input = hide_input
- self.hidden = hidden
-
- # Flags
- if is_flag is None:
- if flag_value is not None:
- is_flag = True
- else:
- is_flag = bool(self.secondary_opts)
- if is_flag and default_is_missing:
- self.default = False
- if flag_value is None:
- flag_value = not self.default
- self.is_flag = is_flag
- self.flag_value = flag_value
- if self.is_flag and isinstance(self.flag_value, bool) and type in [None, bool]:
- self.type = BOOL
- self.is_bool_flag = True
- else:
- self.is_bool_flag = False
-
- # Counting
- self.count = count
- if count:
- if type is None:
- self.type = IntRange(min=0)
- if default_is_missing:
- self.default = 0
-
- self.multiple = multiple
- self.allow_from_autoenv = allow_from_autoenv
- self.help = help
- self.show_default = show_default
- self.show_choices = show_choices
- self.show_envvar = show_envvar
-
- # Sanity check for stuff we don't support
- if __debug__:
- if self.nargs < 0:
- raise TypeError("Options cannot have nargs < 0")
- if self.prompt and self.is_flag and not self.is_bool_flag:
- raise TypeError("Cannot prompt for flags that are not bools.")
- if not self.is_bool_flag and self.secondary_opts:
- raise TypeError("Got secondary option for non boolean flag.")
- if self.is_bool_flag and self.hide_input and self.prompt is not None:
- raise TypeError("Hidden input does not work with boolean flag prompts.")
- if self.count:
- if self.multiple:
- raise TypeError(
- "Options cannot be multiple and count at the same time."
- )
- elif self.is_flag:
- raise TypeError(
- "Options cannot be count and flags at the same time."
- )
-
- def _parse_decls(self, decls, expose_value):
- opts = []
- secondary_opts = []
- name = None
- possible_names = []
-
- for decl in decls:
- if isidentifier(decl):
- if name is not None:
- raise TypeError("Name defined twice")
- name = decl
- else:
- split_char = ";" if decl[:1] == "/" else "/"
- if split_char in decl:
- first, second = decl.split(split_char, 1)
- first = first.rstrip()
- if first:
- possible_names.append(split_opt(first))
- opts.append(first)
- second = second.lstrip()
- if second:
- secondary_opts.append(second.lstrip())
- else:
- possible_names.append(split_opt(decl))
- opts.append(decl)
-
- if name is None and possible_names:
- possible_names.sort(key=lambda x: -len(x[0])) # group long options first
- name = possible_names[0][1].replace("-", "_").lower()
- if not isidentifier(name):
- name = None
-
- if name is None:
- if not expose_value:
- return None, opts, secondary_opts
- raise TypeError("Could not determine name for option")
-
- if not opts and not secondary_opts:
- raise TypeError(
- "No options defined but a name was passed ({}). Did you"
- " mean to declare an argument instead of an option?".format(name)
- )
-
- return name, opts, secondary_opts
-
- def add_to_parser(self, parser, ctx):
- kwargs = {
- "dest": self.name,
- "nargs": self.nargs,
- "obj": self,
- }
-
- if self.multiple:
- action = "append"
- elif self.count:
- action = "count"
- else:
- action = "store"
-
- if self.is_flag:
- kwargs.pop("nargs", None)
- action_const = "{}_const".format(action)
- if self.is_bool_flag and self.secondary_opts:
- parser.add_option(self.opts, action=action_const, const=True, **kwargs)
- parser.add_option(
- self.secondary_opts, action=action_const, const=False, **kwargs
- )
- else:
- parser.add_option(
- self.opts, action=action_const, const=self.flag_value, **kwargs
- )
- else:
- kwargs["action"] = action
- parser.add_option(self.opts, **kwargs)
-
- def get_help_record(self, ctx):
- if self.hidden:
- return
- any_prefix_is_slash = []
-
- def _write_opts(opts):
- rv, any_slashes = join_options(opts)
- if any_slashes:
- any_prefix_is_slash[:] = [True]
- if not self.is_flag and not self.count:
- rv += " {}".format(self.make_metavar())
- return rv
-
- rv = [_write_opts(self.opts)]
- if self.secondary_opts:
- rv.append(_write_opts(self.secondary_opts))
-
- help = self.help or ""
- extra = []
- if self.show_envvar:
- envvar = self.envvar
- if envvar is None:
- if self.allow_from_autoenv and ctx.auto_envvar_prefix is not None:
- envvar = "{}_{}".format(ctx.auto_envvar_prefix, self.name.upper())
- if envvar is not None:
- extra.append(
- "env var: {}".format(
- ", ".join(str(d) for d in envvar)
- if isinstance(envvar, (list, tuple))
- else envvar
- )
- )
- if self.default is not None and (self.show_default or ctx.show_default):
- if isinstance(self.show_default, string_types):
- default_string = "({})".format(self.show_default)
- elif isinstance(self.default, (list, tuple)):
- default_string = ", ".join(str(d) for d in self.default)
- elif inspect.isfunction(self.default):
- default_string = "(dynamic)"
- else:
- default_string = self.default
- extra.append("default: {}".format(default_string))
-
- if self.required:
- extra.append("required")
- if extra:
- help = "{}[{}]".format(
- "{} ".format(help) if help else "", "; ".join(extra)
- )
-
- return ("; " if any_prefix_is_slash else " / ").join(rv), help
-
- def get_default(self, ctx):
- # If we're a non boolean flag our default is more complex because
- # we need to look at all flags in the same group to figure out
- # if we're the the default one in which case we return the flag
- # value as default.
- if self.is_flag and not self.is_bool_flag:
- for param in ctx.command.params:
- if param.name == self.name and param.default:
- return param.flag_value
- return None
- return Parameter.get_default(self, ctx)
-
- def prompt_for_value(self, ctx):
- """This is an alternative flow that can be activated in the full
- value processing if a value does not exist. It will prompt the
- user until a valid value exists and then returns the processed
- value as result.
- """
- # Calculate the default before prompting anything to be stable.
- default = self.get_default(ctx)
-
- # If this is a prompt for a flag we need to handle this
- # differently.
- if self.is_bool_flag:
- return confirm(self.prompt, default)
-
- return prompt(
- self.prompt,
- default=default,
- type=self.type,
- hide_input=self.hide_input,
- show_choices=self.show_choices,
- confirmation_prompt=self.confirmation_prompt,
- value_proc=lambda x: self.process_value(ctx, x),
- )
-
- def resolve_envvar_value(self, ctx):
- rv = Parameter.resolve_envvar_value(self, ctx)
- if rv is not None:
- return rv
- if self.allow_from_autoenv and ctx.auto_envvar_prefix is not None:
- envvar = "{}_{}".format(ctx.auto_envvar_prefix, self.name.upper())
- return os.environ.get(envvar)
-
- def value_from_envvar(self, ctx):
- rv = self.resolve_envvar_value(ctx)
- if rv is None:
- return None
- value_depth = (self.nargs != 1) + bool(self.multiple)
- if value_depth > 0 and rv is not None:
- rv = self.type.split_envvar_value(rv)
- if self.multiple and self.nargs != 1:
- rv = batch(rv, self.nargs)
- return rv
-
- def full_process_value(self, ctx, value):
- if value is None and self.prompt is not None and not ctx.resilient_parsing:
- return self.prompt_for_value(ctx)
- return Parameter.full_process_value(self, ctx, value)
-
-
-class Argument(Parameter):
- """Arguments are positional parameters to a command. They generally
- provide fewer features than options but can have infinite ``nargs``
- and are required by default.
-
- All parameters are passed onwards to the parameter constructor.
- """
-
- param_type_name = "argument"
-
- def __init__(self, param_decls, required=None, **attrs):
- if required is None:
- if attrs.get("default") is not None:
- required = False
- else:
- required = attrs.get("nargs", 1) > 0
- Parameter.__init__(self, param_decls, required=required, **attrs)
- if self.default is not None and self.nargs < 0:
- raise TypeError(
- "nargs=-1 in combination with a default value is not supported."
- )
-
- @property
- def human_readable_name(self):
- if self.metavar is not None:
- return self.metavar
- return self.name.upper()
-
- def make_metavar(self):
- if self.metavar is not None:
- return self.metavar
- var = self.type.get_metavar(self)
- if not var:
- var = self.name.upper()
- if not self.required:
- var = "[{}]".format(var)
- if self.nargs != 1:
- var += "..."
- return var
-
- def _parse_decls(self, decls, expose_value):
- if not decls:
- if not expose_value:
- return None, [], []
- raise TypeError("Could not determine name for argument")
- if len(decls) == 1:
- name = arg = decls[0]
- name = name.replace("-", "_").lower()
- else:
- raise TypeError(
- "Arguments take exactly one parameter declaration, got"
- " {}".format(len(decls))
- )
- return name, [arg], []
-
- def get_usage_pieces(self, ctx):
- return [self.make_metavar()]
-
- def get_error_hint(self, ctx):
- return repr(self.make_metavar())
-
- def add_to_parser(self, parser, ctx):
- parser.add_argument(dest=self.name, nargs=self.nargs, obj=self)
diff --git a/client/ayon_core/vendor/python/python_2/click/decorators.py b/client/ayon_core/vendor/python/python_2/click/decorators.py
deleted file mode 100644
index c7b5af6cc5..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/decorators.py
+++ /dev/null
@@ -1,333 +0,0 @@
-import inspect
-import sys
-from functools import update_wrapper
-
-from ._compat import iteritems
-from ._unicodefun import _check_for_unicode_literals
-from .core import Argument
-from .core import Command
-from .core import Group
-from .core import Option
-from .globals import get_current_context
-from .utils import echo
-
-
-def pass_context(f):
- """Marks a callback as wanting to receive the current context
- object as first argument.
- """
-
- def new_func(*args, **kwargs):
- return f(get_current_context(), *args, **kwargs)
-
- return update_wrapper(new_func, f)
-
-
-def pass_obj(f):
- """Similar to :func:`pass_context`, but only pass the object on the
- context onwards (:attr:`Context.obj`). This is useful if that object
- represents the state of a nested system.
- """
-
- def new_func(*args, **kwargs):
- return f(get_current_context().obj, *args, **kwargs)
-
- return update_wrapper(new_func, f)
-
-
-def make_pass_decorator(object_type, ensure=False):
- """Given an object type this creates a decorator that will work
- similar to :func:`pass_obj` but instead of passing the object of the
- current context, it will find the innermost context of type
- :func:`object_type`.
-
- This generates a decorator that works roughly like this::
-
- from functools import update_wrapper
-
- def decorator(f):
- @pass_context
- def new_func(ctx, *args, **kwargs):
- obj = ctx.find_object(object_type)
- return ctx.invoke(f, obj, *args, **kwargs)
- return update_wrapper(new_func, f)
- return decorator
-
- :param object_type: the type of the object to pass.
- :param ensure: if set to `True`, a new object will be created and
- remembered on the context if it's not there yet.
- """
-
- def decorator(f):
- def new_func(*args, **kwargs):
- ctx = get_current_context()
- if ensure:
- obj = ctx.ensure_object(object_type)
- else:
- obj = ctx.find_object(object_type)
- if obj is None:
- raise RuntimeError(
- "Managed to invoke callback without a context"
- " object of type '{}' existing".format(object_type.__name__)
- )
- return ctx.invoke(f, obj, *args, **kwargs)
-
- return update_wrapper(new_func, f)
-
- return decorator
-
-
-def _make_command(f, name, attrs, cls):
- if isinstance(f, Command):
- raise TypeError("Attempted to convert a callback into a command twice.")
- try:
- params = f.__click_params__
- params.reverse()
- del f.__click_params__
- except AttributeError:
- params = []
- help = attrs.get("help")
- if help is None:
- help = inspect.getdoc(f)
- if isinstance(help, bytes):
- help = help.decode("utf-8")
- else:
- help = inspect.cleandoc(help)
- attrs["help"] = help
- _check_for_unicode_literals()
- return cls(
- name=name or f.__name__.lower().replace("_", "-"),
- callback=f,
- params=params,
- **attrs
- )
-
-
-def command(name=None, cls=None, **attrs):
- r"""Creates a new :class:`Command` and uses the decorated function as
- callback. This will also automatically attach all decorated
- :func:`option`\s and :func:`argument`\s as parameters to the command.
-
- The name of the command defaults to the name of the function with
- underscores replaced by dashes. If you want to change that, you can
- pass the intended name as the first argument.
-
- All keyword arguments are forwarded to the underlying command class.
-
- Once decorated the function turns into a :class:`Command` instance
- that can be invoked as a command line utility or be attached to a
- command :class:`Group`.
-
- :param name: the name of the command. This defaults to the function
- name with underscores replaced by dashes.
- :param cls: the command class to instantiate. This defaults to
- :class:`Command`.
- """
- if cls is None:
- cls = Command
-
- def decorator(f):
- cmd = _make_command(f, name, attrs, cls)
- cmd.__doc__ = f.__doc__
- return cmd
-
- return decorator
-
-
-def group(name=None, **attrs):
- """Creates a new :class:`Group` with a function as callback. This
- works otherwise the same as :func:`command` just that the `cls`
- parameter is set to :class:`Group`.
- """
- attrs.setdefault("cls", Group)
- return command(name, **attrs)
-
-
-def _param_memo(f, param):
- if isinstance(f, Command):
- f.params.append(param)
- else:
- if not hasattr(f, "__click_params__"):
- f.__click_params__ = []
- f.__click_params__.append(param)
-
-
-def argument(*param_decls, **attrs):
- """Attaches an argument to the command. All positional arguments are
- passed as parameter declarations to :class:`Argument`; all keyword
- arguments are forwarded unchanged (except ``cls``).
- This is equivalent to creating an :class:`Argument` instance manually
- and attaching it to the :attr:`Command.params` list.
-
- :param cls: the argument class to instantiate. This defaults to
- :class:`Argument`.
- """
-
- def decorator(f):
- ArgumentClass = attrs.pop("cls", Argument)
- _param_memo(f, ArgumentClass(param_decls, **attrs))
- return f
-
- return decorator
-
-
-def option(*param_decls, **attrs):
- """Attaches an option to the command. All positional arguments are
- passed as parameter declarations to :class:`Option`; all keyword
- arguments are forwarded unchanged (except ``cls``).
- This is equivalent to creating an :class:`Option` instance manually
- and attaching it to the :attr:`Command.params` list.
-
- :param cls: the option class to instantiate. This defaults to
- :class:`Option`.
- """
-
- def decorator(f):
- # Issue 926, copy attrs, so pre-defined options can re-use the same cls=
- option_attrs = attrs.copy()
-
- if "help" in option_attrs:
- option_attrs["help"] = inspect.cleandoc(option_attrs["help"])
- OptionClass = option_attrs.pop("cls", Option)
- _param_memo(f, OptionClass(param_decls, **option_attrs))
- return f
-
- return decorator
-
-
-def confirmation_option(*param_decls, **attrs):
- """Shortcut for confirmation prompts that can be ignored by passing
- ``--yes`` as parameter.
-
- This is equivalent to decorating a function with :func:`option` with
- the following parameters::
-
- def callback(ctx, param, value):
- if not value:
- ctx.abort()
-
- @click.command()
- @click.option('--yes', is_flag=True, callback=callback,
- expose_value=False, prompt='Do you want to continue?')
- def dropdb():
- pass
- """
-
- def decorator(f):
- def callback(ctx, param, value):
- if not value:
- ctx.abort()
-
- attrs.setdefault("is_flag", True)
- attrs.setdefault("callback", callback)
- attrs.setdefault("expose_value", False)
- attrs.setdefault("prompt", "Do you want to continue?")
- attrs.setdefault("help", "Confirm the action without prompting.")
- return option(*(param_decls or ("--yes",)), **attrs)(f)
-
- return decorator
-
-
-def password_option(*param_decls, **attrs):
- """Shortcut for password prompts.
-
- This is equivalent to decorating a function with :func:`option` with
- the following parameters::
-
- @click.command()
- @click.option('--password', prompt=True, confirmation_prompt=True,
- hide_input=True)
- def changeadmin(password):
- pass
- """
-
- def decorator(f):
- attrs.setdefault("prompt", True)
- attrs.setdefault("confirmation_prompt", True)
- attrs.setdefault("hide_input", True)
- return option(*(param_decls or ("--password",)), **attrs)(f)
-
- return decorator
-
-
-def version_option(version=None, *param_decls, **attrs):
- """Adds a ``--version`` option which immediately ends the program
- printing out the version number. This is implemented as an eager
- option that prints the version and exits the program in the callback.
-
- :param version: the version number to show. If not provided Click
- attempts an auto discovery via setuptools.
- :param prog_name: the name of the program (defaults to autodetection)
- :param message: custom message to show instead of the default
- (``'%(prog)s, version %(version)s'``)
- :param others: everything else is forwarded to :func:`option`.
- """
- if version is None:
- if hasattr(sys, "_getframe"):
- module = sys._getframe(1).f_globals.get("__name__")
- else:
- module = ""
-
- def decorator(f):
- prog_name = attrs.pop("prog_name", None)
- message = attrs.pop("message", "%(prog)s, version %(version)s")
-
- def callback(ctx, param, value):
- if not value or ctx.resilient_parsing:
- return
- prog = prog_name
- if prog is None:
- prog = ctx.find_root().info_name
- ver = version
- if ver is None:
- try:
- import pkg_resources
- except ImportError:
- pass
- else:
- for dist in pkg_resources.working_set:
- scripts = dist.get_entry_map().get("console_scripts") or {}
- for _, entry_point in iteritems(scripts):
- if entry_point.module_name == module:
- ver = dist.version
- break
- if ver is None:
- raise RuntimeError("Could not determine version")
- echo(message % {"prog": prog, "version": ver}, color=ctx.color)
- ctx.exit()
-
- attrs.setdefault("is_flag", True)
- attrs.setdefault("expose_value", False)
- attrs.setdefault("is_eager", True)
- attrs.setdefault("help", "Show the version and exit.")
- attrs["callback"] = callback
- return option(*(param_decls or ("--version",)), **attrs)(f)
-
- return decorator
-
-
-def help_option(*param_decls, **attrs):
- """Adds a ``--help`` option which immediately ends the program
- printing out the help page. This is usually unnecessary to add as
- this is added by default to all commands unless suppressed.
-
- Like :func:`version_option`, this is implemented as eager option that
- prints in the callback and exits.
-
- All arguments are forwarded to :func:`option`.
- """
-
- def decorator(f):
- def callback(ctx, param, value):
- if value and not ctx.resilient_parsing:
- echo(ctx.get_help(), color=ctx.color)
- ctx.exit()
-
- attrs.setdefault("is_flag", True)
- attrs.setdefault("expose_value", False)
- attrs.setdefault("help", "Show this message and exit.")
- attrs.setdefault("is_eager", True)
- attrs["callback"] = callback
- return option(*(param_decls or ("--help",)), **attrs)(f)
-
- return decorator
diff --git a/client/ayon_core/vendor/python/python_2/click/exceptions.py b/client/ayon_core/vendor/python/python_2/click/exceptions.py
deleted file mode 100644
index 592ee38f0d..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/exceptions.py
+++ /dev/null
@@ -1,253 +0,0 @@
-from ._compat import filename_to_ui
-from ._compat import get_text_stderr
-from ._compat import PY2
-from .utils import echo
-
-
-def _join_param_hints(param_hint):
- if isinstance(param_hint, (tuple, list)):
- return " / ".join(repr(x) for x in param_hint)
- return param_hint
-
-
-class ClickException(Exception):
- """An exception that Click can handle and show to the user."""
-
- #: The exit code for this exception
- exit_code = 1
-
- def __init__(self, message):
- ctor_msg = message
- if PY2:
- if ctor_msg is not None:
- ctor_msg = ctor_msg.encode("utf-8")
- Exception.__init__(self, ctor_msg)
- self.message = message
-
- def format_message(self):
- return self.message
-
- def __str__(self):
- return self.message
-
- if PY2:
- __unicode__ = __str__
-
- def __str__(self):
- return self.message.encode("utf-8")
-
- def show(self, file=None):
- if file is None:
- file = get_text_stderr()
- echo("Error: {}".format(self.format_message()), file=file)
-
-
-class UsageError(ClickException):
- """An internal exception that signals a usage error. This typically
- aborts any further handling.
-
- :param message: the error message to display.
- :param ctx: optionally the context that caused this error. Click will
- fill in the context automatically in some situations.
- """
-
- exit_code = 2
-
- def __init__(self, message, ctx=None):
- ClickException.__init__(self, message)
- self.ctx = ctx
- self.cmd = self.ctx.command if self.ctx else None
-
- def show(self, file=None):
- if file is None:
- file = get_text_stderr()
- color = None
- hint = ""
- if self.cmd is not None and self.cmd.get_help_option(self.ctx) is not None:
- hint = "Try '{} {}' for help.\n".format(
- self.ctx.command_path, self.ctx.help_option_names[0]
- )
- if self.ctx is not None:
- color = self.ctx.color
- echo("{}\n{}".format(self.ctx.get_usage(), hint), file=file, color=color)
- echo("Error: {}".format(self.format_message()), file=file, color=color)
-
-
-class BadParameter(UsageError):
- """An exception that formats out a standardized error message for a
- bad parameter. This is useful when thrown from a callback or type as
- Click will attach contextual information to it (for instance, which
- parameter it is).
-
- .. versionadded:: 2.0
-
- :param param: the parameter object that caused this error. This can
- be left out, and Click will attach this info itself
- if possible.
- :param param_hint: a string that shows up as parameter name. This
- can be used as alternative to `param` in cases
- where custom validation should happen. If it is
- a string it's used as such, if it's a list then
- each item is quoted and separated.
- """
-
- def __init__(self, message, ctx=None, param=None, param_hint=None):
- UsageError.__init__(self, message, ctx)
- self.param = param
- self.param_hint = param_hint
-
- def format_message(self):
- if self.param_hint is not None:
- param_hint = self.param_hint
- elif self.param is not None:
- param_hint = self.param.get_error_hint(self.ctx)
- else:
- return "Invalid value: {}".format(self.message)
- param_hint = _join_param_hints(param_hint)
-
- return "Invalid value for {}: {}".format(param_hint, self.message)
-
-
-class MissingParameter(BadParameter):
- """Raised if click required an option or argument but it was not
- provided when invoking the script.
-
- .. versionadded:: 4.0
-
- :param param_type: a string that indicates the type of the parameter.
- The default is to inherit the parameter type from
- the given `param`. Valid values are ``'parameter'``,
- ``'option'`` or ``'argument'``.
- """
-
- def __init__(
- self, message=None, ctx=None, param=None, param_hint=None, param_type=None
- ):
- BadParameter.__init__(self, message, ctx, param, param_hint)
- self.param_type = param_type
-
- def format_message(self):
- if self.param_hint is not None:
- param_hint = self.param_hint
- elif self.param is not None:
- param_hint = self.param.get_error_hint(self.ctx)
- else:
- param_hint = None
- param_hint = _join_param_hints(param_hint)
-
- param_type = self.param_type
- if param_type is None and self.param is not None:
- param_type = self.param.param_type_name
-
- msg = self.message
- if self.param is not None:
- msg_extra = self.param.type.get_missing_message(self.param)
- if msg_extra:
- if msg:
- msg += ". {}".format(msg_extra)
- else:
- msg = msg_extra
-
- return "Missing {}{}{}{}".format(
- param_type,
- " {}".format(param_hint) if param_hint else "",
- ". " if msg else ".",
- msg or "",
- )
-
- def __str__(self):
- if self.message is None:
- param_name = self.param.name if self.param else None
- return "missing parameter: {}".format(param_name)
- else:
- return self.message
-
- if PY2:
- __unicode__ = __str__
-
- def __str__(self):
- return self.__unicode__().encode("utf-8")
-
-
-class NoSuchOption(UsageError):
- """Raised if click attempted to handle an option that does not
- exist.
-
- .. versionadded:: 4.0
- """
-
- def __init__(self, option_name, message=None, possibilities=None, ctx=None):
- if message is None:
- message = "no such option: {}".format(option_name)
- UsageError.__init__(self, message, ctx)
- self.option_name = option_name
- self.possibilities = possibilities
-
- def format_message(self):
- bits = [self.message]
- if self.possibilities:
- if len(self.possibilities) == 1:
- bits.append("Did you mean {}?".format(self.possibilities[0]))
- else:
- possibilities = sorted(self.possibilities)
- bits.append("(Possible options: {})".format(", ".join(possibilities)))
- return " ".join(bits)
-
-
-class BadOptionUsage(UsageError):
- """Raised if an option is generally supplied but the use of the option
- was incorrect. This is for instance raised if the number of arguments
- for an option is not correct.
-
- .. versionadded:: 4.0
-
- :param option_name: the name of the option being used incorrectly.
- """
-
- def __init__(self, option_name, message, ctx=None):
- UsageError.__init__(self, message, ctx)
- self.option_name = option_name
-
-
-class BadArgumentUsage(UsageError):
- """Raised if an argument is generally supplied but the use of the argument
- was incorrect. This is for instance raised if the number of values
- for an argument is not correct.
-
- .. versionadded:: 6.0
- """
-
- def __init__(self, message, ctx=None):
- UsageError.__init__(self, message, ctx)
-
-
-class FileError(ClickException):
- """Raised if a file cannot be opened."""
-
- def __init__(self, filename, hint=None):
- ui_filename = filename_to_ui(filename)
- if hint is None:
- hint = "unknown error"
- ClickException.__init__(self, hint)
- self.ui_filename = ui_filename
- self.filename = filename
-
- def format_message(self):
- return "Could not open file {}: {}".format(self.ui_filename, self.message)
-
-
-class Abort(RuntimeError):
- """An internal signalling exception that signals Click to abort."""
-
-
-class Exit(RuntimeError):
- """An exception that indicates that the application should exit with some
- status code.
-
- :param code: the status code to exit with.
- """
-
- __slots__ = ("exit_code",)
-
- def __init__(self, code=0):
- self.exit_code = code
diff --git a/client/ayon_core/vendor/python/python_2/click/formatting.py b/client/ayon_core/vendor/python/python_2/click/formatting.py
deleted file mode 100644
index 319c7f6163..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/formatting.py
+++ /dev/null
@@ -1,283 +0,0 @@
-from contextlib import contextmanager
-
-from ._compat import term_len
-from .parser import split_opt
-from .termui import get_terminal_size
-
-# Can force a width. This is used by the test system
-FORCED_WIDTH = None
-
-
-def measure_table(rows):
- widths = {}
- for row in rows:
- for idx, col in enumerate(row):
- widths[idx] = max(widths.get(idx, 0), term_len(col))
- return tuple(y for x, y in sorted(widths.items()))
-
-
-def iter_rows(rows, col_count):
- for row in rows:
- row = tuple(row)
- yield row + ("",) * (col_count - len(row))
-
-
-def wrap_text(
- text, width=78, initial_indent="", subsequent_indent="", preserve_paragraphs=False
-):
- """A helper function that intelligently wraps text. By default, it
- assumes that it operates on a single paragraph of text but if the
- `preserve_paragraphs` parameter is provided it will intelligently
- handle paragraphs (defined by two empty lines).
-
- If paragraphs are handled, a paragraph can be prefixed with an empty
- line containing the ``\\b`` character (``\\x08``) to indicate that
- no rewrapping should happen in that block.
-
- :param text: the text that should be rewrapped.
- :param width: the maximum width for the text.
- :param initial_indent: the initial indent that should be placed on the
- first line as a string.
- :param subsequent_indent: the indent string that should be placed on
- each consecutive line.
- :param preserve_paragraphs: if this flag is set then the wrapping will
- intelligently handle paragraphs.
- """
- from ._textwrap import TextWrapper
-
- text = text.expandtabs()
- wrapper = TextWrapper(
- width,
- initial_indent=initial_indent,
- subsequent_indent=subsequent_indent,
- replace_whitespace=False,
- )
- if not preserve_paragraphs:
- return wrapper.fill(text)
-
- p = []
- buf = []
- indent = None
-
- def _flush_par():
- if not buf:
- return
- if buf[0].strip() == "\b":
- p.append((indent or 0, True, "\n".join(buf[1:])))
- else:
- p.append((indent or 0, False, " ".join(buf)))
- del buf[:]
-
- for line in text.splitlines():
- if not line:
- _flush_par()
- indent = None
- else:
- if indent is None:
- orig_len = term_len(line)
- line = line.lstrip()
- indent = orig_len - term_len(line)
- buf.append(line)
- _flush_par()
-
- rv = []
- for indent, raw, text in p:
- with wrapper.extra_indent(" " * indent):
- if raw:
- rv.append(wrapper.indent_only(text))
- else:
- rv.append(wrapper.fill(text))
-
- return "\n\n".join(rv)
-
-
-class HelpFormatter(object):
- """This class helps with formatting text-based help pages. It's
- usually just needed for very special internal cases, but it's also
- exposed so that developers can write their own fancy outputs.
-
- At present, it always writes into memory.
-
- :param indent_increment: the additional increment for each level.
- :param width: the width for the text. This defaults to the terminal
- width clamped to a maximum of 78.
- """
-
- def __init__(self, indent_increment=2, width=None, max_width=None):
- self.indent_increment = indent_increment
- if max_width is None:
- max_width = 80
- if width is None:
- width = FORCED_WIDTH
- if width is None:
- width = max(min(get_terminal_size()[0], max_width) - 2, 50)
- self.width = width
- self.current_indent = 0
- self.buffer = []
-
- def write(self, string):
- """Writes a unicode string into the internal buffer."""
- self.buffer.append(string)
-
- def indent(self):
- """Increases the indentation."""
- self.current_indent += self.indent_increment
-
- def dedent(self):
- """Decreases the indentation."""
- self.current_indent -= self.indent_increment
-
- def write_usage(self, prog, args="", prefix="Usage: "):
- """Writes a usage line into the buffer.
-
- :param prog: the program name.
- :param args: whitespace separated list of arguments.
- :param prefix: the prefix for the first line.
- """
- usage_prefix = "{:>{w}}{} ".format(prefix, prog, w=self.current_indent)
- text_width = self.width - self.current_indent
-
- if text_width >= (term_len(usage_prefix) + 20):
- # The arguments will fit to the right of the prefix.
- indent = " " * term_len(usage_prefix)
- self.write(
- wrap_text(
- args,
- text_width,
- initial_indent=usage_prefix,
- subsequent_indent=indent,
- )
- )
- else:
- # The prefix is too long, put the arguments on the next line.
- self.write(usage_prefix)
- self.write("\n")
- indent = " " * (max(self.current_indent, term_len(prefix)) + 4)
- self.write(
- wrap_text(
- args, text_width, initial_indent=indent, subsequent_indent=indent
- )
- )
-
- self.write("\n")
-
- def write_heading(self, heading):
- """Writes a heading into the buffer."""
- self.write("{:>{w}}{}:\n".format("", heading, w=self.current_indent))
-
- def write_paragraph(self):
- """Writes a paragraph into the buffer."""
- if self.buffer:
- self.write("\n")
-
- def write_text(self, text):
- """Writes re-indented text into the buffer. This rewraps and
- preserves paragraphs.
- """
- text_width = max(self.width - self.current_indent, 11)
- indent = " " * self.current_indent
- self.write(
- wrap_text(
- text,
- text_width,
- initial_indent=indent,
- subsequent_indent=indent,
- preserve_paragraphs=True,
- )
- )
- self.write("\n")
-
- def write_dl(self, rows, col_max=30, col_spacing=2):
- """Writes a definition list into the buffer. This is how options
- and commands are usually formatted.
-
- :param rows: a list of two item tuples for the terms and values.
- :param col_max: the maximum width of the first column.
- :param col_spacing: the number of spaces between the first and
- second column.
- """
- rows = list(rows)
- widths = measure_table(rows)
- if len(widths) != 2:
- raise TypeError("Expected two columns for definition list")
-
- first_col = min(widths[0], col_max) + col_spacing
-
- for first, second in iter_rows(rows, len(widths)):
- self.write("{:>{w}}{}".format("", first, w=self.current_indent))
- if not second:
- self.write("\n")
- continue
- if term_len(first) <= first_col - col_spacing:
- self.write(" " * (first_col - term_len(first)))
- else:
- self.write("\n")
- self.write(" " * (first_col + self.current_indent))
-
- text_width = max(self.width - first_col - 2, 10)
- wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True)
- lines = wrapped_text.splitlines()
-
- if lines:
- self.write("{}\n".format(lines[0]))
-
- for line in lines[1:]:
- self.write(
- "{:>{w}}{}\n".format(
- "", line, w=first_col + self.current_indent
- )
- )
-
- if len(lines) > 1:
- # separate long help from next option
- self.write("\n")
- else:
- self.write("\n")
-
- @contextmanager
- def section(self, name):
- """Helpful context manager that writes a paragraph, a heading,
- and the indents.
-
- :param name: the section name that is written as heading.
- """
- self.write_paragraph()
- self.write_heading(name)
- self.indent()
- try:
- yield
- finally:
- self.dedent()
-
- @contextmanager
- def indentation(self):
- """A context manager that increases the indentation."""
- self.indent()
- try:
- yield
- finally:
- self.dedent()
-
- def getvalue(self):
- """Returns the buffer contents."""
- return "".join(self.buffer)
-
-
-def join_options(options):
- """Given a list of option strings this joins them in the most appropriate
- way and returns them in the form ``(formatted_string,
- any_prefix_is_slash)`` where the second item in the tuple is a flag that
- indicates if any of the option prefixes was a slash.
- """
- rv = []
- any_prefix_is_slash = False
- for opt in options:
- prefix = split_opt(opt)[0]
- if prefix == "/":
- any_prefix_is_slash = True
- rv.append((len(prefix), opt))
-
- rv.sort(key=lambda x: x[0])
-
- rv = ", ".join(x[1] for x in rv)
- return rv, any_prefix_is_slash
diff --git a/client/ayon_core/vendor/python/python_2/click/globals.py b/client/ayon_core/vendor/python/python_2/click/globals.py
deleted file mode 100644
index 1649f9a0bf..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/globals.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from threading import local
-
-_local = local()
-
-
-def get_current_context(silent=False):
- """Returns the current click context. This can be used as a way to
- access the current context object from anywhere. This is a more implicit
- alternative to the :func:`pass_context` decorator. This function is
- primarily useful for helpers such as :func:`echo` which might be
- interested in changing its behavior based on the current context.
-
- To push the current context, :meth:`Context.scope` can be used.
-
- .. versionadded:: 5.0
-
- :param silent: if set to `True` the return value is `None` if no context
- is available. The default behavior is to raise a
- :exc:`RuntimeError`.
- """
- try:
- return _local.stack[-1]
- except (AttributeError, IndexError):
- if not silent:
- raise RuntimeError("There is no active click context.")
-
-
-def push_context(ctx):
- """Pushes a new context to the current stack."""
- _local.__dict__.setdefault("stack", []).append(ctx)
-
-
-def pop_context():
- """Removes the top level from the stack."""
- _local.stack.pop()
-
-
-def resolve_color_default(color=None):
- """"Internal helper to get the default value of the color flag. If a
- value is passed it's returned unchanged, otherwise it's looked up from
- the current context.
- """
- if color is not None:
- return color
- ctx = get_current_context(silent=True)
- if ctx is not None:
- return ctx.color
diff --git a/client/ayon_core/vendor/python/python_2/click/parser.py b/client/ayon_core/vendor/python/python_2/click/parser.py
deleted file mode 100644
index f43ebfe9fc..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/parser.py
+++ /dev/null
@@ -1,428 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-This module started out as largely a copy paste from the stdlib's
-optparse module with the features removed that we do not need from
-optparse because we implement them in Click on a higher level (for
-instance type handling, help formatting and a lot more).
-
-The plan is to remove more and more from here over time.
-
-The reason this is a different module and not optparse from the stdlib
-is that there are differences in 2.x and 3.x about the error messages
-generated and optparse in the stdlib uses gettext for no good reason
-and might cause us issues.
-
-Click uses parts of optparse written by Gregory P. Ward and maintained
-by the Python Software Foundation. This is limited to code in parser.py.
-
-Copyright 2001-2006 Gregory P. Ward. All rights reserved.
-Copyright 2002-2006 Python Software Foundation. All rights reserved.
-"""
-import re
-from collections import deque
-
-from .exceptions import BadArgumentUsage
-from .exceptions import BadOptionUsage
-from .exceptions import NoSuchOption
-from .exceptions import UsageError
-
-
-def _unpack_args(args, nargs_spec):
- """Given an iterable of arguments and an iterable of nargs specifications,
- it returns a tuple with all the unpacked arguments at the first index
- and all remaining arguments as the second.
-
- The nargs specification is the number of arguments that should be consumed
- or `-1` to indicate that this position should eat up all the remainders.
-
- Missing items are filled with `None`.
- """
- args = deque(args)
- nargs_spec = deque(nargs_spec)
- rv = []
- spos = None
-
- def _fetch(c):
- try:
- if spos is None:
- return c.popleft()
- else:
- return c.pop()
- except IndexError:
- return None
-
- while nargs_spec:
- nargs = _fetch(nargs_spec)
- if nargs == 1:
- rv.append(_fetch(args))
- elif nargs > 1:
- x = [_fetch(args) for _ in range(nargs)]
- # If we're reversed, we're pulling in the arguments in reverse,
- # so we need to turn them around.
- if spos is not None:
- x.reverse()
- rv.append(tuple(x))
- elif nargs < 0:
- if spos is not None:
- raise TypeError("Cannot have two nargs < 0")
- spos = len(rv)
- rv.append(None)
-
- # spos is the position of the wildcard (star). If it's not `None`,
- # we fill it with the remainder.
- if spos is not None:
- rv[spos] = tuple(args)
- args = []
- rv[spos + 1 :] = reversed(rv[spos + 1 :])
-
- return tuple(rv), list(args)
-
-
-def _error_opt_args(nargs, opt):
- if nargs == 1:
- raise BadOptionUsage(opt, "{} option requires an argument".format(opt))
- raise BadOptionUsage(opt, "{} option requires {} arguments".format(opt, nargs))
-
-
-def split_opt(opt):
- first = opt[:1]
- if first.isalnum():
- return "", opt
- if opt[1:2] == first:
- return opt[:2], opt[2:]
- return first, opt[1:]
-
-
-def normalize_opt(opt, ctx):
- if ctx is None or ctx.token_normalize_func is None:
- return opt
- prefix, opt = split_opt(opt)
- return prefix + ctx.token_normalize_func(opt)
-
-
-def split_arg_string(string):
- """Given an argument string this attempts to split it into small parts."""
- rv = []
- for match in re.finditer(
- r"('([^'\\]*(?:\\.[^'\\]*)*)'|\"([^\"\\]*(?:\\.[^\"\\]*)*)\"|\S+)\s*",
- string,
- re.S,
- ):
- arg = match.group().strip()
- if arg[:1] == arg[-1:] and arg[:1] in "\"'":
- arg = arg[1:-1].encode("ascii", "backslashreplace").decode("unicode-escape")
- try:
- arg = type(string)(arg)
- except UnicodeError:
- pass
- rv.append(arg)
- return rv
-
-
-class Option(object):
- def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None):
- self._short_opts = []
- self._long_opts = []
- self.prefixes = set()
-
- for opt in opts:
- prefix, value = split_opt(opt)
- if not prefix:
- raise ValueError("Invalid start character for option ({})".format(opt))
- self.prefixes.add(prefix[0])
- if len(prefix) == 1 and len(value) == 1:
- self._short_opts.append(opt)
- else:
- self._long_opts.append(opt)
- self.prefixes.add(prefix)
-
- if action is None:
- action = "store"
-
- self.dest = dest
- self.action = action
- self.nargs = nargs
- self.const = const
- self.obj = obj
-
- @property
- def takes_value(self):
- return self.action in ("store", "append")
-
- def process(self, value, state):
- if self.action == "store":
- state.opts[self.dest] = value
- elif self.action == "store_const":
- state.opts[self.dest] = self.const
- elif self.action == "append":
- state.opts.setdefault(self.dest, []).append(value)
- elif self.action == "append_const":
- state.opts.setdefault(self.dest, []).append(self.const)
- elif self.action == "count":
- state.opts[self.dest] = state.opts.get(self.dest, 0) + 1
- else:
- raise ValueError("unknown action '{}'".format(self.action))
- state.order.append(self.obj)
-
-
-class Argument(object):
- def __init__(self, dest, nargs=1, obj=None):
- self.dest = dest
- self.nargs = nargs
- self.obj = obj
-
- def process(self, value, state):
- if self.nargs > 1:
- holes = sum(1 for x in value if x is None)
- if holes == len(value):
- value = None
- elif holes != 0:
- raise BadArgumentUsage(
- "argument {} takes {} values".format(self.dest, self.nargs)
- )
- state.opts[self.dest] = value
- state.order.append(self.obj)
-
-
-class ParsingState(object):
- def __init__(self, rargs):
- self.opts = {}
- self.largs = []
- self.rargs = rargs
- self.order = []
-
-
-class OptionParser(object):
- """The option parser is an internal class that is ultimately used to
- parse options and arguments. It's modelled after optparse and brings
- a similar but vastly simplified API. It should generally not be used
- directly as the high level Click classes wrap it for you.
-
- It's not nearly as extensible as optparse or argparse as it does not
- implement features that are implemented on a higher level (such as
- types or defaults).
-
- :param ctx: optionally the :class:`~click.Context` where this parser
- should go with.
- """
-
- def __init__(self, ctx=None):
- #: The :class:`~click.Context` for this parser. This might be
- #: `None` for some advanced use cases.
- self.ctx = ctx
- #: This controls how the parser deals with interspersed arguments.
- #: If this is set to `False`, the parser will stop on the first
- #: non-option. Click uses this to implement nested subcommands
- #: safely.
- self.allow_interspersed_args = True
- #: This tells the parser how to deal with unknown options. By
- #: default it will error out (which is sensible), but there is a
- #: second mode where it will ignore it and continue processing
- #: after shifting all the unknown options into the resulting args.
- self.ignore_unknown_options = False
- if ctx is not None:
- self.allow_interspersed_args = ctx.allow_interspersed_args
- self.ignore_unknown_options = ctx.ignore_unknown_options
- self._short_opt = {}
- self._long_opt = {}
- self._opt_prefixes = {"-", "--"}
- self._args = []
-
- def add_option(self, opts, dest, action=None, nargs=1, const=None, obj=None):
- """Adds a new option named `dest` to the parser. The destination
- is not inferred (unlike with optparse) and needs to be explicitly
- provided. Action can be any of ``store``, ``store_const``,
- ``append``, ``appnd_const`` or ``count``.
-
- The `obj` can be used to identify the option in the order list
- that is returned from the parser.
- """
- if obj is None:
- obj = dest
- opts = [normalize_opt(opt, self.ctx) for opt in opts]
- option = Option(opts, dest, action=action, nargs=nargs, const=const, obj=obj)
- self._opt_prefixes.update(option.prefixes)
- for opt in option._short_opts:
- self._short_opt[opt] = option
- for opt in option._long_opts:
- self._long_opt[opt] = option
-
- def add_argument(self, dest, nargs=1, obj=None):
- """Adds a positional argument named `dest` to the parser.
-
- The `obj` can be used to identify the option in the order list
- that is returned from the parser.
- """
- if obj is None:
- obj = dest
- self._args.append(Argument(dest=dest, nargs=nargs, obj=obj))
-
- def parse_args(self, args):
- """Parses positional arguments and returns ``(values, args, order)``
- for the parsed options and arguments as well as the leftover
- arguments if there are any. The order is a list of objects as they
- appear on the command line. If arguments appear multiple times they
- will be memorized multiple times as well.
- """
- state = ParsingState(args)
- try:
- self._process_args_for_options(state)
- self._process_args_for_args(state)
- except UsageError:
- if self.ctx is None or not self.ctx.resilient_parsing:
- raise
- return state.opts, state.largs, state.order
-
- def _process_args_for_args(self, state):
- pargs, args = _unpack_args(
- state.largs + state.rargs, [x.nargs for x in self._args]
- )
-
- for idx, arg in enumerate(self._args):
- arg.process(pargs[idx], state)
-
- state.largs = args
- state.rargs = []
-
- def _process_args_for_options(self, state):
- while state.rargs:
- arg = state.rargs.pop(0)
- arglen = len(arg)
- # Double dashes always handled explicitly regardless of what
- # prefixes are valid.
- if arg == "--":
- return
- elif arg[:1] in self._opt_prefixes and arglen > 1:
- self._process_opts(arg, state)
- elif self.allow_interspersed_args:
- state.largs.append(arg)
- else:
- state.rargs.insert(0, arg)
- return
-
- # Say this is the original argument list:
- # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)]
- # ^
- # (we are about to process arg(i)).
- #
- # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of
- # [arg0, ..., arg(i-1)] (any options and their arguments will have
- # been removed from largs).
- #
- # The while loop will usually consume 1 or more arguments per pass.
- # If it consumes 1 (eg. arg is an option that takes no arguments),
- # then after _process_arg() is done the situation is:
- #
- # largs = subset of [arg0, ..., arg(i)]
- # rargs = [arg(i+1), ..., arg(N-1)]
- #
- # If allow_interspersed_args is false, largs will always be
- # *empty* -- still a subset of [arg0, ..., arg(i-1)], but
- # not a very interesting subset!
-
- def _match_long_opt(self, opt, explicit_value, state):
- if opt not in self._long_opt:
- possibilities = [word for word in self._long_opt if word.startswith(opt)]
- raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx)
-
- option = self._long_opt[opt]
- if option.takes_value:
- # At this point it's safe to modify rargs by injecting the
- # explicit value, because no exception is raised in this
- # branch. This means that the inserted value will be fully
- # consumed.
- if explicit_value is not None:
- state.rargs.insert(0, explicit_value)
-
- nargs = option.nargs
- if len(state.rargs) < nargs:
- _error_opt_args(nargs, opt)
- elif nargs == 1:
- value = state.rargs.pop(0)
- else:
- value = tuple(state.rargs[:nargs])
- del state.rargs[:nargs]
-
- elif explicit_value is not None:
- raise BadOptionUsage(opt, "{} option does not take a value".format(opt))
-
- else:
- value = None
-
- option.process(value, state)
-
- def _match_short_opt(self, arg, state):
- stop = False
- i = 1
- prefix = arg[0]
- unknown_options = []
-
- for ch in arg[1:]:
- opt = normalize_opt(prefix + ch, self.ctx)
- option = self._short_opt.get(opt)
- i += 1
-
- if not option:
- if self.ignore_unknown_options:
- unknown_options.append(ch)
- continue
- raise NoSuchOption(opt, ctx=self.ctx)
- if option.takes_value:
- # Any characters left in arg? Pretend they're the
- # next arg, and stop consuming characters of arg.
- if i < len(arg):
- state.rargs.insert(0, arg[i:])
- stop = True
-
- nargs = option.nargs
- if len(state.rargs) < nargs:
- _error_opt_args(nargs, opt)
- elif nargs == 1:
- value = state.rargs.pop(0)
- else:
- value = tuple(state.rargs[:nargs])
- del state.rargs[:nargs]
-
- else:
- value = None
-
- option.process(value, state)
-
- if stop:
- break
-
- # If we got any unknown options we re-combinate the string of the
- # remaining options and re-attach the prefix, then report that
- # to the state as new larg. This way there is basic combinatorics
- # that can be achieved while still ignoring unknown arguments.
- if self.ignore_unknown_options and unknown_options:
- state.largs.append("{}{}".format(prefix, "".join(unknown_options)))
-
- def _process_opts(self, arg, state):
- explicit_value = None
- # Long option handling happens in two parts. The first part is
- # supporting explicitly attached values. In any case, we will try
- # to long match the option first.
- if "=" in arg:
- long_opt, explicit_value = arg.split("=", 1)
- else:
- long_opt = arg
- norm_long_opt = normalize_opt(long_opt, self.ctx)
-
- # At this point we will match the (assumed) long option through
- # the long option matching code. Note that this allows options
- # like "-foo" to be matched as long options.
- try:
- self._match_long_opt(norm_long_opt, explicit_value, state)
- except NoSuchOption:
- # At this point the long option matching failed, and we need
- # to try with short options. However there is a special rule
- # which says, that if we have a two character options prefix
- # (applies to "--foo" for instance), we do not dispatch to the
- # short option code and will instead raise the no option
- # error.
- if arg[:2] not in self._opt_prefixes:
- return self._match_short_opt(arg, state)
- if not self.ignore_unknown_options:
- raise
- state.largs.append(arg)
diff --git a/client/ayon_core/vendor/python/python_2/click/termui.py b/client/ayon_core/vendor/python/python_2/click/termui.py
deleted file mode 100644
index 02ef9e9f04..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/termui.py
+++ /dev/null
@@ -1,681 +0,0 @@
-import inspect
-import io
-import itertools
-import os
-import struct
-import sys
-
-from ._compat import DEFAULT_COLUMNS
-from ._compat import get_winterm_size
-from ._compat import isatty
-from ._compat import raw_input
-from ._compat import string_types
-from ._compat import strip_ansi
-from ._compat import text_type
-from ._compat import WIN
-from .exceptions import Abort
-from .exceptions import UsageError
-from .globals import resolve_color_default
-from .types import Choice
-from .types import convert_type
-from .types import Path
-from .utils import echo
-from .utils import LazyFile
-
-# The prompt functions to use. The doc tools currently override these
-# functions to customize how they work.
-visible_prompt_func = raw_input
-
-_ansi_colors = {
- "black": 30,
- "red": 31,
- "green": 32,
- "yellow": 33,
- "blue": 34,
- "magenta": 35,
- "cyan": 36,
- "white": 37,
- "reset": 39,
- "bright_black": 90,
- "bright_red": 91,
- "bright_green": 92,
- "bright_yellow": 93,
- "bright_blue": 94,
- "bright_magenta": 95,
- "bright_cyan": 96,
- "bright_white": 97,
-}
-_ansi_reset_all = "\033[0m"
-
-
-def hidden_prompt_func(prompt):
- import getpass
-
- return getpass.getpass(prompt)
-
-
-def _build_prompt(
- text, suffix, show_default=False, default=None, show_choices=True, type=None
-):
- prompt = text
- if type is not None and show_choices and isinstance(type, Choice):
- prompt += " ({})".format(", ".join(map(str, type.choices)))
- if default is not None and show_default:
- prompt = "{} [{}]".format(prompt, _format_default(default))
- return prompt + suffix
-
-
-def _format_default(default):
- if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"):
- return default.name
-
- return default
-
-
-def prompt(
- text,
- default=None,
- hide_input=False,
- confirmation_prompt=False,
- type=None,
- value_proc=None,
- prompt_suffix=": ",
- show_default=True,
- err=False,
- show_choices=True,
-):
- """Prompts a user for input. This is a convenience function that can
- be used to prompt a user for input later.
-
- If the user aborts the input by sending a interrupt signal, this
- function will catch it and raise a :exc:`Abort` exception.
-
- .. versionadded:: 7.0
- Added the show_choices parameter.
-
- .. versionadded:: 6.0
- Added unicode support for cmd.exe on Windows.
-
- .. versionadded:: 4.0
- Added the `err` parameter.
-
- :param text: the text to show for the prompt.
- :param default: the default value to use if no input happens. If this
- is not given it will prompt until it's aborted.
- :param hide_input: if this is set to true then the input value will
- be hidden.
- :param confirmation_prompt: asks for confirmation for the value.
- :param type: the type to use to check the value against.
- :param value_proc: if this parameter is provided it's a function that
- is invoked instead of the type conversion to
- convert a value.
- :param prompt_suffix: a suffix that should be added to the prompt.
- :param show_default: shows or hides the default value in the prompt.
- :param err: if set to true the file defaults to ``stderr`` instead of
- ``stdout``, the same as with echo.
- :param show_choices: Show or hide choices if the passed type is a Choice.
- For example if type is a Choice of either day or week,
- show_choices is true and text is "Group by" then the
- prompt will be "Group by (day, week): ".
- """
- result = None
-
- def prompt_func(text):
- f = hidden_prompt_func if hide_input else visible_prompt_func
- try:
- # Write the prompt separately so that we get nice
- # coloring through colorama on Windows
- echo(text, nl=False, err=err)
- return f("")
- except (KeyboardInterrupt, EOFError):
- # getpass doesn't print a newline if the user aborts input with ^C.
- # Allegedly this behavior is inherited from getpass(3).
- # A doc bug has been filed at https://bugs.python.org/issue24711
- if hide_input:
- echo(None, err=err)
- raise Abort()
-
- if value_proc is None:
- value_proc = convert_type(type, default)
-
- prompt = _build_prompt(
- text, prompt_suffix, show_default, default, show_choices, type
- )
-
- while 1:
- while 1:
- value = prompt_func(prompt)
- if value:
- break
- elif default is not None:
- if isinstance(value_proc, Path):
- # validate Path default value(exists, dir_okay etc.)
- value = default
- break
- return default
- try:
- result = value_proc(value)
- except UsageError as e:
- echo("Error: {}".format(e.message), err=err) # noqa: B306
- continue
- if not confirmation_prompt:
- return result
- while 1:
- value2 = prompt_func("Repeat for confirmation: ")
- if value2:
- break
- if value == value2:
- return result
- echo("Error: the two entered values do not match", err=err)
-
-
-def confirm(
- text, default=False, abort=False, prompt_suffix=": ", show_default=True, err=False
-):
- """Prompts for confirmation (yes/no question).
-
- If the user aborts the input by sending a interrupt signal this
- function will catch it and raise a :exc:`Abort` exception.
-
- .. versionadded:: 4.0
- Added the `err` parameter.
-
- :param text: the question to ask.
- :param default: the default for the prompt.
- :param abort: if this is set to `True` a negative answer aborts the
- exception by raising :exc:`Abort`.
- :param prompt_suffix: a suffix that should be added to the prompt.
- :param show_default: shows or hides the default value in the prompt.
- :param err: if set to true the file defaults to ``stderr`` instead of
- ``stdout``, the same as with echo.
- """
- prompt = _build_prompt(
- text, prompt_suffix, show_default, "Y/n" if default else "y/N"
- )
- while 1:
- try:
- # Write the prompt separately so that we get nice
- # coloring through colorama on Windows
- echo(prompt, nl=False, err=err)
- value = visible_prompt_func("").lower().strip()
- except (KeyboardInterrupt, EOFError):
- raise Abort()
- if value in ("y", "yes"):
- rv = True
- elif value in ("n", "no"):
- rv = False
- elif value == "":
- rv = default
- else:
- echo("Error: invalid input", err=err)
- continue
- break
- if abort and not rv:
- raise Abort()
- return rv
-
-
-def get_terminal_size():
- """Returns the current size of the terminal as tuple in the form
- ``(width, height)`` in columns and rows.
- """
- # If shutil has get_terminal_size() (Python 3.3 and later) use that
- if sys.version_info >= (3, 3):
- import shutil
-
- shutil_get_terminal_size = getattr(shutil, "get_terminal_size", None)
- if shutil_get_terminal_size:
- sz = shutil_get_terminal_size()
- return sz.columns, sz.lines
-
- # We provide a sensible default for get_winterm_size() when being invoked
- # inside a subprocess. Without this, it would not provide a useful input.
- if get_winterm_size is not None:
- size = get_winterm_size()
- if size == (0, 0):
- return (79, 24)
- else:
- return size
-
- def ioctl_gwinsz(fd):
- try:
- import fcntl
- import termios
-
- cr = struct.unpack("hh", fcntl.ioctl(fd, termios.TIOCGWINSZ, "1234"))
- except Exception:
- return
- return cr
-
- cr = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2)
- if not cr:
- try:
- fd = os.open(os.ctermid(), os.O_RDONLY)
- try:
- cr = ioctl_gwinsz(fd)
- finally:
- os.close(fd)
- except Exception:
- pass
- if not cr or not cr[0] or not cr[1]:
- cr = (os.environ.get("LINES", 25), os.environ.get("COLUMNS", DEFAULT_COLUMNS))
- return int(cr[1]), int(cr[0])
-
-
-def echo_via_pager(text_or_generator, color=None):
- """This function takes a text and shows it via an environment specific
- pager on stdout.
-
- .. versionchanged:: 3.0
- Added the `color` flag.
-
- :param text_or_generator: the text to page, or alternatively, a
- generator emitting the text to page.
- :param color: controls if the pager supports ANSI colors or not. The
- default is autodetection.
- """
- color = resolve_color_default(color)
-
- if inspect.isgeneratorfunction(text_or_generator):
- i = text_or_generator()
- elif isinstance(text_or_generator, string_types):
- i = [text_or_generator]
- else:
- i = iter(text_or_generator)
-
- # convert every element of i to a text type if necessary
- text_generator = (el if isinstance(el, string_types) else text_type(el) for el in i)
-
- from ._termui_impl import pager
-
- return pager(itertools.chain(text_generator, "\n"), color)
-
-
-def progressbar(
- iterable=None,
- length=None,
- label=None,
- show_eta=True,
- show_percent=None,
- show_pos=False,
- item_show_func=None,
- fill_char="#",
- empty_char="-",
- bar_template="%(label)s [%(bar)s] %(info)s",
- info_sep=" ",
- width=36,
- file=None,
- color=None,
-):
- """This function creates an iterable context manager that can be used
- to iterate over something while showing a progress bar. It will
- either iterate over the `iterable` or `length` items (that are counted
- up). While iteration happens, this function will print a rendered
- progress bar to the given `file` (defaults to stdout) and will attempt
- to calculate remaining time and more. By default, this progress bar
- will not be rendered if the file is not a terminal.
-
- The context manager creates the progress bar. When the context
- manager is entered the progress bar is already created. With every
- iteration over the progress bar, the iterable passed to the bar is
- advanced and the bar is updated. When the context manager exits,
- a newline is printed and the progress bar is finalized on screen.
-
- Note: The progress bar is currently designed for use cases where the
- total progress can be expected to take at least several seconds.
- Because of this, the ProgressBar class object won't display
- progress that is considered too fast, and progress where the time
- between steps is less than a second.
-
- No printing must happen or the progress bar will be unintentionally
- destroyed.
-
- Example usage::
-
- with progressbar(items) as bar:
- for item in bar:
- do_something_with(item)
-
- Alternatively, if no iterable is specified, one can manually update the
- progress bar through the `update()` method instead of directly
- iterating over the progress bar. The update method accepts the number
- of steps to increment the bar with::
-
- with progressbar(length=chunks.total_bytes) as bar:
- for chunk in chunks:
- process_chunk(chunk)
- bar.update(chunks.bytes)
-
- .. versionadded:: 2.0
-
- .. versionadded:: 4.0
- Added the `color` parameter. Added a `update` method to the
- progressbar object.
-
- :param iterable: an iterable to iterate over. If not provided the length
- is required.
- :param length: the number of items to iterate over. By default the
- progressbar will attempt to ask the iterator about its
- length, which might or might not work. If an iterable is
- also provided this parameter can be used to override the
- length. If an iterable is not provided the progress bar
- will iterate over a range of that length.
- :param label: the label to show next to the progress bar.
- :param show_eta: enables or disables the estimated time display. This is
- automatically disabled if the length cannot be
- determined.
- :param show_percent: enables or disables the percentage display. The
- default is `True` if the iterable has a length or
- `False` if not.
- :param show_pos: enables or disables the absolute position display. The
- default is `False`.
- :param item_show_func: a function called with the current item which
- can return a string to show the current item
- next to the progress bar. Note that the current
- item can be `None`!
- :param fill_char: the character to use to show the filled part of the
- progress bar.
- :param empty_char: the character to use to show the non-filled part of
- the progress bar.
- :param bar_template: the format string to use as template for the bar.
- The parameters in it are ``label`` for the label,
- ``bar`` for the progress bar and ``info`` for the
- info section.
- :param info_sep: the separator between multiple info items (eta etc.)
- :param width: the width of the progress bar in characters, 0 means full
- terminal width
- :param file: the file to write to. If this is not a terminal then
- only the label is printed.
- :param color: controls if the terminal supports ANSI colors or not. The
- default is autodetection. This is only needed if ANSI
- codes are included anywhere in the progress bar output
- which is not the case by default.
- """
- from ._termui_impl import ProgressBar
-
- color = resolve_color_default(color)
- return ProgressBar(
- iterable=iterable,
- length=length,
- show_eta=show_eta,
- show_percent=show_percent,
- show_pos=show_pos,
- item_show_func=item_show_func,
- fill_char=fill_char,
- empty_char=empty_char,
- bar_template=bar_template,
- info_sep=info_sep,
- file=file,
- label=label,
- width=width,
- color=color,
- )
-
-
-def clear():
- """Clears the terminal screen. This will have the effect of clearing
- the whole visible space of the terminal and moving the cursor to the
- top left. This does not do anything if not connected to a terminal.
-
- .. versionadded:: 2.0
- """
- if not isatty(sys.stdout):
- return
- # If we're on Windows and we don't have colorama available, then we
- # clear the screen by shelling out. Otherwise we can use an escape
- # sequence.
- if WIN:
- os.system("cls")
- else:
- sys.stdout.write("\033[2J\033[1;1H")
-
-
-def style(
- text,
- fg=None,
- bg=None,
- bold=None,
- dim=None,
- underline=None,
- blink=None,
- reverse=None,
- reset=True,
-):
- """Styles a text with ANSI styles and returns the new string. By
- default the styling is self contained which means that at the end
- of the string a reset code is issued. This can be prevented by
- passing ``reset=False``.
-
- Examples::
-
- click.echo(click.style('Hello World!', fg='green'))
- click.echo(click.style('ATTENTION!', blink=True))
- click.echo(click.style('Some things', reverse=True, fg='cyan'))
-
- Supported color names:
-
- * ``black`` (might be a gray)
- * ``red``
- * ``green``
- * ``yellow`` (might be an orange)
- * ``blue``
- * ``magenta``
- * ``cyan``
- * ``white`` (might be light gray)
- * ``bright_black``
- * ``bright_red``
- * ``bright_green``
- * ``bright_yellow``
- * ``bright_blue``
- * ``bright_magenta``
- * ``bright_cyan``
- * ``bright_white``
- * ``reset`` (reset the color code only)
-
- .. versionadded:: 2.0
-
- .. versionadded:: 7.0
- Added support for bright colors.
-
- :param text: the string to style with ansi codes.
- :param fg: if provided this will become the foreground color.
- :param bg: if provided this will become the background color.
- :param bold: if provided this will enable or disable bold mode.
- :param dim: if provided this will enable or disable dim mode. This is
- badly supported.
- :param underline: if provided this will enable or disable underline.
- :param blink: if provided this will enable or disable blinking.
- :param reverse: if provided this will enable or disable inverse
- rendering (foreground becomes background and the
- other way round).
- :param reset: by default a reset-all code is added at the end of the
- string which means that styles do not carry over. This
- can be disabled to compose styles.
- """
- bits = []
- if fg:
- try:
- bits.append("\033[{}m".format(_ansi_colors[fg]))
- except KeyError:
- raise TypeError("Unknown color '{}'".format(fg))
- if bg:
- try:
- bits.append("\033[{}m".format(_ansi_colors[bg] + 10))
- except KeyError:
- raise TypeError("Unknown color '{}'".format(bg))
- if bold is not None:
- bits.append("\033[{}m".format(1 if bold else 22))
- if dim is not None:
- bits.append("\033[{}m".format(2 if dim else 22))
- if underline is not None:
- bits.append("\033[{}m".format(4 if underline else 24))
- if blink is not None:
- bits.append("\033[{}m".format(5 if blink else 25))
- if reverse is not None:
- bits.append("\033[{}m".format(7 if reverse else 27))
- bits.append(text)
- if reset:
- bits.append(_ansi_reset_all)
- return "".join(bits)
-
-
-def unstyle(text):
- """Removes ANSI styling information from a string. Usually it's not
- necessary to use this function as Click's echo function will
- automatically remove styling if necessary.
-
- .. versionadded:: 2.0
-
- :param text: the text to remove style information from.
- """
- return strip_ansi(text)
-
-
-def secho(message=None, file=None, nl=True, err=False, color=None, **styles):
- """This function combines :func:`echo` and :func:`style` into one
- call. As such the following two calls are the same::
-
- click.secho('Hello World!', fg='green')
- click.echo(click.style('Hello World!', fg='green'))
-
- All keyword arguments are forwarded to the underlying functions
- depending on which one they go with.
-
- .. versionadded:: 2.0
- """
- if message is not None:
- message = style(message, **styles)
- return echo(message, file=file, nl=nl, err=err, color=color)
-
-
-def edit(
- text=None, editor=None, env=None, require_save=True, extension=".txt", filename=None
-):
- r"""Edits the given text in the defined editor. If an editor is given
- (should be the full path to the executable but the regular operating
- system search path is used for finding the executable) it overrides
- the detected editor. Optionally, some environment variables can be
- used. If the editor is closed without changes, `None` is returned. In
- case a file is edited directly the return value is always `None` and
- `require_save` and `extension` are ignored.
-
- If the editor cannot be opened a :exc:`UsageError` is raised.
-
- Note for Windows: to simplify cross-platform usage, the newlines are
- automatically converted from POSIX to Windows and vice versa. As such,
- the message here will have ``\n`` as newline markers.
-
- :param text: the text to edit.
- :param editor: optionally the editor to use. Defaults to automatic
- detection.
- :param env: environment variables to forward to the editor.
- :param require_save: if this is true, then not saving in the editor
- will make the return value become `None`.
- :param extension: the extension to tell the editor about. This defaults
- to `.txt` but changing this might change syntax
- highlighting.
- :param filename: if provided it will edit this file instead of the
- provided text contents. It will not use a temporary
- file as an indirection in that case.
- """
- from ._termui_impl import Editor
-
- editor = Editor(
- editor=editor, env=env, require_save=require_save, extension=extension
- )
- if filename is None:
- return editor.edit(text)
- editor.edit_file(filename)
-
-
-def launch(url, wait=False, locate=False):
- """This function launches the given URL (or filename) in the default
- viewer application for this file type. If this is an executable, it
- might launch the executable in a new session. The return value is
- the exit code of the launched application. Usually, ``0`` indicates
- success.
-
- Examples::
-
- click.launch('https://click.palletsprojects.com/')
- click.launch('/my/downloaded/file', locate=True)
-
- .. versionadded:: 2.0
-
- :param url: URL or filename of the thing to launch.
- :param wait: waits for the program to stop.
- :param locate: if this is set to `True` then instead of launching the
- application associated with the URL it will attempt to
- launch a file manager with the file located. This
- might have weird effects if the URL does not point to
- the filesystem.
- """
- from ._termui_impl import open_url
-
- return open_url(url, wait=wait, locate=locate)
-
-
-# If this is provided, getchar() calls into this instead. This is used
-# for unittesting purposes.
-_getchar = None
-
-
-def getchar(echo=False):
- """Fetches a single character from the terminal and returns it. This
- will always return a unicode character and under certain rare
- circumstances this might return more than one character. The
- situations which more than one character is returned is when for
- whatever reason multiple characters end up in the terminal buffer or
- standard input was not actually a terminal.
-
- Note that this will always read from the terminal, even if something
- is piped into the standard input.
-
- Note for Windows: in rare cases when typing non-ASCII characters, this
- function might wait for a second character and then return both at once.
- This is because certain Unicode characters look like special-key markers.
-
- .. versionadded:: 2.0
-
- :param echo: if set to `True`, the character read will also show up on
- the terminal. The default is to not show it.
- """
- f = _getchar
- if f is None:
- from ._termui_impl import getchar as f
- return f(echo)
-
-
-def raw_terminal():
- from ._termui_impl import raw_terminal as f
-
- return f()
-
-
-def pause(info="Press any key to continue ...", err=False):
- """This command stops execution and waits for the user to press any
- key to continue. This is similar to the Windows batch "pause"
- command. If the program is not run through a terminal, this command
- will instead do nothing.
-
- .. versionadded:: 2.0
-
- .. versionadded:: 4.0
- Added the `err` parameter.
-
- :param info: the info string to print before pausing.
- :param err: if set to message goes to ``stderr`` instead of
- ``stdout``, the same as with echo.
- """
- if not isatty(sys.stdin) or not isatty(sys.stdout):
- return
- try:
- if info:
- echo(info, nl=False, err=err)
- try:
- getchar()
- except (KeyboardInterrupt, EOFError):
- pass
- finally:
- if info:
- echo(err=err)
diff --git a/client/ayon_core/vendor/python/python_2/click/testing.py b/client/ayon_core/vendor/python/python_2/click/testing.py
deleted file mode 100644
index a3dba3b301..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/testing.py
+++ /dev/null
@@ -1,382 +0,0 @@
-import contextlib
-import os
-import shlex
-import shutil
-import sys
-import tempfile
-
-from . import formatting
-from . import termui
-from . import utils
-from ._compat import iteritems
-from ._compat import PY2
-from ._compat import string_types
-
-
-if PY2:
- from cStringIO import StringIO
-else:
- import io
- from ._compat import _find_binary_reader
-
-
-class EchoingStdin(object):
- def __init__(self, input, output):
- self._input = input
- self._output = output
-
- def __getattr__(self, x):
- return getattr(self._input, x)
-
- def _echo(self, rv):
- self._output.write(rv)
- return rv
-
- def read(self, n=-1):
- return self._echo(self._input.read(n))
-
- def readline(self, n=-1):
- return self._echo(self._input.readline(n))
-
- def readlines(self):
- return [self._echo(x) for x in self._input.readlines()]
-
- def __iter__(self):
- return iter(self._echo(x) for x in self._input)
-
- def __repr__(self):
- return repr(self._input)
-
-
-def make_input_stream(input, charset):
- # Is already an input stream.
- if hasattr(input, "read"):
- if PY2:
- return input
- rv = _find_binary_reader(input)
- if rv is not None:
- return rv
- raise TypeError("Could not find binary reader for input stream.")
-
- if input is None:
- input = b""
- elif not isinstance(input, bytes):
- input = input.encode(charset)
- if PY2:
- return StringIO(input)
- return io.BytesIO(input)
-
-
-class Result(object):
- """Holds the captured result of an invoked CLI script."""
-
- def __init__(
- self, runner, stdout_bytes, stderr_bytes, exit_code, exception, exc_info=None
- ):
- #: The runner that created the result
- self.runner = runner
- #: The standard output as bytes.
- self.stdout_bytes = stdout_bytes
- #: The standard error as bytes, or None if not available
- self.stderr_bytes = stderr_bytes
- #: The exit code as integer.
- self.exit_code = exit_code
- #: The exception that happened if one did.
- self.exception = exception
- #: The traceback
- self.exc_info = exc_info
-
- @property
- def output(self):
- """The (standard) output as unicode string."""
- return self.stdout
-
- @property
- def stdout(self):
- """The standard output as unicode string."""
- return self.stdout_bytes.decode(self.runner.charset, "replace").replace(
- "\r\n", "\n"
- )
-
- @property
- def stderr(self):
- """The standard error as unicode string."""
- if self.stderr_bytes is None:
- raise ValueError("stderr not separately captured")
- return self.stderr_bytes.decode(self.runner.charset, "replace").replace(
- "\r\n", "\n"
- )
-
- def __repr__(self):
- return "<{} {}>".format(
- type(self).__name__, repr(self.exception) if self.exception else "okay"
- )
-
-
-class CliRunner(object):
- """The CLI runner provides functionality to invoke a Click command line
- script for unittesting purposes in a isolated environment. This only
- works in single-threaded systems without any concurrency as it changes the
- global interpreter state.
-
- :param charset: the character set for the input and output data. This is
- UTF-8 by default and should not be changed currently as
- the reporting to Click only works in Python 2 properly.
- :param env: a dictionary with environment variables for overriding.
- :param echo_stdin: if this is set to `True`, then reading from stdin writes
- to stdout. This is useful for showing examples in
- some circumstances. Note that regular prompts
- will automatically echo the input.
- :param mix_stderr: if this is set to `False`, then stdout and stderr are
- preserved as independent streams. This is useful for
- Unix-philosophy apps that have predictable stdout and
- noisy stderr, such that each may be measured
- independently
- """
-
- def __init__(self, charset=None, env=None, echo_stdin=False, mix_stderr=True):
- if charset is None:
- charset = "utf-8"
- self.charset = charset
- self.env = env or {}
- self.echo_stdin = echo_stdin
- self.mix_stderr = mix_stderr
-
- def get_default_prog_name(self, cli):
- """Given a command object it will return the default program name
- for it. The default is the `name` attribute or ``"root"`` if not
- set.
- """
- return cli.name or "root"
-
- def make_env(self, overrides=None):
- """Returns the environment overrides for invoking a script."""
- rv = dict(self.env)
- if overrides:
- rv.update(overrides)
- return rv
-
- @contextlib.contextmanager
- def isolation(self, input=None, env=None, color=False):
- """A context manager that sets up the isolation for invoking of a
- command line tool. This sets up stdin with the given input data
- and `os.environ` with the overrides from the given dictionary.
- This also rebinds some internals in Click to be mocked (like the
- prompt functionality).
-
- This is automatically done in the :meth:`invoke` method.
-
- .. versionadded:: 4.0
- The ``color`` parameter was added.
-
- :param input: the input stream to put into sys.stdin.
- :param env: the environment overrides as dictionary.
- :param color: whether the output should contain color codes. The
- application can still override this explicitly.
- """
- input = make_input_stream(input, self.charset)
-
- old_stdin = sys.stdin
- old_stdout = sys.stdout
- old_stderr = sys.stderr
- old_forced_width = formatting.FORCED_WIDTH
- formatting.FORCED_WIDTH = 80
-
- env = self.make_env(env)
-
- if PY2:
- bytes_output = StringIO()
- if self.echo_stdin:
- input = EchoingStdin(input, bytes_output)
- sys.stdout = bytes_output
- if not self.mix_stderr:
- bytes_error = StringIO()
- sys.stderr = bytes_error
- else:
- bytes_output = io.BytesIO()
- if self.echo_stdin:
- input = EchoingStdin(input, bytes_output)
- input = io.TextIOWrapper(input, encoding=self.charset)
- sys.stdout = io.TextIOWrapper(bytes_output, encoding=self.charset)
- if not self.mix_stderr:
- bytes_error = io.BytesIO()
- sys.stderr = io.TextIOWrapper(bytes_error, encoding=self.charset)
-
- if self.mix_stderr:
- sys.stderr = sys.stdout
-
- sys.stdin = input
-
- def visible_input(prompt=None):
- sys.stdout.write(prompt or "")
- val = input.readline().rstrip("\r\n")
- sys.stdout.write("{}\n".format(val))
- sys.stdout.flush()
- return val
-
- def hidden_input(prompt=None):
- sys.stdout.write("{}\n".format(prompt or ""))
- sys.stdout.flush()
- return input.readline().rstrip("\r\n")
-
- def _getchar(echo):
- char = sys.stdin.read(1)
- if echo:
- sys.stdout.write(char)
- sys.stdout.flush()
- return char
-
- default_color = color
-
- def should_strip_ansi(stream=None, color=None):
- if color is None:
- return not default_color
- return not color
-
- old_visible_prompt_func = termui.visible_prompt_func
- old_hidden_prompt_func = termui.hidden_prompt_func
- old__getchar_func = termui._getchar
- old_should_strip_ansi = utils.should_strip_ansi
- termui.visible_prompt_func = visible_input
- termui.hidden_prompt_func = hidden_input
- termui._getchar = _getchar
- utils.should_strip_ansi = should_strip_ansi
-
- old_env = {}
- try:
- for key, value in iteritems(env):
- old_env[key] = os.environ.get(key)
- if value is None:
- try:
- del os.environ[key]
- except Exception:
- pass
- else:
- os.environ[key] = value
- yield (bytes_output, not self.mix_stderr and bytes_error)
- finally:
- for key, value in iteritems(old_env):
- if value is None:
- try:
- del os.environ[key]
- except Exception:
- pass
- else:
- os.environ[key] = value
- sys.stdout = old_stdout
- sys.stderr = old_stderr
- sys.stdin = old_stdin
- termui.visible_prompt_func = old_visible_prompt_func
- termui.hidden_prompt_func = old_hidden_prompt_func
- termui._getchar = old__getchar_func
- utils.should_strip_ansi = old_should_strip_ansi
- formatting.FORCED_WIDTH = old_forced_width
-
- def invoke(
- self,
- cli,
- args=None,
- input=None,
- env=None,
- catch_exceptions=True,
- color=False,
- **extra
- ):
- """Invokes a command in an isolated environment. The arguments are
- forwarded directly to the command line script, the `extra` keyword
- arguments are passed to the :meth:`~clickpkg.Command.main` function of
- the command.
-
- This returns a :class:`Result` object.
-
- .. versionadded:: 3.0
- The ``catch_exceptions`` parameter was added.
-
- .. versionchanged:: 3.0
- The result object now has an `exc_info` attribute with the
- traceback if available.
-
- .. versionadded:: 4.0
- The ``color`` parameter was added.
-
- :param cli: the command to invoke
- :param args: the arguments to invoke. It may be given as an iterable
- or a string. When given as string it will be interpreted
- as a Unix shell command. More details at
- :func:`shlex.split`.
- :param input: the input data for `sys.stdin`.
- :param env: the environment overrides.
- :param catch_exceptions: Whether to catch any other exceptions than
- ``SystemExit``.
- :param extra: the keyword arguments to pass to :meth:`main`.
- :param color: whether the output should contain color codes. The
- application can still override this explicitly.
- """
- exc_info = None
- with self.isolation(input=input, env=env, color=color) as outstreams:
- exception = None
- exit_code = 0
-
- if isinstance(args, string_types):
- args = shlex.split(args)
-
- try:
- prog_name = extra.pop("prog_name")
- except KeyError:
- prog_name = self.get_default_prog_name(cli)
-
- try:
- cli.main(args=args or (), prog_name=prog_name, **extra)
- except SystemExit as e:
- exc_info = sys.exc_info()
- exit_code = e.code
- if exit_code is None:
- exit_code = 0
-
- if exit_code != 0:
- exception = e
-
- if not isinstance(exit_code, int):
- sys.stdout.write(str(exit_code))
- sys.stdout.write("\n")
- exit_code = 1
-
- except Exception as e:
- if not catch_exceptions:
- raise
- exception = e
- exit_code = 1
- exc_info = sys.exc_info()
- finally:
- sys.stdout.flush()
- stdout = outstreams[0].getvalue()
- if self.mix_stderr:
- stderr = None
- else:
- stderr = outstreams[1].getvalue()
-
- return Result(
- runner=self,
- stdout_bytes=stdout,
- stderr_bytes=stderr,
- exit_code=exit_code,
- exception=exception,
- exc_info=exc_info,
- )
-
- @contextlib.contextmanager
- def isolated_filesystem(self):
- """A context manager that creates a temporary folder and changes
- the current working directory to it for isolated filesystem tests.
- """
- cwd = os.getcwd()
- t = tempfile.mkdtemp()
- os.chdir(t)
- try:
- yield t
- finally:
- os.chdir(cwd)
- try:
- shutil.rmtree(t)
- except (OSError, IOError): # noqa: B014
- pass
diff --git a/client/ayon_core/vendor/python/python_2/click/types.py b/client/ayon_core/vendor/python/python_2/click/types.py
deleted file mode 100644
index 505c39f850..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/types.py
+++ /dev/null
@@ -1,762 +0,0 @@
-import os
-import stat
-from datetime import datetime
-
-from ._compat import _get_argv_encoding
-from ._compat import filename_to_ui
-from ._compat import get_filesystem_encoding
-from ._compat import get_streerror
-from ._compat import open_stream
-from ._compat import PY2
-from ._compat import text_type
-from .exceptions import BadParameter
-from .utils import LazyFile
-from .utils import safecall
-
-
-class ParamType(object):
- """Helper for converting values through types. The following is
- necessary for a valid type:
-
- * it needs a name
- * it needs to pass through None unchanged
- * it needs to convert from a string
- * it needs to convert its result type through unchanged
- (eg: needs to be idempotent)
- * it needs to be able to deal with param and context being `None`.
- This can be the case when the object is used with prompt
- inputs.
- """
-
- is_composite = False
-
- #: the descriptive name of this type
- name = None
-
- #: if a list of this type is expected and the value is pulled from a
- #: string environment variable, this is what splits it up. `None`
- #: means any whitespace. For all parameters the general rule is that
- #: whitespace splits them up. The exception are paths and files which
- #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on
- #: Windows).
- envvar_list_splitter = None
-
- def __call__(self, value, param=None, ctx=None):
- if value is not None:
- return self.convert(value, param, ctx)
-
- def get_metavar(self, param):
- """Returns the metavar default for this param if it provides one."""
-
- def get_missing_message(self, param):
- """Optionally might return extra information about a missing
- parameter.
-
- .. versionadded:: 2.0
- """
-
- def convert(self, value, param, ctx):
- """Converts the value. This is not invoked for values that are
- `None` (the missing value).
- """
- return value
-
- def split_envvar_value(self, rv):
- """Given a value from an environment variable this splits it up
- into small chunks depending on the defined envvar list splitter.
-
- If the splitter is set to `None`, which means that whitespace splits,
- then leading and trailing whitespace is ignored. Otherwise, leading
- and trailing splitters usually lead to empty items being included.
- """
- return (rv or "").split(self.envvar_list_splitter)
-
- def fail(self, message, param=None, ctx=None):
- """Helper method to fail with an invalid value message."""
- raise BadParameter(message, ctx=ctx, param=param)
-
-
-class CompositeParamType(ParamType):
- is_composite = True
-
- @property
- def arity(self):
- raise NotImplementedError()
-
-
-class FuncParamType(ParamType):
- def __init__(self, func):
- self.name = func.__name__
- self.func = func
-
- def convert(self, value, param, ctx):
- try:
- return self.func(value)
- except ValueError:
- try:
- value = text_type(value)
- except UnicodeError:
- value = str(value).decode("utf-8", "replace")
- self.fail(value, param, ctx)
-
-
-class UnprocessedParamType(ParamType):
- name = "text"
-
- def convert(self, value, param, ctx):
- return value
-
- def __repr__(self):
- return "UNPROCESSED"
-
-
-class StringParamType(ParamType):
- name = "text"
-
- def convert(self, value, param, ctx):
- if isinstance(value, bytes):
- enc = _get_argv_encoding()
- try:
- value = value.decode(enc)
- except UnicodeError:
- fs_enc = get_filesystem_encoding()
- if fs_enc != enc:
- try:
- value = value.decode(fs_enc)
- except UnicodeError:
- value = value.decode("utf-8", "replace")
- else:
- value = value.decode("utf-8", "replace")
- return value
- return value
-
- def __repr__(self):
- return "STRING"
-
-
-class Choice(ParamType):
- """The choice type allows a value to be checked against a fixed set
- of supported values. All of these values have to be strings.
-
- You should only pass a list or tuple of choices. Other iterables
- (like generators) may lead to surprising results.
-
- The resulting value will always be one of the originally passed choices
- regardless of ``case_sensitive`` or any ``ctx.token_normalize_func``
- being specified.
-
- See :ref:`choice-opts` for an example.
-
- :param case_sensitive: Set to false to make choices case
- insensitive. Defaults to true.
- """
-
- name = "choice"
-
- def __init__(self, choices, case_sensitive=True):
- self.choices = choices
- self.case_sensitive = case_sensitive
-
- def get_metavar(self, param):
- return "[{}]".format("|".join(self.choices))
-
- def get_missing_message(self, param):
- return "Choose from:\n\t{}.".format(",\n\t".join(self.choices))
-
- def convert(self, value, param, ctx):
- # Match through normalization and case sensitivity
- # first do token_normalize_func, then lowercase
- # preserve original `value` to produce an accurate message in
- # `self.fail`
- normed_value = value
- normed_choices = {choice: choice for choice in self.choices}
-
- if ctx is not None and ctx.token_normalize_func is not None:
- normed_value = ctx.token_normalize_func(value)
- normed_choices = {
- ctx.token_normalize_func(normed_choice): original
- for normed_choice, original in normed_choices.items()
- }
-
- if not self.case_sensitive:
- if PY2:
- lower = str.lower
- else:
- lower = str.casefold
-
- normed_value = lower(normed_value)
- normed_choices = {
- lower(normed_choice): original
- for normed_choice, original in normed_choices.items()
- }
-
- if normed_value in normed_choices:
- return normed_choices[normed_value]
-
- self.fail(
- "invalid choice: {}. (choose from {})".format(
- value, ", ".join(self.choices)
- ),
- param,
- ctx,
- )
-
- def __repr__(self):
- return "Choice('{}')".format(list(self.choices))
-
-
-class DateTime(ParamType):
- """The DateTime type converts date strings into `datetime` objects.
-
- The format strings which are checked are configurable, but default to some
- common (non-timezone aware) ISO 8601 formats.
-
- When specifying *DateTime* formats, you should only pass a list or a tuple.
- Other iterables, like generators, may lead to surprising results.
-
- The format strings are processed using ``datetime.strptime``, and this
- consequently defines the format strings which are allowed.
-
- Parsing is tried using each format, in order, and the first format which
- parses successfully is used.
-
- :param formats: A list or tuple of date format strings, in the order in
- which they should be tried. Defaults to
- ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``,
- ``'%Y-%m-%d %H:%M:%S'``.
- """
-
- name = "datetime"
-
- def __init__(self, formats=None):
- self.formats = formats or ["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"]
-
- def get_metavar(self, param):
- return "[{}]".format("|".join(self.formats))
-
- def _try_to_convert_date(self, value, format):
- try:
- return datetime.strptime(value, format)
- except ValueError:
- return None
-
- def convert(self, value, param, ctx):
- # Exact match
- for format in self.formats:
- dtime = self._try_to_convert_date(value, format)
- if dtime:
- return dtime
-
- self.fail(
- "invalid datetime format: {}. (choose from {})".format(
- value, ", ".join(self.formats)
- )
- )
-
- def __repr__(self):
- return "DateTime"
-
-
-class IntParamType(ParamType):
- name = "integer"
-
- def convert(self, value, param, ctx):
- try:
- return int(value)
- except ValueError:
- self.fail("{} is not a valid integer".format(value), param, ctx)
-
- def __repr__(self):
- return "INT"
-
-
-class IntRange(IntParamType):
- """A parameter that works similar to :data:`click.INT` but restricts
- the value to fit into a range. The default behavior is to fail if the
- value falls outside the range, but it can also be silently clamped
- between the two edges.
-
- See :ref:`ranges` for an example.
- """
-
- name = "integer range"
-
- def __init__(self, min=None, max=None, clamp=False):
- self.min = min
- self.max = max
- self.clamp = clamp
-
- def convert(self, value, param, ctx):
- rv = IntParamType.convert(self, value, param, ctx)
- if self.clamp:
- if self.min is not None and rv < self.min:
- return self.min
- if self.max is not None and rv > self.max:
- return self.max
- if (
- self.min is not None
- and rv < self.min
- or self.max is not None
- and rv > self.max
- ):
- if self.min is None:
- self.fail(
- "{} is bigger than the maximum valid value {}.".format(
- rv, self.max
- ),
- param,
- ctx,
- )
- elif self.max is None:
- self.fail(
- "{} is smaller than the minimum valid value {}.".format(
- rv, self.min
- ),
- param,
- ctx,
- )
- else:
- self.fail(
- "{} is not in the valid range of {} to {}.".format(
- rv, self.min, self.max
- ),
- param,
- ctx,
- )
- return rv
-
- def __repr__(self):
- return "IntRange({}, {})".format(self.min, self.max)
-
-
-class FloatParamType(ParamType):
- name = "float"
-
- def convert(self, value, param, ctx):
- try:
- return float(value)
- except ValueError:
- self.fail(
- "{} is not a valid floating point value".format(value), param, ctx
- )
-
- def __repr__(self):
- return "FLOAT"
-
-
-class FloatRange(FloatParamType):
- """A parameter that works similar to :data:`click.FLOAT` but restricts
- the value to fit into a range. The default behavior is to fail if the
- value falls outside the range, but it can also be silently clamped
- between the two edges.
-
- See :ref:`ranges` for an example.
- """
-
- name = "float range"
-
- def __init__(self, min=None, max=None, clamp=False):
- self.min = min
- self.max = max
- self.clamp = clamp
-
- def convert(self, value, param, ctx):
- rv = FloatParamType.convert(self, value, param, ctx)
- if self.clamp:
- if self.min is not None and rv < self.min:
- return self.min
- if self.max is not None and rv > self.max:
- return self.max
- if (
- self.min is not None
- and rv < self.min
- or self.max is not None
- and rv > self.max
- ):
- if self.min is None:
- self.fail(
- "{} is bigger than the maximum valid value {}.".format(
- rv, self.max
- ),
- param,
- ctx,
- )
- elif self.max is None:
- self.fail(
- "{} is smaller than the minimum valid value {}.".format(
- rv, self.min
- ),
- param,
- ctx,
- )
- else:
- self.fail(
- "{} is not in the valid range of {} to {}.".format(
- rv, self.min, self.max
- ),
- param,
- ctx,
- )
- return rv
-
- def __repr__(self):
- return "FloatRange({}, {})".format(self.min, self.max)
-
-
-class BoolParamType(ParamType):
- name = "boolean"
-
- def convert(self, value, param, ctx):
- if isinstance(value, bool):
- return bool(value)
- value = value.lower()
- if value in ("true", "t", "1", "yes", "y"):
- return True
- elif value in ("false", "f", "0", "no", "n"):
- return False
- self.fail("{} is not a valid boolean".format(value), param, ctx)
-
- def __repr__(self):
- return "BOOL"
-
-
-class UUIDParameterType(ParamType):
- name = "uuid"
-
- def convert(self, value, param, ctx):
- import uuid
-
- try:
- if PY2 and isinstance(value, text_type):
- value = value.encode("ascii")
- return uuid.UUID(value)
- except ValueError:
- self.fail("{} is not a valid UUID value".format(value), param, ctx)
-
- def __repr__(self):
- return "UUID"
-
-
-class File(ParamType):
- """Declares a parameter to be a file for reading or writing. The file
- is automatically closed once the context tears down (after the command
- finished working).
-
- Files can be opened for reading or writing. The special value ``-``
- indicates stdin or stdout depending on the mode.
-
- By default, the file is opened for reading text data, but it can also be
- opened in binary mode or for writing. The encoding parameter can be used
- to force a specific encoding.
-
- The `lazy` flag controls if the file should be opened immediately or upon
- first IO. The default is to be non-lazy for standard input and output
- streams as well as files opened for reading, `lazy` otherwise. When opening a
- file lazily for reading, it is still opened temporarily for validation, but
- will not be held open until first IO. lazy is mainly useful when opening
- for writing to avoid creating the file until it is needed.
-
- Starting with Click 2.0, files can also be opened atomically in which
- case all writes go into a separate file in the same folder and upon
- completion the file will be moved over to the original location. This
- is useful if a file regularly read by other users is modified.
-
- See :ref:`file-args` for more information.
- """
-
- name = "filename"
- envvar_list_splitter = os.path.pathsep
-
- def __init__(
- self, mode="r", encoding=None, errors="strict", lazy=None, atomic=False
- ):
- self.mode = mode
- self.encoding = encoding
- self.errors = errors
- self.lazy = lazy
- self.atomic = atomic
-
- def resolve_lazy_flag(self, value):
- if self.lazy is not None:
- return self.lazy
- if value == "-":
- return False
- elif "w" in self.mode:
- return True
- return False
-
- def convert(self, value, param, ctx):
- try:
- if hasattr(value, "read") or hasattr(value, "write"):
- return value
-
- lazy = self.resolve_lazy_flag(value)
-
- if lazy:
- f = LazyFile(
- value, self.mode, self.encoding, self.errors, atomic=self.atomic
- )
- if ctx is not None:
- ctx.call_on_close(f.close_intelligently)
- return f
-
- f, should_close = open_stream(
- value, self.mode, self.encoding, self.errors, atomic=self.atomic
- )
- # If a context is provided, we automatically close the file
- # at the end of the context execution (or flush out). If a
- # context does not exist, it's the caller's responsibility to
- # properly close the file. This for instance happens when the
- # type is used with prompts.
- if ctx is not None:
- if should_close:
- ctx.call_on_close(safecall(f.close))
- else:
- ctx.call_on_close(safecall(f.flush))
- return f
- except (IOError, OSError) as e: # noqa: B014
- self.fail(
- "Could not open file: {}: {}".format(
- filename_to_ui(value), get_streerror(e)
- ),
- param,
- ctx,
- )
-
-
-class Path(ParamType):
- """The path type is similar to the :class:`File` type but it performs
- different checks. First of all, instead of returning an open file
- handle it returns just the filename. Secondly, it can perform various
- basic checks about what the file or directory should be.
-
- .. versionchanged:: 6.0
- `allow_dash` was added.
-
- :param exists: if set to true, the file or directory needs to exist for
- this value to be valid. If this is not required and a
- file does indeed not exist, then all further checks are
- silently skipped.
- :param file_okay: controls if a file is a possible value.
- :param dir_okay: controls if a directory is a possible value.
- :param writable: if true, a writable check is performed.
- :param readable: if true, a readable check is performed.
- :param resolve_path: if this is true, then the path is fully resolved
- before the value is passed onwards. This means
- that it's absolute and symlinks are resolved. It
- will not expand a tilde-prefix, as this is
- supposed to be done by the shell only.
- :param allow_dash: If this is set to `True`, a single dash to indicate
- standard streams is permitted.
- :param path_type: optionally a string type that should be used to
- represent the path. The default is `None` which
- means the return value will be either bytes or
- unicode depending on what makes most sense given the
- input data Click deals with.
- """
-
- envvar_list_splitter = os.path.pathsep
-
- def __init__(
- self,
- exists=False,
- file_okay=True,
- dir_okay=True,
- writable=False,
- readable=True,
- resolve_path=False,
- allow_dash=False,
- path_type=None,
- ):
- self.exists = exists
- self.file_okay = file_okay
- self.dir_okay = dir_okay
- self.writable = writable
- self.readable = readable
- self.resolve_path = resolve_path
- self.allow_dash = allow_dash
- self.type = path_type
-
- if self.file_okay and not self.dir_okay:
- self.name = "file"
- self.path_type = "File"
- elif self.dir_okay and not self.file_okay:
- self.name = "directory"
- self.path_type = "Directory"
- else:
- self.name = "path"
- self.path_type = "Path"
-
- def coerce_path_result(self, rv):
- if self.type is not None and not isinstance(rv, self.type):
- if self.type is text_type:
- rv = rv.decode(get_filesystem_encoding())
- else:
- rv = rv.encode(get_filesystem_encoding())
- return rv
-
- def convert(self, value, param, ctx):
- rv = value
-
- is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-")
-
- if not is_dash:
- if self.resolve_path:
- rv = os.path.realpath(rv)
-
- try:
- st = os.stat(rv)
- except OSError:
- if not self.exists:
- return self.coerce_path_result(rv)
- self.fail(
- "{} '{}' does not exist.".format(
- self.path_type, filename_to_ui(value)
- ),
- param,
- ctx,
- )
-
- if not self.file_okay and stat.S_ISREG(st.st_mode):
- self.fail(
- "{} '{}' is a file.".format(self.path_type, filename_to_ui(value)),
- param,
- ctx,
- )
- if not self.dir_okay and stat.S_ISDIR(st.st_mode):
- self.fail(
- "{} '{}' is a directory.".format(
- self.path_type, filename_to_ui(value)
- ),
- param,
- ctx,
- )
- if self.writable and not os.access(value, os.W_OK):
- self.fail(
- "{} '{}' is not writable.".format(
- self.path_type, filename_to_ui(value)
- ),
- param,
- ctx,
- )
- if self.readable and not os.access(value, os.R_OK):
- self.fail(
- "{} '{}' is not readable.".format(
- self.path_type, filename_to_ui(value)
- ),
- param,
- ctx,
- )
-
- return self.coerce_path_result(rv)
-
-
-class Tuple(CompositeParamType):
- """The default behavior of Click is to apply a type on a value directly.
- This works well in most cases, except for when `nargs` is set to a fixed
- count and different types should be used for different items. In this
- case the :class:`Tuple` type can be used. This type can only be used
- if `nargs` is set to a fixed number.
-
- For more information see :ref:`tuple-type`.
-
- This can be selected by using a Python tuple literal as a type.
-
- :param types: a list of types that should be used for the tuple items.
- """
-
- def __init__(self, types):
- self.types = [convert_type(ty) for ty in types]
-
- @property
- def name(self):
- return "<{}>".format(" ".join(ty.name for ty in self.types))
-
- @property
- def arity(self):
- return len(self.types)
-
- def convert(self, value, param, ctx):
- if len(value) != len(self.types):
- raise TypeError(
- "It would appear that nargs is set to conflict with the"
- " composite type arity."
- )
- return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value))
-
-
-def convert_type(ty, default=None):
- """Converts a callable or python type into the most appropriate
- param type.
- """
- guessed_type = False
- if ty is None and default is not None:
- if isinstance(default, tuple):
- ty = tuple(map(type, default))
- else:
- ty = type(default)
- guessed_type = True
-
- if isinstance(ty, tuple):
- return Tuple(ty)
- if isinstance(ty, ParamType):
- return ty
- if ty is text_type or ty is str or ty is None:
- return STRING
- if ty is int:
- return INT
- # Booleans are only okay if not guessed. This is done because for
- # flags the default value is actually a bit of a lie in that it
- # indicates which of the flags is the one we want. See get_default()
- # for more information.
- if ty is bool and not guessed_type:
- return BOOL
- if ty is float:
- return FLOAT
- if guessed_type:
- return STRING
-
- # Catch a common mistake
- if __debug__:
- try:
- if issubclass(ty, ParamType):
- raise AssertionError(
- "Attempted to use an uninstantiated parameter type ({}).".format(ty)
- )
- except TypeError:
- pass
- return FuncParamType(ty)
-
-
-#: A dummy parameter type that just does nothing. From a user's
-#: perspective this appears to just be the same as `STRING` but internally
-#: no string conversion takes place. This is necessary to achieve the
-#: same bytes/unicode behavior on Python 2/3 in situations where you want
-#: to not convert argument types. This is usually useful when working
-#: with file paths as they can appear in bytes and unicode.
-#:
-#: For path related uses the :class:`Path` type is a better choice but
-#: there are situations where an unprocessed type is useful which is why
-#: it is is provided.
-#:
-#: .. versionadded:: 4.0
-UNPROCESSED = UnprocessedParamType()
-
-#: A unicode string parameter type which is the implicit default. This
-#: can also be selected by using ``str`` as type.
-STRING = StringParamType()
-
-#: An integer parameter. This can also be selected by using ``int`` as
-#: type.
-INT = IntParamType()
-
-#: A floating point value parameter. This can also be selected by using
-#: ``float`` as type.
-FLOAT = FloatParamType()
-
-#: A boolean parameter. This is the default for boolean flags. This can
-#: also be selected by using ``bool`` as a type.
-BOOL = BoolParamType()
-
-#: A UUID parameter.
-UUID = UUIDParameterType()
diff --git a/client/ayon_core/vendor/python/python_2/click/utils.py b/client/ayon_core/vendor/python/python_2/click/utils.py
deleted file mode 100644
index 79265e732d..0000000000
--- a/client/ayon_core/vendor/python/python_2/click/utils.py
+++ /dev/null
@@ -1,455 +0,0 @@
-import os
-import sys
-
-from ._compat import _default_text_stderr
-from ._compat import _default_text_stdout
-from ._compat import auto_wrap_for_ansi
-from ._compat import binary_streams
-from ._compat import filename_to_ui
-from ._compat import get_filesystem_encoding
-from ._compat import get_streerror
-from ._compat import is_bytes
-from ._compat import open_stream
-from ._compat import PY2
-from ._compat import should_strip_ansi
-from ._compat import string_types
-from ._compat import strip_ansi
-from ._compat import text_streams
-from ._compat import text_type
-from ._compat import WIN
-from .globals import resolve_color_default
-
-if not PY2:
- from ._compat import _find_binary_writer
-elif WIN:
- from ._winconsole import _get_windows_argv
- from ._winconsole import _hash_py_argv
- from ._winconsole import _initial_argv_hash
-
-echo_native_types = string_types + (bytes, bytearray)
-
-
-def _posixify(name):
- return "-".join(name.split()).lower()
-
-
-def safecall(func):
- """Wraps a function so that it swallows exceptions."""
-
- def wrapper(*args, **kwargs):
- try:
- return func(*args, **kwargs)
- except Exception:
- pass
-
- return wrapper
-
-
-def make_str(value):
- """Converts a value into a valid string."""
- if isinstance(value, bytes):
- try:
- return value.decode(get_filesystem_encoding())
- except UnicodeError:
- return value.decode("utf-8", "replace")
- return text_type(value)
-
-
-def make_default_short_help(help, max_length=45):
- """Return a condensed version of help string."""
- words = help.split()
- total_length = 0
- result = []
- done = False
-
- for word in words:
- if word[-1:] == ".":
- done = True
- new_length = 1 + len(word) if result else len(word)
- if total_length + new_length > max_length:
- result.append("...")
- done = True
- else:
- if result:
- result.append(" ")
- result.append(word)
- if done:
- break
- total_length += new_length
-
- return "".join(result)
-
-
-class LazyFile(object):
- """A lazy file works like a regular file but it does not fully open
- the file but it does perform some basic checks early to see if the
- filename parameter does make sense. This is useful for safely opening
- files for writing.
- """
-
- def __init__(
- self, filename, mode="r", encoding=None, errors="strict", atomic=False
- ):
- self.name = filename
- self.mode = mode
- self.encoding = encoding
- self.errors = errors
- self.atomic = atomic
-
- if filename == "-":
- self._f, self.should_close = open_stream(filename, mode, encoding, errors)
- else:
- if "r" in mode:
- # Open and close the file in case we're opening it for
- # reading so that we can catch at least some errors in
- # some cases early.
- open(filename, mode).close()
- self._f = None
- self.should_close = True
-
- def __getattr__(self, name):
- return getattr(self.open(), name)
-
- def __repr__(self):
- if self._f is not None:
- return repr(self._f)
- return "".format(self.name, self.mode)
-
- def open(self):
- """Opens the file if it's not yet open. This call might fail with
- a :exc:`FileError`. Not handling this error will produce an error
- that Click shows.
- """
- if self._f is not None:
- return self._f
- try:
- rv, self.should_close = open_stream(
- self.name, self.mode, self.encoding, self.errors, atomic=self.atomic
- )
- except (IOError, OSError) as e: # noqa: E402
- from .exceptions import FileError
-
- raise FileError(self.name, hint=get_streerror(e))
- self._f = rv
- return rv
-
- def close(self):
- """Closes the underlying file, no matter what."""
- if self._f is not None:
- self._f.close()
-
- def close_intelligently(self):
- """This function only closes the file if it was opened by the lazy
- file wrapper. For instance this will never close stdin.
- """
- if self.should_close:
- self.close()
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_value, tb):
- self.close_intelligently()
-
- def __iter__(self):
- self.open()
- return iter(self._f)
-
-
-class KeepOpenFile(object):
- def __init__(self, file):
- self._file = file
-
- def __getattr__(self, name):
- return getattr(self._file, name)
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_value, tb):
- pass
-
- def __repr__(self):
- return repr(self._file)
-
- def __iter__(self):
- return iter(self._file)
-
-
-def echo(message=None, file=None, nl=True, err=False, color=None):
- """Prints a message plus a newline to the given file or stdout. On
- first sight, this looks like the print function, but it has improved
- support for handling Unicode and binary data that does not fail no
- matter how badly configured the system is.
-
- Primarily it means that you can print binary data as well as Unicode
- data on both 2.x and 3.x to the given file in the most appropriate way
- possible. This is a very carefree function in that it will try its
- best to not fail. As of Click 6.0 this includes support for unicode
- output on the Windows console.
-
- In addition to that, if `colorama`_ is installed, the echo function will
- also support clever handling of ANSI codes. Essentially it will then
- do the following:
-
- - add transparent handling of ANSI color codes on Windows.
- - hide ANSI codes automatically if the destination file is not a
- terminal.
-
- .. _colorama: https://pypi.org/project/colorama/
-
- .. versionchanged:: 6.0
- As of Click 6.0 the echo function will properly support unicode
- output on the windows console. Not that click does not modify
- the interpreter in any way which means that `sys.stdout` or the
- print statement or function will still not provide unicode support.
-
- .. versionchanged:: 2.0
- Starting with version 2.0 of Click, the echo function will work
- with colorama if it's installed.
-
- .. versionadded:: 3.0
- The `err` parameter was added.
-
- .. versionchanged:: 4.0
- Added the `color` flag.
-
- :param message: the message to print
- :param file: the file to write to (defaults to ``stdout``)
- :param err: if set to true the file defaults to ``stderr`` instead of
- ``stdout``. This is faster and easier than calling
- :func:`get_text_stderr` yourself.
- :param nl: if set to `True` (the default) a newline is printed afterwards.
- :param color: controls if the terminal supports ANSI colors or not. The
- default is autodetection.
- """
- if file is None:
- if err:
- file = _default_text_stderr()
- else:
- file = _default_text_stdout()
-
- # Convert non bytes/text into the native string type.
- if message is not None and not isinstance(message, echo_native_types):
- message = text_type(message)
-
- if nl:
- message = message or u""
- if isinstance(message, text_type):
- message += u"\n"
- else:
- message += b"\n"
-
- # If there is a message, and we're in Python 3, and the value looks
- # like bytes, we manually need to find the binary stream and write the
- # message in there. This is done separately so that most stream
- # types will work as you would expect. Eg: you can write to StringIO
- # for other cases.
- if message and not PY2 and is_bytes(message):
- binary_file = _find_binary_writer(file)
- if binary_file is not None:
- file.flush()
- binary_file.write(message)
- binary_file.flush()
- return
-
- # ANSI-style support. If there is no message or we are dealing with
- # bytes nothing is happening. If we are connected to a file we want
- # to strip colors. If we are on windows we either wrap the stream
- # to strip the color or we use the colorama support to translate the
- # ansi codes to API calls.
- if message and not is_bytes(message):
- color = resolve_color_default(color)
- if should_strip_ansi(file, color):
- message = strip_ansi(message)
- elif WIN:
- if auto_wrap_for_ansi is not None:
- file = auto_wrap_for_ansi(file)
- elif not color:
- message = strip_ansi(message)
-
- if message:
- file.write(message)
- file.flush()
-
-
-def get_binary_stream(name):
- """Returns a system stream for byte processing. This essentially
- returns the stream from the sys module with the given name but it
- solves some compatibility issues between different Python versions.
- Primarily this function is necessary for getting binary streams on
- Python 3.
-
- :param name: the name of the stream to open. Valid names are ``'stdin'``,
- ``'stdout'`` and ``'stderr'``
- """
- opener = binary_streams.get(name)
- if opener is None:
- raise TypeError("Unknown standard stream '{}'".format(name))
- return opener()
-
-
-def get_text_stream(name, encoding=None, errors="strict"):
- """Returns a system stream for text processing. This usually returns
- a wrapped stream around a binary stream returned from
- :func:`get_binary_stream` but it also can take shortcuts on Python 3
- for already correctly configured streams.
-
- :param name: the name of the stream to open. Valid names are ``'stdin'``,
- ``'stdout'`` and ``'stderr'``
- :param encoding: overrides the detected default encoding.
- :param errors: overrides the default error mode.
- """
- opener = text_streams.get(name)
- if opener is None:
- raise TypeError("Unknown standard stream '{}'".format(name))
- return opener(encoding, errors)
-
-
-def open_file(
- filename, mode="r", encoding=None, errors="strict", lazy=False, atomic=False
-):
- """This is similar to how the :class:`File` works but for manual
- usage. Files are opened non lazy by default. This can open regular
- files as well as stdin/stdout if ``'-'`` is passed.
-
- If stdin/stdout is returned the stream is wrapped so that the context
- manager will not close the stream accidentally. This makes it possible
- to always use the function like this without having to worry to
- accidentally close a standard stream::
-
- with open_file(filename) as f:
- ...
-
- .. versionadded:: 3.0
-
- :param filename: the name of the file to open (or ``'-'`` for stdin/stdout).
- :param mode: the mode in which to open the file.
- :param encoding: the encoding to use.
- :param errors: the error handling for this file.
- :param lazy: can be flipped to true to open the file lazily.
- :param atomic: in atomic mode writes go into a temporary file and it's
- moved on close.
- """
- if lazy:
- return LazyFile(filename, mode, encoding, errors, atomic=atomic)
- f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic)
- if not should_close:
- f = KeepOpenFile(f)
- return f
-
-
-def get_os_args():
- """This returns the argument part of sys.argv in the most appropriate
- form for processing. What this means is that this return value is in
- a format that works for Click to process but does not necessarily
- correspond well to what's actually standard for the interpreter.
-
- On most environments the return value is ``sys.argv[:1]`` unchanged.
- However if you are on Windows and running Python 2 the return value
- will actually be a list of unicode strings instead because the
- default behavior on that platform otherwise will not be able to
- carry all possible values that sys.argv can have.
-
- .. versionadded:: 6.0
- """
- # We can only extract the unicode argv if sys.argv has not been
- # changed since the startup of the application.
- if PY2 and WIN and _initial_argv_hash == _hash_py_argv():
- return _get_windows_argv()
- return sys.argv[1:]
-
-
-def format_filename(filename, shorten=False):
- """Formats a filename for user display. The main purpose of this
- function is to ensure that the filename can be displayed at all. This
- will decode the filename to unicode if necessary in a way that it will
- not fail. Optionally, it can shorten the filename to not include the
- full path to the filename.
-
- :param filename: formats a filename for UI display. This will also convert
- the filename into unicode without failing.
- :param shorten: this optionally shortens the filename to strip of the
- path that leads up to it.
- """
- if shorten:
- filename = os.path.basename(filename)
- return filename_to_ui(filename)
-
-
-def get_app_dir(app_name, roaming=True, force_posix=False):
- r"""Returns the config folder for the application. The default behavior
- is to return whatever is most appropriate for the operating system.
-
- To give you an idea, for an app called ``"Foo Bar"``, something like
- the following folders could be returned:
-
- Mac OS X:
- ``~/Library/Application Support/Foo Bar``
- Mac OS X (POSIX):
- ``~/.foo-bar``
- Unix:
- ``~/.config/foo-bar``
- Unix (POSIX):
- ``~/.foo-bar``
- Win XP (roaming):
- ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar``
- Win XP (not roaming):
- ``C:\Documents and Settings\\Application Data\Foo Bar``
- Win 7 (roaming):
- ``C:\Users\\AppData\Roaming\Foo Bar``
- Win 7 (not roaming):
- ``C:\Users\\AppData\Local\Foo Bar``
-
- .. versionadded:: 2.0
-
- :param app_name: the application name. This should be properly capitalized
- and can contain whitespace.
- :param roaming: controls if the folder should be roaming or not on Windows.
- Has no affect otherwise.
- :param force_posix: if this is set to `True` then on any POSIX system the
- folder will be stored in the home folder with a leading
- dot instead of the XDG config home or darwin's
- application support folder.
- """
- if WIN:
- key = "APPDATA" if roaming else "LOCALAPPDATA"
- folder = os.environ.get(key)
- if folder is None:
- folder = os.path.expanduser("~")
- return os.path.join(folder, app_name)
- if force_posix:
- return os.path.join(os.path.expanduser("~/.{}".format(_posixify(app_name))))
- if sys.platform == "darwin":
- return os.path.join(
- os.path.expanduser("~/Library/Application Support"), app_name
- )
- return os.path.join(
- os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")),
- _posixify(app_name),
- )
-
-
-class PacifyFlushWrapper(object):
- """This wrapper is used to catch and suppress BrokenPipeErrors resulting
- from ``.flush()`` being called on broken pipe during the shutdown/final-GC
- of the Python interpreter. Notably ``.flush()`` is always called on
- ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any
- other cleanup code, and the case where the underlying file is not a broken
- pipe, all calls and attributes are proxied.
- """
-
- def __init__(self, wrapped):
- self.wrapped = wrapped
-
- def flush(self):
- try:
- self.wrapped.flush()
- except IOError as e:
- import errno
-
- if e.errno != errno.EPIPE:
- raise
-
- def __getattr__(self, attr):
- return getattr(self.wrapped, attr)
diff --git a/client/ayon_core/vendor/python/python_2/dns/__init__.py b/client/ayon_core/vendor/python/python_2/dns/__init__.py
deleted file mode 100644
index c1ce8e6061..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/__init__.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""dnspython DNS toolkit"""
-
-__all__ = [
- 'dnssec',
- 'e164',
- 'edns',
- 'entropy',
- 'exception',
- 'flags',
- 'hash',
- 'inet',
- 'ipv4',
- 'ipv6',
- 'message',
- 'name',
- 'namedict',
- 'node',
- 'opcode',
- 'query',
- 'rcode',
- 'rdata',
- 'rdataclass',
- 'rdataset',
- 'rdatatype',
- 'renderer',
- 'resolver',
- 'reversename',
- 'rrset',
- 'set',
- 'tokenizer',
- 'tsig',
- 'tsigkeyring',
- 'ttl',
- 'rdtypes',
- 'update',
- 'version',
- 'wiredata',
- 'zone',
-]
diff --git a/client/ayon_core/vendor/python/python_2/dns/_compat.py b/client/ayon_core/vendor/python/python_2/dns/_compat.py
deleted file mode 100644
index ca0931c2b5..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/_compat.py
+++ /dev/null
@@ -1,59 +0,0 @@
-import sys
-import decimal
-from decimal import Context
-
-PY3 = sys.version_info[0] == 3
-PY2 = sys.version_info[0] == 2
-
-
-if PY3:
- long = int
- xrange = range
-else:
- long = long # pylint: disable=long-builtin
- xrange = xrange # pylint: disable=xrange-builtin
-
-# unicode / binary types
-if PY3:
- text_type = str
- binary_type = bytes
- string_types = (str,)
- unichr = chr
- def maybe_decode(x):
- return x.decode()
- def maybe_encode(x):
- return x.encode()
- def maybe_chr(x):
- return x
- def maybe_ord(x):
- return x
-else:
- text_type = unicode # pylint: disable=unicode-builtin, undefined-variable
- binary_type = str
- string_types = (
- basestring, # pylint: disable=basestring-builtin, undefined-variable
- )
- unichr = unichr # pylint: disable=unichr-builtin
- def maybe_decode(x):
- return x
- def maybe_encode(x):
- return x
- def maybe_chr(x):
- return chr(x)
- def maybe_ord(x):
- return ord(x)
-
-
-def round_py2_compat(what):
- """
- Python 2 and Python 3 use different rounding strategies in round(). This
- function ensures that results are python2/3 compatible and backward
- compatible with previous py2 releases
- :param what: float
- :return: rounded long
- """
- d = Context(
- prec=len(str(long(what))), # round to integer with max precision
- rounding=decimal.ROUND_HALF_UP
- ).create_decimal(str(what)) # str(): python 2.6 compat
- return long(d)
diff --git a/client/ayon_core/vendor/python/python_2/dns/dnssec.py b/client/ayon_core/vendor/python/python_2/dns/dnssec.py
deleted file mode 100644
index 35da6b5a81..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/dnssec.py
+++ /dev/null
@@ -1,519 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Common DNSSEC-related functions and constants."""
-
-from io import BytesIO
-import struct
-import time
-
-import dns.exception
-import dns.name
-import dns.node
-import dns.rdataset
-import dns.rdata
-import dns.rdatatype
-import dns.rdataclass
-from ._compat import string_types
-
-
-class UnsupportedAlgorithm(dns.exception.DNSException):
- """The DNSSEC algorithm is not supported."""
-
-
-class ValidationFailure(dns.exception.DNSException):
- """The DNSSEC signature is invalid."""
-
-
-#: RSAMD5
-RSAMD5 = 1
-#: DH
-DH = 2
-#: DSA
-DSA = 3
-#: ECC
-ECC = 4
-#: RSASHA1
-RSASHA1 = 5
-#: DSANSEC3SHA1
-DSANSEC3SHA1 = 6
-#: RSASHA1NSEC3SHA1
-RSASHA1NSEC3SHA1 = 7
-#: RSASHA256
-RSASHA256 = 8
-#: RSASHA512
-RSASHA512 = 10
-#: ECDSAP256SHA256
-ECDSAP256SHA256 = 13
-#: ECDSAP384SHA384
-ECDSAP384SHA384 = 14
-#: INDIRECT
-INDIRECT = 252
-#: PRIVATEDNS
-PRIVATEDNS = 253
-#: PRIVATEOID
-PRIVATEOID = 254
-
-_algorithm_by_text = {
- 'RSAMD5': RSAMD5,
- 'DH': DH,
- 'DSA': DSA,
- 'ECC': ECC,
- 'RSASHA1': RSASHA1,
- 'DSANSEC3SHA1': DSANSEC3SHA1,
- 'RSASHA1NSEC3SHA1': RSASHA1NSEC3SHA1,
- 'RSASHA256': RSASHA256,
- 'RSASHA512': RSASHA512,
- 'INDIRECT': INDIRECT,
- 'ECDSAP256SHA256': ECDSAP256SHA256,
- 'ECDSAP384SHA384': ECDSAP384SHA384,
- 'PRIVATEDNS': PRIVATEDNS,
- 'PRIVATEOID': PRIVATEOID,
-}
-
-# We construct the inverse mapping programmatically to ensure that we
-# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
-# would cause the mapping not to be true inverse.
-
-_algorithm_by_value = {y: x for x, y in _algorithm_by_text.items()}
-
-
-def algorithm_from_text(text):
- """Convert text into a DNSSEC algorithm value.
-
- Returns an ``int``.
- """
-
- value = _algorithm_by_text.get(text.upper())
- if value is None:
- value = int(text)
- return value
-
-
-def algorithm_to_text(value):
- """Convert a DNSSEC algorithm value to text
-
- Returns a ``str``.
- """
-
- text = _algorithm_by_value.get(value)
- if text is None:
- text = str(value)
- return text
-
-
-def _to_rdata(record, origin):
- s = BytesIO()
- record.to_wire(s, origin=origin)
- return s.getvalue()
-
-
-def key_id(key, origin=None):
- """Return the key id (a 16-bit number) for the specified key.
-
- Note the *origin* parameter of this function is historical and
- is not needed.
-
- Returns an ``int`` between 0 and 65535.
- """
-
- rdata = _to_rdata(key, origin)
- rdata = bytearray(rdata)
- if key.algorithm == RSAMD5:
- return (rdata[-3] << 8) + rdata[-2]
- else:
- total = 0
- for i in range(len(rdata) // 2):
- total += (rdata[2 * i] << 8) + \
- rdata[2 * i + 1]
- if len(rdata) % 2 != 0:
- total += rdata[len(rdata) - 1] << 8
- total += ((total >> 16) & 0xffff)
- return total & 0xffff
-
-
-def make_ds(name, key, algorithm, origin=None):
- """Create a DS record for a DNSSEC key.
-
- *name* is the owner name of the DS record.
-
- *key* is a ``dns.rdtypes.ANY.DNSKEY``.
-
- *algorithm* is a string describing which hash algorithm to use. The
- currently supported hashes are "SHA1" and "SHA256". Case does not
- matter for these strings.
-
- *origin* is a ``dns.name.Name`` and will be used as the origin
- if *key* is a relative name.
-
- Returns a ``dns.rdtypes.ANY.DS``.
- """
-
- if algorithm.upper() == 'SHA1':
- dsalg = 1
- hash = SHA1.new()
- elif algorithm.upper() == 'SHA256':
- dsalg = 2
- hash = SHA256.new()
- else:
- raise UnsupportedAlgorithm('unsupported algorithm "%s"' % algorithm)
-
- if isinstance(name, string_types):
- name = dns.name.from_text(name, origin)
- hash.update(name.canonicalize().to_wire())
- hash.update(_to_rdata(key, origin))
- digest = hash.digest()
-
- dsrdata = struct.pack("!HBB", key_id(key), key.algorithm, dsalg) + digest
- return dns.rdata.from_wire(dns.rdataclass.IN, dns.rdatatype.DS, dsrdata, 0,
- len(dsrdata))
-
-
-def _find_candidate_keys(keys, rrsig):
- candidate_keys = []
- value = keys.get(rrsig.signer)
- if value is None:
- return None
- if isinstance(value, dns.node.Node):
- try:
- rdataset = value.find_rdataset(dns.rdataclass.IN,
- dns.rdatatype.DNSKEY)
- except KeyError:
- return None
- else:
- rdataset = value
- for rdata in rdataset:
- if rdata.algorithm == rrsig.algorithm and \
- key_id(rdata) == rrsig.key_tag:
- candidate_keys.append(rdata)
- return candidate_keys
-
-
-def _is_rsa(algorithm):
- return algorithm in (RSAMD5, RSASHA1,
- RSASHA1NSEC3SHA1, RSASHA256,
- RSASHA512)
-
-
-def _is_dsa(algorithm):
- return algorithm in (DSA, DSANSEC3SHA1)
-
-
-def _is_ecdsa(algorithm):
- return _have_ecdsa and (algorithm in (ECDSAP256SHA256, ECDSAP384SHA384))
-
-
-def _is_md5(algorithm):
- return algorithm == RSAMD5
-
-
-def _is_sha1(algorithm):
- return algorithm in (DSA, RSASHA1,
- DSANSEC3SHA1, RSASHA1NSEC3SHA1)
-
-
-def _is_sha256(algorithm):
- return algorithm in (RSASHA256, ECDSAP256SHA256)
-
-
-def _is_sha384(algorithm):
- return algorithm == ECDSAP384SHA384
-
-
-def _is_sha512(algorithm):
- return algorithm == RSASHA512
-
-
-def _make_hash(algorithm):
- if _is_md5(algorithm):
- return MD5.new()
- if _is_sha1(algorithm):
- return SHA1.new()
- if _is_sha256(algorithm):
- return SHA256.new()
- if _is_sha384(algorithm):
- return SHA384.new()
- if _is_sha512(algorithm):
- return SHA512.new()
- raise ValidationFailure('unknown hash for algorithm %u' % algorithm)
-
-
-def _make_algorithm_id(algorithm):
- if _is_md5(algorithm):
- oid = [0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05]
- elif _is_sha1(algorithm):
- oid = [0x2b, 0x0e, 0x03, 0x02, 0x1a]
- elif _is_sha256(algorithm):
- oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01]
- elif _is_sha512(algorithm):
- oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03]
- else:
- raise ValidationFailure('unknown algorithm %u' % algorithm)
- olen = len(oid)
- dlen = _make_hash(algorithm).digest_size
- idbytes = [0x30] + [8 + olen + dlen] + \
- [0x30, olen + 4] + [0x06, olen] + oid + \
- [0x05, 0x00] + [0x04, dlen]
- return struct.pack('!%dB' % len(idbytes), *idbytes)
-
-
-def _validate_rrsig(rrset, rrsig, keys, origin=None, now=None):
- """Validate an RRset against a single signature rdata
-
- The owner name of *rrsig* is assumed to be the same as the owner name
- of *rrset*.
-
- *rrset* is the RRset to validate. It can be a ``dns.rrset.RRset`` or
- a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple.
-
- *rrsig* is a ``dns.rdata.Rdata``, the signature to validate.
-
- *keys* is the key dictionary, used to find the DNSKEY associated with
- a given name. The dictionary is keyed by a ``dns.name.Name``, and has
- ``dns.node.Node`` or ``dns.rdataset.Rdataset`` values.
-
- *origin* is a ``dns.name.Name``, the origin to use for relative names.
-
- *now* is an ``int``, the time to use when validating the signatures,
- in seconds since the UNIX epoch. The default is the current time.
- """
-
- if isinstance(origin, string_types):
- origin = dns.name.from_text(origin, dns.name.root)
-
- candidate_keys = _find_candidate_keys(keys, rrsig)
- if candidate_keys is None:
- raise ValidationFailure('unknown key')
-
- for candidate_key in candidate_keys:
- # For convenience, allow the rrset to be specified as a (name,
- # rdataset) tuple as well as a proper rrset
- if isinstance(rrset, tuple):
- rrname = rrset[0]
- rdataset = rrset[1]
- else:
- rrname = rrset.name
- rdataset = rrset
-
- if now is None:
- now = time.time()
- if rrsig.expiration < now:
- raise ValidationFailure('expired')
- if rrsig.inception > now:
- raise ValidationFailure('not yet valid')
-
- hash = _make_hash(rrsig.algorithm)
-
- if _is_rsa(rrsig.algorithm):
- keyptr = candidate_key.key
- (bytes_,) = struct.unpack('!B', keyptr[0:1])
- keyptr = keyptr[1:]
- if bytes_ == 0:
- (bytes_,) = struct.unpack('!H', keyptr[0:2])
- keyptr = keyptr[2:]
- rsa_e = keyptr[0:bytes_]
- rsa_n = keyptr[bytes_:]
- try:
- pubkey = CryptoRSA.construct(
- (number.bytes_to_long(rsa_n),
- number.bytes_to_long(rsa_e)))
- except ValueError:
- raise ValidationFailure('invalid public key')
- sig = rrsig.signature
- elif _is_dsa(rrsig.algorithm):
- keyptr = candidate_key.key
- (t,) = struct.unpack('!B', keyptr[0:1])
- keyptr = keyptr[1:]
- octets = 64 + t * 8
- dsa_q = keyptr[0:20]
- keyptr = keyptr[20:]
- dsa_p = keyptr[0:octets]
- keyptr = keyptr[octets:]
- dsa_g = keyptr[0:octets]
- keyptr = keyptr[octets:]
- dsa_y = keyptr[0:octets]
- pubkey = CryptoDSA.construct(
- (number.bytes_to_long(dsa_y),
- number.bytes_to_long(dsa_g),
- number.bytes_to_long(dsa_p),
- number.bytes_to_long(dsa_q)))
- sig = rrsig.signature[1:]
- elif _is_ecdsa(rrsig.algorithm):
- # use ecdsa for NIST-384p -- not currently supported by pycryptodome
-
- keyptr = candidate_key.key
-
- if rrsig.algorithm == ECDSAP256SHA256:
- curve = ecdsa.curves.NIST256p
- key_len = 32
- elif rrsig.algorithm == ECDSAP384SHA384:
- curve = ecdsa.curves.NIST384p
- key_len = 48
-
- x = number.bytes_to_long(keyptr[0:key_len])
- y = number.bytes_to_long(keyptr[key_len:key_len * 2])
- if not ecdsa.ecdsa.point_is_valid(curve.generator, x, y):
- raise ValidationFailure('invalid ECDSA key')
- point = ecdsa.ellipticcurve.Point(curve.curve, x, y, curve.order)
- verifying_key = ecdsa.keys.VerifyingKey.from_public_point(point,
- curve)
- pubkey = ECKeyWrapper(verifying_key, key_len)
- r = rrsig.signature[:key_len]
- s = rrsig.signature[key_len:]
- sig = ecdsa.ecdsa.Signature(number.bytes_to_long(r),
- number.bytes_to_long(s))
-
- else:
- raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm)
-
- hash.update(_to_rdata(rrsig, origin)[:18])
- hash.update(rrsig.signer.to_digestable(origin))
-
- if rrsig.labels < len(rrname) - 1:
- suffix = rrname.split(rrsig.labels + 1)[1]
- rrname = dns.name.from_text('*', suffix)
- rrnamebuf = rrname.to_digestable(origin)
- rrfixed = struct.pack('!HHI', rdataset.rdtype, rdataset.rdclass,
- rrsig.original_ttl)
- rrlist = sorted(rdataset)
- for rr in rrlist:
- hash.update(rrnamebuf)
- hash.update(rrfixed)
- rrdata = rr.to_digestable(origin)
- rrlen = struct.pack('!H', len(rrdata))
- hash.update(rrlen)
- hash.update(rrdata)
-
- try:
- if _is_rsa(rrsig.algorithm):
- verifier = pkcs1_15.new(pubkey)
- # will raise ValueError if verify fails:
- verifier.verify(hash, sig)
- elif _is_dsa(rrsig.algorithm):
- verifier = DSS.new(pubkey, 'fips-186-3')
- verifier.verify(hash, sig)
- elif _is_ecdsa(rrsig.algorithm):
- digest = hash.digest()
- if not pubkey.verify(digest, sig):
- raise ValueError
- else:
- # Raise here for code clarity; this won't actually ever happen
- # since if the algorithm is really unknown we'd already have
- # raised an exception above
- raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm)
- # If we got here, we successfully verified so we can return without error
- return
- except ValueError:
- # this happens on an individual validation failure
- continue
- # nothing verified -- raise failure:
- raise ValidationFailure('verify failure')
-
-
-def _validate(rrset, rrsigset, keys, origin=None, now=None):
- """Validate an RRset.
-
- *rrset* is the RRset to validate. It can be a ``dns.rrset.RRset`` or
- a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple.
-
- *rrsigset* is the signature RRset to be validated. It can be a
- ``dns.rrset.RRset`` or a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple.
-
- *keys* is the key dictionary, used to find the DNSKEY associated with
- a given name. The dictionary is keyed by a ``dns.name.Name``, and has
- ``dns.node.Node`` or ``dns.rdataset.Rdataset`` values.
-
- *origin* is a ``dns.name.Name``, the origin to use for relative names.
-
- *now* is an ``int``, the time to use when validating the signatures,
- in seconds since the UNIX epoch. The default is the current time.
- """
-
- if isinstance(origin, string_types):
- origin = dns.name.from_text(origin, dns.name.root)
-
- if isinstance(rrset, tuple):
- rrname = rrset[0]
- else:
- rrname = rrset.name
-
- if isinstance(rrsigset, tuple):
- rrsigname = rrsigset[0]
- rrsigrdataset = rrsigset[1]
- else:
- rrsigname = rrsigset.name
- rrsigrdataset = rrsigset
-
- rrname = rrname.choose_relativity(origin)
- rrsigname = rrsigname.choose_relativity(origin)
- if rrname != rrsigname:
- raise ValidationFailure("owner names do not match")
-
- for rrsig in rrsigrdataset:
- try:
- _validate_rrsig(rrset, rrsig, keys, origin, now)
- return
- except ValidationFailure:
- pass
- raise ValidationFailure("no RRSIGs validated")
-
-
-def _need_pycrypto(*args, **kwargs):
- raise NotImplementedError("DNSSEC validation requires pycryptodome/pycryptodomex")
-
-
-try:
- try:
- # test we're using pycryptodome, not pycrypto (which misses SHA1 for example)
- from Crypto.Hash import MD5, SHA1, SHA256, SHA384, SHA512
- from Crypto.PublicKey import RSA as CryptoRSA, DSA as CryptoDSA
- from Crypto.Signature import pkcs1_15, DSS
- from Crypto.Util import number
- except ImportError:
- from Cryptodome.Hash import MD5, SHA1, SHA256, SHA384, SHA512
- from Cryptodome.PublicKey import RSA as CryptoRSA, DSA as CryptoDSA
- from Cryptodome.Signature import pkcs1_15, DSS
- from Cryptodome.Util import number
-except ImportError:
- validate = _need_pycrypto
- validate_rrsig = _need_pycrypto
- _have_pycrypto = False
- _have_ecdsa = False
-else:
- validate = _validate
- validate_rrsig = _validate_rrsig
- _have_pycrypto = True
-
- try:
- import ecdsa
- import ecdsa.ecdsa
- import ecdsa.ellipticcurve
- import ecdsa.keys
- except ImportError:
- _have_ecdsa = False
- else:
- _have_ecdsa = True
-
- class ECKeyWrapper(object):
-
- def __init__(self, key, key_len):
- self.key = key
- self.key_len = key_len
-
- def verify(self, digest, sig):
- diglong = number.bytes_to_long(digest)
- return self.key.pubkey.verifies(diglong, sig)
diff --git a/client/ayon_core/vendor/python/python_2/dns/e164.py b/client/ayon_core/vendor/python/python_2/dns/e164.py
deleted file mode 100644
index 758c47a784..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/e164.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2006-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS E.164 helpers."""
-
-import dns.exception
-import dns.name
-import dns.resolver
-from ._compat import string_types, maybe_decode
-
-#: The public E.164 domain.
-public_enum_domain = dns.name.from_text('e164.arpa.')
-
-
-def from_e164(text, origin=public_enum_domain):
- """Convert an E.164 number in textual form into a Name object whose
- value is the ENUM domain name for that number.
-
- Non-digits in the text are ignored, i.e. "16505551212",
- "+1.650.555.1212" and "1 (650) 555-1212" are all the same.
-
- *text*, a ``text``, is an E.164 number in textual form.
-
- *origin*, a ``dns.name.Name``, the domain in which the number
- should be constructed. The default is ``e164.arpa.``.
-
- Returns a ``dns.name.Name``.
- """
-
- parts = [d for d in text if d.isdigit()]
- parts.reverse()
- return dns.name.from_text('.'.join(parts), origin=origin)
-
-
-def to_e164(name, origin=public_enum_domain, want_plus_prefix=True):
- """Convert an ENUM domain name into an E.164 number.
-
- Note that dnspython does not have any information about preferred
- number formats within national numbering plans, so all numbers are
- emitted as a simple string of digits, prefixed by a '+' (unless
- *want_plus_prefix* is ``False``).
-
- *name* is a ``dns.name.Name``, the ENUM domain name.
-
- *origin* is a ``dns.name.Name``, a domain containing the ENUM
- domain name. The name is relativized to this domain before being
- converted to text. If ``None``, no relativization is done.
-
- *want_plus_prefix* is a ``bool``. If True, add a '+' to the beginning of
- the returned number.
-
- Returns a ``text``.
-
- """
- if origin is not None:
- name = name.relativize(origin)
- dlabels = [d for d in name.labels if d.isdigit() and len(d) == 1]
- if len(dlabels) != len(name.labels):
- raise dns.exception.SyntaxError('non-digit labels in ENUM domain name')
- dlabels.reverse()
- text = b''.join(dlabels)
- if want_plus_prefix:
- text = b'+' + text
- return maybe_decode(text)
-
-
-def query(number, domains, resolver=None):
- """Look for NAPTR RRs for the specified number in the specified domains.
-
- e.g. lookup('16505551212', ['e164.dnspython.org.', 'e164.arpa.'])
-
- *number*, a ``text`` is the number to look for.
-
- *domains* is an iterable containing ``dns.name.Name`` values.
-
- *resolver*, a ``dns.resolver.Resolver``, is the resolver to use. If
- ``None``, the default resolver is used.
- """
-
- if resolver is None:
- resolver = dns.resolver.get_default_resolver()
- e_nx = dns.resolver.NXDOMAIN()
- for domain in domains:
- if isinstance(domain, string_types):
- domain = dns.name.from_text(domain)
- qname = dns.e164.from_e164(number, domain)
- try:
- return resolver.query(qname, 'NAPTR')
- except dns.resolver.NXDOMAIN as e:
- e_nx += e
- raise e_nx
diff --git a/client/ayon_core/vendor/python/python_2/dns/edns.py b/client/ayon_core/vendor/python/python_2/dns/edns.py
deleted file mode 100644
index 5660f7bb7a..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/edns.py
+++ /dev/null
@@ -1,269 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2009-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""EDNS Options"""
-
-from __future__ import absolute_import
-
-import math
-import struct
-
-import dns.inet
-
-#: NSID
-NSID = 3
-#: DAU
-DAU = 5
-#: DHU
-DHU = 6
-#: N3U
-N3U = 7
-#: ECS (client-subnet)
-ECS = 8
-#: EXPIRE
-EXPIRE = 9
-#: COOKIE
-COOKIE = 10
-#: KEEPALIVE
-KEEPALIVE = 11
-#: PADDING
-PADDING = 12
-#: CHAIN
-CHAIN = 13
-
-class Option(object):
-
- """Base class for all EDNS option types."""
-
- def __init__(self, otype):
- """Initialize an option.
-
- *otype*, an ``int``, is the option type.
- """
- self.otype = otype
-
- def to_wire(self, file):
- """Convert an option to wire format.
- """
- raise NotImplementedError
-
- @classmethod
- def from_wire(cls, otype, wire, current, olen):
- """Build an EDNS option object from wire format.
-
- *otype*, an ``int``, is the option type.
-
- *wire*, a ``binary``, is the wire-format message.
-
- *current*, an ``int``, is the offset in *wire* of the beginning
- of the rdata.
-
- *olen*, an ``int``, is the length of the wire-format option data
-
- Returns a ``dns.edns.Option``.
- """
-
- raise NotImplementedError
-
- def _cmp(self, other):
- """Compare an EDNS option with another option of the same type.
-
- Returns < 0 if < *other*, 0 if == *other*, and > 0 if > *other*.
- """
- raise NotImplementedError
-
- def __eq__(self, other):
- if not isinstance(other, Option):
- return False
- if self.otype != other.otype:
- return False
- return self._cmp(other) == 0
-
- def __ne__(self, other):
- if not isinstance(other, Option):
- return False
- if self.otype != other.otype:
- return False
- return self._cmp(other) != 0
-
- def __lt__(self, other):
- if not isinstance(other, Option) or \
- self.otype != other.otype:
- return NotImplemented
- return self._cmp(other) < 0
-
- def __le__(self, other):
- if not isinstance(other, Option) or \
- self.otype != other.otype:
- return NotImplemented
- return self._cmp(other) <= 0
-
- def __ge__(self, other):
- if not isinstance(other, Option) or \
- self.otype != other.otype:
- return NotImplemented
- return self._cmp(other) >= 0
-
- def __gt__(self, other):
- if not isinstance(other, Option) or \
- self.otype != other.otype:
- return NotImplemented
- return self._cmp(other) > 0
-
-
-class GenericOption(Option):
-
- """Generic Option Class
-
- This class is used for EDNS option types for which we have no better
- implementation.
- """
-
- def __init__(self, otype, data):
- super(GenericOption, self).__init__(otype)
- self.data = data
-
- def to_wire(self, file):
- file.write(self.data)
-
- def to_text(self):
- return "Generic %d" % self.otype
-
- @classmethod
- def from_wire(cls, otype, wire, current, olen):
- return cls(otype, wire[current: current + olen])
-
- def _cmp(self, other):
- if self.data == other.data:
- return 0
- if self.data > other.data:
- return 1
- return -1
-
-
-class ECSOption(Option):
- """EDNS Client Subnet (ECS, RFC7871)"""
-
- def __init__(self, address, srclen=None, scopelen=0):
- """*address*, a ``text``, is the client address information.
-
- *srclen*, an ``int``, the source prefix length, which is the
- leftmost number of bits of the address to be used for the
- lookup. The default is 24 for IPv4 and 56 for IPv6.
-
- *scopelen*, an ``int``, the scope prefix length. This value
- must be 0 in queries, and should be set in responses.
- """
-
- super(ECSOption, self).__init__(ECS)
- af = dns.inet.af_for_address(address)
-
- if af == dns.inet.AF_INET6:
- self.family = 2
- if srclen is None:
- srclen = 56
- elif af == dns.inet.AF_INET:
- self.family = 1
- if srclen is None:
- srclen = 24
- else:
- raise ValueError('Bad ip family')
-
- self.address = address
- self.srclen = srclen
- self.scopelen = scopelen
-
- addrdata = dns.inet.inet_pton(af, address)
- nbytes = int(math.ceil(srclen/8.0))
-
- # Truncate to srclen and pad to the end of the last octet needed
- # See RFC section 6
- self.addrdata = addrdata[:nbytes]
- nbits = srclen % 8
- if nbits != 0:
- last = struct.pack('B', ord(self.addrdata[-1:]) & (0xff << nbits))
- self.addrdata = self.addrdata[:-1] + last
-
- def to_text(self):
- return "ECS {}/{} scope/{}".format(self.address, self.srclen,
- self.scopelen)
-
- def to_wire(self, file):
- file.write(struct.pack('!H', self.family))
- file.write(struct.pack('!BB', self.srclen, self.scopelen))
- file.write(self.addrdata)
-
- @classmethod
- def from_wire(cls, otype, wire, cur, olen):
- family, src, scope = struct.unpack('!HBB', wire[cur:cur+4])
- cur += 4
-
- addrlen = int(math.ceil(src/8.0))
-
- if family == 1:
- af = dns.inet.AF_INET
- pad = 4 - addrlen
- elif family == 2:
- af = dns.inet.AF_INET6
- pad = 16 - addrlen
- else:
- raise ValueError('unsupported family')
-
- addr = dns.inet.inet_ntop(af, wire[cur:cur+addrlen] + b'\x00' * pad)
- return cls(addr, src, scope)
-
- def _cmp(self, other):
- if self.addrdata == other.addrdata:
- return 0
- if self.addrdata > other.addrdata:
- return 1
- return -1
-
-_type_to_class = {
- ECS: ECSOption
-}
-
-def get_option_class(otype):
- """Return the class for the specified option type.
-
- The GenericOption class is used if a more specific class is not
- known.
- """
-
- cls = _type_to_class.get(otype)
- if cls is None:
- cls = GenericOption
- return cls
-
-
-def option_from_wire(otype, wire, current, olen):
- """Build an EDNS option object from wire format.
-
- *otype*, an ``int``, is the option type.
-
- *wire*, a ``binary``, is the wire-format message.
-
- *current*, an ``int``, is the offset in *wire* of the beginning
- of the rdata.
-
- *olen*, an ``int``, is the length of the wire-format option data
-
- Returns an instance of a subclass of ``dns.edns.Option``.
- """
-
- cls = get_option_class(otype)
- return cls.from_wire(otype, wire, current, olen)
diff --git a/client/ayon_core/vendor/python/python_2/dns/entropy.py b/client/ayon_core/vendor/python/python_2/dns/entropy.py
deleted file mode 100644
index 00c6a4b389..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/entropy.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2009-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import os
-import random
-import time
-from ._compat import long, binary_type
-try:
- import threading as _threading
-except ImportError:
- import dummy_threading as _threading
-
-
-class EntropyPool(object):
-
- # This is an entropy pool for Python implementations that do not
- # have a working SystemRandom. I'm not sure there are any, but
- # leaving this code doesn't hurt anything as the library code
- # is used if present.
-
- def __init__(self, seed=None):
- self.pool_index = 0
- self.digest = None
- self.next_byte = 0
- self.lock = _threading.Lock()
- try:
- import hashlib
- self.hash = hashlib.sha1()
- self.hash_len = 20
- except ImportError:
- try:
- import sha
- self.hash = sha.new()
- self.hash_len = 20
- except ImportError:
- import md5 # pylint: disable=import-error
- self.hash = md5.new()
- self.hash_len = 16
- self.pool = bytearray(b'\0' * self.hash_len)
- if seed is not None:
- self.stir(bytearray(seed))
- self.seeded = True
- self.seed_pid = os.getpid()
- else:
- self.seeded = False
- self.seed_pid = 0
-
- def stir(self, entropy, already_locked=False):
- if not already_locked:
- self.lock.acquire()
- try:
- for c in entropy:
- if self.pool_index == self.hash_len:
- self.pool_index = 0
- b = c & 0xff
- self.pool[self.pool_index] ^= b
- self.pool_index += 1
- finally:
- if not already_locked:
- self.lock.release()
-
- def _maybe_seed(self):
- if not self.seeded or self.seed_pid != os.getpid():
- try:
- seed = os.urandom(16)
- except Exception:
- try:
- r = open('/dev/urandom', 'rb', 0)
- try:
- seed = r.read(16)
- finally:
- r.close()
- except Exception:
- seed = str(time.time())
- self.seeded = True
- self.seed_pid = os.getpid()
- self.digest = None
- seed = bytearray(seed)
- self.stir(seed, True)
-
- def random_8(self):
- self.lock.acquire()
- try:
- self._maybe_seed()
- if self.digest is None or self.next_byte == self.hash_len:
- self.hash.update(binary_type(self.pool))
- self.digest = bytearray(self.hash.digest())
- self.stir(self.digest, True)
- self.next_byte = 0
- value = self.digest[self.next_byte]
- self.next_byte += 1
- finally:
- self.lock.release()
- return value
-
- def random_16(self):
- return self.random_8() * 256 + self.random_8()
-
- def random_32(self):
- return self.random_16() * 65536 + self.random_16()
-
- def random_between(self, first, last):
- size = last - first + 1
- if size > long(4294967296):
- raise ValueError('too big')
- if size > 65536:
- rand = self.random_32
- max = long(4294967295)
- elif size > 256:
- rand = self.random_16
- max = 65535
- else:
- rand = self.random_8
- max = 255
- return first + size * rand() // (max + 1)
-
-pool = EntropyPool()
-
-try:
- system_random = random.SystemRandom()
-except Exception:
- system_random = None
-
-def random_16():
- if system_random is not None:
- return system_random.randrange(0, 65536)
- else:
- return pool.random_16()
-
-def between(first, last):
- if system_random is not None:
- return system_random.randrange(first, last + 1)
- else:
- return pool.random_between(first, last)
diff --git a/client/ayon_core/vendor/python/python_2/dns/exception.py b/client/ayon_core/vendor/python/python_2/dns/exception.py
deleted file mode 100644
index 71ff04f148..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/exception.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Common DNS Exceptions.
-
-Dnspython modules may also define their own exceptions, which will
-always be subclasses of ``DNSException``.
-"""
-
-class DNSException(Exception):
- """Abstract base class shared by all dnspython exceptions.
-
- It supports two basic modes of operation:
-
- a) Old/compatible mode is used if ``__init__`` was called with
- empty *kwargs*. In compatible mode all *args* are passed
- to the standard Python Exception class as before and all *args* are
- printed by the standard ``__str__`` implementation. Class variable
- ``msg`` (or doc string if ``msg`` is ``None``) is returned from ``str()``
- if *args* is empty.
-
- b) New/parametrized mode is used if ``__init__`` was called with
- non-empty *kwargs*.
- In the new mode *args* must be empty and all kwargs must match
- those set in class variable ``supp_kwargs``. All kwargs are stored inside
- ``self.kwargs`` and used in a new ``__str__`` implementation to construct
- a formatted message based on the ``fmt`` class variable, a ``string``.
-
- In the simplest case it is enough to override the ``supp_kwargs``
- and ``fmt`` class variables to get nice parametrized messages.
- """
-
- msg = None # non-parametrized message
- supp_kwargs = set() # accepted parameters for _fmt_kwargs (sanity check)
- fmt = None # message parametrized with results from _fmt_kwargs
-
- def __init__(self, *args, **kwargs):
- self._check_params(*args, **kwargs)
- if kwargs:
- self.kwargs = self._check_kwargs(**kwargs)
- self.msg = str(self)
- else:
- self.kwargs = dict() # defined but empty for old mode exceptions
- if self.msg is None:
- # doc string is better implicit message than empty string
- self.msg = self.__doc__
- if args:
- super(DNSException, self).__init__(*args)
- else:
- super(DNSException, self).__init__(self.msg)
-
- def _check_params(self, *args, **kwargs):
- """Old exceptions supported only args and not kwargs.
-
- For sanity we do not allow to mix old and new behavior."""
- if args or kwargs:
- assert bool(args) != bool(kwargs), \
- 'keyword arguments are mutually exclusive with positional args'
-
- def _check_kwargs(self, **kwargs):
- if kwargs:
- assert set(kwargs.keys()) == self.supp_kwargs, \
- 'following set of keyword args is required: %s' % (
- self.supp_kwargs)
- return kwargs
-
- def _fmt_kwargs(self, **kwargs):
- """Format kwargs before printing them.
-
- Resulting dictionary has to have keys necessary for str.format call
- on fmt class variable.
- """
- fmtargs = {}
- for kw, data in kwargs.items():
- if isinstance(data, (list, set)):
- # convert list of to list of str()
- fmtargs[kw] = list(map(str, data))
- if len(fmtargs[kw]) == 1:
- # remove list brackets [] from single-item lists
- fmtargs[kw] = fmtargs[kw].pop()
- else:
- fmtargs[kw] = data
- return fmtargs
-
- def __str__(self):
- if self.kwargs and self.fmt:
- # provide custom message constructed from keyword arguments
- fmtargs = self._fmt_kwargs(**self.kwargs)
- return self.fmt.format(**fmtargs)
- else:
- # print *args directly in the same way as old DNSException
- return super(DNSException, self).__str__()
-
-
-class FormError(DNSException):
- """DNS message is malformed."""
-
-
-class SyntaxError(DNSException):
- """Text input is malformed."""
-
-
-class UnexpectedEnd(SyntaxError):
- """Text input ended unexpectedly."""
-
-
-class TooBig(DNSException):
- """The DNS message is too big."""
-
-
-class Timeout(DNSException):
- """The DNS operation timed out."""
- supp_kwargs = {'timeout'}
- fmt = "The DNS operation timed out after {timeout} seconds"
diff --git a/client/ayon_core/vendor/python/python_2/dns/flags.py b/client/ayon_core/vendor/python/python_2/dns/flags.py
deleted file mode 100644
index 0119dec71f..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/flags.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Message Flags."""
-
-# Standard DNS flags
-
-#: Query Response
-QR = 0x8000
-#: Authoritative Answer
-AA = 0x0400
-#: Truncated Response
-TC = 0x0200
-#: Recursion Desired
-RD = 0x0100
-#: Recursion Available
-RA = 0x0080
-#: Authentic Data
-AD = 0x0020
-#: Checking Disabled
-CD = 0x0010
-
-# EDNS flags
-
-#: DNSSEC answer OK
-DO = 0x8000
-
-_by_text = {
- 'QR': QR,
- 'AA': AA,
- 'TC': TC,
- 'RD': RD,
- 'RA': RA,
- 'AD': AD,
- 'CD': CD
-}
-
-_edns_by_text = {
- 'DO': DO
-}
-
-
-# We construct the inverse mappings programmatically to ensure that we
-# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
-# would cause the mappings not to be true inverses.
-
-_by_value = {y: x for x, y in _by_text.items()}
-
-_edns_by_value = {y: x for x, y in _edns_by_text.items()}
-
-
-def _order_flags(table):
- order = list(table.items())
- order.sort()
- order.reverse()
- return order
-
-_flags_order = _order_flags(_by_value)
-
-_edns_flags_order = _order_flags(_edns_by_value)
-
-
-def _from_text(text, table):
- flags = 0
- tokens = text.split()
- for t in tokens:
- flags = flags | table[t.upper()]
- return flags
-
-
-def _to_text(flags, table, order):
- text_flags = []
- for k, v in order:
- if flags & k != 0:
- text_flags.append(v)
- return ' '.join(text_flags)
-
-
-def from_text(text):
- """Convert a space-separated list of flag text values into a flags
- value.
-
- Returns an ``int``
- """
-
- return _from_text(text, _by_text)
-
-
-def to_text(flags):
- """Convert a flags value into a space-separated list of flag text
- values.
-
- Returns a ``text``.
- """
-
- return _to_text(flags, _by_value, _flags_order)
-
-
-def edns_from_text(text):
- """Convert a space-separated list of EDNS flag text values into a EDNS
- flags value.
-
- Returns an ``int``
- """
-
- return _from_text(text, _edns_by_text)
-
-
-def edns_to_text(flags):
- """Convert an EDNS flags value into a space-separated list of EDNS flag
- text values.
-
- Returns a ``text``.
- """
-
- return _to_text(flags, _edns_by_value, _edns_flags_order)
diff --git a/client/ayon_core/vendor/python/python_2/dns/grange.py b/client/ayon_core/vendor/python/python_2/dns/grange.py
deleted file mode 100644
index ffe8be7c46..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/grange.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2012-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS GENERATE range conversion."""
-
-import dns
-
-def from_text(text):
- """Convert the text form of a range in a ``$GENERATE`` statement to an
- integer.
-
- *text*, a ``str``, the textual range in ``$GENERATE`` form.
-
- Returns a tuple of three ``int`` values ``(start, stop, step)``.
- """
-
- # TODO, figure out the bounds on start, stop and step.
- step = 1
- cur = ''
- state = 0
- # state 0 1 2 3 4
- # x - y / z
-
- if text and text[0] == '-':
- raise dns.exception.SyntaxError("Start cannot be a negative number")
-
- for c in text:
- if c == '-' and state == 0:
- start = int(cur)
- cur = ''
- state = 2
- elif c == '/':
- stop = int(cur)
- cur = ''
- state = 4
- elif c.isdigit():
- cur += c
- else:
- raise dns.exception.SyntaxError("Could not parse %s" % (c))
-
- if state in (1, 3):
- raise dns.exception.SyntaxError()
-
- if state == 2:
- stop = int(cur)
-
- if state == 4:
- step = int(cur)
-
- assert step >= 1
- assert start >= 0
- assert start <= stop
- # TODO, can start == stop?
-
- return (start, stop, step)
diff --git a/client/ayon_core/vendor/python/python_2/dns/hash.py b/client/ayon_core/vendor/python/python_2/dns/hash.py
deleted file mode 100644
index 1713e62894..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/hash.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Hashing backwards compatibility wrapper"""
-
-import hashlib
-import warnings
-
-warnings.warn(
- "dns.hash module will be removed in future versions. Please use hashlib instead.",
- DeprecationWarning)
-
-hashes = {}
-hashes['MD5'] = hashlib.md5
-hashes['SHA1'] = hashlib.sha1
-hashes['SHA224'] = hashlib.sha224
-hashes['SHA256'] = hashlib.sha256
-hashes['SHA384'] = hashlib.sha384
-hashes['SHA512'] = hashlib.sha512
-
-
-def get(algorithm):
- return hashes[algorithm.upper()]
diff --git a/client/ayon_core/vendor/python/python_2/dns/inet.py b/client/ayon_core/vendor/python/python_2/dns/inet.py
deleted file mode 100644
index c8d7c1b404..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/inet.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Generic Internet address helper functions."""
-
-import socket
-
-import dns.ipv4
-import dns.ipv6
-
-from ._compat import maybe_ord
-
-# We assume that AF_INET is always defined.
-
-AF_INET = socket.AF_INET
-
-# AF_INET6 might not be defined in the socket module, but we need it.
-# We'll try to use the socket module's value, and if it doesn't work,
-# we'll use our own value.
-
-try:
- AF_INET6 = socket.AF_INET6
-except AttributeError:
- AF_INET6 = 9999
-
-
-def inet_pton(family, text):
- """Convert the textual form of a network address into its binary form.
-
- *family* is an ``int``, the address family.
-
- *text* is a ``text``, the textual address.
-
- Raises ``NotImplementedError`` if the address family specified is not
- implemented.
-
- Returns a ``binary``.
- """
-
- if family == AF_INET:
- return dns.ipv4.inet_aton(text)
- elif family == AF_INET6:
- return dns.ipv6.inet_aton(text)
- else:
- raise NotImplementedError
-
-
-def inet_ntop(family, address):
- """Convert the binary form of a network address into its textual form.
-
- *family* is an ``int``, the address family.
-
- *address* is a ``binary``, the network address in binary form.
-
- Raises ``NotImplementedError`` if the address family specified is not
- implemented.
-
- Returns a ``text``.
- """
-
- if family == AF_INET:
- return dns.ipv4.inet_ntoa(address)
- elif family == AF_INET6:
- return dns.ipv6.inet_ntoa(address)
- else:
- raise NotImplementedError
-
-
-def af_for_address(text):
- """Determine the address family of a textual-form network address.
-
- *text*, a ``text``, the textual address.
-
- Raises ``ValueError`` if the address family cannot be determined
- from the input.
-
- Returns an ``int``.
- """
-
- try:
- dns.ipv4.inet_aton(text)
- return AF_INET
- except Exception:
- try:
- dns.ipv6.inet_aton(text)
- return AF_INET6
- except:
- raise ValueError
-
-
-def is_multicast(text):
- """Is the textual-form network address a multicast address?
-
- *text*, a ``text``, the textual address.
-
- Raises ``ValueError`` if the address family cannot be determined
- from the input.
-
- Returns a ``bool``.
- """
-
- try:
- first = maybe_ord(dns.ipv4.inet_aton(text)[0])
- return first >= 224 and first <= 239
- except Exception:
- try:
- first = maybe_ord(dns.ipv6.inet_aton(text)[0])
- return first == 255
- except Exception:
- raise ValueError
diff --git a/client/ayon_core/vendor/python/python_2/dns/ipv4.py b/client/ayon_core/vendor/python/python_2/dns/ipv4.py
deleted file mode 100644
index 8fc4f7dcfd..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/ipv4.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""IPv4 helper functions."""
-
-import struct
-
-import dns.exception
-from ._compat import binary_type
-
-def inet_ntoa(address):
- """Convert an IPv4 address in binary form to text form.
-
- *address*, a ``binary``, the IPv4 address in binary form.
-
- Returns a ``text``.
- """
-
- if len(address) != 4:
- raise dns.exception.SyntaxError
- if not isinstance(address, bytearray):
- address = bytearray(address)
- return ('%u.%u.%u.%u' % (address[0], address[1],
- address[2], address[3]))
-
-def inet_aton(text):
- """Convert an IPv4 address in text form to binary form.
-
- *text*, a ``text``, the IPv4 address in textual form.
-
- Returns a ``binary``.
- """
-
- if not isinstance(text, binary_type):
- text = text.encode()
- parts = text.split(b'.')
- if len(parts) != 4:
- raise dns.exception.SyntaxError
- for part in parts:
- if not part.isdigit():
- raise dns.exception.SyntaxError
- if len(part) > 1 and part[0] == '0':
- # No leading zeros
- raise dns.exception.SyntaxError
- try:
- bytes = [int(part) for part in parts]
- return struct.pack('BBBB', *bytes)
- except:
- raise dns.exception.SyntaxError
diff --git a/client/ayon_core/vendor/python/python_2/dns/ipv6.py b/client/ayon_core/vendor/python/python_2/dns/ipv6.py
deleted file mode 100644
index 128e56c8f1..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/ipv6.py
+++ /dev/null
@@ -1,181 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""IPv6 helper functions."""
-
-import re
-import binascii
-
-import dns.exception
-import dns.ipv4
-from ._compat import xrange, binary_type, maybe_decode
-
-_leading_zero = re.compile(r'0+([0-9a-f]+)')
-
-def inet_ntoa(address):
- """Convert an IPv6 address in binary form to text form.
-
- *address*, a ``binary``, the IPv6 address in binary form.
-
- Raises ``ValueError`` if the address isn't 16 bytes long.
- Returns a ``text``.
- """
-
- if len(address) != 16:
- raise ValueError("IPv6 addresses are 16 bytes long")
- hex = binascii.hexlify(address)
- chunks = []
- i = 0
- l = len(hex)
- while i < l:
- chunk = maybe_decode(hex[i : i + 4])
- # strip leading zeros. we do this with an re instead of
- # with lstrip() because lstrip() didn't support chars until
- # python 2.2.2
- m = _leading_zero.match(chunk)
- if not m is None:
- chunk = m.group(1)
- chunks.append(chunk)
- i += 4
- #
- # Compress the longest subsequence of 0-value chunks to ::
- #
- best_start = 0
- best_len = 0
- start = -1
- last_was_zero = False
- for i in xrange(8):
- if chunks[i] != '0':
- if last_was_zero:
- end = i
- current_len = end - start
- if current_len > best_len:
- best_start = start
- best_len = current_len
- last_was_zero = False
- elif not last_was_zero:
- start = i
- last_was_zero = True
- if last_was_zero:
- end = 8
- current_len = end - start
- if current_len > best_len:
- best_start = start
- best_len = current_len
- if best_len > 1:
- if best_start == 0 and \
- (best_len == 6 or
- best_len == 5 and chunks[5] == 'ffff'):
- # We have an embedded IPv4 address
- if best_len == 6:
- prefix = '::'
- else:
- prefix = '::ffff:'
- hex = prefix + dns.ipv4.inet_ntoa(address[12:])
- else:
- hex = ':'.join(chunks[:best_start]) + '::' + \
- ':'.join(chunks[best_start + best_len:])
- else:
- hex = ':'.join(chunks)
- return hex
-
-_v4_ending = re.compile(br'(.*):(\d+\.\d+\.\d+\.\d+)$')
-_colon_colon_start = re.compile(br'::.*')
-_colon_colon_end = re.compile(br'.*::$')
-
-def inet_aton(text):
- """Convert an IPv6 address in text form to binary form.
-
- *text*, a ``text``, the IPv6 address in textual form.
-
- Returns a ``binary``.
- """
-
- #
- # Our aim here is not something fast; we just want something that works.
- #
- if not isinstance(text, binary_type):
- text = text.encode()
-
- if text == b'::':
- text = b'0::'
- #
- # Get rid of the icky dot-quad syntax if we have it.
- #
- m = _v4_ending.match(text)
- if not m is None:
- b = bytearray(dns.ipv4.inet_aton(m.group(2)))
- text = (u"{}:{:02x}{:02x}:{:02x}{:02x}".format(m.group(1).decode(),
- b[0], b[1], b[2],
- b[3])).encode()
- #
- # Try to turn '::' into ':'; if no match try to
- # turn '::' into ':'
- #
- m = _colon_colon_start.match(text)
- if not m is None:
- text = text[1:]
- else:
- m = _colon_colon_end.match(text)
- if not m is None:
- text = text[:-1]
- #
- # Now canonicalize into 8 chunks of 4 hex digits each
- #
- chunks = text.split(b':')
- l = len(chunks)
- if l > 8:
- raise dns.exception.SyntaxError
- seen_empty = False
- canonical = []
- for c in chunks:
- if c == b'':
- if seen_empty:
- raise dns.exception.SyntaxError
- seen_empty = True
- for i in xrange(0, 8 - l + 1):
- canonical.append(b'0000')
- else:
- lc = len(c)
- if lc > 4:
- raise dns.exception.SyntaxError
- if lc != 4:
- c = (b'0' * (4 - lc)) + c
- canonical.append(c)
- if l < 8 and not seen_empty:
- raise dns.exception.SyntaxError
- text = b''.join(canonical)
-
- #
- # Finally we can go to binary.
- #
- try:
- return binascii.unhexlify(text)
- except (binascii.Error, TypeError):
- raise dns.exception.SyntaxError
-
-_mapped_prefix = b'\x00' * 10 + b'\xff\xff'
-
-def is_mapped(address):
- """Is the specified address a mapped IPv4 address?
-
- *address*, a ``binary`` is an IPv6 address in binary form.
-
- Returns a ``bool``.
- """
-
- return address.startswith(_mapped_prefix)
diff --git a/client/ayon_core/vendor/python/python_2/dns/message.py b/client/ayon_core/vendor/python/python_2/dns/message.py
deleted file mode 100644
index 9d2b2f43c9..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/message.py
+++ /dev/null
@@ -1,1175 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Messages"""
-
-from __future__ import absolute_import
-
-from io import StringIO
-import struct
-import time
-
-import dns.edns
-import dns.exception
-import dns.flags
-import dns.name
-import dns.opcode
-import dns.entropy
-import dns.rcode
-import dns.rdata
-import dns.rdataclass
-import dns.rdatatype
-import dns.rrset
-import dns.renderer
-import dns.tsig
-import dns.wiredata
-
-from ._compat import long, xrange, string_types
-
-
-class ShortHeader(dns.exception.FormError):
- """The DNS packet passed to from_wire() is too short."""
-
-
-class TrailingJunk(dns.exception.FormError):
- """The DNS packet passed to from_wire() has extra junk at the end of it."""
-
-
-class UnknownHeaderField(dns.exception.DNSException):
- """The header field name was not recognized when converting from text
- into a message."""
-
-
-class BadEDNS(dns.exception.FormError):
- """An OPT record occurred somewhere other than the start of
- the additional data section."""
-
-
-class BadTSIG(dns.exception.FormError):
- """A TSIG record occurred somewhere other than the end of
- the additional data section."""
-
-
-class UnknownTSIGKey(dns.exception.DNSException):
- """A TSIG with an unknown key was received."""
-
-
-#: The question section number
-QUESTION = 0
-
-#: The answer section number
-ANSWER = 1
-
-#: The authority section number
-AUTHORITY = 2
-
-#: The additional section number
-ADDITIONAL = 3
-
-class Message(object):
- """A DNS message."""
-
- def __init__(self, id=None):
- if id is None:
- self.id = dns.entropy.random_16()
- else:
- self.id = id
- self.flags = 0
- self.question = []
- self.answer = []
- self.authority = []
- self.additional = []
- self.edns = -1
- self.ednsflags = 0
- self.payload = 0
- self.options = []
- self.request_payload = 0
- self.keyring = None
- self.keyname = None
- self.keyalgorithm = dns.tsig.default_algorithm
- self.request_mac = b''
- self.other_data = b''
- self.tsig_error = 0
- self.fudge = 300
- self.original_id = self.id
- self.mac = b''
- self.xfr = False
- self.origin = None
- self.tsig_ctx = None
- self.had_tsig = False
- self.multi = False
- self.first = True
- self.index = {}
-
- def __repr__(self):
- return ''
-
- def __str__(self):
- return self.to_text()
-
- def to_text(self, origin=None, relativize=True, **kw):
- """Convert the message to text.
-
- The *origin*, *relativize*, and any other keyword
- arguments are passed to the RRset ``to_wire()`` method.
-
- Returns a ``text``.
- """
-
- s = StringIO()
- s.write(u'id %d\n' % self.id)
- s.write(u'opcode %s\n' %
- dns.opcode.to_text(dns.opcode.from_flags(self.flags)))
- rc = dns.rcode.from_flags(self.flags, self.ednsflags)
- s.write(u'rcode %s\n' % dns.rcode.to_text(rc))
- s.write(u'flags %s\n' % dns.flags.to_text(self.flags))
- if self.edns >= 0:
- s.write(u'edns %s\n' % self.edns)
- if self.ednsflags != 0:
- s.write(u'eflags %s\n' %
- dns.flags.edns_to_text(self.ednsflags))
- s.write(u'payload %d\n' % self.payload)
- for opt in self.options:
- s.write(u'option %s\n' % opt.to_text())
- is_update = dns.opcode.is_update(self.flags)
- if is_update:
- s.write(u';ZONE\n')
- else:
- s.write(u';QUESTION\n')
- for rrset in self.question:
- s.write(rrset.to_text(origin, relativize, **kw))
- s.write(u'\n')
- if is_update:
- s.write(u';PREREQ\n')
- else:
- s.write(u';ANSWER\n')
- for rrset in self.answer:
- s.write(rrset.to_text(origin, relativize, **kw))
- s.write(u'\n')
- if is_update:
- s.write(u';UPDATE\n')
- else:
- s.write(u';AUTHORITY\n')
- for rrset in self.authority:
- s.write(rrset.to_text(origin, relativize, **kw))
- s.write(u'\n')
- s.write(u';ADDITIONAL\n')
- for rrset in self.additional:
- s.write(rrset.to_text(origin, relativize, **kw))
- s.write(u'\n')
- #
- # We strip off the final \n so the caller can print the result without
- # doing weird things to get around eccentricities in Python print
- # formatting
- #
- return s.getvalue()[:-1]
-
- def __eq__(self, other):
- """Two messages are equal if they have the same content in the
- header, question, answer, and authority sections.
-
- Returns a ``bool``.
- """
-
- if not isinstance(other, Message):
- return False
- if self.id != other.id:
- return False
- if self.flags != other.flags:
- return False
- for n in self.question:
- if n not in other.question:
- return False
- for n in other.question:
- if n not in self.question:
- return False
- for n in self.answer:
- if n not in other.answer:
- return False
- for n in other.answer:
- if n not in self.answer:
- return False
- for n in self.authority:
- if n not in other.authority:
- return False
- for n in other.authority:
- if n not in self.authority:
- return False
- return True
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- def is_response(self, other):
- """Is this message a response to *other*?
-
- Returns a ``bool``.
- """
-
- if other.flags & dns.flags.QR == 0 or \
- self.id != other.id or \
- dns.opcode.from_flags(self.flags) != \
- dns.opcode.from_flags(other.flags):
- return False
- if dns.rcode.from_flags(other.flags, other.ednsflags) != \
- dns.rcode.NOERROR:
- return True
- if dns.opcode.is_update(self.flags):
- return True
- for n in self.question:
- if n not in other.question:
- return False
- for n in other.question:
- if n not in self.question:
- return False
- return True
-
- def section_number(self, section):
- """Return the "section number" of the specified section for use
- in indexing. The question section is 0, the answer section is 1,
- the authority section is 2, and the additional section is 3.
-
- *section* is one of the section attributes of this message.
-
- Raises ``ValueError`` if the section isn't known.
-
- Returns an ``int``.
- """
-
- if section is self.question:
- return QUESTION
- elif section is self.answer:
- return ANSWER
- elif section is self.authority:
- return AUTHORITY
- elif section is self.additional:
- return ADDITIONAL
- else:
- raise ValueError('unknown section')
-
- def section_from_number(self, number):
- """Return the "section number" of the specified section for use
- in indexing. The question section is 0, the answer section is 1,
- the authority section is 2, and the additional section is 3.
-
- *section* is one of the section attributes of this message.
-
- Raises ``ValueError`` if the section isn't known.
-
- Returns an ``int``.
- """
-
- if number == QUESTION:
- return self.question
- elif number == ANSWER:
- return self.answer
- elif number == AUTHORITY:
- return self.authority
- elif number == ADDITIONAL:
- return self.additional
- else:
- raise ValueError('unknown section')
-
- def find_rrset(self, section, name, rdclass, rdtype,
- covers=dns.rdatatype.NONE, deleting=None, create=False,
- force_unique=False):
- """Find the RRset with the given attributes in the specified section.
-
- *section*, an ``int`` section number, or one of the section
- attributes of this message. This specifies the
- the section of the message to search. For example::
-
- my_message.find_rrset(my_message.answer, name, rdclass, rdtype)
- my_message.find_rrset(dns.message.ANSWER, name, rdclass, rdtype)
-
- *name*, a ``dns.name.Name``, the name of the RRset.
-
- *rdclass*, an ``int``, the class of the RRset.
-
- *rdtype*, an ``int``, the type of the RRset.
-
- *covers*, an ``int`` or ``None``, the covers value of the RRset.
- The default is ``None``.
-
- *deleting*, an ``int`` or ``None``, the deleting value of the RRset.
- The default is ``None``.
-
- *create*, a ``bool``. If ``True``, create the RRset if it is not found.
- The created RRset is appended to *section*.
-
- *force_unique*, a ``bool``. If ``True`` and *create* is also ``True``,
- create a new RRset regardless of whether a matching RRset exists
- already. The default is ``False``. This is useful when creating
- DDNS Update messages, as order matters for them.
-
- Raises ``KeyError`` if the RRset was not found and create was
- ``False``.
-
- Returns a ``dns.rrset.RRset object``.
- """
-
- if isinstance(section, int):
- section_number = section
- section = self.section_from_number(section_number)
- else:
- section_number = self.section_number(section)
- key = (section_number, name, rdclass, rdtype, covers, deleting)
- if not force_unique:
- if self.index is not None:
- rrset = self.index.get(key)
- if rrset is not None:
- return rrset
- else:
- for rrset in section:
- if rrset.match(name, rdclass, rdtype, covers, deleting):
- return rrset
- if not create:
- raise KeyError
- rrset = dns.rrset.RRset(name, rdclass, rdtype, covers, deleting)
- section.append(rrset)
- if self.index is not None:
- self.index[key] = rrset
- return rrset
-
- def get_rrset(self, section, name, rdclass, rdtype,
- covers=dns.rdatatype.NONE, deleting=None, create=False,
- force_unique=False):
- """Get the RRset with the given attributes in the specified section.
-
- If the RRset is not found, None is returned.
-
- *section*, an ``int`` section number, or one of the section
- attributes of this message. This specifies the
- the section of the message to search. For example::
-
- my_message.get_rrset(my_message.answer, name, rdclass, rdtype)
- my_message.get_rrset(dns.message.ANSWER, name, rdclass, rdtype)
-
- *name*, a ``dns.name.Name``, the name of the RRset.
-
- *rdclass*, an ``int``, the class of the RRset.
-
- *rdtype*, an ``int``, the type of the RRset.
-
- *covers*, an ``int`` or ``None``, the covers value of the RRset.
- The default is ``None``.
-
- *deleting*, an ``int`` or ``None``, the deleting value of the RRset.
- The default is ``None``.
-
- *create*, a ``bool``. If ``True``, create the RRset if it is not found.
- The created RRset is appended to *section*.
-
- *force_unique*, a ``bool``. If ``True`` and *create* is also ``True``,
- create a new RRset regardless of whether a matching RRset exists
- already. The default is ``False``. This is useful when creating
- DDNS Update messages, as order matters for them.
-
- Returns a ``dns.rrset.RRset object`` or ``None``.
- """
-
- try:
- rrset = self.find_rrset(section, name, rdclass, rdtype, covers,
- deleting, create, force_unique)
- except KeyError:
- rrset = None
- return rrset
-
- def to_wire(self, origin=None, max_size=0, **kw):
- """Return a string containing the message in DNS compressed wire
- format.
-
- Additional keyword arguments are passed to the RRset ``to_wire()``
- method.
-
- *origin*, a ``dns.name.Name`` or ``None``, the origin to be appended
- to any relative names.
-
- *max_size*, an ``int``, the maximum size of the wire format
- output; default is 0, which means "the message's request
- payload, if nonzero, or 65535".
-
- Raises ``dns.exception.TooBig`` if *max_size* was exceeded.
-
- Returns a ``binary``.
- """
-
- if max_size == 0:
- if self.request_payload != 0:
- max_size = self.request_payload
- else:
- max_size = 65535
- if max_size < 512:
- max_size = 512
- elif max_size > 65535:
- max_size = 65535
- r = dns.renderer.Renderer(self.id, self.flags, max_size, origin)
- for rrset in self.question:
- r.add_question(rrset.name, rrset.rdtype, rrset.rdclass)
- for rrset in self.answer:
- r.add_rrset(dns.renderer.ANSWER, rrset, **kw)
- for rrset in self.authority:
- r.add_rrset(dns.renderer.AUTHORITY, rrset, **kw)
- if self.edns >= 0:
- r.add_edns(self.edns, self.ednsflags, self.payload, self.options)
- for rrset in self.additional:
- r.add_rrset(dns.renderer.ADDITIONAL, rrset, **kw)
- r.write_header()
- if self.keyname is not None:
- r.add_tsig(self.keyname, self.keyring[self.keyname],
- self.fudge, self.original_id, self.tsig_error,
- self.other_data, self.request_mac,
- self.keyalgorithm)
- self.mac = r.mac
- return r.get_wire()
-
- def use_tsig(self, keyring, keyname=None, fudge=300,
- original_id=None, tsig_error=0, other_data=b'',
- algorithm=dns.tsig.default_algorithm):
- """When sending, a TSIG signature using the specified keyring
- and keyname should be added.
-
- See the documentation of the Message class for a complete
- description of the keyring dictionary.
-
- *keyring*, a ``dict``, the TSIG keyring to use. If a
- *keyring* is specified but a *keyname* is not, then the key
- used will be the first key in the *keyring*. Note that the
- order of keys in a dictionary is not defined, so applications
- should supply a keyname when a keyring is used, unless they
- know the keyring contains only one key.
-
- *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key
- to use; defaults to ``None``. The key must be defined in the keyring.
-
- *fudge*, an ``int``, the TSIG time fudge.
-
- *original_id*, an ``int``, the TSIG original id. If ``None``,
- the message's id is used.
-
- *tsig_error*, an ``int``, the TSIG error code.
-
- *other_data*, a ``binary``, the TSIG other data.
-
- *algorithm*, a ``dns.name.Name``, the TSIG algorithm to use.
- """
-
- self.keyring = keyring
- if keyname is None:
- self.keyname = list(self.keyring.keys())[0]
- else:
- if isinstance(keyname, string_types):
- keyname = dns.name.from_text(keyname)
- self.keyname = keyname
- self.keyalgorithm = algorithm
- self.fudge = fudge
- if original_id is None:
- self.original_id = self.id
- else:
- self.original_id = original_id
- self.tsig_error = tsig_error
- self.other_data = other_data
-
- def use_edns(self, edns=0, ednsflags=0, payload=1280, request_payload=None,
- options=None):
- """Configure EDNS behavior.
-
- *edns*, an ``int``, is the EDNS level to use. Specifying
- ``None``, ``False``, or ``-1`` means "do not use EDNS", and in this case
- the other parameters are ignored. Specifying ``True`` is
- equivalent to specifying 0, i.e. "use EDNS0".
-
- *ednsflags*, an ``int``, the EDNS flag values.
-
- *payload*, an ``int``, is the EDNS sender's payload field, which is the
- maximum size of UDP datagram the sender can handle. I.e. how big
- a response to this message can be.
-
- *request_payload*, an ``int``, is the EDNS payload size to use when
- sending this message. If not specified, defaults to the value of
- *payload*.
-
- *options*, a list of ``dns.edns.Option`` objects or ``None``, the EDNS
- options.
- """
-
- if edns is None or edns is False:
- edns = -1
- if edns is True:
- edns = 0
- if request_payload is None:
- request_payload = payload
- if edns < 0:
- ednsflags = 0
- payload = 0
- request_payload = 0
- options = []
- else:
- # make sure the EDNS version in ednsflags agrees with edns
- ednsflags &= long(0xFF00FFFF)
- ednsflags |= (edns << 16)
- if options is None:
- options = []
- self.edns = edns
- self.ednsflags = ednsflags
- self.payload = payload
- self.options = options
- self.request_payload = request_payload
-
- def want_dnssec(self, wanted=True):
- """Enable or disable 'DNSSEC desired' flag in requests.
-
- *wanted*, a ``bool``. If ``True``, then DNSSEC data is
- desired in the response, EDNS is enabled if required, and then
- the DO bit is set. If ``False``, the DO bit is cleared if
- EDNS is enabled.
- """
-
- if wanted:
- if self.edns < 0:
- self.use_edns()
- self.ednsflags |= dns.flags.DO
- elif self.edns >= 0:
- self.ednsflags &= ~dns.flags.DO
-
- def rcode(self):
- """Return the rcode.
-
- Returns an ``int``.
- """
- return dns.rcode.from_flags(self.flags, self.ednsflags)
-
- def set_rcode(self, rcode):
- """Set the rcode.
-
- *rcode*, an ``int``, is the rcode to set.
- """
- (value, evalue) = dns.rcode.to_flags(rcode)
- self.flags &= 0xFFF0
- self.flags |= value
- self.ednsflags &= long(0x00FFFFFF)
- self.ednsflags |= evalue
- if self.ednsflags != 0 and self.edns < 0:
- self.edns = 0
-
- def opcode(self):
- """Return the opcode.
-
- Returns an ``int``.
- """
- return dns.opcode.from_flags(self.flags)
-
- def set_opcode(self, opcode):
- """Set the opcode.
-
- *opcode*, an ``int``, is the opcode to set.
- """
- self.flags &= 0x87FF
- self.flags |= dns.opcode.to_flags(opcode)
-
-
-class _WireReader(object):
-
- """Wire format reader.
-
- wire: a binary, is the wire-format message.
- message: The message object being built
- current: When building a message object from wire format, this
- variable contains the offset from the beginning of wire of the next octet
- to be read.
- updating: Is the message a dynamic update?
- one_rr_per_rrset: Put each RR into its own RRset?
- ignore_trailing: Ignore trailing junk at end of request?
- zone_rdclass: The class of the zone in messages which are
- DNS dynamic updates.
- """
-
- def __init__(self, wire, message, question_only=False,
- one_rr_per_rrset=False, ignore_trailing=False):
- self.wire = dns.wiredata.maybe_wrap(wire)
- self.message = message
- self.current = 0
- self.updating = False
- self.zone_rdclass = dns.rdataclass.IN
- self.question_only = question_only
- self.one_rr_per_rrset = one_rr_per_rrset
- self.ignore_trailing = ignore_trailing
-
- def _get_question(self, qcount):
- """Read the next *qcount* records from the wire data and add them to
- the question section.
- """
-
- if self.updating and qcount > 1:
- raise dns.exception.FormError
-
- for i in xrange(0, qcount):
- (qname, used) = dns.name.from_wire(self.wire, self.current)
- if self.message.origin is not None:
- qname = qname.relativize(self.message.origin)
- self.current = self.current + used
- (rdtype, rdclass) = \
- struct.unpack('!HH',
- self.wire[self.current:self.current + 4])
- self.current = self.current + 4
- self.message.find_rrset(self.message.question, qname,
- rdclass, rdtype, create=True,
- force_unique=True)
- if self.updating:
- self.zone_rdclass = rdclass
-
- def _get_section(self, section, count):
- """Read the next I{count} records from the wire data and add them to
- the specified section.
-
- section: the section of the message to which to add records
- count: the number of records to read
- """
-
- if self.updating or self.one_rr_per_rrset:
- force_unique = True
- else:
- force_unique = False
- seen_opt = False
- for i in xrange(0, count):
- rr_start = self.current
- (name, used) = dns.name.from_wire(self.wire, self.current)
- absolute_name = name
- if self.message.origin is not None:
- name = name.relativize(self.message.origin)
- self.current = self.current + used
- (rdtype, rdclass, ttl, rdlen) = \
- struct.unpack('!HHIH',
- self.wire[self.current:self.current + 10])
- self.current = self.current + 10
- if rdtype == dns.rdatatype.OPT:
- if section is not self.message.additional or seen_opt:
- raise BadEDNS
- self.message.payload = rdclass
- self.message.ednsflags = ttl
- self.message.edns = (ttl & 0xff0000) >> 16
- self.message.options = []
- current = self.current
- optslen = rdlen
- while optslen > 0:
- (otype, olen) = \
- struct.unpack('!HH',
- self.wire[current:current + 4])
- current = current + 4
- opt = dns.edns.option_from_wire(
- otype, self.wire, current, olen)
- self.message.options.append(opt)
- current = current + olen
- optslen = optslen - 4 - olen
- seen_opt = True
- elif rdtype == dns.rdatatype.TSIG:
- if not (section is self.message.additional and
- i == (count - 1)):
- raise BadTSIG
- if self.message.keyring is None:
- raise UnknownTSIGKey('got signed message without keyring')
- secret = self.message.keyring.get(absolute_name)
- if secret is None:
- raise UnknownTSIGKey("key '%s' unknown" % name)
- self.message.keyname = absolute_name
- (self.message.keyalgorithm, self.message.mac) = \
- dns.tsig.get_algorithm_and_mac(self.wire, self.current,
- rdlen)
- self.message.tsig_ctx = \
- dns.tsig.validate(self.wire,
- absolute_name,
- secret,
- int(time.time()),
- self.message.request_mac,
- rr_start,
- self.current,
- rdlen,
- self.message.tsig_ctx,
- self.message.multi,
- self.message.first)
- self.message.had_tsig = True
- else:
- if ttl < 0:
- ttl = 0
- if self.updating and \
- (rdclass == dns.rdataclass.ANY or
- rdclass == dns.rdataclass.NONE):
- deleting = rdclass
- rdclass = self.zone_rdclass
- else:
- deleting = None
- if deleting == dns.rdataclass.ANY or \
- (deleting == dns.rdataclass.NONE and
- section is self.message.answer):
- covers = dns.rdatatype.NONE
- rd = None
- else:
- rd = dns.rdata.from_wire(rdclass, rdtype, self.wire,
- self.current, rdlen,
- self.message.origin)
- covers = rd.covers()
- if self.message.xfr and rdtype == dns.rdatatype.SOA:
- force_unique = True
- rrset = self.message.find_rrset(section, name,
- rdclass, rdtype, covers,
- deleting, True, force_unique)
- if rd is not None:
- rrset.add(rd, ttl)
- self.current = self.current + rdlen
-
- def read(self):
- """Read a wire format DNS message and build a dns.message.Message
- object."""
-
- l = len(self.wire)
- if l < 12:
- raise ShortHeader
- (self.message.id, self.message.flags, qcount, ancount,
- aucount, adcount) = struct.unpack('!HHHHHH', self.wire[:12])
- self.current = 12
- if dns.opcode.is_update(self.message.flags):
- self.updating = True
- self._get_question(qcount)
- if self.question_only:
- return
- self._get_section(self.message.answer, ancount)
- self._get_section(self.message.authority, aucount)
- self._get_section(self.message.additional, adcount)
- if not self.ignore_trailing and self.current != l:
- raise TrailingJunk
- if self.message.multi and self.message.tsig_ctx and \
- not self.message.had_tsig:
- self.message.tsig_ctx.update(self.wire)
-
-
-def from_wire(wire, keyring=None, request_mac=b'', xfr=False, origin=None,
- tsig_ctx=None, multi=False, first=True,
- question_only=False, one_rr_per_rrset=False,
- ignore_trailing=False):
- """Convert a DNS wire format message into a message
- object.
-
- *keyring*, a ``dict``, the keyring to use if the message is signed.
-
- *request_mac*, a ``binary``. If the message is a response to a
- TSIG-signed request, *request_mac* should be set to the MAC of
- that request.
-
- *xfr*, a ``bool``, should be set to ``True`` if this message is part of
- a zone transfer.
-
- *origin*, a ``dns.name.Name`` or ``None``. If the message is part
- of a zone transfer, *origin* should be the origin name of the
- zone.
-
- *tsig_ctx*, a ``hmac.HMAC`` objext, the ongoing TSIG context, used
- when validating zone transfers.
-
- *multi*, a ``bool``, should be set to ``True`` if this message
- part of a multiple message sequence.
-
- *first*, a ``bool``, should be set to ``True`` if this message is
- stand-alone, or the first message in a multi-message sequence.
-
- *question_only*, a ``bool``. If ``True``, read only up to
- the end of the question section.
-
- *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its
- own RRset.
-
- *ignore_trailing*, a ``bool``. If ``True``, ignore trailing
- junk at end of the message.
-
- Raises ``dns.message.ShortHeader`` if the message is less than 12 octets
- long.
-
- Raises ``dns.messaage.TrailingJunk`` if there were octets in the message
- past the end of the proper DNS message, and *ignore_trailing* is ``False``.
-
- Raises ``dns.message.BadEDNS`` if an OPT record was in the
- wrong section, or occurred more than once.
-
- Raises ``dns.message.BadTSIG`` if a TSIG record was not the last
- record of the additional data section.
-
- Returns a ``dns.message.Message``.
- """
-
- m = Message(id=0)
- m.keyring = keyring
- m.request_mac = request_mac
- m.xfr = xfr
- m.origin = origin
- m.tsig_ctx = tsig_ctx
- m.multi = multi
- m.first = first
-
- reader = _WireReader(wire, m, question_only, one_rr_per_rrset,
- ignore_trailing)
- reader.read()
-
- return m
-
-
-class _TextReader(object):
-
- """Text format reader.
-
- tok: the tokenizer.
- message: The message object being built.
- updating: Is the message a dynamic update?
- zone_rdclass: The class of the zone in messages which are
- DNS dynamic updates.
- last_name: The most recently read name when building a message object.
- """
-
- def __init__(self, text, message):
- self.message = message
- self.tok = dns.tokenizer.Tokenizer(text)
- self.last_name = None
- self.zone_rdclass = dns.rdataclass.IN
- self.updating = False
-
- def _header_line(self, section):
- """Process one line from the text format header section."""
-
- token = self.tok.get()
- what = token.value
- if what == 'id':
- self.message.id = self.tok.get_int()
- elif what == 'flags':
- while True:
- token = self.tok.get()
- if not token.is_identifier():
- self.tok.unget(token)
- break
- self.message.flags = self.message.flags | \
- dns.flags.from_text(token.value)
- if dns.opcode.is_update(self.message.flags):
- self.updating = True
- elif what == 'edns':
- self.message.edns = self.tok.get_int()
- self.message.ednsflags = self.message.ednsflags | \
- (self.message.edns << 16)
- elif what == 'eflags':
- if self.message.edns < 0:
- self.message.edns = 0
- while True:
- token = self.tok.get()
- if not token.is_identifier():
- self.tok.unget(token)
- break
- self.message.ednsflags = self.message.ednsflags | \
- dns.flags.edns_from_text(token.value)
- elif what == 'payload':
- self.message.payload = self.tok.get_int()
- if self.message.edns < 0:
- self.message.edns = 0
- elif what == 'opcode':
- text = self.tok.get_string()
- self.message.flags = self.message.flags | \
- dns.opcode.to_flags(dns.opcode.from_text(text))
- elif what == 'rcode':
- text = self.tok.get_string()
- self.message.set_rcode(dns.rcode.from_text(text))
- else:
- raise UnknownHeaderField
- self.tok.get_eol()
-
- def _question_line(self, section):
- """Process one line from the text format question section."""
-
- token = self.tok.get(want_leading=True)
- if not token.is_whitespace():
- self.last_name = dns.name.from_text(token.value, None)
- name = self.last_name
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- # Class
- try:
- rdclass = dns.rdataclass.from_text(token.value)
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except dns.exception.SyntaxError:
- raise dns.exception.SyntaxError
- except Exception:
- rdclass = dns.rdataclass.IN
- # Type
- rdtype = dns.rdatatype.from_text(token.value)
- self.message.find_rrset(self.message.question, name,
- rdclass, rdtype, create=True,
- force_unique=True)
- if self.updating:
- self.zone_rdclass = rdclass
- self.tok.get_eol()
-
- def _rr_line(self, section):
- """Process one line from the text format answer, authority, or
- additional data sections.
- """
-
- deleting = None
- # Name
- token = self.tok.get(want_leading=True)
- if not token.is_whitespace():
- self.last_name = dns.name.from_text(token.value, None)
- name = self.last_name
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- # TTL
- try:
- ttl = int(token.value, 0)
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except dns.exception.SyntaxError:
- raise dns.exception.SyntaxError
- except Exception:
- ttl = 0
- # Class
- try:
- rdclass = dns.rdataclass.from_text(token.value)
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- if rdclass == dns.rdataclass.ANY or rdclass == dns.rdataclass.NONE:
- deleting = rdclass
- rdclass = self.zone_rdclass
- except dns.exception.SyntaxError:
- raise dns.exception.SyntaxError
- except Exception:
- rdclass = dns.rdataclass.IN
- # Type
- rdtype = dns.rdatatype.from_text(token.value)
- token = self.tok.get()
- if not token.is_eol_or_eof():
- self.tok.unget(token)
- rd = dns.rdata.from_text(rdclass, rdtype, self.tok, None)
- covers = rd.covers()
- else:
- rd = None
- covers = dns.rdatatype.NONE
- rrset = self.message.find_rrset(section, name,
- rdclass, rdtype, covers,
- deleting, True, self.updating)
- if rd is not None:
- rrset.add(rd, ttl)
-
- def read(self):
- """Read a text format DNS message and build a dns.message.Message
- object."""
-
- line_method = self._header_line
- section = None
- while 1:
- token = self.tok.get(True, True)
- if token.is_eol_or_eof():
- break
- if token.is_comment():
- u = token.value.upper()
- if u == 'HEADER':
- line_method = self._header_line
- elif u == 'QUESTION' or u == 'ZONE':
- line_method = self._question_line
- section = self.message.question
- elif u == 'ANSWER' or u == 'PREREQ':
- line_method = self._rr_line
- section = self.message.answer
- elif u == 'AUTHORITY' or u == 'UPDATE':
- line_method = self._rr_line
- section = self.message.authority
- elif u == 'ADDITIONAL':
- line_method = self._rr_line
- section = self.message.additional
- self.tok.get_eol()
- continue
- self.tok.unget(token)
- line_method(section)
-
-
-def from_text(text):
- """Convert the text format message into a message object.
-
- *text*, a ``text``, the text format message.
-
- Raises ``dns.message.UnknownHeaderField`` if a header is unknown.
-
- Raises ``dns.exception.SyntaxError`` if the text is badly formed.
-
- Returns a ``dns.message.Message object``
- """
-
- # 'text' can also be a file, but we don't publish that fact
- # since it's an implementation detail. The official file
- # interface is from_file().
-
- m = Message()
-
- reader = _TextReader(text, m)
- reader.read()
-
- return m
-
-
-def from_file(f):
- """Read the next text format message from the specified file.
-
- *f*, a ``file`` or ``text``. If *f* is text, it is treated as the
- pathname of a file to open.
-
- Raises ``dns.message.UnknownHeaderField`` if a header is unknown.
-
- Raises ``dns.exception.SyntaxError`` if the text is badly formed.
-
- Returns a ``dns.message.Message object``
- """
-
- str_type = string_types
- opts = 'rU'
-
- if isinstance(f, str_type):
- f = open(f, opts)
- want_close = True
- else:
- want_close = False
-
- try:
- m = from_text(f)
- finally:
- if want_close:
- f.close()
- return m
-
-
-def make_query(qname, rdtype, rdclass=dns.rdataclass.IN, use_edns=None,
- want_dnssec=False, ednsflags=None, payload=None,
- request_payload=None, options=None):
- """Make a query message.
-
- The query name, type, and class may all be specified either
- as objects of the appropriate type, or as strings.
-
- The query will have a randomly chosen query id, and its DNS flags
- will be set to dns.flags.RD.
-
- qname, a ``dns.name.Name`` or ``text``, the query name.
-
- *rdtype*, an ``int`` or ``text``, the desired rdata type.
-
- *rdclass*, an ``int`` or ``text``, the desired rdata class; the default
- is class IN.
-
- *use_edns*, an ``int``, ``bool`` or ``None``. The EDNS level to use; the
- default is None (no EDNS).
- See the description of dns.message.Message.use_edns() for the possible
- values for use_edns and their meanings.
-
- *want_dnssec*, a ``bool``. If ``True``, DNSSEC data is desired.
-
- *ednsflags*, an ``int``, the EDNS flag values.
-
- *payload*, an ``int``, is the EDNS sender's payload field, which is the
- maximum size of UDP datagram the sender can handle. I.e. how big
- a response to this message can be.
-
- *request_payload*, an ``int``, is the EDNS payload size to use when
- sending this message. If not specified, defaults to the value of
- *payload*.
-
- *options*, a list of ``dns.edns.Option`` objects or ``None``, the EDNS
- options.
-
- Returns a ``dns.message.Message``
- """
-
- if isinstance(qname, string_types):
- qname = dns.name.from_text(qname)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if isinstance(rdclass, string_types):
- rdclass = dns.rdataclass.from_text(rdclass)
- m = Message()
- m.flags |= dns.flags.RD
- m.find_rrset(m.question, qname, rdclass, rdtype, create=True,
- force_unique=True)
- # only pass keywords on to use_edns if they have been set to a
- # non-None value. Setting a field will turn EDNS on if it hasn't
- # been configured.
- kwargs = {}
- if ednsflags is not None:
- kwargs['ednsflags'] = ednsflags
- if use_edns is None:
- use_edns = 0
- if payload is not None:
- kwargs['payload'] = payload
- if use_edns is None:
- use_edns = 0
- if request_payload is not None:
- kwargs['request_payload'] = request_payload
- if use_edns is None:
- use_edns = 0
- if options is not None:
- kwargs['options'] = options
- if use_edns is None:
- use_edns = 0
- kwargs['edns'] = use_edns
- m.use_edns(**kwargs)
- m.want_dnssec(want_dnssec)
- return m
-
-
-def make_response(query, recursion_available=False, our_payload=8192,
- fudge=300):
- """Make a message which is a response for the specified query.
- The message returned is really a response skeleton; it has all
- of the infrastructure required of a response, but none of the
- content.
-
- The response's question section is a shallow copy of the query's
- question section, so the query's question RRsets should not be
- changed.
-
- *query*, a ``dns.message.Message``, the query to respond to.
-
- *recursion_available*, a ``bool``, should RA be set in the response?
-
- *our_payload*, an ``int``, the payload size to advertise in EDNS
- responses.
-
- *fudge*, an ``int``, the TSIG time fudge.
-
- Returns a ``dns.message.Message`` object.
- """
-
- if query.flags & dns.flags.QR:
- raise dns.exception.FormError('specified query message is not a query')
- response = dns.message.Message(query.id)
- response.flags = dns.flags.QR | (query.flags & dns.flags.RD)
- if recursion_available:
- response.flags |= dns.flags.RA
- response.set_opcode(query.opcode())
- response.question = list(query.question)
- if query.edns >= 0:
- response.use_edns(0, 0, our_payload, query.payload)
- if query.had_tsig:
- response.use_tsig(query.keyring, query.keyname, fudge, None, 0, b'',
- query.keyalgorithm)
- response.request_mac = query.mac
- return response
diff --git a/client/ayon_core/vendor/python/python_2/dns/name.py b/client/ayon_core/vendor/python/python_2/dns/name.py
deleted file mode 100644
index 0bcfd83432..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/name.py
+++ /dev/null
@@ -1,994 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Names.
-"""
-
-from io import BytesIO
-import struct
-import sys
-import copy
-import encodings.idna
-try:
- import idna
- have_idna_2008 = True
-except ImportError:
- have_idna_2008 = False
-
-import dns.exception
-import dns.wiredata
-
-from ._compat import long, binary_type, text_type, unichr, maybe_decode
-
-try:
- maxint = sys.maxint # pylint: disable=sys-max-int
-except AttributeError:
- maxint = (1 << (8 * struct.calcsize("P"))) // 2 - 1
-
-
-# fullcompare() result values
-
-#: The compared names have no relationship to each other.
-NAMERELN_NONE = 0
-#: the first name is a superdomain of the second.
-NAMERELN_SUPERDOMAIN = 1
-#: The first name is a subdomain of the second.
-NAMERELN_SUBDOMAIN = 2
-#: The compared names are equal.
-NAMERELN_EQUAL = 3
-#: The compared names have a common ancestor.
-NAMERELN_COMMONANCESTOR = 4
-
-
-class EmptyLabel(dns.exception.SyntaxError):
- """A DNS label is empty."""
-
-
-class BadEscape(dns.exception.SyntaxError):
- """An escaped code in a text format of DNS name is invalid."""
-
-
-class BadPointer(dns.exception.FormError):
- """A DNS compression pointer points forward instead of backward."""
-
-
-class BadLabelType(dns.exception.FormError):
- """The label type in DNS name wire format is unknown."""
-
-
-class NeedAbsoluteNameOrOrigin(dns.exception.DNSException):
- """An attempt was made to convert a non-absolute name to
- wire when there was also a non-absolute (or missing) origin."""
-
-
-class NameTooLong(dns.exception.FormError):
- """A DNS name is > 255 octets long."""
-
-
-class LabelTooLong(dns.exception.SyntaxError):
- """A DNS label is > 63 octets long."""
-
-
-class AbsoluteConcatenation(dns.exception.DNSException):
- """An attempt was made to append anything other than the
- empty name to an absolute DNS name."""
-
-
-class NoParent(dns.exception.DNSException):
- """An attempt was made to get the parent of the root name
- or the empty name."""
-
-class NoIDNA2008(dns.exception.DNSException):
- """IDNA 2008 processing was requested but the idna module is not
- available."""
-
-
-class IDNAException(dns.exception.DNSException):
- """IDNA processing raised an exception."""
-
- supp_kwargs = {'idna_exception'}
- fmt = "IDNA processing exception: {idna_exception}"
-
-
-class IDNACodec(object):
- """Abstract base class for IDNA encoder/decoders."""
-
- def __init__(self):
- pass
-
- def encode(self, label):
- raise NotImplementedError
-
- def decode(self, label):
- # We do not apply any IDNA policy on decode; we just
- downcased = label.lower()
- if downcased.startswith(b'xn--'):
- try:
- label = downcased[4:].decode('punycode')
- except Exception as e:
- raise IDNAException(idna_exception=e)
- else:
- label = maybe_decode(label)
- return _escapify(label, True)
-
-
-class IDNA2003Codec(IDNACodec):
- """IDNA 2003 encoder/decoder."""
-
- def __init__(self, strict_decode=False):
- """Initialize the IDNA 2003 encoder/decoder.
-
- *strict_decode* is a ``bool``. If `True`, then IDNA2003 checking
- is done when decoding. This can cause failures if the name
- was encoded with IDNA2008. The default is `False`.
- """
-
- super(IDNA2003Codec, self).__init__()
- self.strict_decode = strict_decode
-
- def encode(self, label):
- """Encode *label*."""
-
- if label == '':
- return b''
- try:
- return encodings.idna.ToASCII(label)
- except UnicodeError:
- raise LabelTooLong
-
- def decode(self, label):
- """Decode *label*."""
- if not self.strict_decode:
- return super(IDNA2003Codec, self).decode(label)
- if label == b'':
- return u''
- try:
- return _escapify(encodings.idna.ToUnicode(label), True)
- except Exception as e:
- raise IDNAException(idna_exception=e)
-
-
-class IDNA2008Codec(IDNACodec):
- """IDNA 2008 encoder/decoder.
-
- *uts_46* is a ``bool``. If True, apply Unicode IDNA
- compatibility processing as described in Unicode Technical
- Standard #46 (http://unicode.org/reports/tr46/).
- If False, do not apply the mapping. The default is False.
-
- *transitional* is a ``bool``: If True, use the
- "transitional" mode described in Unicode Technical Standard
- #46. The default is False.
-
- *allow_pure_ascii* is a ``bool``. If True, then a label which
- consists of only ASCII characters is allowed. This is less
- strict than regular IDNA 2008, but is also necessary for mixed
- names, e.g. a name with starting with "_sip._tcp." and ending
- in an IDN suffix which would otherwise be disallowed. The
- default is False.
-
- *strict_decode* is a ``bool``: If True, then IDNA2008 checking
- is done when decoding. This can cause failures if the name
- was encoded with IDNA2003. The default is False.
- """
-
- def __init__(self, uts_46=False, transitional=False,
- allow_pure_ascii=False, strict_decode=False):
- """Initialize the IDNA 2008 encoder/decoder."""
- super(IDNA2008Codec, self).__init__()
- self.uts_46 = uts_46
- self.transitional = transitional
- self.allow_pure_ascii = allow_pure_ascii
- self.strict_decode = strict_decode
-
- def is_all_ascii(self, label):
- for c in label:
- if ord(c) > 0x7f:
- return False
- return True
-
- def encode(self, label):
- if label == '':
- return b''
- if self.allow_pure_ascii and self.is_all_ascii(label):
- return label.encode('ascii')
- if not have_idna_2008:
- raise NoIDNA2008
- try:
- if self.uts_46:
- label = idna.uts46_remap(label, False, self.transitional)
- return idna.alabel(label)
- except idna.IDNAError as e:
- raise IDNAException(idna_exception=e)
-
- def decode(self, label):
- if not self.strict_decode:
- return super(IDNA2008Codec, self).decode(label)
- if label == b'':
- return u''
- if not have_idna_2008:
- raise NoIDNA2008
- try:
- if self.uts_46:
- label = idna.uts46_remap(label, False, False)
- return _escapify(idna.ulabel(label), True)
- except idna.IDNAError as e:
- raise IDNAException(idna_exception=e)
-
-_escaped = bytearray(b'"().;\\@$')
-
-IDNA_2003_Practical = IDNA2003Codec(False)
-IDNA_2003_Strict = IDNA2003Codec(True)
-IDNA_2003 = IDNA_2003_Practical
-IDNA_2008_Practical = IDNA2008Codec(True, False, True, False)
-IDNA_2008_UTS_46 = IDNA2008Codec(True, False, False, False)
-IDNA_2008_Strict = IDNA2008Codec(False, False, False, True)
-IDNA_2008_Transitional = IDNA2008Codec(True, True, False, False)
-IDNA_2008 = IDNA_2008_Practical
-
-def _escapify(label, unicode_mode=False):
- """Escape the characters in label which need it.
- @param unicode_mode: escapify only special and whitespace (<= 0x20)
- characters
- @returns: the escaped string
- @rtype: string"""
- if not unicode_mode:
- text = ''
- if isinstance(label, text_type):
- label = label.encode()
- for c in bytearray(label):
- if c in _escaped:
- text += '\\' + chr(c)
- elif c > 0x20 and c < 0x7F:
- text += chr(c)
- else:
- text += '\\%03d' % c
- return text.encode()
-
- text = u''
- if isinstance(label, binary_type):
- label = label.decode()
- for c in label:
- if c > u'\x20' and c < u'\x7f':
- text += c
- else:
- if c >= u'\x7f':
- text += c
- else:
- text += u'\\%03d' % ord(c)
- return text
-
-def _validate_labels(labels):
- """Check for empty labels in the middle of a label sequence,
- labels that are too long, and for too many labels.
-
- Raises ``dns.name.NameTooLong`` if the name as a whole is too long.
-
- Raises ``dns.name.EmptyLabel`` if a label is empty (i.e. the root
- label) and appears in a position other than the end of the label
- sequence
-
- """
-
- l = len(labels)
- total = 0
- i = -1
- j = 0
- for label in labels:
- ll = len(label)
- total += ll + 1
- if ll > 63:
- raise LabelTooLong
- if i < 0 and label == b'':
- i = j
- j += 1
- if total > 255:
- raise NameTooLong
- if i >= 0 and i != l - 1:
- raise EmptyLabel
-
-
-def _maybe_convert_to_binary(label):
- """If label is ``text``, convert it to ``binary``. If it is already
- ``binary`` just return it.
-
- """
-
- if isinstance(label, binary_type):
- return label
- if isinstance(label, text_type):
- return label.encode()
- raise ValueError
-
-
-class Name(object):
-
- """A DNS name.
-
- The dns.name.Name class represents a DNS name as a tuple of
- labels. Each label is a `binary` in DNS wire format. Instances
- of the class are immutable.
- """
-
- __slots__ = ['labels']
-
- def __init__(self, labels):
- """*labels* is any iterable whose values are ``text`` or ``binary``.
- """
-
- labels = [_maybe_convert_to_binary(x) for x in labels]
- super(Name, self).__setattr__('labels', tuple(labels))
- _validate_labels(self.labels)
-
- def __setattr__(self, name, value):
- # Names are immutable
- raise TypeError("object doesn't support attribute assignment")
-
- def __copy__(self):
- return Name(self.labels)
-
- def __deepcopy__(self, memo):
- return Name(copy.deepcopy(self.labels, memo))
-
- def __getstate__(self):
- # Names can be pickled
- return {'labels': self.labels}
-
- def __setstate__(self, state):
- super(Name, self).__setattr__('labels', state['labels'])
- _validate_labels(self.labels)
-
- def is_absolute(self):
- """Is the most significant label of this name the root label?
-
- Returns a ``bool``.
- """
-
- return len(self.labels) > 0 and self.labels[-1] == b''
-
- def is_wild(self):
- """Is this name wild? (I.e. Is the least significant label '*'?)
-
- Returns a ``bool``.
- """
-
- return len(self.labels) > 0 and self.labels[0] == b'*'
-
- def __hash__(self):
- """Return a case-insensitive hash of the name.
-
- Returns an ``int``.
- """
-
- h = long(0)
- for label in self.labels:
- for c in bytearray(label.lower()):
- h += (h << 3) + c
- return int(h % maxint)
-
- def fullcompare(self, other):
- """Compare two names, returning a 3-tuple
- ``(relation, order, nlabels)``.
-
- *relation* describes the relation ship between the names,
- and is one of: ``dns.name.NAMERELN_NONE``,
- ``dns.name.NAMERELN_SUPERDOMAIN``, ``dns.name.NAMERELN_SUBDOMAIN``,
- ``dns.name.NAMERELN_EQUAL``, or ``dns.name.NAMERELN_COMMONANCESTOR``.
-
- *order* is < 0 if *self* < *other*, > 0 if *self* > *other*, and ==
- 0 if *self* == *other*. A relative name is always less than an
- absolute name. If both names have the same relativity, then
- the DNSSEC order relation is used to order them.
-
- *nlabels* is the number of significant labels that the two names
- have in common.
-
- Here are some examples. Names ending in "." are absolute names,
- those not ending in "." are relative names.
-
- ============= ============= =========== ===== =======
- self other relation order nlabels
- ============= ============= =========== ===== =======
- www.example. www.example. equal 0 3
- www.example. example. subdomain > 0 2
- example. www.example. superdomain < 0 2
- example1.com. example2.com. common anc. < 0 2
- example1 example2. none < 0 0
- example1. example2 none > 0 0
- ============= ============= =========== ===== =======
- """
-
- sabs = self.is_absolute()
- oabs = other.is_absolute()
- if sabs != oabs:
- if sabs:
- return (NAMERELN_NONE, 1, 0)
- else:
- return (NAMERELN_NONE, -1, 0)
- l1 = len(self.labels)
- l2 = len(other.labels)
- ldiff = l1 - l2
- if ldiff < 0:
- l = l1
- else:
- l = l2
-
- order = 0
- nlabels = 0
- namereln = NAMERELN_NONE
- while l > 0:
- l -= 1
- l1 -= 1
- l2 -= 1
- label1 = self.labels[l1].lower()
- label2 = other.labels[l2].lower()
- if label1 < label2:
- order = -1
- if nlabels > 0:
- namereln = NAMERELN_COMMONANCESTOR
- return (namereln, order, nlabels)
- elif label1 > label2:
- order = 1
- if nlabels > 0:
- namereln = NAMERELN_COMMONANCESTOR
- return (namereln, order, nlabels)
- nlabels += 1
- order = ldiff
- if ldiff < 0:
- namereln = NAMERELN_SUPERDOMAIN
- elif ldiff > 0:
- namereln = NAMERELN_SUBDOMAIN
- else:
- namereln = NAMERELN_EQUAL
- return (namereln, order, nlabels)
-
- def is_subdomain(self, other):
- """Is self a subdomain of other?
-
- Note that the notion of subdomain includes equality, e.g.
- "dnpython.org" is a subdomain of itself.
-
- Returns a ``bool``.
- """
-
- (nr, o, nl) = self.fullcompare(other)
- if nr == NAMERELN_SUBDOMAIN or nr == NAMERELN_EQUAL:
- return True
- return False
-
- def is_superdomain(self, other):
- """Is self a superdomain of other?
-
- Note that the notion of superdomain includes equality, e.g.
- "dnpython.org" is a superdomain of itself.
-
- Returns a ``bool``.
- """
-
- (nr, o, nl) = self.fullcompare(other)
- if nr == NAMERELN_SUPERDOMAIN or nr == NAMERELN_EQUAL:
- return True
- return False
-
- def canonicalize(self):
- """Return a name which is equal to the current name, but is in
- DNSSEC canonical form.
- """
-
- return Name([x.lower() for x in self.labels])
-
- def __eq__(self, other):
- if isinstance(other, Name):
- return self.fullcompare(other)[1] == 0
- else:
- return False
-
- def __ne__(self, other):
- if isinstance(other, Name):
- return self.fullcompare(other)[1] != 0
- else:
- return True
-
- def __lt__(self, other):
- if isinstance(other, Name):
- return self.fullcompare(other)[1] < 0
- else:
- return NotImplemented
-
- def __le__(self, other):
- if isinstance(other, Name):
- return self.fullcompare(other)[1] <= 0
- else:
- return NotImplemented
-
- def __ge__(self, other):
- if isinstance(other, Name):
- return self.fullcompare(other)[1] >= 0
- else:
- return NotImplemented
-
- def __gt__(self, other):
- if isinstance(other, Name):
- return self.fullcompare(other)[1] > 0
- else:
- return NotImplemented
-
- def __repr__(self):
- return ''
-
- def __str__(self):
- return self.to_text(False)
-
- def to_text(self, omit_final_dot=False):
- """Convert name to DNS text format.
-
- *omit_final_dot* is a ``bool``. If True, don't emit the final
- dot (denoting the root label) for absolute names. The default
- is False.
-
- Returns a ``text``.
- """
-
- if len(self.labels) == 0:
- return maybe_decode(b'@')
- if len(self.labels) == 1 and self.labels[0] == b'':
- return maybe_decode(b'.')
- if omit_final_dot and self.is_absolute():
- l = self.labels[:-1]
- else:
- l = self.labels
- s = b'.'.join(map(_escapify, l))
- return maybe_decode(s)
-
- def to_unicode(self, omit_final_dot=False, idna_codec=None):
- """Convert name to Unicode text format.
-
- IDN ACE labels are converted to Unicode.
-
- *omit_final_dot* is a ``bool``. If True, don't emit the final
- dot (denoting the root label) for absolute names. The default
- is False.
- *idna_codec* specifies the IDNA encoder/decoder. If None, the
- dns.name.IDNA_2003_Practical encoder/decoder is used.
- The IDNA_2003_Practical decoder does
- not impose any policy, it just decodes punycode, so if you
- don't want checking for compliance, you can use this decoder
- for IDNA2008 as well.
-
- Returns a ``text``.
- """
-
- if len(self.labels) == 0:
- return u'@'
- if len(self.labels) == 1 and self.labels[0] == b'':
- return u'.'
- if omit_final_dot and self.is_absolute():
- l = self.labels[:-1]
- else:
- l = self.labels
- if idna_codec is None:
- idna_codec = IDNA_2003_Practical
- return u'.'.join([idna_codec.decode(x) for x in l])
-
- def to_digestable(self, origin=None):
- """Convert name to a format suitable for digesting in hashes.
-
- The name is canonicalized and converted to uncompressed wire
- format. All names in wire format are absolute. If the name
- is a relative name, then an origin must be supplied.
-
- *origin* is a ``dns.name.Name`` or ``None``. If the name is
- relative and origin is not ``None``, then origin will be appended
- to the name.
-
- Raises ``dns.name.NeedAbsoluteNameOrOrigin`` if the name is
- relative and no origin was provided.
-
- Returns a ``binary``.
- """
-
- if not self.is_absolute():
- if origin is None or not origin.is_absolute():
- raise NeedAbsoluteNameOrOrigin
- labels = list(self.labels)
- labels.extend(list(origin.labels))
- else:
- labels = self.labels
- dlabels = [struct.pack('!B%ds' % len(x), len(x), x.lower())
- for x in labels]
- return b''.join(dlabels)
-
- def to_wire(self, file=None, compress=None, origin=None):
- """Convert name to wire format, possibly compressing it.
-
- *file* is the file where the name is emitted (typically a
- BytesIO file). If ``None`` (the default), a ``binary``
- containing the wire name will be returned.
-
- *compress*, a ``dict``, is the compression table to use. If
- ``None`` (the default), names will not be compressed.
-
- *origin* is a ``dns.name.Name`` or ``None``. If the name is
- relative and origin is not ``None``, then *origin* will be appended
- to it.
-
- Raises ``dns.name.NeedAbsoluteNameOrOrigin`` if the name is
- relative and no origin was provided.
-
- Returns a ``binary`` or ``None``.
- """
-
- if file is None:
- file = BytesIO()
- want_return = True
- else:
- want_return = False
-
- if not self.is_absolute():
- if origin is None or not origin.is_absolute():
- raise NeedAbsoluteNameOrOrigin
- labels = list(self.labels)
- labels.extend(list(origin.labels))
- else:
- labels = self.labels
- i = 0
- for label in labels:
- n = Name(labels[i:])
- i += 1
- if compress is not None:
- pos = compress.get(n)
- else:
- pos = None
- if pos is not None:
- value = 0xc000 + pos
- s = struct.pack('!H', value)
- file.write(s)
- break
- else:
- if compress is not None and len(n) > 1:
- pos = file.tell()
- if pos <= 0x3fff:
- compress[n] = pos
- l = len(label)
- file.write(struct.pack('!B', l))
- if l > 0:
- file.write(label)
- if want_return:
- return file.getvalue()
-
- def __len__(self):
- """The length of the name (in labels).
-
- Returns an ``int``.
- """
-
- return len(self.labels)
-
- def __getitem__(self, index):
- return self.labels[index]
-
- def __add__(self, other):
- return self.concatenate(other)
-
- def __sub__(self, other):
- return self.relativize(other)
-
- def split(self, depth):
- """Split a name into a prefix and suffix names at the specified depth.
-
- *depth* is an ``int`` specifying the number of labels in the suffix
-
- Raises ``ValueError`` if *depth* was not >= 0 and <= the length of the
- name.
-
- Returns the tuple ``(prefix, suffix)``.
- """
-
- l = len(self.labels)
- if depth == 0:
- return (self, dns.name.empty)
- elif depth == l:
- return (dns.name.empty, self)
- elif depth < 0 or depth > l:
- raise ValueError(
- 'depth must be >= 0 and <= the length of the name')
- return (Name(self[: -depth]), Name(self[-depth:]))
-
- def concatenate(self, other):
- """Return a new name which is the concatenation of self and other.
-
- Raises ``dns.name.AbsoluteConcatenation`` if the name is
- absolute and *other* is not the empty name.
-
- Returns a ``dns.name.Name``.
- """
-
- if self.is_absolute() and len(other) > 0:
- raise AbsoluteConcatenation
- labels = list(self.labels)
- labels.extend(list(other.labels))
- return Name(labels)
-
- def relativize(self, origin):
- """If the name is a subdomain of *origin*, return a new name which is
- the name relative to origin. Otherwise return the name.
-
- For example, relativizing ``www.dnspython.org.`` to origin
- ``dnspython.org.`` returns the name ``www``. Relativizing ``example.``
- to origin ``dnspython.org.`` returns ``example.``.
-
- Returns a ``dns.name.Name``.
- """
-
- if origin is not None and self.is_subdomain(origin):
- return Name(self[: -len(origin)])
- else:
- return self
-
- def derelativize(self, origin):
- """If the name is a relative name, return a new name which is the
- concatenation of the name and origin. Otherwise return the name.
-
- For example, derelativizing ``www`` to origin ``dnspython.org.``
- returns the name ``www.dnspython.org.``. Derelativizing ``example.``
- to origin ``dnspython.org.`` returns ``example.``.
-
- Returns a ``dns.name.Name``.
- """
-
- if not self.is_absolute():
- return self.concatenate(origin)
- else:
- return self
-
- def choose_relativity(self, origin=None, relativize=True):
- """Return a name with the relativity desired by the caller.
-
- If *origin* is ``None``, then the name is returned.
- Otherwise, if *relativize* is ``True`` the name is
- relativized, and if *relativize* is ``False`` the name is
- derelativized.
-
- Returns a ``dns.name.Name``.
- """
-
- if origin:
- if relativize:
- return self.relativize(origin)
- else:
- return self.derelativize(origin)
- else:
- return self
-
- def parent(self):
- """Return the parent of the name.
-
- For example, the parent of ``www.dnspython.org.`` is ``dnspython.org``.
-
- Raises ``dns.name.NoParent`` if the name is either the root name or the
- empty name, and thus has no parent.
-
- Returns a ``dns.name.Name``.
- """
-
- if self == root or self == empty:
- raise NoParent
- return Name(self.labels[1:])
-
-#: The root name, '.'
-root = Name([b''])
-
-#: The empty name.
-empty = Name([])
-
-def from_unicode(text, origin=root, idna_codec=None):
- """Convert unicode text into a Name object.
-
- Labels are encoded in IDN ACE form according to rules specified by
- the IDNA codec.
-
- *text*, a ``text``, is the text to convert into a name.
-
- *origin*, a ``dns.name.Name``, specifies the origin to
- append to non-absolute names. The default is the root name.
-
- *idna_codec*, a ``dns.name.IDNACodec``, specifies the IDNA
- encoder/decoder. If ``None``, the default IDNA 2003 encoder/decoder
- is used.
-
- Returns a ``dns.name.Name``.
- """
-
- if not isinstance(text, text_type):
- raise ValueError("input to from_unicode() must be a unicode string")
- if not (origin is None or isinstance(origin, Name)):
- raise ValueError("origin must be a Name or None")
- labels = []
- label = u''
- escaping = False
- edigits = 0
- total = 0
- if idna_codec is None:
- idna_codec = IDNA_2003
- if text == u'@':
- text = u''
- if text:
- if text == u'.':
- return Name([b'']) # no Unicode "u" on this constant!
- for c in text:
- if escaping:
- if edigits == 0:
- if c.isdigit():
- total = int(c)
- edigits += 1
- else:
- label += c
- escaping = False
- else:
- if not c.isdigit():
- raise BadEscape
- total *= 10
- total += int(c)
- edigits += 1
- if edigits == 3:
- escaping = False
- label += unichr(total)
- elif c in [u'.', u'\u3002', u'\uff0e', u'\uff61']:
- if len(label) == 0:
- raise EmptyLabel
- labels.append(idna_codec.encode(label))
- label = u''
- elif c == u'\\':
- escaping = True
- edigits = 0
- total = 0
- else:
- label += c
- if escaping:
- raise BadEscape
- if len(label) > 0:
- labels.append(idna_codec.encode(label))
- else:
- labels.append(b'')
-
- if (len(labels) == 0 or labels[-1] != b'') and origin is not None:
- labels.extend(list(origin.labels))
- return Name(labels)
-
-
-def from_text(text, origin=root, idna_codec=None):
- """Convert text into a Name object.
-
- *text*, a ``text``, is the text to convert into a name.
-
- *origin*, a ``dns.name.Name``, specifies the origin to
- append to non-absolute names. The default is the root name.
-
- *idna_codec*, a ``dns.name.IDNACodec``, specifies the IDNA
- encoder/decoder. If ``None``, the default IDNA 2003 encoder/decoder
- is used.
-
- Returns a ``dns.name.Name``.
- """
-
- if isinstance(text, text_type):
- return from_unicode(text, origin, idna_codec)
- if not isinstance(text, binary_type):
- raise ValueError("input to from_text() must be a string")
- if not (origin is None or isinstance(origin, Name)):
- raise ValueError("origin must be a Name or None")
- labels = []
- label = b''
- escaping = False
- edigits = 0
- total = 0
- if text == b'@':
- text = b''
- if text:
- if text == b'.':
- return Name([b''])
- for c in bytearray(text):
- byte_ = struct.pack('!B', c)
- if escaping:
- if edigits == 0:
- if byte_.isdigit():
- total = int(byte_)
- edigits += 1
- else:
- label += byte_
- escaping = False
- else:
- if not byte_.isdigit():
- raise BadEscape
- total *= 10
- total += int(byte_)
- edigits += 1
- if edigits == 3:
- escaping = False
- label += struct.pack('!B', total)
- elif byte_ == b'.':
- if len(label) == 0:
- raise EmptyLabel
- labels.append(label)
- label = b''
- elif byte_ == b'\\':
- escaping = True
- edigits = 0
- total = 0
- else:
- label += byte_
- if escaping:
- raise BadEscape
- if len(label) > 0:
- labels.append(label)
- else:
- labels.append(b'')
- if (len(labels) == 0 or labels[-1] != b'') and origin is not None:
- labels.extend(list(origin.labels))
- return Name(labels)
-
-
-def from_wire(message, current):
- """Convert possibly compressed wire format into a Name.
-
- *message* is a ``binary`` containing an entire DNS message in DNS
- wire form.
-
- *current*, an ``int``, is the offset of the beginning of the name
- from the start of the message
-
- Raises ``dns.name.BadPointer`` if a compression pointer did not
- point backwards in the message.
-
- Raises ``dns.name.BadLabelType`` if an invalid label type was encountered.
-
- Returns a ``(dns.name.Name, int)`` tuple consisting of the name
- that was read and the number of bytes of the wire format message
- which were consumed reading it.
- """
-
- if not isinstance(message, binary_type):
- raise ValueError("input to from_wire() must be a byte string")
- message = dns.wiredata.maybe_wrap(message)
- labels = []
- biggest_pointer = current
- hops = 0
- count = message[current]
- current += 1
- cused = 1
- while count != 0:
- if count < 64:
- labels.append(message[current: current + count].unwrap())
- current += count
- if hops == 0:
- cused += count
- elif count >= 192:
- current = (count & 0x3f) * 256 + message[current]
- if hops == 0:
- cused += 1
- if current >= biggest_pointer:
- raise BadPointer
- biggest_pointer = current
- hops += 1
- else:
- raise BadLabelType
- count = message[current]
- current += 1
- if hops == 0:
- cused += 1
- labels.append('')
- return (Name(labels), cused)
diff --git a/client/ayon_core/vendor/python/python_2/dns/namedict.py b/client/ayon_core/vendor/python/python_2/dns/namedict.py
deleted file mode 100644
index 37a13104e6..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/namedict.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-# Copyright (C) 2016 Coresec Systems AB
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND CORESEC SYSTEMS AB DISCLAIMS ALL
-# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CORESEC
-# SYSTEMS AB BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
-# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
-# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS name dictionary"""
-
-import collections
-import dns.name
-from ._compat import xrange
-
-
-class NameDict(collections.MutableMapping):
- """A dictionary whose keys are dns.name.Name objects.
-
- In addition to being like a regular Python dictionary, this
- dictionary can also get the deepest match for a given key.
- """
-
- __slots__ = ["max_depth", "max_depth_items", "__store"]
-
- def __init__(self, *args, **kwargs):
- super(NameDict, self).__init__()
- self.__store = dict()
- #: the maximum depth of the keys that have ever been added
- self.max_depth = 0
- #: the number of items of maximum depth
- self.max_depth_items = 0
- self.update(dict(*args, **kwargs))
-
- def __update_max_depth(self, key):
- if len(key) == self.max_depth:
- self.max_depth_items = self.max_depth_items + 1
- elif len(key) > self.max_depth:
- self.max_depth = len(key)
- self.max_depth_items = 1
-
- def __getitem__(self, key):
- return self.__store[key]
-
- def __setitem__(self, key, value):
- if not isinstance(key, dns.name.Name):
- raise ValueError('NameDict key must be a name')
- self.__store[key] = value
- self.__update_max_depth(key)
-
- def __delitem__(self, key):
- value = self.__store.pop(key)
- if len(value) == self.max_depth:
- self.max_depth_items = self.max_depth_items - 1
- if self.max_depth_items == 0:
- self.max_depth = 0
- for k in self.__store:
- self.__update_max_depth(k)
-
- def __iter__(self):
- return iter(self.__store)
-
- def __len__(self):
- return len(self.__store)
-
- def has_key(self, key):
- return key in self.__store
-
- def get_deepest_match(self, name):
- """Find the deepest match to *fname* in the dictionary.
-
- The deepest match is the longest name in the dictionary which is
- a superdomain of *name*. Note that *superdomain* includes matching
- *name* itself.
-
- *name*, a ``dns.name.Name``, the name to find.
-
- Returns a ``(key, value)`` where *key* is the deepest
- ``dns.name.Name``, and *value* is the value associated with *key*.
- """
-
- depth = len(name)
- if depth > self.max_depth:
- depth = self.max_depth
- for i in xrange(-depth, 0):
- n = dns.name.Name(name[i:])
- if n in self:
- return (n, self[n])
- v = self[dns.name.empty]
- return (dns.name.empty, v)
diff --git a/client/ayon_core/vendor/python/python_2/dns/node.py b/client/ayon_core/vendor/python/python_2/dns/node.py
deleted file mode 100644
index 8a7f19f523..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/node.py
+++ /dev/null
@@ -1,182 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS nodes. A node is a set of rdatasets."""
-
-from io import StringIO
-
-import dns.rdataset
-import dns.rdatatype
-import dns.renderer
-
-
-class Node(object):
-
- """A Node is a set of rdatasets."""
-
- __slots__ = ['rdatasets']
-
- def __init__(self):
- #: the set of rdatsets, represented as a list.
- self.rdatasets = []
-
- def to_text(self, name, **kw):
- """Convert a node to text format.
-
- Each rdataset at the node is printed. Any keyword arguments
- to this method are passed on to the rdataset's to_text() method.
-
- *name*, a ``dns.name.Name`` or ``text``, the owner name of the rdatasets.
-
- Returns a ``text``.
- """
-
- s = StringIO()
- for rds in self.rdatasets:
- if len(rds) > 0:
- s.write(rds.to_text(name, **kw))
- s.write(u'\n')
- return s.getvalue()[:-1]
-
- def __repr__(self):
- return ''
-
- def __eq__(self, other):
- #
- # This is inefficient. Good thing we don't need to do it much.
- #
- for rd in self.rdatasets:
- if rd not in other.rdatasets:
- return False
- for rd in other.rdatasets:
- if rd not in self.rdatasets:
- return False
- return True
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- def __len__(self):
- return len(self.rdatasets)
-
- def __iter__(self):
- return iter(self.rdatasets)
-
- def find_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE,
- create=False):
- """Find an rdataset matching the specified properties in the
- current node.
-
- *rdclass*, an ``int``, the class of the rdataset.
-
- *rdtype*, an ``int``, the type of the rdataset.
-
- *covers*, an ``int``, the covered type. Usually this value is
- dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or
- dns.rdatatype.RRSIG, then the covers value will be the rdata
- type the SIG/RRSIG covers. The library treats the SIG and RRSIG
- types as if they were a family of
- types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much
- easier to work with than if RRSIGs covering different rdata
- types were aggregated into a single RRSIG rdataset.
-
- *create*, a ``bool``. If True, create the rdataset if it is not found.
-
- Raises ``KeyError`` if an rdataset of the desired type and class does
- not exist and *create* is not ``True``.
-
- Returns a ``dns.rdataset.Rdataset``.
- """
-
- for rds in self.rdatasets:
- if rds.match(rdclass, rdtype, covers):
- return rds
- if not create:
- raise KeyError
- rds = dns.rdataset.Rdataset(rdclass, rdtype)
- self.rdatasets.append(rds)
- return rds
-
- def get_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE,
- create=False):
- """Get an rdataset matching the specified properties in the
- current node.
-
- None is returned if an rdataset of the specified type and
- class does not exist and *create* is not ``True``.
-
- *rdclass*, an ``int``, the class of the rdataset.
-
- *rdtype*, an ``int``, the type of the rdataset.
-
- *covers*, an ``int``, the covered type. Usually this value is
- dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or
- dns.rdatatype.RRSIG, then the covers value will be the rdata
- type the SIG/RRSIG covers. The library treats the SIG and RRSIG
- types as if they were a family of
- types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much
- easier to work with than if RRSIGs covering different rdata
- types were aggregated into a single RRSIG rdataset.
-
- *create*, a ``bool``. If True, create the rdataset if it is not found.
-
- Returns a ``dns.rdataset.Rdataset`` or ``None``.
- """
-
- try:
- rds = self.find_rdataset(rdclass, rdtype, covers, create)
- except KeyError:
- rds = None
- return rds
-
- def delete_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE):
- """Delete the rdataset matching the specified properties in the
- current node.
-
- If a matching rdataset does not exist, it is not an error.
-
- *rdclass*, an ``int``, the class of the rdataset.
-
- *rdtype*, an ``int``, the type of the rdataset.
-
- *covers*, an ``int``, the covered type.
- """
-
- rds = self.get_rdataset(rdclass, rdtype, covers)
- if rds is not None:
- self.rdatasets.remove(rds)
-
- def replace_rdataset(self, replacement):
- """Replace an rdataset.
-
- It is not an error if there is no rdataset matching *replacement*.
-
- Ownership of the *replacement* object is transferred to the node;
- in other words, this method does not store a copy of *replacement*
- at the node, it stores *replacement* itself.
-
- *replacement*, a ``dns.rdataset.Rdataset``.
-
- Raises ``ValueError`` if *replacement* is not a
- ``dns.rdataset.Rdataset``.
- """
-
- if not isinstance(replacement, dns.rdataset.Rdataset):
- raise ValueError('replacement is not an rdataset')
- self.delete_rdataset(replacement.rdclass, replacement.rdtype,
- replacement.covers)
- self.rdatasets.append(replacement)
diff --git a/client/ayon_core/vendor/python/python_2/dns/opcode.py b/client/ayon_core/vendor/python/python_2/dns/opcode.py
deleted file mode 100644
index c0735ba47b..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/opcode.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Opcodes."""
-
-import dns.exception
-
-#: Query
-QUERY = 0
-#: Inverse Query (historical)
-IQUERY = 1
-#: Server Status (unspecified and unimplemented anywhere)
-STATUS = 2
-#: Notify
-NOTIFY = 4
-#: Dynamic Update
-UPDATE = 5
-
-_by_text = {
- 'QUERY': QUERY,
- 'IQUERY': IQUERY,
- 'STATUS': STATUS,
- 'NOTIFY': NOTIFY,
- 'UPDATE': UPDATE
-}
-
-# We construct the inverse mapping programmatically to ensure that we
-# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
-# would cause the mapping not to be true inverse.
-
-_by_value = {y: x for x, y in _by_text.items()}
-
-
-class UnknownOpcode(dns.exception.DNSException):
- """An DNS opcode is unknown."""
-
-
-def from_text(text):
- """Convert text into an opcode.
-
- *text*, a ``text``, the textual opcode
-
- Raises ``dns.opcode.UnknownOpcode`` if the opcode is unknown.
-
- Returns an ``int``.
- """
-
- if text.isdigit():
- value = int(text)
- if value >= 0 and value <= 15:
- return value
- value = _by_text.get(text.upper())
- if value is None:
- raise UnknownOpcode
- return value
-
-
-def from_flags(flags):
- """Extract an opcode from DNS message flags.
-
- *flags*, an ``int``, the DNS flags.
-
- Returns an ``int``.
- """
-
- return (flags & 0x7800) >> 11
-
-
-def to_flags(value):
- """Convert an opcode to a value suitable for ORing into DNS message
- flags.
-
- *value*, an ``int``, the DNS opcode value.
-
- Returns an ``int``.
- """
-
- return (value << 11) & 0x7800
-
-
-def to_text(value):
- """Convert an opcode to text.
-
- *value*, an ``int`` the opcode value,
-
- Raises ``dns.opcode.UnknownOpcode`` if the opcode is unknown.
-
- Returns a ``text``.
- """
-
- text = _by_value.get(value)
- if text is None:
- text = str(value)
- return text
-
-
-def is_update(flags):
- """Is the opcode in flags UPDATE?
-
- *flags*, an ``int``, the DNS message flags.
-
- Returns a ``bool``.
- """
-
- return from_flags(flags) == UPDATE
diff --git a/client/ayon_core/vendor/python/python_2/dns/py.typed b/client/ayon_core/vendor/python/python_2/dns/py.typed
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/client/ayon_core/vendor/python/python_2/dns/query.py b/client/ayon_core/vendor/python/python_2/dns/query.py
deleted file mode 100644
index c0c517ccd4..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/query.py
+++ /dev/null
@@ -1,683 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Talk to a DNS server."""
-
-from __future__ import generators
-
-import errno
-import select
-import socket
-import struct
-import sys
-import time
-
-import dns.exception
-import dns.inet
-import dns.name
-import dns.message
-import dns.rcode
-import dns.rdataclass
-import dns.rdatatype
-from ._compat import long, string_types, PY3
-
-if PY3:
- select_error = OSError
-else:
- select_error = select.error
-
-# Function used to create a socket. Can be overridden if needed in special
-# situations.
-socket_factory = socket.socket
-
-class UnexpectedSource(dns.exception.DNSException):
- """A DNS query response came from an unexpected address or port."""
-
-
-class BadResponse(dns.exception.FormError):
- """A DNS query response does not respond to the question asked."""
-
-
-class TransferError(dns.exception.DNSException):
- """A zone transfer response got a non-zero rcode."""
-
- def __init__(self, rcode):
- message = 'Zone transfer error: %s' % dns.rcode.to_text(rcode)
- super(TransferError, self).__init__(message)
- self.rcode = rcode
-
-
-def _compute_expiration(timeout):
- if timeout is None:
- return None
- else:
- return time.time() + timeout
-
-# This module can use either poll() or select() as the "polling backend".
-#
-# A backend function takes an fd, bools for readability, writablity, and
-# error detection, and a timeout.
-
-def _poll_for(fd, readable, writable, error, timeout):
- """Poll polling backend."""
-
- event_mask = 0
- if readable:
- event_mask |= select.POLLIN
- if writable:
- event_mask |= select.POLLOUT
- if error:
- event_mask |= select.POLLERR
-
- pollable = select.poll()
- pollable.register(fd, event_mask)
-
- if timeout:
- event_list = pollable.poll(long(timeout * 1000))
- else:
- event_list = pollable.poll()
-
- return bool(event_list)
-
-
-def _select_for(fd, readable, writable, error, timeout):
- """Select polling backend."""
-
- rset, wset, xset = [], [], []
-
- if readable:
- rset = [fd]
- if writable:
- wset = [fd]
- if error:
- xset = [fd]
-
- if timeout is None:
- (rcount, wcount, xcount) = select.select(rset, wset, xset)
- else:
- (rcount, wcount, xcount) = select.select(rset, wset, xset, timeout)
-
- return bool((rcount or wcount or xcount))
-
-
-def _wait_for(fd, readable, writable, error, expiration):
- # Use the selected polling backend to wait for any of the specified
- # events. An "expiration" absolute time is converted into a relative
- # timeout.
-
- done = False
- while not done:
- if expiration is None:
- timeout = None
- else:
- timeout = expiration - time.time()
- if timeout <= 0.0:
- raise dns.exception.Timeout
- try:
- if not _polling_backend(fd, readable, writable, error, timeout):
- raise dns.exception.Timeout
- except select_error as e:
- if e.args[0] != errno.EINTR:
- raise e
- done = True
-
-
-def _set_polling_backend(fn):
- # Internal API. Do not use.
-
- global _polling_backend
-
- _polling_backend = fn
-
-if hasattr(select, 'poll'):
- # Prefer poll() on platforms that support it because it has no
- # limits on the maximum value of a file descriptor (plus it will
- # be more efficient for high values).
- _polling_backend = _poll_for
-else:
- _polling_backend = _select_for
-
-
-def _wait_for_readable(s, expiration):
- _wait_for(s, True, False, True, expiration)
-
-
-def _wait_for_writable(s, expiration):
- _wait_for(s, False, True, True, expiration)
-
-
-def _addresses_equal(af, a1, a2):
- # Convert the first value of the tuple, which is a textual format
- # address into binary form, so that we are not confused by different
- # textual representations of the same address
- try:
- n1 = dns.inet.inet_pton(af, a1[0])
- n2 = dns.inet.inet_pton(af, a2[0])
- except dns.exception.SyntaxError:
- return False
- return n1 == n2 and a1[1:] == a2[1:]
-
-
-def _destination_and_source(af, where, port, source, source_port):
- # Apply defaults and compute destination and source tuples
- # suitable for use in connect(), sendto(), or bind().
- if af is None:
- try:
- af = dns.inet.af_for_address(where)
- except Exception:
- af = dns.inet.AF_INET
- if af == dns.inet.AF_INET:
- destination = (where, port)
- if source is not None or source_port != 0:
- if source is None:
- source = '0.0.0.0'
- source = (source, source_port)
- elif af == dns.inet.AF_INET6:
- destination = (where, port, 0, 0)
- if source is not None or source_port != 0:
- if source is None:
- source = '::'
- source = (source, source_port, 0, 0)
- return (af, destination, source)
-
-
-def send_udp(sock, what, destination, expiration=None):
- """Send a DNS message to the specified UDP socket.
-
- *sock*, a ``socket``.
-
- *what*, a ``binary`` or ``dns.message.Message``, the message to send.
-
- *destination*, a destination tuple appropriate for the address family
- of the socket, specifying where to send the query.
-
- *expiration*, a ``float`` or ``None``, the absolute time at which
- a timeout exception should be raised. If ``None``, no timeout will
- occur.
-
- Returns an ``(int, float)`` tuple of bytes sent and the sent time.
- """
-
- if isinstance(what, dns.message.Message):
- what = what.to_wire()
- _wait_for_writable(sock, expiration)
- sent_time = time.time()
- n = sock.sendto(what, destination)
- return (n, sent_time)
-
-
-def receive_udp(sock, destination, expiration=None,
- ignore_unexpected=False, one_rr_per_rrset=False,
- keyring=None, request_mac=b'', ignore_trailing=False):
- """Read a DNS message from a UDP socket.
-
- *sock*, a ``socket``.
-
- *destination*, a destination tuple appropriate for the address family
- of the socket, specifying where the associated query was sent.
-
- *expiration*, a ``float`` or ``None``, the absolute time at which
- a timeout exception should be raised. If ``None``, no timeout will
- occur.
-
- *ignore_unexpected*, a ``bool``. If ``True``, ignore responses from
- unexpected sources.
-
- *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own
- RRset.
-
- *keyring*, a ``dict``, the keyring to use for TSIG.
-
- *request_mac*, a ``binary``, the MAC of the request (for TSIG).
-
- *ignore_trailing*, a ``bool``. If ``True``, ignore trailing
- junk at end of the received message.
-
- Raises if the message is malformed, if network errors occur, of if
- there is a timeout.
-
- Returns a ``dns.message.Message`` object.
- """
-
- wire = b''
- while 1:
- _wait_for_readable(sock, expiration)
- (wire, from_address) = sock.recvfrom(65535)
- if _addresses_equal(sock.family, from_address, destination) or \
- (dns.inet.is_multicast(destination[0]) and
- from_address[1:] == destination[1:]):
- break
- if not ignore_unexpected:
- raise UnexpectedSource('got a response from '
- '%s instead of %s' % (from_address,
- destination))
- received_time = time.time()
- r = dns.message.from_wire(wire, keyring=keyring, request_mac=request_mac,
- one_rr_per_rrset=one_rr_per_rrset,
- ignore_trailing=ignore_trailing)
- return (r, received_time)
-
-def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0,
- ignore_unexpected=False, one_rr_per_rrset=False, ignore_trailing=False):
- """Return the response obtained after sending a query via UDP.
-
- *q*, a ``dns.message.Message``, the query to send
-
- *where*, a ``text`` containing an IPv4 or IPv6 address, where
- to send the message.
-
- *timeout*, a ``float`` or ``None``, the number of seconds to wait before the
- query times out. If ``None``, the default, wait forever.
-
- *port*, an ``int``, the port send the message to. The default is 53.
-
- *af*, an ``int``, the address family to use. The default is ``None``,
- which causes the address family to use to be inferred from the form of
- *where*. If the inference attempt fails, AF_INET is used. This
- parameter is historical; you need never set it.
-
- *source*, a ``text`` containing an IPv4 or IPv6 address, specifying
- the source address. The default is the wildcard address.
-
- *source_port*, an ``int``, the port from which to send the message.
- The default is 0.
-
- *ignore_unexpected*, a ``bool``. If ``True``, ignore responses from
- unexpected sources.
-
- *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own
- RRset.
-
- *ignore_trailing*, a ``bool``. If ``True``, ignore trailing
- junk at end of the received message.
-
- Returns a ``dns.message.Message``.
- """
-
- wire = q.to_wire()
- (af, destination, source) = _destination_and_source(af, where, port,
- source, source_port)
- s = socket_factory(af, socket.SOCK_DGRAM, 0)
- received_time = None
- sent_time = None
- try:
- expiration = _compute_expiration(timeout)
- s.setblocking(0)
- if source is not None:
- s.bind(source)
- (_, sent_time) = send_udp(s, wire, destination, expiration)
- (r, received_time) = receive_udp(s, destination, expiration,
- ignore_unexpected, one_rr_per_rrset,
- q.keyring, q.mac, ignore_trailing)
- finally:
- if sent_time is None or received_time is None:
- response_time = 0
- else:
- response_time = received_time - sent_time
- s.close()
- r.time = response_time
- if not q.is_response(r):
- raise BadResponse
- return r
-
-
-def _net_read(sock, count, expiration):
- """Read the specified number of bytes from sock. Keep trying until we
- either get the desired amount, or we hit EOF.
- A Timeout exception will be raised if the operation is not completed
- by the expiration time.
- """
- s = b''
- while count > 0:
- _wait_for_readable(sock, expiration)
- n = sock.recv(count)
- if n == b'':
- raise EOFError
- count = count - len(n)
- s = s + n
- return s
-
-
-def _net_write(sock, data, expiration):
- """Write the specified data to the socket.
- A Timeout exception will be raised if the operation is not completed
- by the expiration time.
- """
- current = 0
- l = len(data)
- while current < l:
- _wait_for_writable(sock, expiration)
- current += sock.send(data[current:])
-
-
-def send_tcp(sock, what, expiration=None):
- """Send a DNS message to the specified TCP socket.
-
- *sock*, a ``socket``.
-
- *what*, a ``binary`` or ``dns.message.Message``, the message to send.
-
- *expiration*, a ``float`` or ``None``, the absolute time at which
- a timeout exception should be raised. If ``None``, no timeout will
- occur.
-
- Returns an ``(int, float)`` tuple of bytes sent and the sent time.
- """
-
- if isinstance(what, dns.message.Message):
- what = what.to_wire()
- l = len(what)
- # copying the wire into tcpmsg is inefficient, but lets us
- # avoid writev() or doing a short write that would get pushed
- # onto the net
- tcpmsg = struct.pack("!H", l) + what
- _wait_for_writable(sock, expiration)
- sent_time = time.time()
- _net_write(sock, tcpmsg, expiration)
- return (len(tcpmsg), sent_time)
-
-def receive_tcp(sock, expiration=None, one_rr_per_rrset=False,
- keyring=None, request_mac=b'', ignore_trailing=False):
- """Read a DNS message from a TCP socket.
-
- *sock*, a ``socket``.
-
- *expiration*, a ``float`` or ``None``, the absolute time at which
- a timeout exception should be raised. If ``None``, no timeout will
- occur.
-
- *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own
- RRset.
-
- *keyring*, a ``dict``, the keyring to use for TSIG.
-
- *request_mac*, a ``binary``, the MAC of the request (for TSIG).
-
- *ignore_trailing*, a ``bool``. If ``True``, ignore trailing
- junk at end of the received message.
-
- Raises if the message is malformed, if network errors occur, of if
- there is a timeout.
-
- Returns a ``dns.message.Message`` object.
- """
-
- ldata = _net_read(sock, 2, expiration)
- (l,) = struct.unpack("!H", ldata)
- wire = _net_read(sock, l, expiration)
- received_time = time.time()
- r = dns.message.from_wire(wire, keyring=keyring, request_mac=request_mac,
- one_rr_per_rrset=one_rr_per_rrset,
- ignore_trailing=ignore_trailing)
- return (r, received_time)
-
-def _connect(s, address):
- try:
- s.connect(address)
- except socket.error:
- (ty, v) = sys.exc_info()[:2]
-
- if hasattr(v, 'errno'):
- v_err = v.errno
- else:
- v_err = v[0]
- if v_err not in [errno.EINPROGRESS, errno.EWOULDBLOCK, errno.EALREADY]:
- raise v
-
-
-def tcp(q, where, timeout=None, port=53, af=None, source=None, source_port=0,
- one_rr_per_rrset=False, ignore_trailing=False):
- """Return the response obtained after sending a query via TCP.
-
- *q*, a ``dns.message.Message``, the query to send
-
- *where*, a ``text`` containing an IPv4 or IPv6 address, where
- to send the message.
-
- *timeout*, a ``float`` or ``None``, the number of seconds to wait before the
- query times out. If ``None``, the default, wait forever.
-
- *port*, an ``int``, the port send the message to. The default is 53.
-
- *af*, an ``int``, the address family to use. The default is ``None``,
- which causes the address family to use to be inferred from the form of
- *where*. If the inference attempt fails, AF_INET is used. This
- parameter is historical; you need never set it.
-
- *source*, a ``text`` containing an IPv4 or IPv6 address, specifying
- the source address. The default is the wildcard address.
-
- *source_port*, an ``int``, the port from which to send the message.
- The default is 0.
-
- *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own
- RRset.
-
- *ignore_trailing*, a ``bool``. If ``True``, ignore trailing
- junk at end of the received message.
-
- Returns a ``dns.message.Message``.
- """
-
- wire = q.to_wire()
- (af, destination, source) = _destination_and_source(af, where, port,
- source, source_port)
- s = socket_factory(af, socket.SOCK_STREAM, 0)
- begin_time = None
- received_time = None
- try:
- expiration = _compute_expiration(timeout)
- s.setblocking(0)
- begin_time = time.time()
- if source is not None:
- s.bind(source)
- _connect(s, destination)
- send_tcp(s, wire, expiration)
- (r, received_time) = receive_tcp(s, expiration, one_rr_per_rrset,
- q.keyring, q.mac, ignore_trailing)
- finally:
- if begin_time is None or received_time is None:
- response_time = 0
- else:
- response_time = received_time - begin_time
- s.close()
- r.time = response_time
- if not q.is_response(r):
- raise BadResponse
- return r
-
-
-def xfr(where, zone, rdtype=dns.rdatatype.AXFR, rdclass=dns.rdataclass.IN,
- timeout=None, port=53, keyring=None, keyname=None, relativize=True,
- af=None, lifetime=None, source=None, source_port=0, serial=0,
- use_udp=False, keyalgorithm=dns.tsig.default_algorithm):
- """Return a generator for the responses to a zone transfer.
-
- *where*. If the inference attempt fails, AF_INET is used. This
- parameter is historical; you need never set it.
-
- *zone*, a ``dns.name.Name`` or ``text``, the name of the zone to transfer.
-
- *rdtype*, an ``int`` or ``text``, the type of zone transfer. The
- default is ``dns.rdatatype.AXFR``. ``dns.rdatatype.IXFR`` can be
- used to do an incremental transfer instead.
-
- *rdclass*, an ``int`` or ``text``, the class of the zone transfer.
- The default is ``dns.rdataclass.IN``.
-
- *timeout*, a ``float``, the number of seconds to wait for each
- response message. If None, the default, wait forever.
-
- *port*, an ``int``, the port send the message to. The default is 53.
-
- *keyring*, a ``dict``, the keyring to use for TSIG.
-
- *keyname*, a ``dns.name.Name`` or ``text``, the name of the TSIG
- key to use.
-
- *relativize*, a ``bool``. If ``True``, all names in the zone will be
- relativized to the zone origin. It is essential that the
- relativize setting matches the one specified to
- ``dns.zone.from_xfr()`` if using this generator to make a zone.
-
- *af*, an ``int``, the address family to use. The default is ``None``,
- which causes the address family to use to be inferred from the form of
- *where*. If the inference attempt fails, AF_INET is used. This
- parameter is historical; you need never set it.
-
- *lifetime*, a ``float``, the total number of seconds to spend
- doing the transfer. If ``None``, the default, then there is no
- limit on the time the transfer may take.
-
- *source*, a ``text`` containing an IPv4 or IPv6 address, specifying
- the source address. The default is the wildcard address.
-
- *source_port*, an ``int``, the port from which to send the message.
- The default is 0.
-
- *serial*, an ``int``, the SOA serial number to use as the base for
- an IXFR diff sequence (only meaningful if *rdtype* is
- ``dns.rdatatype.IXFR``).
-
- *use_udp*, a ``bool``. If ``True``, use UDP (only meaningful for IXFR).
-
- *keyalgorithm*, a ``dns.name.Name`` or ``text``, the TSIG algorithm to use.
-
- Raises on errors, and so does the generator.
-
- Returns a generator of ``dns.message.Message`` objects.
- """
-
- if isinstance(zone, string_types):
- zone = dns.name.from_text(zone)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- q = dns.message.make_query(zone, rdtype, rdclass)
- if rdtype == dns.rdatatype.IXFR:
- rrset = dns.rrset.from_text(zone, 0, 'IN', 'SOA',
- '. . %u 0 0 0 0' % serial)
- q.authority.append(rrset)
- if keyring is not None:
- q.use_tsig(keyring, keyname, algorithm=keyalgorithm)
- wire = q.to_wire()
- (af, destination, source) = _destination_and_source(af, where, port,
- source, source_port)
- if use_udp:
- if rdtype != dns.rdatatype.IXFR:
- raise ValueError('cannot do a UDP AXFR')
- s = socket_factory(af, socket.SOCK_DGRAM, 0)
- else:
- s = socket_factory(af, socket.SOCK_STREAM, 0)
- s.setblocking(0)
- if source is not None:
- s.bind(source)
- expiration = _compute_expiration(lifetime)
- _connect(s, destination)
- l = len(wire)
- if use_udp:
- _wait_for_writable(s, expiration)
- s.send(wire)
- else:
- tcpmsg = struct.pack("!H", l) + wire
- _net_write(s, tcpmsg, expiration)
- done = False
- delete_mode = True
- expecting_SOA = False
- soa_rrset = None
- if relativize:
- origin = zone
- oname = dns.name.empty
- else:
- origin = None
- oname = zone
- tsig_ctx = None
- first = True
- while not done:
- mexpiration = _compute_expiration(timeout)
- if mexpiration is None or mexpiration > expiration:
- mexpiration = expiration
- if use_udp:
- _wait_for_readable(s, expiration)
- (wire, from_address) = s.recvfrom(65535)
- else:
- ldata = _net_read(s, 2, mexpiration)
- (l,) = struct.unpack("!H", ldata)
- wire = _net_read(s, l, mexpiration)
- is_ixfr = (rdtype == dns.rdatatype.IXFR)
- r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac,
- xfr=True, origin=origin, tsig_ctx=tsig_ctx,
- multi=True, first=first,
- one_rr_per_rrset=is_ixfr)
- rcode = r.rcode()
- if rcode != dns.rcode.NOERROR:
- raise TransferError(rcode)
- tsig_ctx = r.tsig_ctx
- first = False
- answer_index = 0
- if soa_rrset is None:
- if not r.answer or r.answer[0].name != oname:
- raise dns.exception.FormError(
- "No answer or RRset not for qname")
- rrset = r.answer[0]
- if rrset.rdtype != dns.rdatatype.SOA:
- raise dns.exception.FormError("first RRset is not an SOA")
- answer_index = 1
- soa_rrset = rrset.copy()
- if rdtype == dns.rdatatype.IXFR:
- if soa_rrset[0].serial <= serial:
- #
- # We're already up-to-date.
- #
- done = True
- else:
- expecting_SOA = True
- #
- # Process SOAs in the answer section (other than the initial
- # SOA in the first message).
- #
- for rrset in r.answer[answer_index:]:
- if done:
- raise dns.exception.FormError("answers after final SOA")
- if rrset.rdtype == dns.rdatatype.SOA and rrset.name == oname:
- if expecting_SOA:
- if rrset[0].serial != serial:
- raise dns.exception.FormError(
- "IXFR base serial mismatch")
- expecting_SOA = False
- elif rdtype == dns.rdatatype.IXFR:
- delete_mode = not delete_mode
- #
- # If this SOA RRset is equal to the first we saw then we're
- # finished. If this is an IXFR we also check that we're seeing
- # the record in the expected part of the response.
- #
- if rrset == soa_rrset and \
- (rdtype == dns.rdatatype.AXFR or
- (rdtype == dns.rdatatype.IXFR and delete_mode)):
- done = True
- elif expecting_SOA:
- #
- # We made an IXFR request and are expecting another
- # SOA RR, but saw something else, so this must be an
- # AXFR response.
- #
- rdtype = dns.rdatatype.AXFR
- expecting_SOA = False
- if done and q.keyring and not r.had_tsig:
- raise dns.exception.FormError("missing TSIG")
- yield r
- s.close()
diff --git a/client/ayon_core/vendor/python/python_2/dns/rcode.py b/client/ayon_core/vendor/python/python_2/dns/rcode.py
deleted file mode 100644
index 5191e1b18c..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rcode.py
+++ /dev/null
@@ -1,144 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Result Codes."""
-
-import dns.exception
-from ._compat import long
-
-#: No error
-NOERROR = 0
-#: Form error
-FORMERR = 1
-#: Server failure
-SERVFAIL = 2
-#: Name does not exist ("Name Error" in RFC 1025 terminology).
-NXDOMAIN = 3
-#: Not implemented
-NOTIMP = 4
-#: Refused
-REFUSED = 5
-#: Name exists.
-YXDOMAIN = 6
-#: RRset exists.
-YXRRSET = 7
-#: RRset does not exist.
-NXRRSET = 8
-#: Not authoritative.
-NOTAUTH = 9
-#: Name not in zone.
-NOTZONE = 10
-#: Bad EDNS version.
-BADVERS = 16
-
-_by_text = {
- 'NOERROR': NOERROR,
- 'FORMERR': FORMERR,
- 'SERVFAIL': SERVFAIL,
- 'NXDOMAIN': NXDOMAIN,
- 'NOTIMP': NOTIMP,
- 'REFUSED': REFUSED,
- 'YXDOMAIN': YXDOMAIN,
- 'YXRRSET': YXRRSET,
- 'NXRRSET': NXRRSET,
- 'NOTAUTH': NOTAUTH,
- 'NOTZONE': NOTZONE,
- 'BADVERS': BADVERS
-}
-
-# We construct the inverse mapping programmatically to ensure that we
-# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
-# would cause the mapping not to be a true inverse.
-
-_by_value = {y: x for x, y in _by_text.items()}
-
-
-class UnknownRcode(dns.exception.DNSException):
- """A DNS rcode is unknown."""
-
-
-def from_text(text):
- """Convert text into an rcode.
-
- *text*, a ``text``, the textual rcode or an integer in textual form.
-
- Raises ``dns.rcode.UnknownRcode`` if the rcode mnemonic is unknown.
-
- Returns an ``int``.
- """
-
- if text.isdigit():
- v = int(text)
- if v >= 0 and v <= 4095:
- return v
- v = _by_text.get(text.upper())
- if v is None:
- raise UnknownRcode
- return v
-
-
-def from_flags(flags, ednsflags):
- """Return the rcode value encoded by flags and ednsflags.
-
- *flags*, an ``int``, the DNS flags field.
-
- *ednsflags*, an ``int``, the EDNS flags field.
-
- Raises ``ValueError`` if rcode is < 0 or > 4095
-
- Returns an ``int``.
- """
-
- value = (flags & 0x000f) | ((ednsflags >> 20) & 0xff0)
- if value < 0 or value > 4095:
- raise ValueError('rcode must be >= 0 and <= 4095')
- return value
-
-
-def to_flags(value):
- """Return a (flags, ednsflags) tuple which encodes the rcode.
-
- *value*, an ``int``, the rcode.
-
- Raises ``ValueError`` if rcode is < 0 or > 4095.
-
- Returns an ``(int, int)`` tuple.
- """
-
- if value < 0 or value > 4095:
- raise ValueError('rcode must be >= 0 and <= 4095')
- v = value & 0xf
- ev = long(value & 0xff0) << 20
- return (v, ev)
-
-
-def to_text(value):
- """Convert rcode into text.
-
- *value*, and ``int``, the rcode.
-
- Raises ``ValueError`` if rcode is < 0 or > 4095.
-
- Returns a ``text``.
- """
-
- if value < 0 or value > 4095:
- raise ValueError('rcode must be >= 0 and <= 4095')
- text = _by_value.get(value)
- if text is None:
- text = str(value)
- return text
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdata.py b/client/ayon_core/vendor/python/python_2/dns/rdata.py
deleted file mode 100644
index ea1971dc5f..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdata.py
+++ /dev/null
@@ -1,456 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS rdata."""
-
-from io import BytesIO
-import base64
-import binascii
-
-import dns.exception
-import dns.name
-import dns.rdataclass
-import dns.rdatatype
-import dns.tokenizer
-import dns.wiredata
-from ._compat import xrange, string_types, text_type
-
-try:
- import threading as _threading
-except ImportError:
- import dummy_threading as _threading
-
-_hex_chunksize = 32
-
-
-def _hexify(data, chunksize=_hex_chunksize):
- """Convert a binary string into its hex encoding, broken up into chunks
- of chunksize characters separated by a space.
- """
-
- line = binascii.hexlify(data)
- return b' '.join([line[i:i + chunksize]
- for i
- in range(0, len(line), chunksize)]).decode()
-
-_base64_chunksize = 32
-
-
-def _base64ify(data, chunksize=_base64_chunksize):
- """Convert a binary string into its base64 encoding, broken up into chunks
- of chunksize characters separated by a space.
- """
-
- line = base64.b64encode(data)
- return b' '.join([line[i:i + chunksize]
- for i
- in range(0, len(line), chunksize)]).decode()
-
-__escaped = bytearray(b'"\\')
-
-def _escapify(qstring):
- """Escape the characters in a quoted string which need it."""
-
- if isinstance(qstring, text_type):
- qstring = qstring.encode()
- if not isinstance(qstring, bytearray):
- qstring = bytearray(qstring)
-
- text = ''
- for c in qstring:
- if c in __escaped:
- text += '\\' + chr(c)
- elif c >= 0x20 and c < 0x7F:
- text += chr(c)
- else:
- text += '\\%03d' % c
- return text
-
-
-def _truncate_bitmap(what):
- """Determine the index of greatest byte that isn't all zeros, and
- return the bitmap that contains all the bytes less than that index.
- """
-
- for i in xrange(len(what) - 1, -1, -1):
- if what[i] != 0:
- return what[0: i + 1]
- return what[0:1]
-
-
-class Rdata(object):
- """Base class for all DNS rdata types."""
-
- __slots__ = ['rdclass', 'rdtype']
-
- def __init__(self, rdclass, rdtype):
- """Initialize an rdata.
-
- *rdclass*, an ``int`` is the rdataclass of the Rdata.
- *rdtype*, an ``int`` is the rdatatype of the Rdata.
- """
-
- self.rdclass = rdclass
- self.rdtype = rdtype
-
- def covers(self):
- """Return the type a Rdata covers.
-
- DNS SIG/RRSIG rdatas apply to a specific type; this type is
- returned by the covers() function. If the rdata type is not
- SIG or RRSIG, dns.rdatatype.NONE is returned. This is useful when
- creating rdatasets, allowing the rdataset to contain only RRSIGs
- of a particular type, e.g. RRSIG(NS).
-
- Returns an ``int``.
- """
-
- return dns.rdatatype.NONE
-
- def extended_rdatatype(self):
- """Return a 32-bit type value, the least significant 16 bits of
- which are the ordinary DNS type, and the upper 16 bits of which are
- the "covered" type, if any.
-
- Returns an ``int``.
- """
-
- return self.covers() << 16 | self.rdtype
-
- def to_text(self, origin=None, relativize=True, **kw):
- """Convert an rdata to text format.
-
- Returns a ``text``.
- """
-
- raise NotImplementedError
-
- def to_wire(self, file, compress=None, origin=None):
- """Convert an rdata to wire format.
-
- Returns a ``binary``.
- """
-
- raise NotImplementedError
-
- def to_digestable(self, origin=None):
- """Convert rdata to a format suitable for digesting in hashes. This
- is also the DNSSEC canonical form.
-
- Returns a ``binary``.
- """
-
- f = BytesIO()
- self.to_wire(f, None, origin)
- return f.getvalue()
-
- def validate(self):
- """Check that the current contents of the rdata's fields are
- valid.
-
- If you change an rdata by assigning to its fields,
- it is a good idea to call validate() when you are done making
- changes.
-
- Raises various exceptions if there are problems.
-
- Returns ``None``.
- """
-
- dns.rdata.from_text(self.rdclass, self.rdtype, self.to_text())
-
- def __repr__(self):
- covers = self.covers()
- if covers == dns.rdatatype.NONE:
- ctext = ''
- else:
- ctext = '(' + dns.rdatatype.to_text(covers) + ')'
- return ''
-
- def __str__(self):
- return self.to_text()
-
- def _cmp(self, other):
- """Compare an rdata with another rdata of the same rdtype and
- rdclass.
-
- Return < 0 if self < other in the DNSSEC ordering, 0 if self
- == other, and > 0 if self > other.
-
- """
- our = self.to_digestable(dns.name.root)
- their = other.to_digestable(dns.name.root)
- if our == their:
- return 0
- elif our > their:
- return 1
- else:
- return -1
-
- def __eq__(self, other):
- if not isinstance(other, Rdata):
- return False
- if self.rdclass != other.rdclass or self.rdtype != other.rdtype:
- return False
- return self._cmp(other) == 0
-
- def __ne__(self, other):
- if not isinstance(other, Rdata):
- return True
- if self.rdclass != other.rdclass or self.rdtype != other.rdtype:
- return True
- return self._cmp(other) != 0
-
- def __lt__(self, other):
- if not isinstance(other, Rdata) or \
- self.rdclass != other.rdclass or self.rdtype != other.rdtype:
-
- return NotImplemented
- return self._cmp(other) < 0
-
- def __le__(self, other):
- if not isinstance(other, Rdata) or \
- self.rdclass != other.rdclass or self.rdtype != other.rdtype:
- return NotImplemented
- return self._cmp(other) <= 0
-
- def __ge__(self, other):
- if not isinstance(other, Rdata) or \
- self.rdclass != other.rdclass or self.rdtype != other.rdtype:
- return NotImplemented
- return self._cmp(other) >= 0
-
- def __gt__(self, other):
- if not isinstance(other, Rdata) or \
- self.rdclass != other.rdclass or self.rdtype != other.rdtype:
- return NotImplemented
- return self._cmp(other) > 0
-
- def __hash__(self):
- return hash(self.to_digestable(dns.name.root))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- raise NotImplementedError
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- raise NotImplementedError
-
- def choose_relativity(self, origin=None, relativize=True):
- """Convert any domain names in the rdata to the specified
- relativization.
- """
-
-class GenericRdata(Rdata):
-
- """Generic Rdata Class
-
- This class is used for rdata types for which we have no better
- implementation. It implements the DNS "unknown RRs" scheme.
- """
-
- __slots__ = ['data']
-
- def __init__(self, rdclass, rdtype, data):
- super(GenericRdata, self).__init__(rdclass, rdtype)
- self.data = data
-
- def to_text(self, origin=None, relativize=True, **kw):
- return r'\# %d ' % len(self.data) + _hexify(self.data)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- token = tok.get()
- if not token.is_identifier() or token.value != r'\#':
- raise dns.exception.SyntaxError(
- r'generic rdata does not start with \#')
- length = tok.get_int()
- chunks = []
- while 1:
- token = tok.get()
- if token.is_eol_or_eof():
- break
- chunks.append(token.value.encode())
- hex = b''.join(chunks)
- data = binascii.unhexlify(hex)
- if len(data) != length:
- raise dns.exception.SyntaxError(
- 'generic rdata hex data has wrong length')
- return cls(rdclass, rdtype, data)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(self.data)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- return cls(rdclass, rdtype, wire[current: current + rdlen])
-
-_rdata_modules = {}
-_module_prefix = 'dns.rdtypes'
-_import_lock = _threading.Lock()
-
-def get_rdata_class(rdclass, rdtype):
-
- def import_module(name):
- with _import_lock:
- mod = __import__(name)
- components = name.split('.')
- for comp in components[1:]:
- mod = getattr(mod, comp)
- return mod
-
- mod = _rdata_modules.get((rdclass, rdtype))
- rdclass_text = dns.rdataclass.to_text(rdclass)
- rdtype_text = dns.rdatatype.to_text(rdtype)
- rdtype_text = rdtype_text.replace('-', '_')
- if not mod:
- mod = _rdata_modules.get((dns.rdatatype.ANY, rdtype))
- if not mod:
- try:
- mod = import_module('.'.join([_module_prefix,
- rdclass_text, rdtype_text]))
- _rdata_modules[(rdclass, rdtype)] = mod
- except ImportError:
- try:
- mod = import_module('.'.join([_module_prefix,
- 'ANY', rdtype_text]))
- _rdata_modules[(dns.rdataclass.ANY, rdtype)] = mod
- except ImportError:
- mod = None
- if mod:
- cls = getattr(mod, rdtype_text)
- else:
- cls = GenericRdata
- return cls
-
-
-def from_text(rdclass, rdtype, tok, origin=None, relativize=True):
- """Build an rdata object from text format.
-
- This function attempts to dynamically load a class which
- implements the specified rdata class and type. If there is no
- class-and-type-specific implementation, the GenericRdata class
- is used.
-
- Once a class is chosen, its from_text() class method is called
- with the parameters to this function.
-
- If *tok* is a ``text``, then a tokenizer is created and the string
- is used as its input.
-
- *rdclass*, an ``int``, the rdataclass.
-
- *rdtype*, an ``int``, the rdatatype.
-
- *tok*, a ``dns.tokenizer.Tokenizer`` or a ``text``.
-
- *origin*, a ``dns.name.Name`` (or ``None``), the
- origin to use for relative names.
-
- *relativize*, a ``bool``. If true, name will be relativized to
- the specified origin.
-
- Returns an instance of the chosen Rdata subclass.
- """
-
- if isinstance(tok, string_types):
- tok = dns.tokenizer.Tokenizer(tok)
- cls = get_rdata_class(rdclass, rdtype)
- if cls != GenericRdata:
- # peek at first token
- token = tok.get()
- tok.unget(token)
- if token.is_identifier() and \
- token.value == r'\#':
- #
- # Known type using the generic syntax. Extract the
- # wire form from the generic syntax, and then run
- # from_wire on it.
- #
- rdata = GenericRdata.from_text(rdclass, rdtype, tok, origin,
- relativize)
- return from_wire(rdclass, rdtype, rdata.data, 0, len(rdata.data),
- origin)
- return cls.from_text(rdclass, rdtype, tok, origin, relativize)
-
-
-def from_wire(rdclass, rdtype, wire, current, rdlen, origin=None):
- """Build an rdata object from wire format
-
- This function attempts to dynamically load a class which
- implements the specified rdata class and type. If there is no
- class-and-type-specific implementation, the GenericRdata class
- is used.
-
- Once a class is chosen, its from_wire() class method is called
- with the parameters to this function.
-
- *rdclass*, an ``int``, the rdataclass.
-
- *rdtype*, an ``int``, the rdatatype.
-
- *wire*, a ``binary``, the wire-format message.
-
- *current*, an ``int``, the offset in wire of the beginning of
- the rdata.
-
- *rdlen*, an ``int``, the length of the wire-format rdata
-
- *origin*, a ``dns.name.Name`` (or ``None``). If not ``None``,
- then names will be relativized to this origin.
-
- Returns an instance of the chosen Rdata subclass.
- """
-
- wire = dns.wiredata.maybe_wrap(wire)
- cls = get_rdata_class(rdclass, rdtype)
- return cls.from_wire(rdclass, rdtype, wire, current, rdlen, origin)
-
-
-class RdatatypeExists(dns.exception.DNSException):
- """DNS rdatatype already exists."""
- supp_kwargs = {'rdclass', 'rdtype'}
- fmt = "The rdata type with class {rdclass} and rdtype {rdtype} " + \
- "already exists."
-
-
-def register_type(implementation, rdtype, rdtype_text, is_singleton=False,
- rdclass=dns.rdataclass.IN):
- """Dynamically register a module to handle an rdatatype.
-
- *implementation*, a module implementing the type in the usual dnspython
- way.
-
- *rdtype*, an ``int``, the rdatatype to register.
-
- *rdtype_text*, a ``text``, the textual form of the rdatatype.
-
- *is_singleton*, a ``bool``, indicating if the type is a singleton (i.e.
- RRsets of the type can have only one member.)
-
- *rdclass*, the rdataclass of the type, or ``dns.rdataclass.ANY`` if
- it applies to all classes.
- """
-
- existing_cls = get_rdata_class(rdclass, rdtype)
- if existing_cls != GenericRdata:
- raise RdatatypeExists(rdclass=rdclass, rdtype=rdtype)
- _rdata_modules[(rdclass, rdtype)] = implementation
- dns.rdatatype.register_type(rdtype, rdtype_text, is_singleton)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdataclass.py b/client/ayon_core/vendor/python/python_2/dns/rdataclass.py
deleted file mode 100644
index b88aa85b7b..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdataclass.py
+++ /dev/null
@@ -1,122 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Rdata Classes."""
-
-import re
-
-import dns.exception
-
-RESERVED0 = 0
-IN = 1
-CH = 3
-HS = 4
-NONE = 254
-ANY = 255
-
-_by_text = {
- 'RESERVED0': RESERVED0,
- 'IN': IN,
- 'CH': CH,
- 'HS': HS,
- 'NONE': NONE,
- 'ANY': ANY
-}
-
-# We construct the inverse mapping programmatically to ensure that we
-# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
-# would cause the mapping not to be true inverse.
-
-_by_value = {y: x for x, y in _by_text.items()}
-
-# Now that we've built the inverse map, we can add class aliases to
-# the _by_text mapping.
-
-_by_text.update({
- 'INTERNET': IN,
- 'CHAOS': CH,
- 'HESIOD': HS
-})
-
-_metaclasses = {
- NONE: True,
- ANY: True
-}
-
-_unknown_class_pattern = re.compile('CLASS([0-9]+)$', re.I)
-
-
-class UnknownRdataclass(dns.exception.DNSException):
- """A DNS class is unknown."""
-
-
-def from_text(text):
- """Convert text into a DNS rdata class value.
-
- The input text can be a defined DNS RR class mnemonic or
- instance of the DNS generic class syntax.
-
- For example, "IN" and "CLASS1" will both result in a value of 1.
-
- Raises ``dns.rdatatype.UnknownRdataclass`` if the class is unknown.
-
- Raises ``ValueError`` if the rdata class value is not >= 0 and <= 65535.
-
- Returns an ``int``.
- """
-
- value = _by_text.get(text.upper())
- if value is None:
- match = _unknown_class_pattern.match(text)
- if match is None:
- raise UnknownRdataclass
- value = int(match.group(1))
- if value < 0 or value > 65535:
- raise ValueError("class must be between >= 0 and <= 65535")
- return value
-
-
-def to_text(value):
- """Convert a DNS rdata type value to text.
-
- If the value has a known mnemonic, it will be used, otherwise the
- DNS generic class syntax will be used.
-
- Raises ``ValueError`` if the rdata class value is not >= 0 and <= 65535.
-
- Returns a ``str``.
- """
-
- if value < 0 or value > 65535:
- raise ValueError("class must be between >= 0 and <= 65535")
- text = _by_value.get(value)
- if text is None:
- text = 'CLASS' + repr(value)
- return text
-
-
-def is_metaclass(rdclass):
- """True if the specified class is a metaclass.
-
- The currently defined metaclasses are ANY and NONE.
-
- *rdclass* is an ``int``.
- """
-
- if rdclass in _metaclasses:
- return True
- return False
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdataset.py b/client/ayon_core/vendor/python/python_2/dns/rdataset.py
deleted file mode 100644
index f1afe24198..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdataset.py
+++ /dev/null
@@ -1,347 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS rdatasets (an rdataset is a set of rdatas of a given type and class)"""
-
-import random
-from io import StringIO
-import struct
-
-import dns.exception
-import dns.rdatatype
-import dns.rdataclass
-import dns.rdata
-import dns.set
-from ._compat import string_types
-
-# define SimpleSet here for backwards compatibility
-SimpleSet = dns.set.Set
-
-
-class DifferingCovers(dns.exception.DNSException):
- """An attempt was made to add a DNS SIG/RRSIG whose covered type
- is not the same as that of the other rdatas in the rdataset."""
-
-
-class IncompatibleTypes(dns.exception.DNSException):
- """An attempt was made to add DNS RR data of an incompatible type."""
-
-
-class Rdataset(dns.set.Set):
-
- """A DNS rdataset."""
-
- __slots__ = ['rdclass', 'rdtype', 'covers', 'ttl']
-
- def __init__(self, rdclass, rdtype, covers=dns.rdatatype.NONE, ttl=0):
- """Create a new rdataset of the specified class and type.
-
- *rdclass*, an ``int``, the rdataclass.
-
- *rdtype*, an ``int``, the rdatatype.
-
- *covers*, an ``int``, the covered rdatatype.
-
- *ttl*, an ``int``, the TTL.
- """
-
- super(Rdataset, self).__init__()
- self.rdclass = rdclass
- self.rdtype = rdtype
- self.covers = covers
- self.ttl = ttl
-
- def _clone(self):
- obj = super(Rdataset, self)._clone()
- obj.rdclass = self.rdclass
- obj.rdtype = self.rdtype
- obj.covers = self.covers
- obj.ttl = self.ttl
- return obj
-
- def update_ttl(self, ttl):
- """Perform TTL minimization.
-
- Set the TTL of the rdataset to be the lesser of the set's current
- TTL or the specified TTL. If the set contains no rdatas, set the TTL
- to the specified TTL.
-
- *ttl*, an ``int``.
- """
-
- if len(self) == 0:
- self.ttl = ttl
- elif ttl < self.ttl:
- self.ttl = ttl
-
- def add(self, rd, ttl=None):
- """Add the specified rdata to the rdataset.
-
- If the optional *ttl* parameter is supplied, then
- ``self.update_ttl(ttl)`` will be called prior to adding the rdata.
-
- *rd*, a ``dns.rdata.Rdata``, the rdata
-
- *ttl*, an ``int``, the TTL.
-
- Raises ``dns.rdataset.IncompatibleTypes`` if the type and class
- do not match the type and class of the rdataset.
-
- Raises ``dns.rdataset.DifferingCovers`` if the type is a signature
- type and the covered type does not match that of the rdataset.
- """
-
- #
- # If we're adding a signature, do some special handling to
- # check that the signature covers the same type as the
- # other rdatas in this rdataset. If this is the first rdata
- # in the set, initialize the covers field.
- #
- if self.rdclass != rd.rdclass or self.rdtype != rd.rdtype:
- raise IncompatibleTypes
- if ttl is not None:
- self.update_ttl(ttl)
- if self.rdtype == dns.rdatatype.RRSIG or \
- self.rdtype == dns.rdatatype.SIG:
- covers = rd.covers()
- if len(self) == 0 and self.covers == dns.rdatatype.NONE:
- self.covers = covers
- elif self.covers != covers:
- raise DifferingCovers
- if dns.rdatatype.is_singleton(rd.rdtype) and len(self) > 0:
- self.clear()
- super(Rdataset, self).add(rd)
-
- def union_update(self, other):
- self.update_ttl(other.ttl)
- super(Rdataset, self).union_update(other)
-
- def intersection_update(self, other):
- self.update_ttl(other.ttl)
- super(Rdataset, self).intersection_update(other)
-
- def update(self, other):
- """Add all rdatas in other to self.
-
- *other*, a ``dns.rdataset.Rdataset``, the rdataset from which
- to update.
- """
-
- self.update_ttl(other.ttl)
- super(Rdataset, self).update(other)
-
- def __repr__(self):
- if self.covers == 0:
- ctext = ''
- else:
- ctext = '(' + dns.rdatatype.to_text(self.covers) + ')'
- return ''
-
- def __str__(self):
- return self.to_text()
-
- def __eq__(self, other):
- if not isinstance(other, Rdataset):
- return False
- if self.rdclass != other.rdclass or \
- self.rdtype != other.rdtype or \
- self.covers != other.covers:
- return False
- return super(Rdataset, self).__eq__(other)
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- def to_text(self, name=None, origin=None, relativize=True,
- override_rdclass=None, **kw):
- """Convert the rdataset into DNS master file format.
-
- See ``dns.name.Name.choose_relativity`` for more information
- on how *origin* and *relativize* determine the way names
- are emitted.
-
- Any additional keyword arguments are passed on to the rdata
- ``to_text()`` method.
-
- *name*, a ``dns.name.Name``. If name is not ``None``, emit RRs with
- *name* as the owner name.
-
- *origin*, a ``dns.name.Name`` or ``None``, the origin for relative
- names.
-
- *relativize*, a ``bool``. If ``True``, names will be relativized
- to *origin*.
- """
-
- if name is not None:
- name = name.choose_relativity(origin, relativize)
- ntext = str(name)
- pad = ' '
- else:
- ntext = ''
- pad = ''
- s = StringIO()
- if override_rdclass is not None:
- rdclass = override_rdclass
- else:
- rdclass = self.rdclass
- if len(self) == 0:
- #
- # Empty rdatasets are used for the question section, and in
- # some dynamic updates, so we don't need to print out the TTL
- # (which is meaningless anyway).
- #
- s.write(u'{}{}{} {}\n'.format(ntext, pad,
- dns.rdataclass.to_text(rdclass),
- dns.rdatatype.to_text(self.rdtype)))
- else:
- for rd in self:
- s.write(u'%s%s%d %s %s %s\n' %
- (ntext, pad, self.ttl, dns.rdataclass.to_text(rdclass),
- dns.rdatatype.to_text(self.rdtype),
- rd.to_text(origin=origin, relativize=relativize,
- **kw)))
- #
- # We strip off the final \n for the caller's convenience in printing
- #
- return s.getvalue()[:-1]
-
- def to_wire(self, name, file, compress=None, origin=None,
- override_rdclass=None, want_shuffle=True):
- """Convert the rdataset to wire format.
-
- *name*, a ``dns.name.Name`` is the owner name to use.
-
- *file* is the file where the name is emitted (typically a
- BytesIO file).
-
- *compress*, a ``dict``, is the compression table to use. If
- ``None`` (the default), names will not be compressed.
-
- *origin* is a ``dns.name.Name`` or ``None``. If the name is
- relative and origin is not ``None``, then *origin* will be appended
- to it.
-
- *override_rdclass*, an ``int``, is used as the class instead of the
- class of the rdataset. This is useful when rendering rdatasets
- associated with dynamic updates.
-
- *want_shuffle*, a ``bool``. If ``True``, then the order of the
- Rdatas within the Rdataset will be shuffled before rendering.
-
- Returns an ``int``, the number of records emitted.
- """
-
- if override_rdclass is not None:
- rdclass = override_rdclass
- want_shuffle = False
- else:
- rdclass = self.rdclass
- file.seek(0, 2)
- if len(self) == 0:
- name.to_wire(file, compress, origin)
- stuff = struct.pack("!HHIH", self.rdtype, rdclass, 0, 0)
- file.write(stuff)
- return 1
- else:
- if want_shuffle:
- l = list(self)
- random.shuffle(l)
- else:
- l = self
- for rd in l:
- name.to_wire(file, compress, origin)
- stuff = struct.pack("!HHIH", self.rdtype, rdclass,
- self.ttl, 0)
- file.write(stuff)
- start = file.tell()
- rd.to_wire(file, compress, origin)
- end = file.tell()
- assert end - start < 65536
- file.seek(start - 2)
- stuff = struct.pack("!H", end - start)
- file.write(stuff)
- file.seek(0, 2)
- return len(self)
-
- def match(self, rdclass, rdtype, covers):
- """Returns ``True`` if this rdataset matches the specified class,
- type, and covers.
- """
- if self.rdclass == rdclass and \
- self.rdtype == rdtype and \
- self.covers == covers:
- return True
- return False
-
-
-def from_text_list(rdclass, rdtype, ttl, text_rdatas):
- """Create an rdataset with the specified class, type, and TTL, and with
- the specified list of rdatas in text format.
-
- Returns a ``dns.rdataset.Rdataset`` object.
- """
-
- if isinstance(rdclass, string_types):
- rdclass = dns.rdataclass.from_text(rdclass)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- r = Rdataset(rdclass, rdtype)
- r.update_ttl(ttl)
- for t in text_rdatas:
- rd = dns.rdata.from_text(r.rdclass, r.rdtype, t)
- r.add(rd)
- return r
-
-
-def from_text(rdclass, rdtype, ttl, *text_rdatas):
- """Create an rdataset with the specified class, type, and TTL, and with
- the specified rdatas in text format.
-
- Returns a ``dns.rdataset.Rdataset`` object.
- """
-
- return from_text_list(rdclass, rdtype, ttl, text_rdatas)
-
-
-def from_rdata_list(ttl, rdatas):
- """Create an rdataset with the specified TTL, and with
- the specified list of rdata objects.
-
- Returns a ``dns.rdataset.Rdataset`` object.
- """
-
- if len(rdatas) == 0:
- raise ValueError("rdata list must not be empty")
- r = None
- for rd in rdatas:
- if r is None:
- r = Rdataset(rd.rdclass, rd.rdtype)
- r.update_ttl(ttl)
- r.add(rd)
- return r
-
-
-def from_rdata(ttl, *rdatas):
- """Create an rdataset with the specified TTL, and with
- the specified rdata objects.
-
- Returns a ``dns.rdataset.Rdataset`` object.
- """
-
- return from_rdata_list(ttl, rdatas)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdatatype.py b/client/ayon_core/vendor/python/python_2/dns/rdatatype.py
deleted file mode 100644
index b247bc9c42..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdatatype.py
+++ /dev/null
@@ -1,287 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Rdata Types."""
-
-import re
-
-import dns.exception
-
-NONE = 0
-A = 1
-NS = 2
-MD = 3
-MF = 4
-CNAME = 5
-SOA = 6
-MB = 7
-MG = 8
-MR = 9
-NULL = 10
-WKS = 11
-PTR = 12
-HINFO = 13
-MINFO = 14
-MX = 15
-TXT = 16
-RP = 17
-AFSDB = 18
-X25 = 19
-ISDN = 20
-RT = 21
-NSAP = 22
-NSAP_PTR = 23
-SIG = 24
-KEY = 25
-PX = 26
-GPOS = 27
-AAAA = 28
-LOC = 29
-NXT = 30
-SRV = 33
-NAPTR = 35
-KX = 36
-CERT = 37
-A6 = 38
-DNAME = 39
-OPT = 41
-APL = 42
-DS = 43
-SSHFP = 44
-IPSECKEY = 45
-RRSIG = 46
-NSEC = 47
-DNSKEY = 48
-DHCID = 49
-NSEC3 = 50
-NSEC3PARAM = 51
-TLSA = 52
-HIP = 55
-CDS = 59
-CDNSKEY = 60
-OPENPGPKEY = 61
-CSYNC = 62
-SPF = 99
-UNSPEC = 103
-EUI48 = 108
-EUI64 = 109
-TKEY = 249
-TSIG = 250
-IXFR = 251
-AXFR = 252
-MAILB = 253
-MAILA = 254
-ANY = 255
-URI = 256
-CAA = 257
-AVC = 258
-TA = 32768
-DLV = 32769
-
-_by_text = {
- 'NONE': NONE,
- 'A': A,
- 'NS': NS,
- 'MD': MD,
- 'MF': MF,
- 'CNAME': CNAME,
- 'SOA': SOA,
- 'MB': MB,
- 'MG': MG,
- 'MR': MR,
- 'NULL': NULL,
- 'WKS': WKS,
- 'PTR': PTR,
- 'HINFO': HINFO,
- 'MINFO': MINFO,
- 'MX': MX,
- 'TXT': TXT,
- 'RP': RP,
- 'AFSDB': AFSDB,
- 'X25': X25,
- 'ISDN': ISDN,
- 'RT': RT,
- 'NSAP': NSAP,
- 'NSAP-PTR': NSAP_PTR,
- 'SIG': SIG,
- 'KEY': KEY,
- 'PX': PX,
- 'GPOS': GPOS,
- 'AAAA': AAAA,
- 'LOC': LOC,
- 'NXT': NXT,
- 'SRV': SRV,
- 'NAPTR': NAPTR,
- 'KX': KX,
- 'CERT': CERT,
- 'A6': A6,
- 'DNAME': DNAME,
- 'OPT': OPT,
- 'APL': APL,
- 'DS': DS,
- 'SSHFP': SSHFP,
- 'IPSECKEY': IPSECKEY,
- 'RRSIG': RRSIG,
- 'NSEC': NSEC,
- 'DNSKEY': DNSKEY,
- 'DHCID': DHCID,
- 'NSEC3': NSEC3,
- 'NSEC3PARAM': NSEC3PARAM,
- 'TLSA': TLSA,
- 'HIP': HIP,
- 'CDS': CDS,
- 'CDNSKEY': CDNSKEY,
- 'OPENPGPKEY': OPENPGPKEY,
- 'CSYNC': CSYNC,
- 'SPF': SPF,
- 'UNSPEC': UNSPEC,
- 'EUI48': EUI48,
- 'EUI64': EUI64,
- 'TKEY': TKEY,
- 'TSIG': TSIG,
- 'IXFR': IXFR,
- 'AXFR': AXFR,
- 'MAILB': MAILB,
- 'MAILA': MAILA,
- 'ANY': ANY,
- 'URI': URI,
- 'CAA': CAA,
- 'AVC': AVC,
- 'TA': TA,
- 'DLV': DLV,
-}
-
-# We construct the inverse mapping programmatically to ensure that we
-# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
-# would cause the mapping not to be true inverse.
-
-_by_value = {y: x for x, y in _by_text.items()}
-
-_metatypes = {
- OPT: True
-}
-
-_singletons = {
- SOA: True,
- NXT: True,
- DNAME: True,
- NSEC: True,
- CNAME: True,
-}
-
-_unknown_type_pattern = re.compile('TYPE([0-9]+)$', re.I)
-
-
-class UnknownRdatatype(dns.exception.DNSException):
- """DNS resource record type is unknown."""
-
-
-def from_text(text):
- """Convert text into a DNS rdata type value.
-
- The input text can be a defined DNS RR type mnemonic or
- instance of the DNS generic type syntax.
-
- For example, "NS" and "TYPE2" will both result in a value of 2.
-
- Raises ``dns.rdatatype.UnknownRdatatype`` if the type is unknown.
-
- Raises ``ValueError`` if the rdata type value is not >= 0 and <= 65535.
-
- Returns an ``int``.
- """
-
- value = _by_text.get(text.upper())
- if value is None:
- match = _unknown_type_pattern.match(text)
- if match is None:
- raise UnknownRdatatype
- value = int(match.group(1))
- if value < 0 or value > 65535:
- raise ValueError("type must be between >= 0 and <= 65535")
- return value
-
-
-def to_text(value):
- """Convert a DNS rdata type value to text.
-
- If the value has a known mnemonic, it will be used, otherwise the
- DNS generic type syntax will be used.
-
- Raises ``ValueError`` if the rdata type value is not >= 0 and <= 65535.
-
- Returns a ``str``.
- """
-
- if value < 0 or value > 65535:
- raise ValueError("type must be between >= 0 and <= 65535")
- text = _by_value.get(value)
- if text is None:
- text = 'TYPE' + repr(value)
- return text
-
-
-def is_metatype(rdtype):
- """True if the specified type is a metatype.
-
- *rdtype* is an ``int``.
-
- The currently defined metatypes are TKEY, TSIG, IXFR, AXFR, MAILA,
- MAILB, ANY, and OPT.
-
- Returns a ``bool``.
- """
-
- if rdtype >= TKEY and rdtype <= ANY or rdtype in _metatypes:
- return True
- return False
-
-
-def is_singleton(rdtype):
- """Is the specified type a singleton type?
-
- Singleton types can only have a single rdata in an rdataset, or a single
- RR in an RRset.
-
- The currently defined singleton types are CNAME, DNAME, NSEC, NXT, and
- SOA.
-
- *rdtype* is an ``int``.
-
- Returns a ``bool``.
- """
-
- if rdtype in _singletons:
- return True
- return False
-
-
-def register_type(rdtype, rdtype_text, is_singleton=False): # pylint: disable=redefined-outer-name
- """Dynamically register an rdatatype.
-
- *rdtype*, an ``int``, the rdatatype to register.
-
- *rdtype_text*, a ``text``, the textual form of the rdatatype.
-
- *is_singleton*, a ``bool``, indicating if the type is a singleton (i.e.
- RRsets of the type can have only one member.)
- """
-
- _by_text[rdtype_text] = rdtype
- _by_value[rdtype] = rdtype_text
- if is_singleton:
- _singletons[rdtype] = True
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/AFSDB.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/AFSDB.py
deleted file mode 100644
index c6a700cf56..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/AFSDB.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.mxbase
-
-
-class AFSDB(dns.rdtypes.mxbase.UncompressedDowncasingMX):
-
- """AFSDB record
-
- @ivar subtype: the subtype value
- @type subtype: int
- @ivar hostname: the hostname name
- @type hostname: dns.name.Name object"""
-
- # Use the property mechanism to make "subtype" an alias for the
- # "preference" attribute, and "hostname" an alias for the "exchange"
- # attribute.
- #
- # This lets us inherit the UncompressedMX implementation but lets
- # the caller use appropriate attribute names for the rdata type.
- #
- # We probably lose some performance vs. a cut-and-paste
- # implementation, but this way we don't copy code, and that's
- # good.
-
- def get_subtype(self):
- return self.preference
-
- def set_subtype(self, subtype):
- self.preference = subtype
-
- subtype = property(get_subtype, set_subtype)
-
- def get_hostname(self):
- return self.exchange
-
- def set_hostname(self, hostname):
- self.exchange = hostname
-
- hostname = property(get_hostname, set_hostname)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/AVC.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/AVC.py
deleted file mode 100644
index 7f340b39d2..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/AVC.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2016 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.txtbase
-
-
-class AVC(dns.rdtypes.txtbase.TXTBase):
-
- """AVC record
-
- @see: U{http://www.iana.org/assignments/dns-parameters/AVC/avc-completed-template}"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CAA.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CAA.py
deleted file mode 100644
index 0acf201ab1..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CAA.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.tokenizer
-
-
-class CAA(dns.rdata.Rdata):
-
- """CAA (Certification Authority Authorization) record
-
- @ivar flags: the flags
- @type flags: int
- @ivar tag: the tag
- @type tag: string
- @ivar value: the value
- @type value: string
- @see: RFC 6844"""
-
- __slots__ = ['flags', 'tag', 'value']
-
- def __init__(self, rdclass, rdtype, flags, tag, value):
- super(CAA, self).__init__(rdclass, rdtype)
- self.flags = flags
- self.tag = tag
- self.value = value
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '%u %s "%s"' % (self.flags,
- dns.rdata._escapify(self.tag),
- dns.rdata._escapify(self.value))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- flags = tok.get_uint8()
- tag = tok.get_string().encode()
- if len(tag) > 255:
- raise dns.exception.SyntaxError("tag too long")
- if not tag.isalnum():
- raise dns.exception.SyntaxError("tag is not alphanumeric")
- value = tok.get_string().encode()
- return cls(rdclass, rdtype, flags, tag, value)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(struct.pack('!B', self.flags))
- l = len(self.tag)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.tag)
- file.write(self.value)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (flags, l) = struct.unpack('!BB', wire[current: current + 2])
- current += 2
- tag = wire[current: current + l]
- value = wire[current + l:current + rdlen - 2]
- return cls(rdclass, rdtype, flags, tag, value)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CDNSKEY.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CDNSKEY.py
deleted file mode 100644
index 653ae1be16..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CDNSKEY.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.dnskeybase
-from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set
-
-
-__all__ = ['flags_to_text_set', 'flags_from_text_set']
-
-
-class CDNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase):
-
- """CDNSKEY record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CDS.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CDS.py
deleted file mode 100644
index a63041dd79..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CDS.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.dsbase
-
-
-class CDS(dns.rdtypes.dsbase.DSBase):
-
- """CDS record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CERT.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CERT.py
deleted file mode 100644
index eea27b52c3..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CERT.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-import base64
-
-import dns.exception
-import dns.dnssec
-import dns.rdata
-import dns.tokenizer
-
-_ctype_by_value = {
- 1: 'PKIX',
- 2: 'SPKI',
- 3: 'PGP',
- 253: 'URI',
- 254: 'OID',
-}
-
-_ctype_by_name = {
- 'PKIX': 1,
- 'SPKI': 2,
- 'PGP': 3,
- 'URI': 253,
- 'OID': 254,
-}
-
-
-def _ctype_from_text(what):
- v = _ctype_by_name.get(what)
- if v is not None:
- return v
- return int(what)
-
-
-def _ctype_to_text(what):
- v = _ctype_by_value.get(what)
- if v is not None:
- return v
- return str(what)
-
-
-class CERT(dns.rdata.Rdata):
-
- """CERT record
-
- @ivar certificate_type: certificate type
- @type certificate_type: int
- @ivar key_tag: key tag
- @type key_tag: int
- @ivar algorithm: algorithm
- @type algorithm: int
- @ivar certificate: the certificate or CRL
- @type certificate: string
- @see: RFC 2538"""
-
- __slots__ = ['certificate_type', 'key_tag', 'algorithm', 'certificate']
-
- def __init__(self, rdclass, rdtype, certificate_type, key_tag, algorithm,
- certificate):
- super(CERT, self).__init__(rdclass, rdtype)
- self.certificate_type = certificate_type
- self.key_tag = key_tag
- self.algorithm = algorithm
- self.certificate = certificate
-
- def to_text(self, origin=None, relativize=True, **kw):
- certificate_type = _ctype_to_text(self.certificate_type)
- return "%s %d %s %s" % (certificate_type, self.key_tag,
- dns.dnssec.algorithm_to_text(self.algorithm),
- dns.rdata._base64ify(self.certificate))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- certificate_type = _ctype_from_text(tok.get_string())
- key_tag = tok.get_uint16()
- algorithm = dns.dnssec.algorithm_from_text(tok.get_string())
- if algorithm < 0 or algorithm > 255:
- raise dns.exception.SyntaxError("bad algorithm type")
- chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- chunks.append(t.value.encode())
- b64 = b''.join(chunks)
- certificate = base64.b64decode(b64)
- return cls(rdclass, rdtype, certificate_type, key_tag,
- algorithm, certificate)
-
- def to_wire(self, file, compress=None, origin=None):
- prefix = struct.pack("!HHB", self.certificate_type, self.key_tag,
- self.algorithm)
- file.write(prefix)
- file.write(self.certificate)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- prefix = wire[current: current + 5].unwrap()
- current += 5
- rdlen -= 5
- if rdlen < 0:
- raise dns.exception.FormError
- (certificate_type, key_tag, algorithm) = struct.unpack("!HHB", prefix)
- certificate = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, certificate_type, key_tag, algorithm,
- certificate)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CNAME.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CNAME.py
deleted file mode 100644
index 11d42aa7fd..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CNAME.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.nsbase
-
-
-class CNAME(dns.rdtypes.nsbase.NSBase):
-
- """CNAME record
-
- Note: although CNAME is officially a singleton type, dnspython allows
- non-singleton CNAME rdatasets because such sets have been commonly
- used by BIND and other nameservers for load balancing."""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CSYNC.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CSYNC.py
deleted file mode 100644
index 06292fb28c..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/CSYNC.py
+++ /dev/null
@@ -1,126 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2004-2007, 2009-2011, 2016 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.rdatatype
-import dns.name
-from dns._compat import xrange
-
-class CSYNC(dns.rdata.Rdata):
-
- """CSYNC record
-
- @ivar serial: the SOA serial number
- @type serial: int
- @ivar flags: the CSYNC flags
- @type flags: int
- @ivar windows: the windowed bitmap list
- @type windows: list of (window number, string) tuples"""
-
- __slots__ = ['serial', 'flags', 'windows']
-
- def __init__(self, rdclass, rdtype, serial, flags, windows):
- super(CSYNC, self).__init__(rdclass, rdtype)
- self.serial = serial
- self.flags = flags
- self.windows = windows
-
- def to_text(self, origin=None, relativize=True, **kw):
- text = ''
- for (window, bitmap) in self.windows:
- bits = []
- for i in xrange(0, len(bitmap)):
- byte = bitmap[i]
- for j in xrange(0, 8):
- if byte & (0x80 >> j):
- bits.append(dns.rdatatype.to_text(window * 256 +
- i * 8 + j))
- text += (' ' + ' '.join(bits))
- return '%d %d%s' % (self.serial, self.flags, text)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- serial = tok.get_uint32()
- flags = tok.get_uint16()
- rdtypes = []
- while 1:
- token = tok.get().unescape()
- if token.is_eol_or_eof():
- break
- nrdtype = dns.rdatatype.from_text(token.value)
- if nrdtype == 0:
- raise dns.exception.SyntaxError("CSYNC with bit 0")
- if nrdtype > 65535:
- raise dns.exception.SyntaxError("CSYNC with bit > 65535")
- rdtypes.append(nrdtype)
- rdtypes.sort()
- window = 0
- octets = 0
- prior_rdtype = 0
- bitmap = bytearray(b'\0' * 32)
- windows = []
- for nrdtype in rdtypes:
- if nrdtype == prior_rdtype:
- continue
- prior_rdtype = nrdtype
- new_window = nrdtype // 256
- if new_window != window:
- windows.append((window, bitmap[0:octets]))
- bitmap = bytearray(b'\0' * 32)
- window = new_window
- offset = nrdtype % 256
- byte = offset // 8
- bit = offset % 8
- octets = byte + 1
- bitmap[byte] = bitmap[byte] | (0x80 >> bit)
-
- windows.append((window, bitmap[0:octets]))
- return cls(rdclass, rdtype, serial, flags, windows)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(struct.pack('!IH', self.serial, self.flags))
- for (window, bitmap) in self.windows:
- file.write(struct.pack('!BB', window, len(bitmap)))
- file.write(bitmap)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- if rdlen < 6:
- raise dns.exception.FormError("CSYNC too short")
- (serial, flags) = struct.unpack("!IH", wire[current: current + 6])
- current += 6
- rdlen -= 6
- windows = []
- while rdlen > 0:
- if rdlen < 3:
- raise dns.exception.FormError("CSYNC too short")
- window = wire[current]
- octets = wire[current + 1]
- if octets == 0 or octets > 32:
- raise dns.exception.FormError("bad CSYNC octets")
- current += 2
- rdlen -= 2
- if rdlen < octets:
- raise dns.exception.FormError("bad CSYNC bitmap length")
- bitmap = bytearray(wire[current: current + octets].unwrap())
- current += octets
- rdlen -= octets
- windows.append((window, bitmap))
- return cls(rdclass, rdtype, serial, flags, windows)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DLV.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DLV.py
deleted file mode 100644
index 1635212583..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DLV.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.dsbase
-
-
-class DLV(dns.rdtypes.dsbase.DSBase):
-
- """DLV record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DNAME.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DNAME.py
deleted file mode 100644
index 2499283cfa..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DNAME.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.nsbase
-
-
-class DNAME(dns.rdtypes.nsbase.UncompressedNS):
-
- """DNAME record"""
-
- def to_digestable(self, origin=None):
- return self.target.to_digestable(origin)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DNSKEY.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DNSKEY.py
deleted file mode 100644
index e36f7bc5b1..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DNSKEY.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.dnskeybase
-from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set
-
-
-__all__ = ['flags_to_text_set', 'flags_from_text_set']
-
-
-class DNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase):
-
- """DNSKEY record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DS.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DS.py
deleted file mode 100644
index 7d457b2281..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/DS.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.dsbase
-
-
-class DS(dns.rdtypes.dsbase.DSBase):
-
- """DS record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/EUI48.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/EUI48.py
deleted file mode 100644
index aa260e205d..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/EUI48.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright (C) 2015 Red Hat, Inc.
-# Author: Petr Spacek
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.euibase
-
-
-class EUI48(dns.rdtypes.euibase.EUIBase):
-
- """EUI48 record
-
- @ivar fingerprint: 48-bit Extended Unique Identifier (EUI-48)
- @type fingerprint: string
- @see: rfc7043.txt"""
-
- byte_len = 6 # 0123456789ab (in hex)
- text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/EUI64.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/EUI64.py
deleted file mode 100644
index 5eba350d8f..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/EUI64.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright (C) 2015 Red Hat, Inc.
-# Author: Petr Spacek
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.euibase
-
-
-class EUI64(dns.rdtypes.euibase.EUIBase):
-
- """EUI64 record
-
- @ivar fingerprint: 64-bit Extended Unique Identifier (EUI-64)
- @type fingerprint: string
- @see: rfc7043.txt"""
-
- byte_len = 8 # 0123456789abcdef (in hex)
- text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab-cd-ef
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/GPOS.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/GPOS.py
deleted file mode 100644
index 422822f03b..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/GPOS.py
+++ /dev/null
@@ -1,162 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.tokenizer
-from dns._compat import long, text_type
-
-
-def _validate_float_string(what):
- if what[0] == b'-'[0] or what[0] == b'+'[0]:
- what = what[1:]
- if what.isdigit():
- return
- (left, right) = what.split(b'.')
- if left == b'' and right == b'':
- raise dns.exception.FormError
- if not left == b'' and not left.decode().isdigit():
- raise dns.exception.FormError
- if not right == b'' and not right.decode().isdigit():
- raise dns.exception.FormError
-
-
-def _sanitize(value):
- if isinstance(value, text_type):
- return value.encode()
- return value
-
-
-class GPOS(dns.rdata.Rdata):
-
- """GPOS record
-
- @ivar latitude: latitude
- @type latitude: string
- @ivar longitude: longitude
- @type longitude: string
- @ivar altitude: altitude
- @type altitude: string
- @see: RFC 1712"""
-
- __slots__ = ['latitude', 'longitude', 'altitude']
-
- def __init__(self, rdclass, rdtype, latitude, longitude, altitude):
- super(GPOS, self).__init__(rdclass, rdtype)
- if isinstance(latitude, float) or \
- isinstance(latitude, int) or \
- isinstance(latitude, long):
- latitude = str(latitude)
- if isinstance(longitude, float) or \
- isinstance(longitude, int) or \
- isinstance(longitude, long):
- longitude = str(longitude)
- if isinstance(altitude, float) or \
- isinstance(altitude, int) or \
- isinstance(altitude, long):
- altitude = str(altitude)
- latitude = _sanitize(latitude)
- longitude = _sanitize(longitude)
- altitude = _sanitize(altitude)
- _validate_float_string(latitude)
- _validate_float_string(longitude)
- _validate_float_string(altitude)
- self.latitude = latitude
- self.longitude = longitude
- self.altitude = altitude
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '{} {} {}'.format(self.latitude.decode(),
- self.longitude.decode(),
- self.altitude.decode())
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- latitude = tok.get_string()
- longitude = tok.get_string()
- altitude = tok.get_string()
- tok.get_eol()
- return cls(rdclass, rdtype, latitude, longitude, altitude)
-
- def to_wire(self, file, compress=None, origin=None):
- l = len(self.latitude)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.latitude)
- l = len(self.longitude)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.longitude)
- l = len(self.altitude)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.altitude)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- l = wire[current]
- current += 1
- rdlen -= 1
- if l > rdlen:
- raise dns.exception.FormError
- latitude = wire[current: current + l].unwrap()
- current += l
- rdlen -= l
- l = wire[current]
- current += 1
- rdlen -= 1
- if l > rdlen:
- raise dns.exception.FormError
- longitude = wire[current: current + l].unwrap()
- current += l
- rdlen -= l
- l = wire[current]
- current += 1
- rdlen -= 1
- if l != rdlen:
- raise dns.exception.FormError
- altitude = wire[current: current + l].unwrap()
- return cls(rdclass, rdtype, latitude, longitude, altitude)
-
- def _get_float_latitude(self):
- return float(self.latitude)
-
- def _set_float_latitude(self, value):
- self.latitude = str(value)
-
- float_latitude = property(_get_float_latitude, _set_float_latitude,
- doc="latitude as a floating point value")
-
- def _get_float_longitude(self):
- return float(self.longitude)
-
- def _set_float_longitude(self, value):
- self.longitude = str(value)
-
- float_longitude = property(_get_float_longitude, _set_float_longitude,
- doc="longitude as a floating point value")
-
- def _get_float_altitude(self):
- return float(self.altitude)
-
- def _set_float_altitude(self, value):
- self.altitude = str(value)
-
- float_altitude = property(_get_float_altitude, _set_float_altitude,
- doc="altitude as a floating point value")
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/HINFO.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/HINFO.py
deleted file mode 100644
index e4e0b34a49..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/HINFO.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.tokenizer
-from dns._compat import text_type
-
-
-class HINFO(dns.rdata.Rdata):
-
- """HINFO record
-
- @ivar cpu: the CPU type
- @type cpu: string
- @ivar os: the OS type
- @type os: string
- @see: RFC 1035"""
-
- __slots__ = ['cpu', 'os']
-
- def __init__(self, rdclass, rdtype, cpu, os):
- super(HINFO, self).__init__(rdclass, rdtype)
- if isinstance(cpu, text_type):
- self.cpu = cpu.encode()
- else:
- self.cpu = cpu
- if isinstance(os, text_type):
- self.os = os.encode()
- else:
- self.os = os
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '"{}" "{}"'.format(dns.rdata._escapify(self.cpu),
- dns.rdata._escapify(self.os))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- cpu = tok.get_string()
- os = tok.get_string()
- tok.get_eol()
- return cls(rdclass, rdtype, cpu, os)
-
- def to_wire(self, file, compress=None, origin=None):
- l = len(self.cpu)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.cpu)
- l = len(self.os)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.os)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- l = wire[current]
- current += 1
- rdlen -= 1
- if l > rdlen:
- raise dns.exception.FormError
- cpu = wire[current:current + l].unwrap()
- current += l
- rdlen -= l
- l = wire[current]
- current += 1
- rdlen -= 1
- if l != rdlen:
- raise dns.exception.FormError
- os = wire[current: current + l].unwrap()
- return cls(rdclass, rdtype, cpu, os)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/HIP.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/HIP.py
deleted file mode 100644
index 7c876b2d2f..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/HIP.py
+++ /dev/null
@@ -1,115 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2010, 2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-import base64
-import binascii
-
-import dns.exception
-import dns.rdata
-import dns.rdatatype
-
-
-class HIP(dns.rdata.Rdata):
-
- """HIP record
-
- @ivar hit: the host identity tag
- @type hit: string
- @ivar algorithm: the public key cryptographic algorithm
- @type algorithm: int
- @ivar key: the public key
- @type key: string
- @ivar servers: the rendezvous servers
- @type servers: list of dns.name.Name objects
- @see: RFC 5205"""
-
- __slots__ = ['hit', 'algorithm', 'key', 'servers']
-
- def __init__(self, rdclass, rdtype, hit, algorithm, key, servers):
- super(HIP, self).__init__(rdclass, rdtype)
- self.hit = hit
- self.algorithm = algorithm
- self.key = key
- self.servers = servers
-
- def to_text(self, origin=None, relativize=True, **kw):
- hit = binascii.hexlify(self.hit).decode()
- key = base64.b64encode(self.key).replace(b'\n', b'').decode()
- text = u''
- servers = []
- for server in self.servers:
- servers.append(server.choose_relativity(origin, relativize))
- if len(servers) > 0:
- text += (u' ' + u' '.join((x.to_unicode() for x in servers)))
- return u'%u %s %s%s' % (self.algorithm, hit, key, text)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- algorithm = tok.get_uint8()
- hit = binascii.unhexlify(tok.get_string().encode())
- if len(hit) > 255:
- raise dns.exception.SyntaxError("HIT too long")
- key = base64.b64decode(tok.get_string().encode())
- servers = []
- while 1:
- token = tok.get()
- if token.is_eol_or_eof():
- break
- server = dns.name.from_text(token.value, origin)
- server.choose_relativity(origin, relativize)
- servers.append(server)
- return cls(rdclass, rdtype, hit, algorithm, key, servers)
-
- def to_wire(self, file, compress=None, origin=None):
- lh = len(self.hit)
- lk = len(self.key)
- file.write(struct.pack("!BBH", lh, self.algorithm, lk))
- file.write(self.hit)
- file.write(self.key)
- for server in self.servers:
- server.to_wire(file, None, origin)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (lh, algorithm, lk) = struct.unpack('!BBH',
- wire[current: current + 4])
- current += 4
- rdlen -= 4
- hit = wire[current: current + lh].unwrap()
- current += lh
- rdlen -= lh
- key = wire[current: current + lk].unwrap()
- current += lk
- rdlen -= lk
- servers = []
- while rdlen > 0:
- (server, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- current += cused
- rdlen -= cused
- if origin is not None:
- server = server.relativize(origin)
- servers.append(server)
- return cls(rdclass, rdtype, hit, algorithm, key, servers)
-
- def choose_relativity(self, origin=None, relativize=True):
- servers = []
- for server in self.servers:
- server = server.choose_relativity(origin, relativize)
- servers.append(server)
- self.servers = servers
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/ISDN.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/ISDN.py
deleted file mode 100644
index f5f5f8b9ea..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/ISDN.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.tokenizer
-from dns._compat import text_type
-
-
-class ISDN(dns.rdata.Rdata):
-
- """ISDN record
-
- @ivar address: the ISDN address
- @type address: string
- @ivar subaddress: the ISDN subaddress (or '' if not present)
- @type subaddress: string
- @see: RFC 1183"""
-
- __slots__ = ['address', 'subaddress']
-
- def __init__(self, rdclass, rdtype, address, subaddress):
- super(ISDN, self).__init__(rdclass, rdtype)
- if isinstance(address, text_type):
- self.address = address.encode()
- else:
- self.address = address
- if isinstance(address, text_type):
- self.subaddress = subaddress.encode()
- else:
- self.subaddress = subaddress
-
- def to_text(self, origin=None, relativize=True, **kw):
- if self.subaddress:
- return '"{}" "{}"'.format(dns.rdata._escapify(self.address),
- dns.rdata._escapify(self.subaddress))
- else:
- return '"%s"' % dns.rdata._escapify(self.address)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- address = tok.get_string()
- t = tok.get()
- if not t.is_eol_or_eof():
- tok.unget(t)
- subaddress = tok.get_string()
- else:
- tok.unget(t)
- subaddress = ''
- tok.get_eol()
- return cls(rdclass, rdtype, address, subaddress)
-
- def to_wire(self, file, compress=None, origin=None):
- l = len(self.address)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.address)
- l = len(self.subaddress)
- if l > 0:
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.subaddress)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- l = wire[current]
- current += 1
- rdlen -= 1
- if l > rdlen:
- raise dns.exception.FormError
- address = wire[current: current + l].unwrap()
- current += l
- rdlen -= l
- if rdlen > 0:
- l = wire[current]
- current += 1
- rdlen -= 1
- if l != rdlen:
- raise dns.exception.FormError
- subaddress = wire[current: current + l].unwrap()
- else:
- subaddress = ''
- return cls(rdclass, rdtype, address, subaddress)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/LOC.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/LOC.py
deleted file mode 100644
index da9bb03a95..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/LOC.py
+++ /dev/null
@@ -1,327 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-from __future__ import division
-
-import struct
-
-import dns.exception
-import dns.rdata
-from dns._compat import long, xrange, round_py2_compat
-
-
-_pows = tuple(long(10**i) for i in range(0, 11))
-
-# default values are in centimeters
-_default_size = 100.0
-_default_hprec = 1000000.0
-_default_vprec = 1000.0
-
-
-def _exponent_of(what, desc):
- if what == 0:
- return 0
- exp = None
- for i in xrange(len(_pows)):
- if what // _pows[i] == long(0):
- exp = i - 1
- break
- if exp is None or exp < 0:
- raise dns.exception.SyntaxError("%s value out of bounds" % desc)
- return exp
-
-
-def _float_to_tuple(what):
- if what < 0:
- sign = -1
- what *= -1
- else:
- sign = 1
- what = round_py2_compat(what * 3600000)
- degrees = int(what // 3600000)
- what -= degrees * 3600000
- minutes = int(what // 60000)
- what -= minutes * 60000
- seconds = int(what // 1000)
- what -= int(seconds * 1000)
- what = int(what)
- return (degrees, minutes, seconds, what, sign)
-
-
-def _tuple_to_float(what):
- value = float(what[0])
- value += float(what[1]) / 60.0
- value += float(what[2]) / 3600.0
- value += float(what[3]) / 3600000.0
- return float(what[4]) * value
-
-
-def _encode_size(what, desc):
- what = long(what)
- exponent = _exponent_of(what, desc) & 0xF
- base = what // pow(10, exponent) & 0xF
- return base * 16 + exponent
-
-
-def _decode_size(what, desc):
- exponent = what & 0x0F
- if exponent > 9:
- raise dns.exception.SyntaxError("bad %s exponent" % desc)
- base = (what & 0xF0) >> 4
- if base > 9:
- raise dns.exception.SyntaxError("bad %s base" % desc)
- return long(base) * pow(10, exponent)
-
-
-class LOC(dns.rdata.Rdata):
-
- """LOC record
-
- @ivar latitude: latitude
- @type latitude: (int, int, int, int, sign) tuple specifying the degrees, minutes,
- seconds, milliseconds, and sign of the coordinate.
- @ivar longitude: longitude
- @type longitude: (int, int, int, int, sign) tuple specifying the degrees,
- minutes, seconds, milliseconds, and sign of the coordinate.
- @ivar altitude: altitude
- @type altitude: float
- @ivar size: size of the sphere
- @type size: float
- @ivar horizontal_precision: horizontal precision
- @type horizontal_precision: float
- @ivar vertical_precision: vertical precision
- @type vertical_precision: float
- @see: RFC 1876"""
-
- __slots__ = ['latitude', 'longitude', 'altitude', 'size',
- 'horizontal_precision', 'vertical_precision']
-
- def __init__(self, rdclass, rdtype, latitude, longitude, altitude,
- size=_default_size, hprec=_default_hprec,
- vprec=_default_vprec):
- """Initialize a LOC record instance.
-
- The parameters I{latitude} and I{longitude} may be either a 4-tuple
- of integers specifying (degrees, minutes, seconds, milliseconds),
- or they may be floating point values specifying the number of
- degrees. The other parameters are floats. Size, horizontal precision,
- and vertical precision are specified in centimeters."""
-
- super(LOC, self).__init__(rdclass, rdtype)
- if isinstance(latitude, int) or isinstance(latitude, long):
- latitude = float(latitude)
- if isinstance(latitude, float):
- latitude = _float_to_tuple(latitude)
- self.latitude = latitude
- if isinstance(longitude, int) or isinstance(longitude, long):
- longitude = float(longitude)
- if isinstance(longitude, float):
- longitude = _float_to_tuple(longitude)
- self.longitude = longitude
- self.altitude = float(altitude)
- self.size = float(size)
- self.horizontal_precision = float(hprec)
- self.vertical_precision = float(vprec)
-
- def to_text(self, origin=None, relativize=True, **kw):
- if self.latitude[4] > 0:
- lat_hemisphere = 'N'
- else:
- lat_hemisphere = 'S'
- if self.longitude[4] > 0:
- long_hemisphere = 'E'
- else:
- long_hemisphere = 'W'
- text = "%d %d %d.%03d %s %d %d %d.%03d %s %0.2fm" % (
- self.latitude[0], self.latitude[1],
- self.latitude[2], self.latitude[3], lat_hemisphere,
- self.longitude[0], self.longitude[1], self.longitude[2],
- self.longitude[3], long_hemisphere,
- self.altitude / 100.0
- )
-
- # do not print default values
- if self.size != _default_size or \
- self.horizontal_precision != _default_hprec or \
- self.vertical_precision != _default_vprec:
- text += " {:0.2f}m {:0.2f}m {:0.2f}m".format(
- self.size / 100.0, self.horizontal_precision / 100.0,
- self.vertical_precision / 100.0
- )
- return text
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- latitude = [0, 0, 0, 0, 1]
- longitude = [0, 0, 0, 0, 1]
- size = _default_size
- hprec = _default_hprec
- vprec = _default_vprec
-
- latitude[0] = tok.get_int()
- t = tok.get_string()
- if t.isdigit():
- latitude[1] = int(t)
- t = tok.get_string()
- if '.' in t:
- (seconds, milliseconds) = t.split('.')
- if not seconds.isdigit():
- raise dns.exception.SyntaxError(
- 'bad latitude seconds value')
- latitude[2] = int(seconds)
- if latitude[2] >= 60:
- raise dns.exception.SyntaxError('latitude seconds >= 60')
- l = len(milliseconds)
- if l == 0 or l > 3 or not milliseconds.isdigit():
- raise dns.exception.SyntaxError(
- 'bad latitude milliseconds value')
- if l == 1:
- m = 100
- elif l == 2:
- m = 10
- else:
- m = 1
- latitude[3] = m * int(milliseconds)
- t = tok.get_string()
- elif t.isdigit():
- latitude[2] = int(t)
- t = tok.get_string()
- if t == 'S':
- latitude[4] = -1
- elif t != 'N':
- raise dns.exception.SyntaxError('bad latitude hemisphere value')
-
- longitude[0] = tok.get_int()
- t = tok.get_string()
- if t.isdigit():
- longitude[1] = int(t)
- t = tok.get_string()
- if '.' in t:
- (seconds, milliseconds) = t.split('.')
- if not seconds.isdigit():
- raise dns.exception.SyntaxError(
- 'bad longitude seconds value')
- longitude[2] = int(seconds)
- if longitude[2] >= 60:
- raise dns.exception.SyntaxError('longitude seconds >= 60')
- l = len(milliseconds)
- if l == 0 or l > 3 or not milliseconds.isdigit():
- raise dns.exception.SyntaxError(
- 'bad longitude milliseconds value')
- if l == 1:
- m = 100
- elif l == 2:
- m = 10
- else:
- m = 1
- longitude[3] = m * int(milliseconds)
- t = tok.get_string()
- elif t.isdigit():
- longitude[2] = int(t)
- t = tok.get_string()
- if t == 'W':
- longitude[4] = -1
- elif t != 'E':
- raise dns.exception.SyntaxError('bad longitude hemisphere value')
-
- t = tok.get_string()
- if t[-1] == 'm':
- t = t[0: -1]
- altitude = float(t) * 100.0 # m -> cm
-
- token = tok.get().unescape()
- if not token.is_eol_or_eof():
- value = token.value
- if value[-1] == 'm':
- value = value[0: -1]
- size = float(value) * 100.0 # m -> cm
- token = tok.get().unescape()
- if not token.is_eol_or_eof():
- value = token.value
- if value[-1] == 'm':
- value = value[0: -1]
- hprec = float(value) * 100.0 # m -> cm
- token = tok.get().unescape()
- if not token.is_eol_or_eof():
- value = token.value
- if value[-1] == 'm':
- value = value[0: -1]
- vprec = float(value) * 100.0 # m -> cm
- tok.get_eol()
-
- return cls(rdclass, rdtype, latitude, longitude, altitude,
- size, hprec, vprec)
-
- def to_wire(self, file, compress=None, origin=None):
- milliseconds = (self.latitude[0] * 3600000 +
- self.latitude[1] * 60000 +
- self.latitude[2] * 1000 +
- self.latitude[3]) * self.latitude[4]
- latitude = long(0x80000000) + milliseconds
- milliseconds = (self.longitude[0] * 3600000 +
- self.longitude[1] * 60000 +
- self.longitude[2] * 1000 +
- self.longitude[3]) * self.longitude[4]
- longitude = long(0x80000000) + milliseconds
- altitude = long(self.altitude) + long(10000000)
- size = _encode_size(self.size, "size")
- hprec = _encode_size(self.horizontal_precision, "horizontal precision")
- vprec = _encode_size(self.vertical_precision, "vertical precision")
- wire = struct.pack("!BBBBIII", 0, size, hprec, vprec, latitude,
- longitude, altitude)
- file.write(wire)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (version, size, hprec, vprec, latitude, longitude, altitude) = \
- struct.unpack("!BBBBIII", wire[current: current + rdlen])
- if latitude > long(0x80000000):
- latitude = float(latitude - long(0x80000000)) / 3600000
- else:
- latitude = -1 * float(long(0x80000000) - latitude) / 3600000
- if latitude < -90.0 or latitude > 90.0:
- raise dns.exception.FormError("bad latitude")
- if longitude > long(0x80000000):
- longitude = float(longitude - long(0x80000000)) / 3600000
- else:
- longitude = -1 * float(long(0x80000000) - longitude) / 3600000
- if longitude < -180.0 or longitude > 180.0:
- raise dns.exception.FormError("bad longitude")
- altitude = float(altitude) - 10000000.0
- size = _decode_size(size, "size")
- hprec = _decode_size(hprec, "horizontal precision")
- vprec = _decode_size(vprec, "vertical precision")
- return cls(rdclass, rdtype, latitude, longitude, altitude,
- size, hprec, vprec)
-
- def _get_float_latitude(self):
- return _tuple_to_float(self.latitude)
-
- def _set_float_latitude(self, value):
- self.latitude = _float_to_tuple(value)
-
- float_latitude = property(_get_float_latitude, _set_float_latitude,
- doc="latitude as a floating point value")
-
- def _get_float_longitude(self):
- return _tuple_to_float(self.longitude)
-
- def _set_float_longitude(self, value):
- self.longitude = _float_to_tuple(value)
-
- float_longitude = property(_get_float_longitude, _set_float_longitude,
- doc="longitude as a floating point value")
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/MX.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/MX.py
deleted file mode 100644
index 0a06494f73..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/MX.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.mxbase
-
-
-class MX(dns.rdtypes.mxbase.MXBase):
-
- """MX record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NS.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NS.py
deleted file mode 100644
index f9fcf637f7..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NS.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.nsbase
-
-
-class NS(dns.rdtypes.nsbase.NSBase):
-
- """NS record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC.py
deleted file mode 100644
index 4e3da7296b..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.rdatatype
-import dns.name
-from dns._compat import xrange
-
-
-class NSEC(dns.rdata.Rdata):
-
- """NSEC record
-
- @ivar next: the next name
- @type next: dns.name.Name object
- @ivar windows: the windowed bitmap list
- @type windows: list of (window number, string) tuples"""
-
- __slots__ = ['next', 'windows']
-
- def __init__(self, rdclass, rdtype, next, windows):
- super(NSEC, self).__init__(rdclass, rdtype)
- self.next = next
- self.windows = windows
-
- def to_text(self, origin=None, relativize=True, **kw):
- next = self.next.choose_relativity(origin, relativize)
- text = ''
- for (window, bitmap) in self.windows:
- bits = []
- for i in xrange(0, len(bitmap)):
- byte = bitmap[i]
- for j in xrange(0, 8):
- if byte & (0x80 >> j):
- bits.append(dns.rdatatype.to_text(window * 256 +
- i * 8 + j))
- text += (' ' + ' '.join(bits))
- return '{}{}'.format(next, text)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- next = tok.get_name()
- next = next.choose_relativity(origin, relativize)
- rdtypes = []
- while 1:
- token = tok.get().unescape()
- if token.is_eol_or_eof():
- break
- nrdtype = dns.rdatatype.from_text(token.value)
- if nrdtype == 0:
- raise dns.exception.SyntaxError("NSEC with bit 0")
- if nrdtype > 65535:
- raise dns.exception.SyntaxError("NSEC with bit > 65535")
- rdtypes.append(nrdtype)
- rdtypes.sort()
- window = 0
- octets = 0
- prior_rdtype = 0
- bitmap = bytearray(b'\0' * 32)
- windows = []
- for nrdtype in rdtypes:
- if nrdtype == prior_rdtype:
- continue
- prior_rdtype = nrdtype
- new_window = nrdtype // 256
- if new_window != window:
- windows.append((window, bitmap[0:octets]))
- bitmap = bytearray(b'\0' * 32)
- window = new_window
- offset = nrdtype % 256
- byte = offset // 8
- bit = offset % 8
- octets = byte + 1
- bitmap[byte] = bitmap[byte] | (0x80 >> bit)
-
- windows.append((window, bitmap[0:octets]))
- return cls(rdclass, rdtype, next, windows)
-
- def to_wire(self, file, compress=None, origin=None):
- self.next.to_wire(file, None, origin)
- for (window, bitmap) in self.windows:
- file.write(struct.pack('!BB', window, len(bitmap)))
- file.write(bitmap)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (next, cused) = dns.name.from_wire(wire[: current + rdlen], current)
- current += cused
- rdlen -= cused
- windows = []
- while rdlen > 0:
- if rdlen < 3:
- raise dns.exception.FormError("NSEC too short")
- window = wire[current]
- octets = wire[current + 1]
- if octets == 0 or octets > 32:
- raise dns.exception.FormError("bad NSEC octets")
- current += 2
- rdlen -= 2
- if rdlen < octets:
- raise dns.exception.FormError("bad NSEC bitmap length")
- bitmap = bytearray(wire[current: current + octets].unwrap())
- current += octets
- rdlen -= octets
- windows.append((window, bitmap))
- if origin is not None:
- next = next.relativize(origin)
- return cls(rdclass, rdtype, next, windows)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.next = self.next.choose_relativity(origin, relativize)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC3.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC3.py
deleted file mode 100644
index 1c281c4a4d..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC3.py
+++ /dev/null
@@ -1,196 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2004-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import base64
-import binascii
-import string
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.rdatatype
-from dns._compat import xrange, text_type, PY3
-
-# pylint: disable=deprecated-string-function
-if PY3:
- b32_hex_to_normal = bytes.maketrans(b'0123456789ABCDEFGHIJKLMNOPQRSTUV',
- b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567')
- b32_normal_to_hex = bytes.maketrans(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',
- b'0123456789ABCDEFGHIJKLMNOPQRSTUV')
-else:
- b32_hex_to_normal = string.maketrans('0123456789ABCDEFGHIJKLMNOPQRSTUV',
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567')
- b32_normal_to_hex = string.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',
- '0123456789ABCDEFGHIJKLMNOPQRSTUV')
-# pylint: enable=deprecated-string-function
-
-
-# hash algorithm constants
-SHA1 = 1
-
-# flag constants
-OPTOUT = 1
-
-
-class NSEC3(dns.rdata.Rdata):
-
- """NSEC3 record
-
- @ivar algorithm: the hash algorithm number
- @type algorithm: int
- @ivar flags: the flags
- @type flags: int
- @ivar iterations: the number of iterations
- @type iterations: int
- @ivar salt: the salt
- @type salt: string
- @ivar next: the next name hash
- @type next: string
- @ivar windows: the windowed bitmap list
- @type windows: list of (window number, string) tuples"""
-
- __slots__ = ['algorithm', 'flags', 'iterations', 'salt', 'next', 'windows']
-
- def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt,
- next, windows):
- super(NSEC3, self).__init__(rdclass, rdtype)
- self.algorithm = algorithm
- self.flags = flags
- self.iterations = iterations
- if isinstance(salt, text_type):
- self.salt = salt.encode()
- else:
- self.salt = salt
- self.next = next
- self.windows = windows
-
- def to_text(self, origin=None, relativize=True, **kw):
- next = base64.b32encode(self.next).translate(
- b32_normal_to_hex).lower().decode()
- if self.salt == b'':
- salt = '-'
- else:
- salt = binascii.hexlify(self.salt).decode()
- text = u''
- for (window, bitmap) in self.windows:
- bits = []
- for i in xrange(0, len(bitmap)):
- byte = bitmap[i]
- for j in xrange(0, 8):
- if byte & (0x80 >> j):
- bits.append(dns.rdatatype.to_text(window * 256 +
- i * 8 + j))
- text += (u' ' + u' '.join(bits))
- return u'%u %u %u %s %s%s' % (self.algorithm, self.flags,
- self.iterations, salt, next, text)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- algorithm = tok.get_uint8()
- flags = tok.get_uint8()
- iterations = tok.get_uint16()
- salt = tok.get_string()
- if salt == u'-':
- salt = b''
- else:
- salt = binascii.unhexlify(salt.encode('ascii'))
- next = tok.get_string().encode(
- 'ascii').upper().translate(b32_hex_to_normal)
- next = base64.b32decode(next)
- rdtypes = []
- while 1:
- token = tok.get().unescape()
- if token.is_eol_or_eof():
- break
- nrdtype = dns.rdatatype.from_text(token.value)
- if nrdtype == 0:
- raise dns.exception.SyntaxError("NSEC3 with bit 0")
- if nrdtype > 65535:
- raise dns.exception.SyntaxError("NSEC3 with bit > 65535")
- rdtypes.append(nrdtype)
- rdtypes.sort()
- window = 0
- octets = 0
- prior_rdtype = 0
- bitmap = bytearray(b'\0' * 32)
- windows = []
- for nrdtype in rdtypes:
- if nrdtype == prior_rdtype:
- continue
- prior_rdtype = nrdtype
- new_window = nrdtype // 256
- if new_window != window:
- if octets != 0:
- windows.append((window, bitmap[0:octets]))
- bitmap = bytearray(b'\0' * 32)
- window = new_window
- offset = nrdtype % 256
- byte = offset // 8
- bit = offset % 8
- octets = byte + 1
- bitmap[byte] = bitmap[byte] | (0x80 >> bit)
- if octets != 0:
- windows.append((window, bitmap[0:octets]))
- return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next,
- windows)
-
- def to_wire(self, file, compress=None, origin=None):
- l = len(self.salt)
- file.write(struct.pack("!BBHB", self.algorithm, self.flags,
- self.iterations, l))
- file.write(self.salt)
- l = len(self.next)
- file.write(struct.pack("!B", l))
- file.write(self.next)
- for (window, bitmap) in self.windows:
- file.write(struct.pack("!BB", window, len(bitmap)))
- file.write(bitmap)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (algorithm, flags, iterations, slen) = \
- struct.unpack('!BBHB', wire[current: current + 5])
-
- current += 5
- rdlen -= 5
- salt = wire[current: current + slen].unwrap()
- current += slen
- rdlen -= slen
- nlen = wire[current]
- current += 1
- rdlen -= 1
- next = wire[current: current + nlen].unwrap()
- current += nlen
- rdlen -= nlen
- windows = []
- while rdlen > 0:
- if rdlen < 3:
- raise dns.exception.FormError("NSEC3 too short")
- window = wire[current]
- octets = wire[current + 1]
- if octets == 0 or octets > 32:
- raise dns.exception.FormError("bad NSEC3 octets")
- current += 2
- rdlen -= 2
- if rdlen < octets:
- raise dns.exception.FormError("bad NSEC3 bitmap length")
- bitmap = bytearray(wire[current: current + octets].unwrap())
- current += octets
- rdlen -= octets
- windows.append((window, bitmap))
- return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next,
- windows)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC3PARAM.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC3PARAM.py
deleted file mode 100644
index 87c36e5675..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/NSEC3PARAM.py
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-import binascii
-
-import dns.exception
-import dns.rdata
-from dns._compat import text_type
-
-
-class NSEC3PARAM(dns.rdata.Rdata):
-
- """NSEC3PARAM record
-
- @ivar algorithm: the hash algorithm number
- @type algorithm: int
- @ivar flags: the flags
- @type flags: int
- @ivar iterations: the number of iterations
- @type iterations: int
- @ivar salt: the salt
- @type salt: string"""
-
- __slots__ = ['algorithm', 'flags', 'iterations', 'salt']
-
- def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt):
- super(NSEC3PARAM, self).__init__(rdclass, rdtype)
- self.algorithm = algorithm
- self.flags = flags
- self.iterations = iterations
- if isinstance(salt, text_type):
- self.salt = salt.encode()
- else:
- self.salt = salt
-
- def to_text(self, origin=None, relativize=True, **kw):
- if self.salt == b'':
- salt = '-'
- else:
- salt = binascii.hexlify(self.salt).decode()
- return '%u %u %u %s' % (self.algorithm, self.flags, self.iterations,
- salt)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- algorithm = tok.get_uint8()
- flags = tok.get_uint8()
- iterations = tok.get_uint16()
- salt = tok.get_string()
- if salt == '-':
- salt = ''
- else:
- salt = binascii.unhexlify(salt.encode())
- tok.get_eol()
- return cls(rdclass, rdtype, algorithm, flags, iterations, salt)
-
- def to_wire(self, file, compress=None, origin=None):
- l = len(self.salt)
- file.write(struct.pack("!BBHB", self.algorithm, self.flags,
- self.iterations, l))
- file.write(self.salt)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (algorithm, flags, iterations, slen) = \
- struct.unpack('!BBHB',
- wire[current: current + 5])
- current += 5
- rdlen -= 5
- salt = wire[current: current + slen].unwrap()
- current += slen
- rdlen -= slen
- if rdlen != 0:
- raise dns.exception.FormError
- return cls(rdclass, rdtype, algorithm, flags, iterations, salt)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/OPENPGPKEY.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/OPENPGPKEY.py
deleted file mode 100644
index a066cf98df..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/OPENPGPKEY.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2016 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import base64
-
-import dns.exception
-import dns.rdata
-import dns.tokenizer
-
-class OPENPGPKEY(dns.rdata.Rdata):
-
- """OPENPGPKEY record
-
- @ivar key: the key
- @type key: bytes
- @see: RFC 7929
- """
-
- def __init__(self, rdclass, rdtype, key):
- super(OPENPGPKEY, self).__init__(rdclass, rdtype)
- self.key = key
-
- def to_text(self, origin=None, relativize=True, **kw):
- return dns.rdata._base64ify(self.key)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- chunks.append(t.value.encode())
- b64 = b''.join(chunks)
- key = base64.b64decode(b64)
- return cls(rdclass, rdtype, key)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(self.key)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- key = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, key)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/PTR.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/PTR.py
deleted file mode 100644
index 20cd50761d..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/PTR.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.nsbase
-
-
-class PTR(dns.rdtypes.nsbase.NSBase):
-
- """PTR record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RP.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RP.py
deleted file mode 100644
index 8f07be9071..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RP.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.exception
-import dns.rdata
-import dns.name
-
-
-class RP(dns.rdata.Rdata):
-
- """RP record
-
- @ivar mbox: The responsible person's mailbox
- @type mbox: dns.name.Name object
- @ivar txt: The owner name of a node with TXT records, or the root name
- if no TXT records are associated with this RP.
- @type txt: dns.name.Name object
- @see: RFC 1183"""
-
- __slots__ = ['mbox', 'txt']
-
- def __init__(self, rdclass, rdtype, mbox, txt):
- super(RP, self).__init__(rdclass, rdtype)
- self.mbox = mbox
- self.txt = txt
-
- def to_text(self, origin=None, relativize=True, **kw):
- mbox = self.mbox.choose_relativity(origin, relativize)
- txt = self.txt.choose_relativity(origin, relativize)
- return "{} {}".format(str(mbox), str(txt))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- mbox = tok.get_name()
- txt = tok.get_name()
- mbox = mbox.choose_relativity(origin, relativize)
- txt = txt.choose_relativity(origin, relativize)
- tok.get_eol()
- return cls(rdclass, rdtype, mbox, txt)
-
- def to_wire(self, file, compress=None, origin=None):
- self.mbox.to_wire(file, None, origin)
- self.txt.to_wire(file, None, origin)
-
- def to_digestable(self, origin=None):
- return self.mbox.to_digestable(origin) + \
- self.txt.to_digestable(origin)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (mbox, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- current += cused
- rdlen -= cused
- if rdlen <= 0:
- raise dns.exception.FormError
- (txt, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- if cused != rdlen:
- raise dns.exception.FormError
- if origin is not None:
- mbox = mbox.relativize(origin)
- txt = txt.relativize(origin)
- return cls(rdclass, rdtype, mbox, txt)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.mbox = self.mbox.choose_relativity(origin, relativize)
- self.txt = self.txt.choose_relativity(origin, relativize)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RRSIG.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RRSIG.py
deleted file mode 100644
index d3756ece4e..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RRSIG.py
+++ /dev/null
@@ -1,158 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import base64
-import calendar
-import struct
-import time
-
-import dns.dnssec
-import dns.exception
-import dns.rdata
-import dns.rdatatype
-
-
-class BadSigTime(dns.exception.DNSException):
-
- """Time in DNS SIG or RRSIG resource record cannot be parsed."""
-
-
-def sigtime_to_posixtime(what):
- if len(what) != 14:
- raise BadSigTime
- year = int(what[0:4])
- month = int(what[4:6])
- day = int(what[6:8])
- hour = int(what[8:10])
- minute = int(what[10:12])
- second = int(what[12:14])
- return calendar.timegm((year, month, day, hour, minute, second,
- 0, 0, 0))
-
-
-def posixtime_to_sigtime(what):
- return time.strftime('%Y%m%d%H%M%S', time.gmtime(what))
-
-
-class RRSIG(dns.rdata.Rdata):
-
- """RRSIG record
-
- @ivar type_covered: the rdata type this signature covers
- @type type_covered: int
- @ivar algorithm: the algorithm used for the sig
- @type algorithm: int
- @ivar labels: number of labels
- @type labels: int
- @ivar original_ttl: the original TTL
- @type original_ttl: long
- @ivar expiration: signature expiration time
- @type expiration: long
- @ivar inception: signature inception time
- @type inception: long
- @ivar key_tag: the key tag
- @type key_tag: int
- @ivar signer: the signer
- @type signer: dns.name.Name object
- @ivar signature: the signature
- @type signature: string"""
-
- __slots__ = ['type_covered', 'algorithm', 'labels', 'original_ttl',
- 'expiration', 'inception', 'key_tag', 'signer',
- 'signature']
-
- def __init__(self, rdclass, rdtype, type_covered, algorithm, labels,
- original_ttl, expiration, inception, key_tag, signer,
- signature):
- super(RRSIG, self).__init__(rdclass, rdtype)
- self.type_covered = type_covered
- self.algorithm = algorithm
- self.labels = labels
- self.original_ttl = original_ttl
- self.expiration = expiration
- self.inception = inception
- self.key_tag = key_tag
- self.signer = signer
- self.signature = signature
-
- def covers(self):
- return self.type_covered
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '%s %d %d %d %s %s %d %s %s' % (
- dns.rdatatype.to_text(self.type_covered),
- self.algorithm,
- self.labels,
- self.original_ttl,
- posixtime_to_sigtime(self.expiration),
- posixtime_to_sigtime(self.inception),
- self.key_tag,
- self.signer.choose_relativity(origin, relativize),
- dns.rdata._base64ify(self.signature)
- )
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- type_covered = dns.rdatatype.from_text(tok.get_string())
- algorithm = dns.dnssec.algorithm_from_text(tok.get_string())
- labels = tok.get_int()
- original_ttl = tok.get_ttl()
- expiration = sigtime_to_posixtime(tok.get_string())
- inception = sigtime_to_posixtime(tok.get_string())
- key_tag = tok.get_int()
- signer = tok.get_name()
- signer = signer.choose_relativity(origin, relativize)
- chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- chunks.append(t.value.encode())
- b64 = b''.join(chunks)
- signature = base64.b64decode(b64)
- return cls(rdclass, rdtype, type_covered, algorithm, labels,
- original_ttl, expiration, inception, key_tag, signer,
- signature)
-
- def to_wire(self, file, compress=None, origin=None):
- header = struct.pack('!HBBIIIH', self.type_covered,
- self.algorithm, self.labels,
- self.original_ttl, self.expiration,
- self.inception, self.key_tag)
- file.write(header)
- self.signer.to_wire(file, None, origin)
- file.write(self.signature)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- header = struct.unpack('!HBBIIIH', wire[current: current + 18])
- current += 18
- rdlen -= 18
- (signer, cused) = dns.name.from_wire(wire[: current + rdlen], current)
- current += cused
- rdlen -= cused
- if origin is not None:
- signer = signer.relativize(origin)
- signature = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, header[0], header[1], header[2],
- header[3], header[4], header[5], header[6], signer,
- signature)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.signer = self.signer.choose_relativity(origin, relativize)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RT.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RT.py
deleted file mode 100644
index d0feb79e9d..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/RT.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.mxbase
-
-
-class RT(dns.rdtypes.mxbase.UncompressedDowncasingMX):
-
- """RT record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SOA.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SOA.py
deleted file mode 100644
index aec81cad8a..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SOA.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.name
-
-
-class SOA(dns.rdata.Rdata):
-
- """SOA record
-
- @ivar mname: the SOA MNAME (master name) field
- @type mname: dns.name.Name object
- @ivar rname: the SOA RNAME (responsible name) field
- @type rname: dns.name.Name object
- @ivar serial: The zone's serial number
- @type serial: int
- @ivar refresh: The zone's refresh value (in seconds)
- @type refresh: int
- @ivar retry: The zone's retry value (in seconds)
- @type retry: int
- @ivar expire: The zone's expiration value (in seconds)
- @type expire: int
- @ivar minimum: The zone's negative caching time (in seconds, called
- "minimum" for historical reasons)
- @type minimum: int
- @see: RFC 1035"""
-
- __slots__ = ['mname', 'rname', 'serial', 'refresh', 'retry', 'expire',
- 'minimum']
-
- def __init__(self, rdclass, rdtype, mname, rname, serial, refresh, retry,
- expire, minimum):
- super(SOA, self).__init__(rdclass, rdtype)
- self.mname = mname
- self.rname = rname
- self.serial = serial
- self.refresh = refresh
- self.retry = retry
- self.expire = expire
- self.minimum = minimum
-
- def to_text(self, origin=None, relativize=True, **kw):
- mname = self.mname.choose_relativity(origin, relativize)
- rname = self.rname.choose_relativity(origin, relativize)
- return '%s %s %d %d %d %d %d' % (
- mname, rname, self.serial, self.refresh, self.retry,
- self.expire, self.minimum)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- mname = tok.get_name()
- rname = tok.get_name()
- mname = mname.choose_relativity(origin, relativize)
- rname = rname.choose_relativity(origin, relativize)
- serial = tok.get_uint32()
- refresh = tok.get_ttl()
- retry = tok.get_ttl()
- expire = tok.get_ttl()
- minimum = tok.get_ttl()
- tok.get_eol()
- return cls(rdclass, rdtype, mname, rname, serial, refresh, retry,
- expire, minimum)
-
- def to_wire(self, file, compress=None, origin=None):
- self.mname.to_wire(file, compress, origin)
- self.rname.to_wire(file, compress, origin)
- five_ints = struct.pack('!IIIII', self.serial, self.refresh,
- self.retry, self.expire, self.minimum)
- file.write(five_ints)
-
- def to_digestable(self, origin=None):
- return self.mname.to_digestable(origin) + \
- self.rname.to_digestable(origin) + \
- struct.pack('!IIIII', self.serial, self.refresh,
- self.retry, self.expire, self.minimum)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (mname, cused) = dns.name.from_wire(wire[: current + rdlen], current)
- current += cused
- rdlen -= cused
- (rname, cused) = dns.name.from_wire(wire[: current + rdlen], current)
- current += cused
- rdlen -= cused
- if rdlen != 20:
- raise dns.exception.FormError
- five_ints = struct.unpack('!IIIII',
- wire[current: current + rdlen])
- if origin is not None:
- mname = mname.relativize(origin)
- rname = rname.relativize(origin)
- return cls(rdclass, rdtype, mname, rname,
- five_ints[0], five_ints[1], five_ints[2], five_ints[3],
- five_ints[4])
-
- def choose_relativity(self, origin=None, relativize=True):
- self.mname = self.mname.choose_relativity(origin, relativize)
- self.rname = self.rname.choose_relativity(origin, relativize)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SPF.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SPF.py
deleted file mode 100644
index 41dee62387..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SPF.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.txtbase
-
-
-class SPF(dns.rdtypes.txtbase.TXTBase):
-
- """SPF record
-
- @see: RFC 4408"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SSHFP.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SSHFP.py
deleted file mode 100644
index c18311e906..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/SSHFP.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-import binascii
-
-import dns.rdata
-import dns.rdatatype
-
-
-class SSHFP(dns.rdata.Rdata):
-
- """SSHFP record
-
- @ivar algorithm: the algorithm
- @type algorithm: int
- @ivar fp_type: the digest type
- @type fp_type: int
- @ivar fingerprint: the fingerprint
- @type fingerprint: string
- @see: draft-ietf-secsh-dns-05.txt"""
-
- __slots__ = ['algorithm', 'fp_type', 'fingerprint']
-
- def __init__(self, rdclass, rdtype, algorithm, fp_type,
- fingerprint):
- super(SSHFP, self).__init__(rdclass, rdtype)
- self.algorithm = algorithm
- self.fp_type = fp_type
- self.fingerprint = fingerprint
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '%d %d %s' % (self.algorithm,
- self.fp_type,
- dns.rdata._hexify(self.fingerprint,
- chunksize=128))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- algorithm = tok.get_uint8()
- fp_type = tok.get_uint8()
- chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- chunks.append(t.value.encode())
- fingerprint = b''.join(chunks)
- fingerprint = binascii.unhexlify(fingerprint)
- return cls(rdclass, rdtype, algorithm, fp_type, fingerprint)
-
- def to_wire(self, file, compress=None, origin=None):
- header = struct.pack("!BB", self.algorithm, self.fp_type)
- file.write(header)
- file.write(self.fingerprint)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- header = struct.unpack("!BB", wire[current: current + 2])
- current += 2
- rdlen -= 2
- fingerprint = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, header[0], header[1], fingerprint)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/TLSA.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/TLSA.py
deleted file mode 100644
index a135c2b3da..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/TLSA.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-import binascii
-
-import dns.rdata
-import dns.rdatatype
-
-
-class TLSA(dns.rdata.Rdata):
-
- """TLSA record
-
- @ivar usage: The certificate usage
- @type usage: int
- @ivar selector: The selector field
- @type selector: int
- @ivar mtype: The 'matching type' field
- @type mtype: int
- @ivar cert: The 'Certificate Association Data' field
- @type cert: string
- @see: RFC 6698"""
-
- __slots__ = ['usage', 'selector', 'mtype', 'cert']
-
- def __init__(self, rdclass, rdtype, usage, selector,
- mtype, cert):
- super(TLSA, self).__init__(rdclass, rdtype)
- self.usage = usage
- self.selector = selector
- self.mtype = mtype
- self.cert = cert
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '%d %d %d %s' % (self.usage,
- self.selector,
- self.mtype,
- dns.rdata._hexify(self.cert,
- chunksize=128))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- usage = tok.get_uint8()
- selector = tok.get_uint8()
- mtype = tok.get_uint8()
- cert_chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- cert_chunks.append(t.value.encode())
- cert = b''.join(cert_chunks)
- cert = binascii.unhexlify(cert)
- return cls(rdclass, rdtype, usage, selector, mtype, cert)
-
- def to_wire(self, file, compress=None, origin=None):
- header = struct.pack("!BBB", self.usage, self.selector, self.mtype)
- file.write(header)
- file.write(self.cert)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- header = struct.unpack("!BBB", wire[current: current + 3])
- current += 3
- rdlen -= 3
- cert = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, header[0], header[1], header[2], cert)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/TXT.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/TXT.py
deleted file mode 100644
index c5ae919c5e..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/TXT.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.txtbase
-
-
-class TXT(dns.rdtypes.txtbase.TXTBase):
-
- """TXT record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/URI.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/URI.py
deleted file mode 100644
index f5b65ed6a9..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/URI.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-# Copyright (C) 2015 Red Hat, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.name
-from dns._compat import text_type
-
-
-class URI(dns.rdata.Rdata):
-
- """URI record
-
- @ivar priority: the priority
- @type priority: int
- @ivar weight: the weight
- @type weight: int
- @ivar target: the target host
- @type target: dns.name.Name object
- @see: draft-faltstrom-uri-13"""
-
- __slots__ = ['priority', 'weight', 'target']
-
- def __init__(self, rdclass, rdtype, priority, weight, target):
- super(URI, self).__init__(rdclass, rdtype)
- self.priority = priority
- self.weight = weight
- if len(target) < 1:
- raise dns.exception.SyntaxError("URI target cannot be empty")
- if isinstance(target, text_type):
- self.target = target.encode()
- else:
- self.target = target
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '%d %d "%s"' % (self.priority, self.weight,
- self.target.decode())
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- priority = tok.get_uint16()
- weight = tok.get_uint16()
- target = tok.get().unescape()
- if not (target.is_quoted_string() or target.is_identifier()):
- raise dns.exception.SyntaxError("URI target must be a string")
- tok.get_eol()
- return cls(rdclass, rdtype, priority, weight, target.value)
-
- def to_wire(self, file, compress=None, origin=None):
- two_ints = struct.pack("!HH", self.priority, self.weight)
- file.write(two_ints)
- file.write(self.target)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- if rdlen < 5:
- raise dns.exception.FormError('URI RR is shorter than 5 octets')
-
- (priority, weight) = struct.unpack('!HH', wire[current: current + 4])
- current += 4
- rdlen -= 4
- target = wire[current: current + rdlen]
- current += rdlen
-
- return cls(rdclass, rdtype, priority, weight, target)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/X25.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/X25.py
deleted file mode 100644
index e530a2c2a6..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/X25.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.tokenizer
-from dns._compat import text_type
-
-
-class X25(dns.rdata.Rdata):
-
- """X25 record
-
- @ivar address: the PSDN address
- @type address: string
- @see: RFC 1183"""
-
- __slots__ = ['address']
-
- def __init__(self, rdclass, rdtype, address):
- super(X25, self).__init__(rdclass, rdtype)
- if isinstance(address, text_type):
- self.address = address.encode()
- else:
- self.address = address
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '"%s"' % dns.rdata._escapify(self.address)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- address = tok.get_string()
- tok.get_eol()
- return cls(rdclass, rdtype, address)
-
- def to_wire(self, file, compress=None, origin=None):
- l = len(self.address)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(self.address)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- l = wire[current]
- current += 1
- rdlen -= 1
- if l != rdlen:
- raise dns.exception.FormError
- address = wire[current: current + l].unwrap()
- return cls(rdclass, rdtype, address)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/__init__.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/__init__.py
deleted file mode 100644
index ca41ef8055..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/ANY/__init__.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Class ANY (generic) rdata type classes."""
-
-__all__ = [
- 'AFSDB',
- 'AVC',
- 'CAA',
- 'CDNSKEY',
- 'CDS',
- 'CERT',
- 'CNAME',
- 'CSYNC',
- 'DLV',
- 'DNAME',
- 'DNSKEY',
- 'DS',
- 'EUI48',
- 'EUI64',
- 'GPOS',
- 'HINFO',
- 'HIP',
- 'ISDN',
- 'LOC',
- 'MX',
- 'NS',
- 'NSEC',
- 'NSEC3',
- 'NSEC3PARAM',
- 'OPENPGPKEY',
- 'PTR',
- 'RP',
- 'RRSIG',
- 'RT',
- 'SOA',
- 'SPF',
- 'SSHFP',
- 'TLSA',
- 'TXT',
- 'URI',
- 'X25',
-]
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/CH/A.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/CH/A.py
deleted file mode 100644
index e65d192d82..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/CH/A.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.mxbase
-import struct
-
-class A(dns.rdtypes.mxbase.MXBase):
-
- """A record for Chaosnet
- @ivar domain: the domain of the address
- @type domain: dns.name.Name object
- @ivar address: the 16-bit address
- @type address: int"""
-
- __slots__ = ['domain', 'address']
-
- def __init__(self, rdclass, rdtype, address, domain):
- super(A, self).__init__(rdclass, rdtype, address, domain)
- self.domain = domain
- self.address = address
-
- def to_text(self, origin=None, relativize=True, **kw):
- domain = self.domain.choose_relativity(origin, relativize)
- return '%s %o' % (domain, self.address)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- domain = tok.get_name()
- address = tok.get_uint16(base=8)
- domain = domain.choose_relativity(origin, relativize)
- tok.get_eol()
- return cls(rdclass, rdtype, address, domain)
-
- def to_wire(self, file, compress=None, origin=None):
- self.domain.to_wire(file, compress, origin)
- pref = struct.pack("!H", self.address)
- file.write(pref)
-
- def to_digestable(self, origin=None):
- return self.domain.to_digestable(origin) + \
- struct.pack("!H", self.address)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (domain, cused) = dns.name.from_wire(wire[: current + rdlen-2],
- current)
- current += cused
- (address,) = struct.unpack('!H', wire[current: current + 2])
- if cused+2 != rdlen:
- raise dns.exception.FormError
- if origin is not None:
- domain = domain.relativize(origin)
- return cls(rdclass, rdtype, address, domain)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.domain = self.domain.choose_relativity(origin, relativize)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/CH/__init__.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/CH/__init__.py
deleted file mode 100644
index 7184a7332a..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/CH/__init__.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Class CH rdata type classes."""
-
-__all__ = [
- 'A',
-]
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/A.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/A.py
deleted file mode 100644
index 8998982462..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/A.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.exception
-import dns.ipv4
-import dns.rdata
-import dns.tokenizer
-
-
-class A(dns.rdata.Rdata):
-
- """A record.
-
- @ivar address: an IPv4 address
- @type address: string (in the standard "dotted quad" format)"""
-
- __slots__ = ['address']
-
- def __init__(self, rdclass, rdtype, address):
- super(A, self).__init__(rdclass, rdtype)
- # check that it's OK
- dns.ipv4.inet_aton(address)
- self.address = address
-
- def to_text(self, origin=None, relativize=True, **kw):
- return self.address
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- address = tok.get_identifier()
- tok.get_eol()
- return cls(rdclass, rdtype, address)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(dns.ipv4.inet_aton(self.address))
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- address = dns.ipv4.inet_ntoa(wire[current: current + rdlen])
- return cls(rdclass, rdtype, address)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/AAAA.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/AAAA.py
deleted file mode 100644
index a77c5bf2a5..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/AAAA.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.exception
-import dns.inet
-import dns.rdata
-import dns.tokenizer
-
-
-class AAAA(dns.rdata.Rdata):
-
- """AAAA record.
-
- @ivar address: an IPv6 address
- @type address: string (in the standard IPv6 format)"""
-
- __slots__ = ['address']
-
- def __init__(self, rdclass, rdtype, address):
- super(AAAA, self).__init__(rdclass, rdtype)
- # check that it's OK
- dns.inet.inet_pton(dns.inet.AF_INET6, address)
- self.address = address
-
- def to_text(self, origin=None, relativize=True, **kw):
- return self.address
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- address = tok.get_identifier()
- tok.get_eol()
- return cls(rdclass, rdtype, address)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.address))
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- address = dns.inet.inet_ntop(dns.inet.AF_INET6,
- wire[current: current + rdlen])
- return cls(rdclass, rdtype, address)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/APL.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/APL.py
deleted file mode 100644
index 48faf88ab7..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/APL.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import binascii
-import codecs
-import struct
-
-import dns.exception
-import dns.inet
-import dns.rdata
-import dns.tokenizer
-from dns._compat import xrange, maybe_chr
-
-
-class APLItem(object):
-
- """An APL list item.
-
- @ivar family: the address family (IANA address family registry)
- @type family: int
- @ivar negation: is this item negated?
- @type negation: bool
- @ivar address: the address
- @type address: string
- @ivar prefix: the prefix length
- @type prefix: int
- """
-
- __slots__ = ['family', 'negation', 'address', 'prefix']
-
- def __init__(self, family, negation, address, prefix):
- self.family = family
- self.negation = negation
- self.address = address
- self.prefix = prefix
-
- def __str__(self):
- if self.negation:
- return "!%d:%s/%s" % (self.family, self.address, self.prefix)
- else:
- return "%d:%s/%s" % (self.family, self.address, self.prefix)
-
- def to_wire(self, file):
- if self.family == 1:
- address = dns.inet.inet_pton(dns.inet.AF_INET, self.address)
- elif self.family == 2:
- address = dns.inet.inet_pton(dns.inet.AF_INET6, self.address)
- else:
- address = binascii.unhexlify(self.address)
- #
- # Truncate least significant zero bytes.
- #
- last = 0
- for i in xrange(len(address) - 1, -1, -1):
- if address[i] != maybe_chr(0):
- last = i + 1
- break
- address = address[0: last]
- l = len(address)
- assert l < 128
- if self.negation:
- l |= 0x80
- header = struct.pack('!HBB', self.family, self.prefix, l)
- file.write(header)
- file.write(address)
-
-
-class APL(dns.rdata.Rdata):
-
- """APL record.
-
- @ivar items: a list of APL items
- @type items: list of APL_Item
- @see: RFC 3123"""
-
- __slots__ = ['items']
-
- def __init__(self, rdclass, rdtype, items):
- super(APL, self).__init__(rdclass, rdtype)
- self.items = items
-
- def to_text(self, origin=None, relativize=True, **kw):
- return ' '.join(map(str, self.items))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- items = []
- while 1:
- token = tok.get().unescape()
- if token.is_eol_or_eof():
- break
- item = token.value
- if item[0] == '!':
- negation = True
- item = item[1:]
- else:
- negation = False
- (family, rest) = item.split(':', 1)
- family = int(family)
- (address, prefix) = rest.split('/', 1)
- prefix = int(prefix)
- item = APLItem(family, negation, address, prefix)
- items.append(item)
-
- return cls(rdclass, rdtype, items)
-
- def to_wire(self, file, compress=None, origin=None):
- for item in self.items:
- item.to_wire(file)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
-
- items = []
- while 1:
- if rdlen == 0:
- break
- if rdlen < 4:
- raise dns.exception.FormError
- header = struct.unpack('!HBB', wire[current: current + 4])
- afdlen = header[2]
- if afdlen > 127:
- negation = True
- afdlen -= 128
- else:
- negation = False
- current += 4
- rdlen -= 4
- if rdlen < afdlen:
- raise dns.exception.FormError
- address = wire[current: current + afdlen].unwrap()
- l = len(address)
- if header[0] == 1:
- if l < 4:
- address += b'\x00' * (4 - l)
- address = dns.inet.inet_ntop(dns.inet.AF_INET, address)
- elif header[0] == 2:
- if l < 16:
- address += b'\x00' * (16 - l)
- address = dns.inet.inet_ntop(dns.inet.AF_INET6, address)
- else:
- #
- # This isn't really right according to the RFC, but it
- # seems better than throwing an exception
- #
- address = codecs.encode(address, 'hex_codec')
- current += afdlen
- rdlen -= afdlen
- item = APLItem(header[0], negation, address, header[1])
- items.append(item)
- return cls(rdclass, rdtype, items)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/DHCID.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/DHCID.py
deleted file mode 100644
index cec64590f0..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/DHCID.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import base64
-
-import dns.exception
-
-
-class DHCID(dns.rdata.Rdata):
-
- """DHCID record
-
- @ivar data: the data (the content of the RR is opaque as far as the
- DNS is concerned)
- @type data: string
- @see: RFC 4701"""
-
- __slots__ = ['data']
-
- def __init__(self, rdclass, rdtype, data):
- super(DHCID, self).__init__(rdclass, rdtype)
- self.data = data
-
- def to_text(self, origin=None, relativize=True, **kw):
- return dns.rdata._base64ify(self.data)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- chunks.append(t.value.encode())
- b64 = b''.join(chunks)
- data = base64.b64decode(b64)
- return cls(rdclass, rdtype, data)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(self.data)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- data = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, data)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/IPSECKEY.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/IPSECKEY.py
deleted file mode 100644
index 8f49ba137d..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/IPSECKEY.py
+++ /dev/null
@@ -1,150 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-import base64
-
-import dns.exception
-import dns.inet
-import dns.name
-
-
-class IPSECKEY(dns.rdata.Rdata):
-
- """IPSECKEY record
-
- @ivar precedence: the precedence for this key data
- @type precedence: int
- @ivar gateway_type: the gateway type
- @type gateway_type: int
- @ivar algorithm: the algorithm to use
- @type algorithm: int
- @ivar gateway: the public key
- @type gateway: None, IPv4 address, IPV6 address, or domain name
- @ivar key: the public key
- @type key: string
- @see: RFC 4025"""
-
- __slots__ = ['precedence', 'gateway_type', 'algorithm', 'gateway', 'key']
-
- def __init__(self, rdclass, rdtype, precedence, gateway_type, algorithm,
- gateway, key):
- super(IPSECKEY, self).__init__(rdclass, rdtype)
- if gateway_type == 0:
- if gateway != '.' and gateway is not None:
- raise SyntaxError('invalid gateway for gateway type 0')
- gateway = None
- elif gateway_type == 1:
- # check that it's OK
- dns.inet.inet_pton(dns.inet.AF_INET, gateway)
- elif gateway_type == 2:
- # check that it's OK
- dns.inet.inet_pton(dns.inet.AF_INET6, gateway)
- elif gateway_type == 3:
- pass
- else:
- raise SyntaxError(
- 'invalid IPSECKEY gateway type: %d' % gateway_type)
- self.precedence = precedence
- self.gateway_type = gateway_type
- self.algorithm = algorithm
- self.gateway = gateway
- self.key = key
-
- def to_text(self, origin=None, relativize=True, **kw):
- if self.gateway_type == 0:
- gateway = '.'
- elif self.gateway_type == 1:
- gateway = self.gateway
- elif self.gateway_type == 2:
- gateway = self.gateway
- elif self.gateway_type == 3:
- gateway = str(self.gateway.choose_relativity(origin, relativize))
- else:
- raise ValueError('invalid gateway type')
- return '%d %d %d %s %s' % (self.precedence, self.gateway_type,
- self.algorithm, gateway,
- dns.rdata._base64ify(self.key))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- precedence = tok.get_uint8()
- gateway_type = tok.get_uint8()
- algorithm = tok.get_uint8()
- if gateway_type == 3:
- gateway = tok.get_name().choose_relativity(origin, relativize)
- else:
- gateway = tok.get_string()
- chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- chunks.append(t.value.encode())
- b64 = b''.join(chunks)
- key = base64.b64decode(b64)
- return cls(rdclass, rdtype, precedence, gateway_type, algorithm,
- gateway, key)
-
- def to_wire(self, file, compress=None, origin=None):
- header = struct.pack("!BBB", self.precedence, self.gateway_type,
- self.algorithm)
- file.write(header)
- if self.gateway_type == 0:
- pass
- elif self.gateway_type == 1:
- file.write(dns.inet.inet_pton(dns.inet.AF_INET, self.gateway))
- elif self.gateway_type == 2:
- file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.gateway))
- elif self.gateway_type == 3:
- self.gateway.to_wire(file, None, origin)
- else:
- raise ValueError('invalid gateway type')
- file.write(self.key)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- if rdlen < 3:
- raise dns.exception.FormError
- header = struct.unpack('!BBB', wire[current: current + 3])
- gateway_type = header[1]
- current += 3
- rdlen -= 3
- if gateway_type == 0:
- gateway = None
- elif gateway_type == 1:
- gateway = dns.inet.inet_ntop(dns.inet.AF_INET,
- wire[current: current + 4])
- current += 4
- rdlen -= 4
- elif gateway_type == 2:
- gateway = dns.inet.inet_ntop(dns.inet.AF_INET6,
- wire[current: current + 16])
- current += 16
- rdlen -= 16
- elif gateway_type == 3:
- (gateway, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- current += cused
- rdlen -= cused
- else:
- raise dns.exception.FormError('invalid IPSECKEY gateway type')
- key = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, header[0], gateway_type, header[2],
- gateway, key)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/KX.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/KX.py
deleted file mode 100644
index 1318a582e7..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/KX.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.mxbase
-
-
-class KX(dns.rdtypes.mxbase.UncompressedMX):
-
- """KX record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NAPTR.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NAPTR.py
deleted file mode 100644
index 32fa4745ea..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NAPTR.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.name
-import dns.rdata
-from dns._compat import xrange, text_type
-
-
-def _write_string(file, s):
- l = len(s)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(s)
-
-
-def _sanitize(value):
- if isinstance(value, text_type):
- return value.encode()
- return value
-
-
-class NAPTR(dns.rdata.Rdata):
-
- """NAPTR record
-
- @ivar order: order
- @type order: int
- @ivar preference: preference
- @type preference: int
- @ivar flags: flags
- @type flags: string
- @ivar service: service
- @type service: string
- @ivar regexp: regular expression
- @type regexp: string
- @ivar replacement: replacement name
- @type replacement: dns.name.Name object
- @see: RFC 3403"""
-
- __slots__ = ['order', 'preference', 'flags', 'service', 'regexp',
- 'replacement']
-
- def __init__(self, rdclass, rdtype, order, preference, flags, service,
- regexp, replacement):
- super(NAPTR, self).__init__(rdclass, rdtype)
- self.flags = _sanitize(flags)
- self.service = _sanitize(service)
- self.regexp = _sanitize(regexp)
- self.order = order
- self.preference = preference
- self.replacement = replacement
-
- def to_text(self, origin=None, relativize=True, **kw):
- replacement = self.replacement.choose_relativity(origin, relativize)
- return '%d %d "%s" "%s" "%s" %s' % \
- (self.order, self.preference,
- dns.rdata._escapify(self.flags),
- dns.rdata._escapify(self.service),
- dns.rdata._escapify(self.regexp),
- replacement)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- order = tok.get_uint16()
- preference = tok.get_uint16()
- flags = tok.get_string()
- service = tok.get_string()
- regexp = tok.get_string()
- replacement = tok.get_name()
- replacement = replacement.choose_relativity(origin, relativize)
- tok.get_eol()
- return cls(rdclass, rdtype, order, preference, flags, service,
- regexp, replacement)
-
- def to_wire(self, file, compress=None, origin=None):
- two_ints = struct.pack("!HH", self.order, self.preference)
- file.write(two_ints)
- _write_string(file, self.flags)
- _write_string(file, self.service)
- _write_string(file, self.regexp)
- self.replacement.to_wire(file, compress, origin)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (order, preference) = struct.unpack('!HH', wire[current: current + 4])
- current += 4
- rdlen -= 4
- strings = []
- for i in xrange(3):
- l = wire[current]
- current += 1
- rdlen -= 1
- if l > rdlen or rdlen < 0:
- raise dns.exception.FormError
- s = wire[current: current + l].unwrap()
- current += l
- rdlen -= l
- strings.append(s)
- (replacement, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- if cused != rdlen:
- raise dns.exception.FormError
- if origin is not None:
- replacement = replacement.relativize(origin)
- return cls(rdclass, rdtype, order, preference, strings[0], strings[1],
- strings[2], replacement)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.replacement = self.replacement.choose_relativity(origin,
- relativize)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NSAP.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NSAP.py
deleted file mode 100644
index 336befc7f2..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NSAP.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import binascii
-
-import dns.exception
-import dns.rdata
-import dns.tokenizer
-
-
-class NSAP(dns.rdata.Rdata):
-
- """NSAP record.
-
- @ivar address: a NASP
- @type address: string
- @see: RFC 1706"""
-
- __slots__ = ['address']
-
- def __init__(self, rdclass, rdtype, address):
- super(NSAP, self).__init__(rdclass, rdtype)
- self.address = address
-
- def to_text(self, origin=None, relativize=True, **kw):
- return "0x%s" % binascii.hexlify(self.address).decode()
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- address = tok.get_string()
- tok.get_eol()
- if address[0:2] != '0x':
- raise dns.exception.SyntaxError('string does not start with 0x')
- address = address[2:].replace('.', '')
- if len(address) % 2 != 0:
- raise dns.exception.SyntaxError('hexstring has odd length')
- address = binascii.unhexlify(address.encode())
- return cls(rdclass, rdtype, address)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(self.address)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- address = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, address)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NSAP_PTR.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NSAP_PTR.py
deleted file mode 100644
index a5b66c803f..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/NSAP_PTR.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import dns.rdtypes.nsbase
-
-
-class NSAP_PTR(dns.rdtypes.nsbase.UncompressedNS):
-
- """NSAP-PTR record"""
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/PX.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/PX.py
deleted file mode 100644
index 2dbaee6ce8..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/PX.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.name
-
-
-class PX(dns.rdata.Rdata):
-
- """PX record.
-
- @ivar preference: the preference value
- @type preference: int
- @ivar map822: the map822 name
- @type map822: dns.name.Name object
- @ivar mapx400: the mapx400 name
- @type mapx400: dns.name.Name object
- @see: RFC 2163"""
-
- __slots__ = ['preference', 'map822', 'mapx400']
-
- def __init__(self, rdclass, rdtype, preference, map822, mapx400):
- super(PX, self).__init__(rdclass, rdtype)
- self.preference = preference
- self.map822 = map822
- self.mapx400 = mapx400
-
- def to_text(self, origin=None, relativize=True, **kw):
- map822 = self.map822.choose_relativity(origin, relativize)
- mapx400 = self.mapx400.choose_relativity(origin, relativize)
- return '%d %s %s' % (self.preference, map822, mapx400)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- preference = tok.get_uint16()
- map822 = tok.get_name()
- map822 = map822.choose_relativity(origin, relativize)
- mapx400 = tok.get_name(None)
- mapx400 = mapx400.choose_relativity(origin, relativize)
- tok.get_eol()
- return cls(rdclass, rdtype, preference, map822, mapx400)
-
- def to_wire(self, file, compress=None, origin=None):
- pref = struct.pack("!H", self.preference)
- file.write(pref)
- self.map822.to_wire(file, None, origin)
- self.mapx400.to_wire(file, None, origin)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (preference, ) = struct.unpack('!H', wire[current: current + 2])
- current += 2
- rdlen -= 2
- (map822, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- if cused > rdlen:
- raise dns.exception.FormError
- current += cused
- rdlen -= cused
- if origin is not None:
- map822 = map822.relativize(origin)
- (mapx400, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- if cused != rdlen:
- raise dns.exception.FormError
- if origin is not None:
- mapx400 = mapx400.relativize(origin)
- return cls(rdclass, rdtype, preference, map822, mapx400)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.map822 = self.map822.choose_relativity(origin, relativize)
- self.mapx400 = self.mapx400.choose_relativity(origin, relativize)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/SRV.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/SRV.py
deleted file mode 100644
index b2c1bc9f0b..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/SRV.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.name
-
-
-class SRV(dns.rdata.Rdata):
-
- """SRV record
-
- @ivar priority: the priority
- @type priority: int
- @ivar weight: the weight
- @type weight: int
- @ivar port: the port of the service
- @type port: int
- @ivar target: the target host
- @type target: dns.name.Name object
- @see: RFC 2782"""
-
- __slots__ = ['priority', 'weight', 'port', 'target']
-
- def __init__(self, rdclass, rdtype, priority, weight, port, target):
- super(SRV, self).__init__(rdclass, rdtype)
- self.priority = priority
- self.weight = weight
- self.port = port
- self.target = target
-
- def to_text(self, origin=None, relativize=True, **kw):
- target = self.target.choose_relativity(origin, relativize)
- return '%d %d %d %s' % (self.priority, self.weight, self.port,
- target)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- priority = tok.get_uint16()
- weight = tok.get_uint16()
- port = tok.get_uint16()
- target = tok.get_name(None)
- target = target.choose_relativity(origin, relativize)
- tok.get_eol()
- return cls(rdclass, rdtype, priority, weight, port, target)
-
- def to_wire(self, file, compress=None, origin=None):
- three_ints = struct.pack("!HHH", self.priority, self.weight, self.port)
- file.write(three_ints)
- self.target.to_wire(file, compress, origin)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (priority, weight, port) = struct.unpack('!HHH',
- wire[current: current + 6])
- current += 6
- rdlen -= 6
- (target, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- if cused != rdlen:
- raise dns.exception.FormError
- if origin is not None:
- target = target.relativize(origin)
- return cls(rdclass, rdtype, priority, weight, port, target)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.target = self.target.choose_relativity(origin, relativize)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/WKS.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/WKS.py
deleted file mode 100644
index 96f98ada70..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/WKS.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import socket
-import struct
-
-import dns.ipv4
-import dns.rdata
-from dns._compat import xrange
-
-_proto_tcp = socket.getprotobyname('tcp')
-_proto_udp = socket.getprotobyname('udp')
-
-
-class WKS(dns.rdata.Rdata):
-
- """WKS record
-
- @ivar address: the address
- @type address: string
- @ivar protocol: the protocol
- @type protocol: int
- @ivar bitmap: the bitmap
- @type bitmap: string
- @see: RFC 1035"""
-
- __slots__ = ['address', 'protocol', 'bitmap']
-
- def __init__(self, rdclass, rdtype, address, protocol, bitmap):
- super(WKS, self).__init__(rdclass, rdtype)
- self.address = address
- self.protocol = protocol
- if not isinstance(bitmap, bytearray):
- self.bitmap = bytearray(bitmap)
- else:
- self.bitmap = bitmap
-
- def to_text(self, origin=None, relativize=True, **kw):
- bits = []
- for i in xrange(0, len(self.bitmap)):
- byte = self.bitmap[i]
- for j in xrange(0, 8):
- if byte & (0x80 >> j):
- bits.append(str(i * 8 + j))
- text = ' '.join(bits)
- return '%s %d %s' % (self.address, self.protocol, text)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- address = tok.get_string()
- protocol = tok.get_string()
- if protocol.isdigit():
- protocol = int(protocol)
- else:
- protocol = socket.getprotobyname(protocol)
- bitmap = bytearray()
- while 1:
- token = tok.get().unescape()
- if token.is_eol_or_eof():
- break
- if token.value.isdigit():
- serv = int(token.value)
- else:
- if protocol != _proto_udp and protocol != _proto_tcp:
- raise NotImplementedError("protocol must be TCP or UDP")
- if protocol == _proto_udp:
- protocol_text = "udp"
- else:
- protocol_text = "tcp"
- serv = socket.getservbyname(token.value, protocol_text)
- i = serv // 8
- l = len(bitmap)
- if l < i + 1:
- for j in xrange(l, i + 1):
- bitmap.append(0)
- bitmap[i] = bitmap[i] | (0x80 >> (serv % 8))
- bitmap = dns.rdata._truncate_bitmap(bitmap)
- return cls(rdclass, rdtype, address, protocol, bitmap)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(dns.ipv4.inet_aton(self.address))
- protocol = struct.pack('!B', self.protocol)
- file.write(protocol)
- file.write(self.bitmap)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- address = dns.ipv4.inet_ntoa(wire[current: current + 4])
- protocol, = struct.unpack('!B', wire[current + 4: current + 5])
- current += 5
- rdlen -= 5
- bitmap = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, address, protocol, bitmap)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/__init__.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/__init__.py
deleted file mode 100644
index d7e69c9f60..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/IN/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Class IN rdata type classes."""
-
-__all__ = [
- 'A',
- 'AAAA',
- 'APL',
- 'DHCID',
- 'IPSECKEY',
- 'KX',
- 'NAPTR',
- 'NSAP',
- 'NSAP_PTR',
- 'PX',
- 'SRV',
- 'WKS',
-]
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/__init__.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/__init__.py
deleted file mode 100644
index 1ac137f1fe..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/__init__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS rdata type classes"""
-
-__all__ = [
- 'ANY',
- 'IN',
- 'CH',
- 'euibase',
- 'mxbase',
- 'nsbase',
-]
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/dnskeybase.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/dnskeybase.py
deleted file mode 100644
index 3e7e87ef15..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/dnskeybase.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import base64
-import struct
-
-import dns.exception
-import dns.dnssec
-import dns.rdata
-
-# wildcard import
-__all__ = ["SEP", "REVOKE", "ZONE",
- "flags_to_text_set", "flags_from_text_set"]
-
-# flag constants
-SEP = 0x0001
-REVOKE = 0x0080
-ZONE = 0x0100
-
-_flag_by_text = {
- 'SEP': SEP,
- 'REVOKE': REVOKE,
- 'ZONE': ZONE
-}
-
-# We construct the inverse mapping programmatically to ensure that we
-# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that
-# would cause the mapping not to be true inverse.
-_flag_by_value = {y: x for x, y in _flag_by_text.items()}
-
-
-def flags_to_text_set(flags):
- """Convert a DNSKEY flags value to set texts
- @rtype: set([string])"""
-
- flags_set = set()
- mask = 0x1
- while mask <= 0x8000:
- if flags & mask:
- text = _flag_by_value.get(mask)
- if not text:
- text = hex(mask)
- flags_set.add(text)
- mask <<= 1
- return flags_set
-
-
-def flags_from_text_set(texts_set):
- """Convert set of DNSKEY flag mnemonic texts to DNSKEY flag value
- @rtype: int"""
-
- flags = 0
- for text in texts_set:
- try:
- flags += _flag_by_text[text]
- except KeyError:
- raise NotImplementedError(
- "DNSKEY flag '%s' is not supported" % text)
- return flags
-
-
-class DNSKEYBase(dns.rdata.Rdata):
-
- """Base class for rdata that is like a DNSKEY record
-
- @ivar flags: the key flags
- @type flags: int
- @ivar protocol: the protocol for which this key may be used
- @type protocol: int
- @ivar algorithm: the algorithm used for the key
- @type algorithm: int
- @ivar key: the public key
- @type key: string"""
-
- __slots__ = ['flags', 'protocol', 'algorithm', 'key']
-
- def __init__(self, rdclass, rdtype, flags, protocol, algorithm, key):
- super(DNSKEYBase, self).__init__(rdclass, rdtype)
- self.flags = flags
- self.protocol = protocol
- self.algorithm = algorithm
- self.key = key
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '%d %d %d %s' % (self.flags, self.protocol, self.algorithm,
- dns.rdata._base64ify(self.key))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- flags = tok.get_uint16()
- protocol = tok.get_uint8()
- algorithm = dns.dnssec.algorithm_from_text(tok.get_string())
- chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- chunks.append(t.value.encode())
- b64 = b''.join(chunks)
- key = base64.b64decode(b64)
- return cls(rdclass, rdtype, flags, protocol, algorithm, key)
-
- def to_wire(self, file, compress=None, origin=None):
- header = struct.pack("!HBB", self.flags, self.protocol, self.algorithm)
- file.write(header)
- file.write(self.key)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- if rdlen < 4:
- raise dns.exception.FormError
- header = struct.unpack('!HBB', wire[current: current + 4])
- current += 4
- rdlen -= 4
- key = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, header[0], header[1], header[2],
- key)
-
- def flags_to_text_set(self):
- """Convert a DNSKEY flags value to set texts
- @rtype: set([string])"""
- return flags_to_text_set(self.flags)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/dsbase.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/dsbase.py
deleted file mode 100644
index 26ae9d5c7d..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/dsbase.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2010, 2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import struct
-import binascii
-
-import dns.rdata
-import dns.rdatatype
-
-
-class DSBase(dns.rdata.Rdata):
-
- """Base class for rdata that is like a DS record
-
- @ivar key_tag: the key tag
- @type key_tag: int
- @ivar algorithm: the algorithm
- @type algorithm: int
- @ivar digest_type: the digest type
- @type digest_type: int
- @ivar digest: the digest
- @type digest: int
- @see: draft-ietf-dnsext-delegation-signer-14.txt"""
-
- __slots__ = ['key_tag', 'algorithm', 'digest_type', 'digest']
-
- def __init__(self, rdclass, rdtype, key_tag, algorithm, digest_type,
- digest):
- super(DSBase, self).__init__(rdclass, rdtype)
- self.key_tag = key_tag
- self.algorithm = algorithm
- self.digest_type = digest_type
- self.digest = digest
-
- def to_text(self, origin=None, relativize=True, **kw):
- return '%d %d %d %s' % (self.key_tag, self.algorithm,
- self.digest_type,
- dns.rdata._hexify(self.digest,
- chunksize=128))
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- key_tag = tok.get_uint16()
- algorithm = tok.get_uint8()
- digest_type = tok.get_uint8()
- chunks = []
- while 1:
- t = tok.get().unescape()
- if t.is_eol_or_eof():
- break
- if not t.is_identifier():
- raise dns.exception.SyntaxError
- chunks.append(t.value.encode())
- digest = b''.join(chunks)
- digest = binascii.unhexlify(digest)
- return cls(rdclass, rdtype, key_tag, algorithm, digest_type,
- digest)
-
- def to_wire(self, file, compress=None, origin=None):
- header = struct.pack("!HBB", self.key_tag, self.algorithm,
- self.digest_type)
- file.write(header)
- file.write(self.digest)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- header = struct.unpack("!HBB", wire[current: current + 4])
- current += 4
- rdlen -= 4
- digest = wire[current: current + rdlen].unwrap()
- return cls(rdclass, rdtype, header[0], header[1], header[2], digest)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/euibase.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/euibase.py
deleted file mode 100644
index cc5fdaa63b..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/euibase.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright (C) 2015 Red Hat, Inc.
-# Author: Petr Spacek
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-import binascii
-
-import dns.rdata
-from dns._compat import xrange
-
-
-class EUIBase(dns.rdata.Rdata):
-
- """EUIxx record
-
- @ivar fingerprint: xx-bit Extended Unique Identifier (EUI-xx)
- @type fingerprint: string
- @see: rfc7043.txt"""
-
- __slots__ = ['eui']
- # define these in subclasses
- # byte_len = 6 # 0123456789ab (in hex)
- # text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab
-
- def __init__(self, rdclass, rdtype, eui):
- super(EUIBase, self).__init__(rdclass, rdtype)
- if len(eui) != self.byte_len:
- raise dns.exception.FormError('EUI%s rdata has to have %s bytes'
- % (self.byte_len * 8, self.byte_len))
- self.eui = eui
-
- def to_text(self, origin=None, relativize=True, **kw):
- return dns.rdata._hexify(self.eui, chunksize=2).replace(' ', '-')
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- text = tok.get_string()
- tok.get_eol()
- if len(text) != cls.text_len:
- raise dns.exception.SyntaxError(
- 'Input text must have %s characters' % cls.text_len)
- expected_dash_idxs = xrange(2, cls.byte_len * 3 - 1, 3)
- for i in expected_dash_idxs:
- if text[i] != '-':
- raise dns.exception.SyntaxError('Dash expected at position %s'
- % i)
- text = text.replace('-', '')
- try:
- data = binascii.unhexlify(text.encode())
- except (ValueError, TypeError) as ex:
- raise dns.exception.SyntaxError('Hex decoding error: %s' % str(ex))
- return cls(rdclass, rdtype, data)
-
- def to_wire(self, file, compress=None, origin=None):
- file.write(self.eui)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- eui = wire[current:current + rdlen].unwrap()
- return cls(rdclass, rdtype, eui)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/mxbase.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/mxbase.py
deleted file mode 100644
index 9a3fa62360..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/mxbase.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""MX-like base classes."""
-
-from io import BytesIO
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.name
-
-
-class MXBase(dns.rdata.Rdata):
-
- """Base class for rdata that is like an MX record.
-
- @ivar preference: the preference value
- @type preference: int
- @ivar exchange: the exchange name
- @type exchange: dns.name.Name object"""
-
- __slots__ = ['preference', 'exchange']
-
- def __init__(self, rdclass, rdtype, preference, exchange):
- super(MXBase, self).__init__(rdclass, rdtype)
- self.preference = preference
- self.exchange = exchange
-
- def to_text(self, origin=None, relativize=True, **kw):
- exchange = self.exchange.choose_relativity(origin, relativize)
- return '%d %s' % (self.preference, exchange)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- preference = tok.get_uint16()
- exchange = tok.get_name()
- exchange = exchange.choose_relativity(origin, relativize)
- tok.get_eol()
- return cls(rdclass, rdtype, preference, exchange)
-
- def to_wire(self, file, compress=None, origin=None):
- pref = struct.pack("!H", self.preference)
- file.write(pref)
- self.exchange.to_wire(file, compress, origin)
-
- def to_digestable(self, origin=None):
- return struct.pack("!H", self.preference) + \
- self.exchange.to_digestable(origin)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (preference, ) = struct.unpack('!H', wire[current: current + 2])
- current += 2
- rdlen -= 2
- (exchange, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- if cused != rdlen:
- raise dns.exception.FormError
- if origin is not None:
- exchange = exchange.relativize(origin)
- return cls(rdclass, rdtype, preference, exchange)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.exchange = self.exchange.choose_relativity(origin, relativize)
-
-
-class UncompressedMX(MXBase):
-
- """Base class for rdata that is like an MX record, but whose name
- is not compressed when converted to DNS wire format, and whose
- digestable form is not downcased."""
-
- def to_wire(self, file, compress=None, origin=None):
- super(UncompressedMX, self).to_wire(file, None, origin)
-
- def to_digestable(self, origin=None):
- f = BytesIO()
- self.to_wire(f, None, origin)
- return f.getvalue()
-
-
-class UncompressedDowncasingMX(MXBase):
-
- """Base class for rdata that is like an MX record, but whose name
- is not compressed when convert to DNS wire format."""
-
- def to_wire(self, file, compress=None, origin=None):
- super(UncompressedDowncasingMX, self).to_wire(file, None, origin)
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/nsbase.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/nsbase.py
deleted file mode 100644
index 97a2232638..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/nsbase.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""NS-like base classes."""
-
-from io import BytesIO
-
-import dns.exception
-import dns.rdata
-import dns.name
-
-
-class NSBase(dns.rdata.Rdata):
-
- """Base class for rdata that is like an NS record.
-
- @ivar target: the target name of the rdata
- @type target: dns.name.Name object"""
-
- __slots__ = ['target']
-
- def __init__(self, rdclass, rdtype, target):
- super(NSBase, self).__init__(rdclass, rdtype)
- self.target = target
-
- def to_text(self, origin=None, relativize=True, **kw):
- target = self.target.choose_relativity(origin, relativize)
- return str(target)
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- target = tok.get_name()
- target = target.choose_relativity(origin, relativize)
- tok.get_eol()
- return cls(rdclass, rdtype, target)
-
- def to_wire(self, file, compress=None, origin=None):
- self.target.to_wire(file, compress, origin)
-
- def to_digestable(self, origin=None):
- return self.target.to_digestable(origin)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- (target, cused) = dns.name.from_wire(wire[: current + rdlen],
- current)
- if cused != rdlen:
- raise dns.exception.FormError
- if origin is not None:
- target = target.relativize(origin)
- return cls(rdclass, rdtype, target)
-
- def choose_relativity(self, origin=None, relativize=True):
- self.target = self.target.choose_relativity(origin, relativize)
-
-
-class UncompressedNS(NSBase):
-
- """Base class for rdata that is like an NS record, but whose name
- is not compressed when convert to DNS wire format, and whose
- digestable form is not downcased."""
-
- def to_wire(self, file, compress=None, origin=None):
- super(UncompressedNS, self).to_wire(file, None, origin)
-
- def to_digestable(self, origin=None):
- f = BytesIO()
- self.to_wire(f, None, origin)
- return f.getvalue()
diff --git a/client/ayon_core/vendor/python/python_2/dns/rdtypes/txtbase.py b/client/ayon_core/vendor/python/python_2/dns/rdtypes/txtbase.py
deleted file mode 100644
index 645a57ecfc..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rdtypes/txtbase.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2006-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""TXT-like base class."""
-
-import struct
-
-import dns.exception
-import dns.rdata
-import dns.tokenizer
-from dns._compat import binary_type, string_types
-
-
-class TXTBase(dns.rdata.Rdata):
-
- """Base class for rdata that is like a TXT record
-
- @ivar strings: the strings
- @type strings: list of binary
- @see: RFC 1035"""
-
- __slots__ = ['strings']
-
- def __init__(self, rdclass, rdtype, strings):
- super(TXTBase, self).__init__(rdclass, rdtype)
- if isinstance(strings, binary_type) or \
- isinstance(strings, string_types):
- strings = [strings]
- self.strings = []
- for string in strings:
- if isinstance(string, string_types):
- string = string.encode()
- self.strings.append(string)
-
- def to_text(self, origin=None, relativize=True, **kw):
- txt = ''
- prefix = ''
- for s in self.strings:
- txt += '{}"{}"'.format(prefix, dns.rdata._escapify(s))
- prefix = ' '
- return txt
-
- @classmethod
- def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True):
- strings = []
- while 1:
- token = tok.get().unescape()
- if token.is_eol_or_eof():
- break
- if not (token.is_quoted_string() or token.is_identifier()):
- raise dns.exception.SyntaxError("expected a string")
- if len(token.value) > 255:
- raise dns.exception.SyntaxError("string too long")
- value = token.value
- if isinstance(value, binary_type):
- strings.append(value)
- else:
- strings.append(value.encode())
- if len(strings) == 0:
- raise dns.exception.UnexpectedEnd
- return cls(rdclass, rdtype, strings)
-
- def to_wire(self, file, compress=None, origin=None):
- for s in self.strings:
- l = len(s)
- assert l < 256
- file.write(struct.pack('!B', l))
- file.write(s)
-
- @classmethod
- def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None):
- strings = []
- while rdlen > 0:
- l = wire[current]
- current += 1
- rdlen -= 1
- if l > rdlen:
- raise dns.exception.FormError
- s = wire[current: current + l].unwrap()
- current += l
- rdlen -= l
- strings.append(s)
- return cls(rdclass, rdtype, strings)
diff --git a/client/ayon_core/vendor/python/python_2/dns/renderer.py b/client/ayon_core/vendor/python/python_2/dns/renderer.py
deleted file mode 100644
index d7ef8c7f09..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/renderer.py
+++ /dev/null
@@ -1,291 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Help for building DNS wire format messages"""
-
-from io import BytesIO
-import struct
-import random
-import time
-
-import dns.exception
-import dns.tsig
-from ._compat import long
-
-
-QUESTION = 0
-ANSWER = 1
-AUTHORITY = 2
-ADDITIONAL = 3
-
-
-class Renderer(object):
- """Helper class for building DNS wire-format messages.
-
- Most applications can use the higher-level L{dns.message.Message}
- class and its to_wire() method to generate wire-format messages.
- This class is for those applications which need finer control
- over the generation of messages.
-
- Typical use::
-
- r = dns.renderer.Renderer(id=1, flags=0x80, max_size=512)
- r.add_question(qname, qtype, qclass)
- r.add_rrset(dns.renderer.ANSWER, rrset_1)
- r.add_rrset(dns.renderer.ANSWER, rrset_2)
- r.add_rrset(dns.renderer.AUTHORITY, ns_rrset)
- r.add_edns(0, 0, 4096)
- r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_1)
- r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_2)
- r.write_header()
- r.add_tsig(keyname, secret, 300, 1, 0, '', request_mac)
- wire = r.get_wire()
-
- output, a BytesIO, where rendering is written
-
- id: the message id
-
- flags: the message flags
-
- max_size: the maximum size of the message
-
- origin: the origin to use when rendering relative names
-
- compress: the compression table
-
- section: an int, the section currently being rendered
-
- counts: list of the number of RRs in each section
-
- mac: the MAC of the rendered message (if TSIG was used)
- """
-
- def __init__(self, id=None, flags=0, max_size=65535, origin=None):
- """Initialize a new renderer."""
-
- self.output = BytesIO()
- if id is None:
- self.id = random.randint(0, 65535)
- else:
- self.id = id
- self.flags = flags
- self.max_size = max_size
- self.origin = origin
- self.compress = {}
- self.section = QUESTION
- self.counts = [0, 0, 0, 0]
- self.output.write(b'\x00' * 12)
- self.mac = ''
-
- def _rollback(self, where):
- """Truncate the output buffer at offset *where*, and remove any
- compression table entries that pointed beyond the truncation
- point.
- """
-
- self.output.seek(where)
- self.output.truncate()
- keys_to_delete = []
- for k, v in self.compress.items():
- if v >= where:
- keys_to_delete.append(k)
- for k in keys_to_delete:
- del self.compress[k]
-
- def _set_section(self, section):
- """Set the renderer's current section.
-
- Sections must be rendered order: QUESTION, ANSWER, AUTHORITY,
- ADDITIONAL. Sections may be empty.
-
- Raises dns.exception.FormError if an attempt was made to set
- a section value less than the current section.
- """
-
- if self.section != section:
- if self.section > section:
- raise dns.exception.FormError
- self.section = section
-
- def add_question(self, qname, rdtype, rdclass=dns.rdataclass.IN):
- """Add a question to the message."""
-
- self._set_section(QUESTION)
- before = self.output.tell()
- qname.to_wire(self.output, self.compress, self.origin)
- self.output.write(struct.pack("!HH", rdtype, rdclass))
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
- self.counts[QUESTION] += 1
-
- def add_rrset(self, section, rrset, **kw):
- """Add the rrset to the specified section.
-
- Any keyword arguments are passed on to the rdataset's to_wire()
- routine.
- """
-
- self._set_section(section)
- before = self.output.tell()
- n = rrset.to_wire(self.output, self.compress, self.origin, **kw)
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
- self.counts[section] += n
-
- def add_rdataset(self, section, name, rdataset, **kw):
- """Add the rdataset to the specified section, using the specified
- name as the owner name.
-
- Any keyword arguments are passed on to the rdataset's to_wire()
- routine.
- """
-
- self._set_section(section)
- before = self.output.tell()
- n = rdataset.to_wire(name, self.output, self.compress, self.origin,
- **kw)
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
- self.counts[section] += n
-
- def add_edns(self, edns, ednsflags, payload, options=None):
- """Add an EDNS OPT record to the message."""
-
- # make sure the EDNS version in ednsflags agrees with edns
- ednsflags &= long(0xFF00FFFF)
- ednsflags |= (edns << 16)
- self._set_section(ADDITIONAL)
- before = self.output.tell()
- self.output.write(struct.pack('!BHHIH', 0, dns.rdatatype.OPT, payload,
- ednsflags, 0))
- if options is not None:
- lstart = self.output.tell()
- for opt in options:
- stuff = struct.pack("!HH", opt.otype, 0)
- self.output.write(stuff)
- start = self.output.tell()
- opt.to_wire(self.output)
- end = self.output.tell()
- assert end - start < 65536
- self.output.seek(start - 2)
- stuff = struct.pack("!H", end - start)
- self.output.write(stuff)
- self.output.seek(0, 2)
- lend = self.output.tell()
- assert lend - lstart < 65536
- self.output.seek(lstart - 2)
- stuff = struct.pack("!H", lend - lstart)
- self.output.write(stuff)
- self.output.seek(0, 2)
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
- self.counts[ADDITIONAL] += 1
-
- def add_tsig(self, keyname, secret, fudge, id, tsig_error, other_data,
- request_mac, algorithm=dns.tsig.default_algorithm):
- """Add a TSIG signature to the message."""
-
- s = self.output.getvalue()
- (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s,
- keyname,
- secret,
- int(time.time()),
- fudge,
- id,
- tsig_error,
- other_data,
- request_mac,
- algorithm=algorithm)
- self._write_tsig(tsig_rdata, keyname)
-
- def add_multi_tsig(self, ctx, keyname, secret, fudge, id, tsig_error,
- other_data, request_mac,
- algorithm=dns.tsig.default_algorithm):
- """Add a TSIG signature to the message. Unlike add_tsig(), this can be
- used for a series of consecutive DNS envelopes, e.g. for a zone
- transfer over TCP [RFC2845, 4.4].
-
- For the first message in the sequence, give ctx=None. For each
- subsequent message, give the ctx that was returned from the
- add_multi_tsig() call for the previous message."""
-
- s = self.output.getvalue()
- (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s,
- keyname,
- secret,
- int(time.time()),
- fudge,
- id,
- tsig_error,
- other_data,
- request_mac,
- ctx=ctx,
- first=ctx is None,
- multi=True,
- algorithm=algorithm)
- self._write_tsig(tsig_rdata, keyname)
- return ctx
-
- def _write_tsig(self, tsig_rdata, keyname):
- self._set_section(ADDITIONAL)
- before = self.output.tell()
-
- keyname.to_wire(self.output, self.compress, self.origin)
- self.output.write(struct.pack('!HHIH', dns.rdatatype.TSIG,
- dns.rdataclass.ANY, 0, 0))
- rdata_start = self.output.tell()
- self.output.write(tsig_rdata)
-
- after = self.output.tell()
- assert after - rdata_start < 65536
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
-
- self.output.seek(rdata_start - 2)
- self.output.write(struct.pack('!H', after - rdata_start))
- self.counts[ADDITIONAL] += 1
- self.output.seek(10)
- self.output.write(struct.pack('!H', self.counts[ADDITIONAL]))
- self.output.seek(0, 2)
-
- def write_header(self):
- """Write the DNS message header.
-
- Writing the DNS message header is done after all sections
- have been rendered, but before the optional TSIG signature
- is added.
- """
-
- self.output.seek(0)
- self.output.write(struct.pack('!HHHHHH', self.id, self.flags,
- self.counts[0], self.counts[1],
- self.counts[2], self.counts[3]))
- self.output.seek(0, 2)
-
- def get_wire(self):
- """Return the wire format message."""
-
- return self.output.getvalue()
diff --git a/client/ayon_core/vendor/python/python_2/dns/resolver.py b/client/ayon_core/vendor/python/python_2/dns/resolver.py
deleted file mode 100644
index 806e5b2b45..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/resolver.py
+++ /dev/null
@@ -1,1383 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS stub resolver."""
-
-import socket
-import sys
-import time
-import random
-
-try:
- import threading as _threading
-except ImportError:
- import dummy_threading as _threading
-
-import dns.exception
-import dns.flags
-import dns.ipv4
-import dns.ipv6
-import dns.message
-import dns.name
-import dns.query
-import dns.rcode
-import dns.rdataclass
-import dns.rdatatype
-import dns.reversename
-import dns.tsig
-from ._compat import xrange, string_types
-
-if sys.platform == 'win32':
- try:
- import winreg as _winreg
- except ImportError:
- import _winreg # pylint: disable=import-error
-
-class NXDOMAIN(dns.exception.DNSException):
- """The DNS query name does not exist."""
- supp_kwargs = {'qnames', 'responses'}
- fmt = None # we have our own __str__ implementation
-
- def _check_kwargs(self, qnames, responses=None):
- if not isinstance(qnames, (list, tuple, set)):
- raise AttributeError("qnames must be a list, tuple or set")
- if len(qnames) == 0:
- raise AttributeError("qnames must contain at least one element")
- if responses is None:
- responses = {}
- elif not isinstance(responses, dict):
- raise AttributeError("responses must be a dict(qname=response)")
- kwargs = dict(qnames=qnames, responses=responses)
- return kwargs
-
- def __str__(self):
- if 'qnames' not in self.kwargs:
- return super(NXDOMAIN, self).__str__()
- qnames = self.kwargs['qnames']
- if len(qnames) > 1:
- msg = 'None of DNS query names exist'
- else:
- msg = 'The DNS query name does not exist'
- qnames = ', '.join(map(str, qnames))
- return "{}: {}".format(msg, qnames)
-
- def canonical_name(self):
- if not 'qnames' in self.kwargs:
- raise TypeError("parametrized exception required")
- IN = dns.rdataclass.IN
- CNAME = dns.rdatatype.CNAME
- cname = None
- for qname in self.kwargs['qnames']:
- response = self.kwargs['responses'][qname]
- for answer in response.answer:
- if answer.rdtype != CNAME or answer.rdclass != IN:
- continue
- cname = answer.items[0].target.to_text()
- if cname is not None:
- return dns.name.from_text(cname)
- return self.kwargs['qnames'][0]
- canonical_name = property(canonical_name, doc=(
- "Return the unresolved canonical name."))
-
- def __add__(self, e_nx):
- """Augment by results from another NXDOMAIN exception."""
- qnames0 = list(self.kwargs.get('qnames', []))
- responses0 = dict(self.kwargs.get('responses', {}))
- responses1 = e_nx.kwargs.get('responses', {})
- for qname1 in e_nx.kwargs.get('qnames', []):
- if qname1 not in qnames0:
- qnames0.append(qname1)
- if qname1 in responses1:
- responses0[qname1] = responses1[qname1]
- return NXDOMAIN(qnames=qnames0, responses=responses0)
-
- def qnames(self):
- """All of the names that were tried.
-
- Returns a list of ``dns.name.Name``.
- """
- return self.kwargs['qnames']
-
- def responses(self):
- """A map from queried names to their NXDOMAIN responses.
-
- Returns a dict mapping a ``dns.name.Name`` to a
- ``dns.message.Message``.
- """
- return self.kwargs['responses']
-
- def response(self, qname):
- """The response for query *qname*.
-
- Returns a ``dns.message.Message``.
- """
- return self.kwargs['responses'][qname]
-
-
-class YXDOMAIN(dns.exception.DNSException):
- """The DNS query name is too long after DNAME substitution."""
-
-# The definition of the Timeout exception has moved from here to the
-# dns.exception module. We keep dns.resolver.Timeout defined for
-# backwards compatibility.
-
-Timeout = dns.exception.Timeout
-
-
-class NoAnswer(dns.exception.DNSException):
- """The DNS response does not contain an answer to the question."""
- fmt = 'The DNS response does not contain an answer ' + \
- 'to the question: {query}'
- supp_kwargs = {'response'}
-
- def _fmt_kwargs(self, **kwargs):
- return super(NoAnswer, self)._fmt_kwargs(
- query=kwargs['response'].question)
-
-
-class NoNameservers(dns.exception.DNSException):
- """All nameservers failed to answer the query.
-
- errors: list of servers and respective errors
- The type of errors is
- [(server IP address, any object convertible to string)].
- Non-empty errors list will add explanatory message ()
- """
-
- msg = "All nameservers failed to answer the query."
- fmt = "%s {query}: {errors}" % msg[:-1]
- supp_kwargs = {'request', 'errors'}
-
- def _fmt_kwargs(self, **kwargs):
- srv_msgs = []
- for err in kwargs['errors']:
- srv_msgs.append('Server {} {} port {} answered {}'.format(err[0],
- 'TCP' if err[1] else 'UDP', err[2], err[3]))
- return super(NoNameservers, self)._fmt_kwargs(
- query=kwargs['request'].question, errors='; '.join(srv_msgs))
-
-
-class NotAbsolute(dns.exception.DNSException):
- """An absolute domain name is required but a relative name was provided."""
-
-
-class NoRootSOA(dns.exception.DNSException):
- """There is no SOA RR at the DNS root name. This should never happen!"""
-
-
-class NoMetaqueries(dns.exception.DNSException):
- """DNS metaqueries are not allowed."""
-
-
-class Answer(object):
- """DNS stub resolver answer.
-
- Instances of this class bundle up the result of a successful DNS
- resolution.
-
- For convenience, the answer object implements much of the sequence
- protocol, forwarding to its ``rrset`` attribute. E.g.
- ``for a in answer`` is equivalent to ``for a in answer.rrset``.
- ``answer[i]`` is equivalent to ``answer.rrset[i]``, and
- ``answer[i:j]`` is equivalent to ``answer.rrset[i:j]``.
-
- Note that CNAMEs or DNAMEs in the response may mean that answer
- RRset's name might not be the query name.
- """
-
- def __init__(self, qname, rdtype, rdclass, response,
- raise_on_no_answer=True):
- self.qname = qname
- self.rdtype = rdtype
- self.rdclass = rdclass
- self.response = response
- min_ttl = -1
- rrset = None
- for count in xrange(0, 15):
- try:
- rrset = response.find_rrset(response.answer, qname,
- rdclass, rdtype)
- if min_ttl == -1 or rrset.ttl < min_ttl:
- min_ttl = rrset.ttl
- break
- except KeyError:
- if rdtype != dns.rdatatype.CNAME:
- try:
- crrset = response.find_rrset(response.answer,
- qname,
- rdclass,
- dns.rdatatype.CNAME)
- if min_ttl == -1 or crrset.ttl < min_ttl:
- min_ttl = crrset.ttl
- for rd in crrset:
- qname = rd.target
- break
- continue
- except KeyError:
- if raise_on_no_answer:
- raise NoAnswer(response=response)
- if raise_on_no_answer:
- raise NoAnswer(response=response)
- if rrset is None and raise_on_no_answer:
- raise NoAnswer(response=response)
- self.canonical_name = qname
- self.rrset = rrset
- if rrset is None:
- while 1:
- # Look for a SOA RR whose owner name is a superdomain
- # of qname.
- try:
- srrset = response.find_rrset(response.authority, qname,
- rdclass, dns.rdatatype.SOA)
- if min_ttl == -1 or srrset.ttl < min_ttl:
- min_ttl = srrset.ttl
- if srrset[0].minimum < min_ttl:
- min_ttl = srrset[0].minimum
- break
- except KeyError:
- try:
- qname = qname.parent()
- except dns.name.NoParent:
- break
- self.expiration = time.time() + min_ttl
-
- def __getattr__(self, attr):
- if attr == 'name':
- return self.rrset.name
- elif attr == 'ttl':
- return self.rrset.ttl
- elif attr == 'covers':
- return self.rrset.covers
- elif attr == 'rdclass':
- return self.rrset.rdclass
- elif attr == 'rdtype':
- return self.rrset.rdtype
- else:
- raise AttributeError(attr)
-
- def __len__(self):
- return self.rrset and len(self.rrset) or 0
-
- def __iter__(self):
- return self.rrset and iter(self.rrset) or iter(tuple())
-
- def __getitem__(self, i):
- if self.rrset is None:
- raise IndexError
- return self.rrset[i]
-
- def __delitem__(self, i):
- if self.rrset is None:
- raise IndexError
- del self.rrset[i]
-
-
-class Cache(object):
- """Simple thread-safe DNS answer cache."""
-
- def __init__(self, cleaning_interval=300.0):
- """*cleaning_interval*, a ``float`` is the number of seconds between
- periodic cleanings.
- """
-
- self.data = {}
- self.cleaning_interval = cleaning_interval
- self.next_cleaning = time.time() + self.cleaning_interval
- self.lock = _threading.Lock()
-
- def _maybe_clean(self):
- """Clean the cache if it's time to do so."""
-
- now = time.time()
- if self.next_cleaning <= now:
- keys_to_delete = []
- for (k, v) in self.data.items():
- if v.expiration <= now:
- keys_to_delete.append(k)
- for k in keys_to_delete:
- del self.data[k]
- now = time.time()
- self.next_cleaning = now + self.cleaning_interval
-
- def get(self, key):
- """Get the answer associated with *key*.
-
- Returns None if no answer is cached for the key.
-
- *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the
- query name, rdtype, and rdclass respectively.
-
- Returns a ``dns.resolver.Answer`` or ``None``.
- """
-
- try:
- self.lock.acquire()
- self._maybe_clean()
- v = self.data.get(key)
- if v is None or v.expiration <= time.time():
- return None
- return v
- finally:
- self.lock.release()
-
- def put(self, key, value):
- """Associate key and value in the cache.
-
- *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the
- query name, rdtype, and rdclass respectively.
-
- *value*, a ``dns.resolver.Answer``, the answer.
- """
-
- try:
- self.lock.acquire()
- self._maybe_clean()
- self.data[key] = value
- finally:
- self.lock.release()
-
- def flush(self, key=None):
- """Flush the cache.
-
- If *key* is not ``None``, only that item is flushed. Otherwise
- the entire cache is flushed.
-
- *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the
- query name, rdtype, and rdclass respectively.
- """
-
- try:
- self.lock.acquire()
- if key is not None:
- if key in self.data:
- del self.data[key]
- else:
- self.data = {}
- self.next_cleaning = time.time() + self.cleaning_interval
- finally:
- self.lock.release()
-
-
-class LRUCacheNode(object):
- """LRUCache node."""
-
- def __init__(self, key, value):
- self.key = key
- self.value = value
- self.prev = self
- self.next = self
-
- def link_before(self, node):
- self.prev = node.prev
- self.next = node
- node.prev.next = self
- node.prev = self
-
- def link_after(self, node):
- self.prev = node
- self.next = node.next
- node.next.prev = self
- node.next = self
-
- def unlink(self):
- self.next.prev = self.prev
- self.prev.next = self.next
-
-
-class LRUCache(object):
- """Thread-safe, bounded, least-recently-used DNS answer cache.
-
- This cache is better than the simple cache (above) if you're
- running a web crawler or other process that does a lot of
- resolutions. The LRUCache has a maximum number of nodes, and when
- it is full, the least-recently used node is removed to make space
- for a new one.
- """
-
- def __init__(self, max_size=100000):
- """*max_size*, an ``int``, is the maximum number of nodes to cache;
- it must be greater than 0.
- """
-
- self.data = {}
- self.set_max_size(max_size)
- self.sentinel = LRUCacheNode(None, None)
- self.lock = _threading.Lock()
-
- def set_max_size(self, max_size):
- if max_size < 1:
- max_size = 1
- self.max_size = max_size
-
- def get(self, key):
- """Get the answer associated with *key*.
-
- Returns None if no answer is cached for the key.
-
- *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the
- query name, rdtype, and rdclass respectively.
-
- Returns a ``dns.resolver.Answer`` or ``None``.
- """
-
- try:
- self.lock.acquire()
- node = self.data.get(key)
- if node is None:
- return None
- # Unlink because we're either going to move the node to the front
- # of the LRU list or we're going to free it.
- node.unlink()
- if node.value.expiration <= time.time():
- del self.data[node.key]
- return None
- node.link_after(self.sentinel)
- return node.value
- finally:
- self.lock.release()
-
- def put(self, key, value):
- """Associate key and value in the cache.
-
- *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the
- query name, rdtype, and rdclass respectively.
-
- *value*, a ``dns.resolver.Answer``, the answer.
- """
-
- try:
- self.lock.acquire()
- node = self.data.get(key)
- if node is not None:
- node.unlink()
- del self.data[node.key]
- while len(self.data) >= self.max_size:
- node = self.sentinel.prev
- node.unlink()
- del self.data[node.key]
- node = LRUCacheNode(key, value)
- node.link_after(self.sentinel)
- self.data[key] = node
- finally:
- self.lock.release()
-
- def flush(self, key=None):
- """Flush the cache.
-
- If *key* is not ``None``, only that item is flushed. Otherwise
- the entire cache is flushed.
-
- *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the
- query name, rdtype, and rdclass respectively.
- """
-
- try:
- self.lock.acquire()
- if key is not None:
- node = self.data.get(key)
- if node is not None:
- node.unlink()
- del self.data[node.key]
- else:
- node = self.sentinel.next
- while node != self.sentinel:
- next = node.next
- node.prev = None
- node.next = None
- node = next
- self.data = {}
- finally:
- self.lock.release()
-
-
-class Resolver(object):
- """DNS stub resolver."""
-
- def __init__(self, filename='/etc/resolv.conf', configure=True):
- """*filename*, a ``text`` or file object, specifying a file
- in standard /etc/resolv.conf format. This parameter is meaningful
- only when *configure* is true and the platform is POSIX.
-
- *configure*, a ``bool``. If True (the default), the resolver
- instance is configured in the normal fashion for the operating
- system the resolver is running on. (I.e. by reading a
- /etc/resolv.conf file on POSIX systems and from the registry
- on Windows systems.)
- """
-
- self.domain = None
- self.nameservers = None
- self.nameserver_ports = None
- self.port = None
- self.search = None
- self.timeout = None
- self.lifetime = None
- self.keyring = None
- self.keyname = None
- self.keyalgorithm = None
- self.edns = None
- self.ednsflags = None
- self.payload = None
- self.cache = None
- self.flags = None
- self.retry_servfail = False
- self.rotate = False
-
- self.reset()
- if configure:
- if sys.platform == 'win32':
- self.read_registry()
- elif filename:
- self.read_resolv_conf(filename)
-
- def reset(self):
- """Reset all resolver configuration to the defaults."""
-
- self.domain = \
- dns.name.Name(dns.name.from_text(socket.gethostname())[1:])
- if len(self.domain) == 0:
- self.domain = dns.name.root
- self.nameservers = []
- self.nameserver_ports = {}
- self.port = 53
- self.search = []
- self.timeout = 2.0
- self.lifetime = 30.0
- self.keyring = None
- self.keyname = None
- self.keyalgorithm = dns.tsig.default_algorithm
- self.edns = -1
- self.ednsflags = 0
- self.payload = 0
- self.cache = None
- self.flags = None
- self.retry_servfail = False
- self.rotate = False
-
- def read_resolv_conf(self, f):
- """Process *f* as a file in the /etc/resolv.conf format. If f is
- a ``text``, it is used as the name of the file to open; otherwise it
- is treated as the file itself."""
-
- if isinstance(f, string_types):
- try:
- f = open(f, 'r')
- except IOError:
- # /etc/resolv.conf doesn't exist, can't be read, etc.
- # We'll just use the default resolver configuration.
- self.nameservers = ['127.0.0.1']
- return
- want_close = True
- else:
- want_close = False
- try:
- for l in f:
- if len(l) == 0 or l[0] == '#' or l[0] == ';':
- continue
- tokens = l.split()
-
- # Any line containing less than 2 tokens is malformed
- if len(tokens) < 2:
- continue
-
- if tokens[0] == 'nameserver':
- self.nameservers.append(tokens[1])
- elif tokens[0] == 'domain':
- self.domain = dns.name.from_text(tokens[1])
- elif tokens[0] == 'search':
- for suffix in tokens[1:]:
- self.search.append(dns.name.from_text(suffix))
- elif tokens[0] == 'options':
- if 'rotate' in tokens[1:]:
- self.rotate = True
- finally:
- if want_close:
- f.close()
- if len(self.nameservers) == 0:
- self.nameservers.append('127.0.0.1')
-
- def _determine_split_char(self, entry):
- #
- # The windows registry irritatingly changes the list element
- # delimiter in between ' ' and ',' (and vice-versa) in various
- # versions of windows.
- #
- if entry.find(' ') >= 0:
- split_char = ' '
- elif entry.find(',') >= 0:
- split_char = ','
- else:
- # probably a singleton; treat as a space-separated list.
- split_char = ' '
- return split_char
-
- def _config_win32_nameservers(self, nameservers):
- # we call str() on nameservers to convert it from unicode to ascii
- nameservers = str(nameservers)
- split_char = self._determine_split_char(nameservers)
- ns_list = nameservers.split(split_char)
- for ns in ns_list:
- if ns not in self.nameservers:
- self.nameservers.append(ns)
-
- def _config_win32_domain(self, domain):
- # we call str() on domain to convert it from unicode to ascii
- self.domain = dns.name.from_text(str(domain))
-
- def _config_win32_search(self, search):
- # we call str() on search to convert it from unicode to ascii
- search = str(search)
- split_char = self._determine_split_char(search)
- search_list = search.split(split_char)
- for s in search_list:
- if s not in self.search:
- self.search.append(dns.name.from_text(s))
-
- def _config_win32_fromkey(self, key, always_try_domain):
- try:
- servers, rtype = _winreg.QueryValueEx(key, 'NameServer')
- except WindowsError: # pylint: disable=undefined-variable
- servers = None
- if servers:
- self._config_win32_nameservers(servers)
- if servers or always_try_domain:
- try:
- dom, rtype = _winreg.QueryValueEx(key, 'Domain')
- if dom:
- self._config_win32_domain(dom)
- except WindowsError: # pylint: disable=undefined-variable
- pass
- else:
- try:
- servers, rtype = _winreg.QueryValueEx(key, 'DhcpNameServer')
- except WindowsError: # pylint: disable=undefined-variable
- servers = None
- if servers:
- self._config_win32_nameservers(servers)
- try:
- dom, rtype = _winreg.QueryValueEx(key, 'DhcpDomain')
- if dom:
- self._config_win32_domain(dom)
- except WindowsError: # pylint: disable=undefined-variable
- pass
- try:
- search, rtype = _winreg.QueryValueEx(key, 'SearchList')
- except WindowsError: # pylint: disable=undefined-variable
- search = None
- if search:
- self._config_win32_search(search)
-
- def read_registry(self):
- """Extract resolver configuration from the Windows registry."""
-
- lm = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
- want_scan = False
- try:
- try:
- # XP, 2000
- tcp_params = _winreg.OpenKey(lm,
- r'SYSTEM\CurrentControlSet'
- r'\Services\Tcpip\Parameters')
- want_scan = True
- except EnvironmentError:
- # ME
- tcp_params = _winreg.OpenKey(lm,
- r'SYSTEM\CurrentControlSet'
- r'\Services\VxD\MSTCP')
- try:
- self._config_win32_fromkey(tcp_params, True)
- finally:
- tcp_params.Close()
- if want_scan:
- interfaces = _winreg.OpenKey(lm,
- r'SYSTEM\CurrentControlSet'
- r'\Services\Tcpip\Parameters'
- r'\Interfaces')
- try:
- i = 0
- while True:
- try:
- guid = _winreg.EnumKey(interfaces, i)
- i += 1
- key = _winreg.OpenKey(interfaces, guid)
- if not self._win32_is_nic_enabled(lm, guid, key):
- continue
- try:
- self._config_win32_fromkey(key, False)
- finally:
- key.Close()
- except EnvironmentError:
- break
- finally:
- interfaces.Close()
- finally:
- lm.Close()
-
- def _win32_is_nic_enabled(self, lm, guid, interface_key):
- # Look in the Windows Registry to determine whether the network
- # interface corresponding to the given guid is enabled.
- #
- # (Code contributed by Paul Marks, thanks!)
- #
- try:
- # This hard-coded location seems to be consistent, at least
- # from Windows 2000 through Vista.
- connection_key = _winreg.OpenKey(
- lm,
- r'SYSTEM\CurrentControlSet\Control\Network'
- r'\{4D36E972-E325-11CE-BFC1-08002BE10318}'
- r'\%s\Connection' % guid)
-
- try:
- # The PnpInstanceID points to a key inside Enum
- (pnp_id, ttype) = _winreg.QueryValueEx(
- connection_key, 'PnpInstanceID')
-
- if ttype != _winreg.REG_SZ:
- raise ValueError
-
- device_key = _winreg.OpenKey(
- lm, r'SYSTEM\CurrentControlSet\Enum\%s' % pnp_id)
-
- try:
- # Get ConfigFlags for this device
- (flags, ttype) = _winreg.QueryValueEx(
- device_key, 'ConfigFlags')
-
- if ttype != _winreg.REG_DWORD:
- raise ValueError
-
- # Based on experimentation, bit 0x1 indicates that the
- # device is disabled.
- return not flags & 0x1
-
- finally:
- device_key.Close()
- finally:
- connection_key.Close()
- except (EnvironmentError, ValueError):
- # Pre-vista, enabled interfaces seem to have a non-empty
- # NTEContextList; this was how dnspython detected enabled
- # nics before the code above was contributed. We've retained
- # the old method since we don't know if the code above works
- # on Windows 95/98/ME.
- try:
- (nte, ttype) = _winreg.QueryValueEx(interface_key,
- 'NTEContextList')
- return nte is not None
- except WindowsError: # pylint: disable=undefined-variable
- return False
-
- def _compute_timeout(self, start, lifetime=None):
- lifetime = self.lifetime if lifetime is None else lifetime
- now = time.time()
- duration = now - start
- if duration < 0:
- if duration < -1:
- # Time going backwards is bad. Just give up.
- raise Timeout(timeout=duration)
- else:
- # Time went backwards, but only a little. This can
- # happen, e.g. under vmware with older linux kernels.
- # Pretend it didn't happen.
- now = start
- if duration >= lifetime:
- raise Timeout(timeout=duration)
- return min(lifetime - duration, self.timeout)
-
- def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
- tcp=False, source=None, raise_on_no_answer=True, source_port=0,
- lifetime=None):
- """Query nameservers to find the answer to the question.
-
- The *qname*, *rdtype*, and *rdclass* parameters may be objects
- of the appropriate type, or strings that can be converted into objects
- of the appropriate type.
-
- *qname*, a ``dns.name.Name`` or ``text``, the query name.
-
- *rdtype*, an ``int`` or ``text``, the query type.
-
- *rdclass*, an ``int`` or ``text``, the query class.
-
- *tcp*, a ``bool``. If ``True``, use TCP to make the query.
-
- *source*, a ``text`` or ``None``. If not ``None``, bind to this IP
- address when making queries.
-
- *raise_on_no_answer*, a ``bool``. If ``True``, raise
- ``dns.resolver.NoAnswer`` if there's no answer to the question.
-
- *source_port*, an ``int``, the port from which to send the message.
-
- *lifetime*, a ``float``, how long query should run before timing out.
-
- Raises ``dns.exception.Timeout`` if no answers could be found
- in the specified lifetime.
-
- Raises ``dns.resolver.NXDOMAIN`` if the query name does not exist.
-
- Raises ``dns.resolver.YXDOMAIN`` if the query name is too long after
- DNAME substitution.
-
- Raises ``dns.resolver.NoAnswer`` if *raise_on_no_answer* is
- ``True`` and the query name exists but has no RRset of the
- desired type and class.
-
- Raises ``dns.resolver.NoNameservers`` if no non-broken
- nameservers are available to answer the question.
-
- Returns a ``dns.resolver.Answer`` instance.
- """
-
- if isinstance(qname, string_types):
- qname = dns.name.from_text(qname, None)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if dns.rdatatype.is_metatype(rdtype):
- raise NoMetaqueries
- if isinstance(rdclass, string_types):
- rdclass = dns.rdataclass.from_text(rdclass)
- if dns.rdataclass.is_metaclass(rdclass):
- raise NoMetaqueries
- qnames_to_try = []
- if qname.is_absolute():
- qnames_to_try.append(qname)
- else:
- if len(qname) > 1:
- qnames_to_try.append(qname.concatenate(dns.name.root))
- if self.search:
- for suffix in self.search:
- qnames_to_try.append(qname.concatenate(suffix))
- else:
- qnames_to_try.append(qname.concatenate(self.domain))
- all_nxdomain = True
- nxdomain_responses = {}
- start = time.time()
- _qname = None # make pylint happy
- for _qname in qnames_to_try:
- if self.cache:
- answer = self.cache.get((_qname, rdtype, rdclass))
- if answer is not None:
- if answer.rrset is None and raise_on_no_answer:
- raise NoAnswer(response=answer.response)
- else:
- return answer
- request = dns.message.make_query(_qname, rdtype, rdclass)
- if self.keyname is not None:
- request.use_tsig(self.keyring, self.keyname,
- algorithm=self.keyalgorithm)
- request.use_edns(self.edns, self.ednsflags, self.payload)
- if self.flags is not None:
- request.flags = self.flags
- response = None
- #
- # make a copy of the servers list so we can alter it later.
- #
- nameservers = self.nameservers[:]
- errors = []
- if self.rotate:
- random.shuffle(nameservers)
- backoff = 0.10
- while response is None:
- if len(nameservers) == 0:
- raise NoNameservers(request=request, errors=errors)
- for nameserver in nameservers[:]:
- timeout = self._compute_timeout(start, lifetime)
- port = self.nameserver_ports.get(nameserver, self.port)
- try:
- tcp_attempt = tcp
- if tcp:
- response = dns.query.tcp(request, nameserver,
- timeout, port,
- source=source,
- source_port=source_port)
- else:
- response = dns.query.udp(request, nameserver,
- timeout, port,
- source=source,
- source_port=source_port)
- if response.flags & dns.flags.TC:
- # Response truncated; retry with TCP.
- tcp_attempt = True
- timeout = self._compute_timeout(start, lifetime)
- response = \
- dns.query.tcp(request, nameserver,
- timeout, port,
- source=source,
- source_port=source_port)
- except (socket.error, dns.exception.Timeout) as ex:
- #
- # Communication failure or timeout. Go to the
- # next server
- #
- errors.append((nameserver, tcp_attempt, port, ex,
- response))
- response = None
- continue
- except dns.query.UnexpectedSource as ex:
- #
- # Who knows? Keep going.
- #
- errors.append((nameserver, tcp_attempt, port, ex,
- response))
- response = None
- continue
- except dns.exception.FormError as ex:
- #
- # We don't understand what this server is
- # saying. Take it out of the mix and
- # continue.
- #
- nameservers.remove(nameserver)
- errors.append((nameserver, tcp_attempt, port, ex,
- response))
- response = None
- continue
- except EOFError as ex:
- #
- # We're using TCP and they hung up on us.
- # Probably they don't support TCP (though
- # they're supposed to!). Take it out of the
- # mix and continue.
- #
- nameservers.remove(nameserver)
- errors.append((nameserver, tcp_attempt, port, ex,
- response))
- response = None
- continue
- rcode = response.rcode()
- if rcode == dns.rcode.YXDOMAIN:
- ex = YXDOMAIN()
- errors.append((nameserver, tcp_attempt, port, ex,
- response))
- raise ex
- if rcode == dns.rcode.NOERROR or \
- rcode == dns.rcode.NXDOMAIN:
- break
- #
- # We got a response, but we're not happy with the
- # rcode in it. Remove the server from the mix if
- # the rcode isn't SERVFAIL.
- #
- if rcode != dns.rcode.SERVFAIL or not self.retry_servfail:
- nameservers.remove(nameserver)
- errors.append((nameserver, tcp_attempt, port,
- dns.rcode.to_text(rcode), response))
- response = None
- if response is not None:
- break
- #
- # All nameservers failed!
- #
- if len(nameservers) > 0:
- #
- # But we still have servers to try. Sleep a bit
- # so we don't pound them!
- #
- timeout = self._compute_timeout(start, lifetime)
- sleep_time = min(timeout, backoff)
- backoff *= 2
- time.sleep(sleep_time)
- if response.rcode() == dns.rcode.NXDOMAIN:
- nxdomain_responses[_qname] = response
- continue
- all_nxdomain = False
- break
- if all_nxdomain:
- raise NXDOMAIN(qnames=qnames_to_try, responses=nxdomain_responses)
- answer = Answer(_qname, rdtype, rdclass, response,
- raise_on_no_answer)
- if self.cache:
- self.cache.put((_qname, rdtype, rdclass), answer)
- return answer
-
- def use_tsig(self, keyring, keyname=None,
- algorithm=dns.tsig.default_algorithm):
- """Add a TSIG signature to the query.
-
- See the documentation of the Message class for a complete
- description of the keyring dictionary.
-
- *keyring*, a ``dict``, the TSIG keyring to use. If a
- *keyring* is specified but a *keyname* is not, then the key
- used will be the first key in the *keyring*. Note that the
- order of keys in a dictionary is not defined, so applications
- should supply a keyname when a keyring is used, unless they
- know the keyring contains only one key.
-
- *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key
- to use; defaults to ``None``. The key must be defined in the keyring.
-
- *algorithm*, a ``dns.name.Name``, the TSIG algorithm to use.
- """
-
- self.keyring = keyring
- if keyname is None:
- self.keyname = list(self.keyring.keys())[0]
- else:
- self.keyname = keyname
- self.keyalgorithm = algorithm
-
- def use_edns(self, edns, ednsflags, payload):
- """Configure EDNS behavior.
-
- *edns*, an ``int``, is the EDNS level to use. Specifying
- ``None``, ``False``, or ``-1`` means "do not use EDNS", and in this case
- the other parameters are ignored. Specifying ``True`` is
- equivalent to specifying 0, i.e. "use EDNS0".
-
- *ednsflags*, an ``int``, the EDNS flag values.
-
- *payload*, an ``int``, is the EDNS sender's payload field, which is the
- maximum size of UDP datagram the sender can handle. I.e. how big
- a response to this message can be.
- """
-
- if edns is None:
- edns = -1
- self.edns = edns
- self.ednsflags = ednsflags
- self.payload = payload
-
- def set_flags(self, flags):
- """Overrides the default flags with your own.
-
- *flags*, an ``int``, the message flags to use.
- """
-
- self.flags = flags
-
-
-#: The default resolver.
-default_resolver = None
-
-
-def get_default_resolver():
- """Get the default resolver, initializing it if necessary."""
- if default_resolver is None:
- reset_default_resolver()
- return default_resolver
-
-
-def reset_default_resolver():
- """Re-initialize default resolver.
-
- Note that the resolver configuration (i.e. /etc/resolv.conf on UNIX
- systems) will be re-read immediately.
- """
-
- global default_resolver
- default_resolver = Resolver()
-
-
-def query(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
- tcp=False, source=None, raise_on_no_answer=True,
- source_port=0, lifetime=None):
- """Query nameservers to find the answer to the question.
-
- This is a convenience function that uses the default resolver
- object to make the query.
-
- See ``dns.resolver.Resolver.query`` for more information on the
- parameters.
- """
-
- return get_default_resolver().query(qname, rdtype, rdclass, tcp, source,
- raise_on_no_answer, source_port,
- lifetime)
-
-
-def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None):
- """Find the name of the zone which contains the specified name.
-
- *name*, an absolute ``dns.name.Name`` or ``text``, the query name.
-
- *rdclass*, an ``int``, the query class.
-
- *tcp*, a ``bool``. If ``True``, use TCP to make the query.
-
- *resolver*, a ``dns.resolver.Resolver`` or ``None``, the resolver to use.
- If ``None``, the default resolver is used.
-
- Raises ``dns.resolver.NoRootSOA`` if there is no SOA RR at the DNS
- root. (This is only likely to happen if you're using non-default
- root servers in your network and they are misconfigured.)
-
- Returns a ``dns.name.Name``.
- """
-
- if isinstance(name, string_types):
- name = dns.name.from_text(name, dns.name.root)
- if resolver is None:
- resolver = get_default_resolver()
- if not name.is_absolute():
- raise NotAbsolute(name)
- while 1:
- try:
- answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp)
- if answer.rrset.name == name:
- return name
- # otherwise we were CNAMEd or DNAMEd and need to look higher
- except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
- pass
- try:
- name = name.parent()
- except dns.name.NoParent:
- raise NoRootSOA
-
-#
-# Support for overriding the system resolver for all python code in the
-# running process.
-#
-
-_protocols_for_socktype = {
- socket.SOCK_DGRAM: [socket.SOL_UDP],
- socket.SOCK_STREAM: [socket.SOL_TCP],
-}
-
-_resolver = None
-_original_getaddrinfo = socket.getaddrinfo
-_original_getnameinfo = socket.getnameinfo
-_original_getfqdn = socket.getfqdn
-_original_gethostbyname = socket.gethostbyname
-_original_gethostbyname_ex = socket.gethostbyname_ex
-_original_gethostbyaddr = socket.gethostbyaddr
-
-
-def _getaddrinfo(host=None, service=None, family=socket.AF_UNSPEC, socktype=0,
- proto=0, flags=0):
- if flags & (socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) != 0:
- raise NotImplementedError
- if host is None and service is None:
- raise socket.gaierror(socket.EAI_NONAME)
- v6addrs = []
- v4addrs = []
- canonical_name = None
- try:
- # Is host None or a V6 address literal?
- if host is None:
- canonical_name = 'localhost'
- if flags & socket.AI_PASSIVE != 0:
- v6addrs.append('::')
- v4addrs.append('0.0.0.0')
- else:
- v6addrs.append('::1')
- v4addrs.append('127.0.0.1')
- else:
- parts = host.split('%')
- if len(parts) == 2:
- ahost = parts[0]
- else:
- ahost = host
- addr = dns.ipv6.inet_aton(ahost)
- v6addrs.append(host)
- canonical_name = host
- except Exception:
- try:
- # Is it a V4 address literal?
- addr = dns.ipv4.inet_aton(host)
- v4addrs.append(host)
- canonical_name = host
- except Exception:
- if flags & socket.AI_NUMERICHOST == 0:
- try:
- if family == socket.AF_INET6 or family == socket.AF_UNSPEC:
- v6 = _resolver.query(host, dns.rdatatype.AAAA,
- raise_on_no_answer=False)
- # Note that setting host ensures we query the same name
- # for A as we did for AAAA.
- host = v6.qname
- canonical_name = v6.canonical_name.to_text(True)
- if v6.rrset is not None:
- for rdata in v6.rrset:
- v6addrs.append(rdata.address)
- if family == socket.AF_INET or family == socket.AF_UNSPEC:
- v4 = _resolver.query(host, dns.rdatatype.A,
- raise_on_no_answer=False)
- host = v4.qname
- canonical_name = v4.canonical_name.to_text(True)
- if v4.rrset is not None:
- for rdata in v4.rrset:
- v4addrs.append(rdata.address)
- except dns.resolver.NXDOMAIN:
- raise socket.gaierror(socket.EAI_NONAME)
- except Exception:
- raise socket.gaierror(socket.EAI_SYSTEM)
- port = None
- try:
- # Is it a port literal?
- if service is None:
- port = 0
- else:
- port = int(service)
- except Exception:
- if flags & socket.AI_NUMERICSERV == 0:
- try:
- port = socket.getservbyname(service)
- except Exception:
- pass
- if port is None:
- raise socket.gaierror(socket.EAI_NONAME)
- tuples = []
- if socktype == 0:
- socktypes = [socket.SOCK_DGRAM, socket.SOCK_STREAM]
- else:
- socktypes = [socktype]
- if flags & socket.AI_CANONNAME != 0:
- cname = canonical_name
- else:
- cname = ''
- if family == socket.AF_INET6 or family == socket.AF_UNSPEC:
- for addr in v6addrs:
- for socktype in socktypes:
- for proto in _protocols_for_socktype[socktype]:
- tuples.append((socket.AF_INET6, socktype, proto,
- cname, (addr, port, 0, 0)))
- if family == socket.AF_INET or family == socket.AF_UNSPEC:
- for addr in v4addrs:
- for socktype in socktypes:
- for proto in _protocols_for_socktype[socktype]:
- tuples.append((socket.AF_INET, socktype, proto,
- cname, (addr, port)))
- if len(tuples) == 0:
- raise socket.gaierror(socket.EAI_NONAME)
- return tuples
-
-
-def _getnameinfo(sockaddr, flags=0):
- host = sockaddr[0]
- port = sockaddr[1]
- if len(sockaddr) == 4:
- scope = sockaddr[3]
- family = socket.AF_INET6
- else:
- scope = None
- family = socket.AF_INET
- tuples = _getaddrinfo(host, port, family, socket.SOCK_STREAM,
- socket.SOL_TCP, 0)
- if len(tuples) > 1:
- raise socket.error('sockaddr resolved to multiple addresses')
- addr = tuples[0][4][0]
- if flags & socket.NI_DGRAM:
- pname = 'udp'
- else:
- pname = 'tcp'
- qname = dns.reversename.from_address(addr)
- if flags & socket.NI_NUMERICHOST == 0:
- try:
- answer = _resolver.query(qname, 'PTR')
- hostname = answer.rrset[0].target.to_text(True)
- except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
- if flags & socket.NI_NAMEREQD:
- raise socket.gaierror(socket.EAI_NONAME)
- hostname = addr
- if scope is not None:
- hostname += '%' + str(scope)
- else:
- hostname = addr
- if scope is not None:
- hostname += '%' + str(scope)
- if flags & socket.NI_NUMERICSERV:
- service = str(port)
- else:
- service = socket.getservbyport(port, pname)
- return (hostname, service)
-
-
-def _getfqdn(name=None):
- if name is None:
- name = socket.gethostname()
- try:
- return _getnameinfo(_getaddrinfo(name, 80)[0][4])[0]
- except Exception:
- return name
-
-
-def _gethostbyname(name):
- return _gethostbyname_ex(name)[2][0]
-
-
-def _gethostbyname_ex(name):
- aliases = []
- addresses = []
- tuples = _getaddrinfo(name, 0, socket.AF_INET, socket.SOCK_STREAM,
- socket.SOL_TCP, socket.AI_CANONNAME)
- canonical = tuples[0][3]
- for item in tuples:
- addresses.append(item[4][0])
- # XXX we just ignore aliases
- return (canonical, aliases, addresses)
-
-
-def _gethostbyaddr(ip):
- try:
- dns.ipv6.inet_aton(ip)
- sockaddr = (ip, 80, 0, 0)
- family = socket.AF_INET6
- except Exception:
- sockaddr = (ip, 80)
- family = socket.AF_INET
- (name, port) = _getnameinfo(sockaddr, socket.NI_NAMEREQD)
- aliases = []
- addresses = []
- tuples = _getaddrinfo(name, 0, family, socket.SOCK_STREAM, socket.SOL_TCP,
- socket.AI_CANONNAME)
- canonical = tuples[0][3]
- for item in tuples:
- addresses.append(item[4][0])
- # XXX we just ignore aliases
- return (canonical, aliases, addresses)
-
-
-def override_system_resolver(resolver=None):
- """Override the system resolver routines in the socket module with
- versions which use dnspython's resolver.
-
- This can be useful in testing situations where you want to control
- the resolution behavior of python code without having to change
- the system's resolver settings (e.g. /etc/resolv.conf).
-
- The resolver to use may be specified; if it's not, the default
- resolver will be used.
-
- resolver, a ``dns.resolver.Resolver`` or ``None``, the resolver to use.
- """
-
- if resolver is None:
- resolver = get_default_resolver()
- global _resolver
- _resolver = resolver
- socket.getaddrinfo = _getaddrinfo
- socket.getnameinfo = _getnameinfo
- socket.getfqdn = _getfqdn
- socket.gethostbyname = _gethostbyname
- socket.gethostbyname_ex = _gethostbyname_ex
- socket.gethostbyaddr = _gethostbyaddr
-
-
-def restore_system_resolver():
- """Undo the effects of prior override_system_resolver()."""
-
- global _resolver
- _resolver = None
- socket.getaddrinfo = _original_getaddrinfo
- socket.getnameinfo = _original_getnameinfo
- socket.getfqdn = _original_getfqdn
- socket.gethostbyname = _original_gethostbyname
- socket.gethostbyname_ex = _original_gethostbyname_ex
- socket.gethostbyaddr = _original_gethostbyaddr
diff --git a/client/ayon_core/vendor/python/python_2/dns/reversename.py b/client/ayon_core/vendor/python/python_2/dns/reversename.py
deleted file mode 100644
index 8f095fa91e..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/reversename.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2006-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Reverse Map Names."""
-
-import binascii
-
-import dns.name
-import dns.ipv6
-import dns.ipv4
-
-from dns._compat import PY3
-
-ipv4_reverse_domain = dns.name.from_text('in-addr.arpa.')
-ipv6_reverse_domain = dns.name.from_text('ip6.arpa.')
-
-
-def from_address(text):
- """Convert an IPv4 or IPv6 address in textual form into a Name object whose
- value is the reverse-map domain name of the address.
-
- *text*, a ``text``, is an IPv4 or IPv6 address in textual form
- (e.g. '127.0.0.1', '::1')
-
- Raises ``dns.exception.SyntaxError`` if the address is badly formed.
-
- Returns a ``dns.name.Name``.
- """
-
- try:
- v6 = dns.ipv6.inet_aton(text)
- if dns.ipv6.is_mapped(v6):
- if PY3:
- parts = ['%d' % byte for byte in v6[12:]]
- else:
- parts = ['%d' % ord(byte) for byte in v6[12:]]
- origin = ipv4_reverse_domain
- else:
- parts = [x for x in str(binascii.hexlify(v6).decode())]
- origin = ipv6_reverse_domain
- except Exception:
- parts = ['%d' %
- byte for byte in bytearray(dns.ipv4.inet_aton(text))]
- origin = ipv4_reverse_domain
- parts.reverse()
- return dns.name.from_text('.'.join(parts), origin=origin)
-
-
-def to_address(name):
- """Convert a reverse map domain name into textual address form.
-
- *name*, a ``dns.name.Name``, an IPv4 or IPv6 address in reverse-map name
- form.
-
- Raises ``dns.exception.SyntaxError`` if the name does not have a
- reverse-map form.
-
- Returns a ``text``.
- """
-
- if name.is_subdomain(ipv4_reverse_domain):
- name = name.relativize(ipv4_reverse_domain)
- labels = list(name.labels)
- labels.reverse()
- text = b'.'.join(labels)
- # run through inet_aton() to check syntax and make pretty.
- return dns.ipv4.inet_ntoa(dns.ipv4.inet_aton(text))
- elif name.is_subdomain(ipv6_reverse_domain):
- name = name.relativize(ipv6_reverse_domain)
- labels = list(name.labels)
- labels.reverse()
- parts = []
- i = 0
- l = len(labels)
- while i < l:
- parts.append(b''.join(labels[i:i + 4]))
- i += 4
- text = b':'.join(parts)
- # run through inet_aton() to check syntax and make pretty.
- return dns.ipv6.inet_ntoa(dns.ipv6.inet_aton(text))
- else:
- raise dns.exception.SyntaxError('unknown reverse-map address family')
diff --git a/client/ayon_core/vendor/python/python_2/dns/rrset.py b/client/ayon_core/vendor/python/python_2/dns/rrset.py
deleted file mode 100644
index a53ec324b8..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/rrset.py
+++ /dev/null
@@ -1,189 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS RRsets (an RRset is a named rdataset)"""
-
-
-import dns.name
-import dns.rdataset
-import dns.rdataclass
-import dns.renderer
-from ._compat import string_types
-
-
-class RRset(dns.rdataset.Rdataset):
-
- """A DNS RRset (named rdataset).
-
- RRset inherits from Rdataset, and RRsets can be treated as
- Rdatasets in most cases. There are, however, a few notable
- exceptions. RRsets have different to_wire() and to_text() method
- arguments, reflecting the fact that RRsets always have an owner
- name.
- """
-
- __slots__ = ['name', 'deleting']
-
- def __init__(self, name, rdclass, rdtype, covers=dns.rdatatype.NONE,
- deleting=None):
- """Create a new RRset."""
-
- super(RRset, self).__init__(rdclass, rdtype, covers)
- self.name = name
- self.deleting = deleting
-
- def _clone(self):
- obj = super(RRset, self)._clone()
- obj.name = self.name
- obj.deleting = self.deleting
- return obj
-
- def __repr__(self):
- if self.covers == 0:
- ctext = ''
- else:
- ctext = '(' + dns.rdatatype.to_text(self.covers) + ')'
- if self.deleting is not None:
- dtext = ' delete=' + dns.rdataclass.to_text(self.deleting)
- else:
- dtext = ''
- return ''
-
- def __str__(self):
- return self.to_text()
-
- def __eq__(self, other):
- if not isinstance(other, RRset):
- return False
- if self.name != other.name:
- return False
- return super(RRset, self).__eq__(other)
-
- def match(self, name, rdclass, rdtype, covers, deleting=None):
- """Returns ``True`` if this rrset matches the specified class, type,
- covers, and deletion state.
- """
-
- if not super(RRset, self).match(rdclass, rdtype, covers):
- return False
- if self.name != name or self.deleting != deleting:
- return False
- return True
-
- def to_text(self, origin=None, relativize=True, **kw):
- """Convert the RRset into DNS master file format.
-
- See ``dns.name.Name.choose_relativity`` for more information
- on how *origin* and *relativize* determine the way names
- are emitted.
-
- Any additional keyword arguments are passed on to the rdata
- ``to_text()`` method.
-
- *origin*, a ``dns.name.Name`` or ``None``, the origin for relative
- names.
-
- *relativize*, a ``bool``. If ``True``, names will be relativized
- to *origin*.
- """
-
- return super(RRset, self).to_text(self.name, origin, relativize,
- self.deleting, **kw)
-
- def to_wire(self, file, compress=None, origin=None, **kw):
- """Convert the RRset to wire format.
-
- All keyword arguments are passed to ``dns.rdataset.to_wire()``; see
- that function for details.
-
- Returns an ``int``, the number of records emitted.
- """
-
- return super(RRset, self).to_wire(self.name, file, compress, origin,
- self.deleting, **kw)
-
- def to_rdataset(self):
- """Convert an RRset into an Rdataset.
-
- Returns a ``dns.rdataset.Rdataset``.
- """
- return dns.rdataset.from_rdata_list(self.ttl, list(self))
-
-
-def from_text_list(name, ttl, rdclass, rdtype, text_rdatas,
- idna_codec=None):
- """Create an RRset with the specified name, TTL, class, and type, and with
- the specified list of rdatas in text format.
-
- Returns a ``dns.rrset.RRset`` object.
- """
-
- if isinstance(name, string_types):
- name = dns.name.from_text(name, None, idna_codec=idna_codec)
- if isinstance(rdclass, string_types):
- rdclass = dns.rdataclass.from_text(rdclass)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- r = RRset(name, rdclass, rdtype)
- r.update_ttl(ttl)
- for t in text_rdatas:
- rd = dns.rdata.from_text(r.rdclass, r.rdtype, t)
- r.add(rd)
- return r
-
-
-def from_text(name, ttl, rdclass, rdtype, *text_rdatas):
- """Create an RRset with the specified name, TTL, class, and type and with
- the specified rdatas in text format.
-
- Returns a ``dns.rrset.RRset`` object.
- """
-
- return from_text_list(name, ttl, rdclass, rdtype, text_rdatas)
-
-
-def from_rdata_list(name, ttl, rdatas, idna_codec=None):
- """Create an RRset with the specified name and TTL, and with
- the specified list of rdata objects.
-
- Returns a ``dns.rrset.RRset`` object.
- """
-
- if isinstance(name, string_types):
- name = dns.name.from_text(name, None, idna_codec=idna_codec)
-
- if len(rdatas) == 0:
- raise ValueError("rdata list must not be empty")
- r = None
- for rd in rdatas:
- if r is None:
- r = RRset(name, rd.rdclass, rd.rdtype)
- r.update_ttl(ttl)
- r.add(rd)
- return r
-
-
-def from_rdata(name, ttl, *rdatas):
- """Create an RRset with the specified name and TTL, and with
- the specified rdata objects.
-
- Returns a ``dns.rrset.RRset`` object.
- """
-
- return from_rdata_list(name, ttl, rdatas)
diff --git a/client/ayon_core/vendor/python/python_2/dns/set.py b/client/ayon_core/vendor/python/python_2/dns/set.py
deleted file mode 100644
index 81329bf457..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/set.py
+++ /dev/null
@@ -1,261 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-class Set(object):
-
- """A simple set class.
-
- This class was originally used to deal with sets being missing in
- ancient versions of python, but dnspython will continue to use it
- as these sets are based on lists and are thus indexable, and this
- ability is widely used in dnspython applications.
- """
-
- __slots__ = ['items']
-
- def __init__(self, items=None):
- """Initialize the set.
-
- *items*, an iterable or ``None``, the initial set of items.
- """
-
- self.items = []
- if items is not None:
- for item in items:
- self.add(item)
-
- def __repr__(self):
- return "dns.simpleset.Set(%s)" % repr(self.items)
-
- def add(self, item):
- """Add an item to the set.
- """
-
- if item not in self.items:
- self.items.append(item)
-
- def remove(self, item):
- """Remove an item from the set.
- """
-
- self.items.remove(item)
-
- def discard(self, item):
- """Remove an item from the set if present.
- """
-
- try:
- self.items.remove(item)
- except ValueError:
- pass
-
- def _clone(self):
- """Make a (shallow) copy of the set.
-
- There is a 'clone protocol' that subclasses of this class
- should use. To make a copy, first call your super's _clone()
- method, and use the object returned as the new instance. Then
- make shallow copies of the attributes defined in the subclass.
-
- This protocol allows us to write the set algorithms that
- return new instances (e.g. union) once, and keep using them in
- subclasses.
- """
-
- cls = self.__class__
- obj = cls.__new__(cls)
- obj.items = list(self.items)
- return obj
-
- def __copy__(self):
- """Make a (shallow) copy of the set.
- """
-
- return self._clone()
-
- def copy(self):
- """Make a (shallow) copy of the set.
- """
-
- return self._clone()
-
- def union_update(self, other):
- """Update the set, adding any elements from other which are not
- already in the set.
- """
-
- if not isinstance(other, Set):
- raise ValueError('other must be a Set instance')
- if self is other:
- return
- for item in other.items:
- self.add(item)
-
- def intersection_update(self, other):
- """Update the set, removing any elements from other which are not
- in both sets.
- """
-
- if not isinstance(other, Set):
- raise ValueError('other must be a Set instance')
- if self is other:
- return
- # we make a copy of the list so that we can remove items from
- # the list without breaking the iterator.
- for item in list(self.items):
- if item not in other.items:
- self.items.remove(item)
-
- def difference_update(self, other):
- """Update the set, removing any elements from other which are in
- the set.
- """
-
- if not isinstance(other, Set):
- raise ValueError('other must be a Set instance')
- if self is other:
- self.items = []
- else:
- for item in other.items:
- self.discard(item)
-
- def union(self, other):
- """Return a new set which is the union of ``self`` and ``other``.
-
- Returns the same Set type as this set.
- """
-
- obj = self._clone()
- obj.union_update(other)
- return obj
-
- def intersection(self, other):
- """Return a new set which is the intersection of ``self`` and
- ``other``.
-
- Returns the same Set type as this set.
- """
-
- obj = self._clone()
- obj.intersection_update(other)
- return obj
-
- def difference(self, other):
- """Return a new set which ``self`` - ``other``, i.e. the items
- in ``self`` which are not also in ``other``.
-
- Returns the same Set type as this set.
- """
-
- obj = self._clone()
- obj.difference_update(other)
- return obj
-
- def __or__(self, other):
- return self.union(other)
-
- def __and__(self, other):
- return self.intersection(other)
-
- def __add__(self, other):
- return self.union(other)
-
- def __sub__(self, other):
- return self.difference(other)
-
- def __ior__(self, other):
- self.union_update(other)
- return self
-
- def __iand__(self, other):
- self.intersection_update(other)
- return self
-
- def __iadd__(self, other):
- self.union_update(other)
- return self
-
- def __isub__(self, other):
- self.difference_update(other)
- return self
-
- def update(self, other):
- """Update the set, adding any elements from other which are not
- already in the set.
-
- *other*, the collection of items with which to update the set, which
- may be any iterable type.
- """
-
- for item in other:
- self.add(item)
-
- def clear(self):
- """Make the set empty."""
- self.items = []
-
- def __eq__(self, other):
- # Yes, this is inefficient but the sets we're dealing with are
- # usually quite small, so it shouldn't hurt too much.
- for item in self.items:
- if item not in other.items:
- return False
- for item in other.items:
- if item not in self.items:
- return False
- return True
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- def __len__(self):
- return len(self.items)
-
- def __iter__(self):
- return iter(self.items)
-
- def __getitem__(self, i):
- return self.items[i]
-
- def __delitem__(self, i):
- del self.items[i]
-
- def issubset(self, other):
- """Is this set a subset of *other*?
-
- Returns a ``bool``.
- """
-
- if not isinstance(other, Set):
- raise ValueError('other must be a Set instance')
- for item in self.items:
- if item not in other.items:
- return False
- return True
-
- def issuperset(self, other):
- """Is this set a superset of *other*?
-
- Returns a ``bool``.
- """
-
- if not isinstance(other, Set):
- raise ValueError('other must be a Set instance')
- for item in other.items:
- if item not in self.items:
- return False
- return True
diff --git a/client/ayon_core/vendor/python/python_2/dns/tokenizer.py b/client/ayon_core/vendor/python/python_2/dns/tokenizer.py
deleted file mode 100644
index 880b71ce7a..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/tokenizer.py
+++ /dev/null
@@ -1,571 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""Tokenize DNS master file format"""
-
-from io import StringIO
-import sys
-
-import dns.exception
-import dns.name
-import dns.ttl
-from ._compat import long, text_type, binary_type
-
-_DELIMITERS = {
- ' ': True,
- '\t': True,
- '\n': True,
- ';': True,
- '(': True,
- ')': True,
- '"': True}
-
-_QUOTING_DELIMITERS = {'"': True}
-
-EOF = 0
-EOL = 1
-WHITESPACE = 2
-IDENTIFIER = 3
-QUOTED_STRING = 4
-COMMENT = 5
-DELIMITER = 6
-
-
-class UngetBufferFull(dns.exception.DNSException):
- """An attempt was made to unget a token when the unget buffer was full."""
-
-
-class Token(object):
- """A DNS master file format token.
-
- ttype: The token type
- value: The token value
- has_escape: Does the token value contain escapes?
- """
-
- def __init__(self, ttype, value='', has_escape=False):
- """Initialize a token instance."""
-
- self.ttype = ttype
- self.value = value
- self.has_escape = has_escape
-
- def is_eof(self):
- return self.ttype == EOF
-
- def is_eol(self):
- return self.ttype == EOL
-
- def is_whitespace(self):
- return self.ttype == WHITESPACE
-
- def is_identifier(self):
- return self.ttype == IDENTIFIER
-
- def is_quoted_string(self):
- return self.ttype == QUOTED_STRING
-
- def is_comment(self):
- return self.ttype == COMMENT
-
- def is_delimiter(self):
- return self.ttype == DELIMITER
-
- def is_eol_or_eof(self):
- return self.ttype == EOL or self.ttype == EOF
-
- def __eq__(self, other):
- if not isinstance(other, Token):
- return False
- return (self.ttype == other.ttype and
- self.value == other.value)
-
- def __ne__(self, other):
- if not isinstance(other, Token):
- return True
- return (self.ttype != other.ttype or
- self.value != other.value)
-
- def __str__(self):
- return '%d "%s"' % (self.ttype, self.value)
-
- def unescape(self):
- if not self.has_escape:
- return self
- unescaped = ''
- l = len(self.value)
- i = 0
- while i < l:
- c = self.value[i]
- i += 1
- if c == '\\':
- if i >= l:
- raise dns.exception.UnexpectedEnd
- c = self.value[i]
- i += 1
- if c.isdigit():
- if i >= l:
- raise dns.exception.UnexpectedEnd
- c2 = self.value[i]
- i += 1
- if i >= l:
- raise dns.exception.UnexpectedEnd
- c3 = self.value[i]
- i += 1
- if not (c2.isdigit() and c3.isdigit()):
- raise dns.exception.SyntaxError
- c = chr(int(c) * 100 + int(c2) * 10 + int(c3))
- unescaped += c
- return Token(self.ttype, unescaped)
-
- # compatibility for old-style tuple tokens
-
- def __len__(self):
- return 2
-
- def __iter__(self):
- return iter((self.ttype, self.value))
-
- def __getitem__(self, i):
- if i == 0:
- return self.ttype
- elif i == 1:
- return self.value
- else:
- raise IndexError
-
-
-class Tokenizer(object):
- """A DNS master file format tokenizer.
-
- A token object is basically a (type, value) tuple. The valid
- types are EOF, EOL, WHITESPACE, IDENTIFIER, QUOTED_STRING,
- COMMENT, and DELIMITER.
-
- file: The file to tokenize
-
- ungotten_char: The most recently ungotten character, or None.
-
- ungotten_token: The most recently ungotten token, or None.
-
- multiline: The current multiline level. This value is increased
- by one every time a '(' delimiter is read, and decreased by one every time
- a ')' delimiter is read.
-
- quoting: This variable is true if the tokenizer is currently
- reading a quoted string.
-
- eof: This variable is true if the tokenizer has encountered EOF.
-
- delimiters: The current delimiter dictionary.
-
- line_number: The current line number
-
- filename: A filename that will be returned by the where() method.
- """
-
- def __init__(self, f=sys.stdin, filename=None):
- """Initialize a tokenizer instance.
-
- f: The file to tokenize. The default is sys.stdin.
- This parameter may also be a string, in which case the tokenizer
- will take its input from the contents of the string.
-
- filename: the name of the filename that the where() method
- will return.
- """
-
- if isinstance(f, text_type):
- f = StringIO(f)
- if filename is None:
- filename = ''
- elif isinstance(f, binary_type):
- f = StringIO(f.decode())
- if filename is None:
- filename = ''
- else:
- if filename is None:
- if f is sys.stdin:
- filename = ''
- else:
- filename = ''
- self.file = f
- self.ungotten_char = None
- self.ungotten_token = None
- self.multiline = 0
- self.quoting = False
- self.eof = False
- self.delimiters = _DELIMITERS
- self.line_number = 1
- self.filename = filename
-
- def _get_char(self):
- """Read a character from input.
- """
-
- if self.ungotten_char is None:
- if self.eof:
- c = ''
- else:
- c = self.file.read(1)
- if c == '':
- self.eof = True
- elif c == '\n':
- self.line_number += 1
- else:
- c = self.ungotten_char
- self.ungotten_char = None
- return c
-
- def where(self):
- """Return the current location in the input.
-
- Returns a (string, int) tuple. The first item is the filename of
- the input, the second is the current line number.
- """
-
- return (self.filename, self.line_number)
-
- def _unget_char(self, c):
- """Unget a character.
-
- The unget buffer for characters is only one character large; it is
- an error to try to unget a character when the unget buffer is not
- empty.
-
- c: the character to unget
- raises UngetBufferFull: there is already an ungotten char
- """
-
- if self.ungotten_char is not None:
- raise UngetBufferFull
- self.ungotten_char = c
-
- def skip_whitespace(self):
- """Consume input until a non-whitespace character is encountered.
-
- The non-whitespace character is then ungotten, and the number of
- whitespace characters consumed is returned.
-
- If the tokenizer is in multiline mode, then newlines are whitespace.
-
- Returns the number of characters skipped.
- """
-
- skipped = 0
- while True:
- c = self._get_char()
- if c != ' ' and c != '\t':
- if (c != '\n') or not self.multiline:
- self._unget_char(c)
- return skipped
- skipped += 1
-
- def get(self, want_leading=False, want_comment=False):
- """Get the next token.
-
- want_leading: If True, return a WHITESPACE token if the
- first character read is whitespace. The default is False.
-
- want_comment: If True, return a COMMENT token if the
- first token read is a comment. The default is False.
-
- Raises dns.exception.UnexpectedEnd: input ended prematurely
-
- Raises dns.exception.SyntaxError: input was badly formed
-
- Returns a Token.
- """
-
- if self.ungotten_token is not None:
- token = self.ungotten_token
- self.ungotten_token = None
- if token.is_whitespace():
- if want_leading:
- return token
- elif token.is_comment():
- if want_comment:
- return token
- else:
- return token
- skipped = self.skip_whitespace()
- if want_leading and skipped > 0:
- return Token(WHITESPACE, ' ')
- token = ''
- ttype = IDENTIFIER
- has_escape = False
- while True:
- c = self._get_char()
- if c == '' or c in self.delimiters:
- if c == '' and self.quoting:
- raise dns.exception.UnexpectedEnd
- if token == '' and ttype != QUOTED_STRING:
- if c == '(':
- self.multiline += 1
- self.skip_whitespace()
- continue
- elif c == ')':
- if self.multiline <= 0:
- raise dns.exception.SyntaxError
- self.multiline -= 1
- self.skip_whitespace()
- continue
- elif c == '"':
- if not self.quoting:
- self.quoting = True
- self.delimiters = _QUOTING_DELIMITERS
- ttype = QUOTED_STRING
- continue
- else:
- self.quoting = False
- self.delimiters = _DELIMITERS
- self.skip_whitespace()
- continue
- elif c == '\n':
- return Token(EOL, '\n')
- elif c == ';':
- while 1:
- c = self._get_char()
- if c == '\n' or c == '':
- break
- token += c
- if want_comment:
- self._unget_char(c)
- return Token(COMMENT, token)
- elif c == '':
- if self.multiline:
- raise dns.exception.SyntaxError(
- 'unbalanced parentheses')
- return Token(EOF)
- elif self.multiline:
- self.skip_whitespace()
- token = ''
- continue
- else:
- return Token(EOL, '\n')
- else:
- # This code exists in case we ever want a
- # delimiter to be returned. It never produces
- # a token currently.
- token = c
- ttype = DELIMITER
- else:
- self._unget_char(c)
- break
- elif self.quoting:
- if c == '\\':
- c = self._get_char()
- if c == '':
- raise dns.exception.UnexpectedEnd
- if c.isdigit():
- c2 = self._get_char()
- if c2 == '':
- raise dns.exception.UnexpectedEnd
- c3 = self._get_char()
- if c == '':
- raise dns.exception.UnexpectedEnd
- if not (c2.isdigit() and c3.isdigit()):
- raise dns.exception.SyntaxError
- c = chr(int(c) * 100 + int(c2) * 10 + int(c3))
- elif c == '\n':
- raise dns.exception.SyntaxError('newline in quoted string')
- elif c == '\\':
- #
- # It's an escape. Put it and the next character into
- # the token; it will be checked later for goodness.
- #
- token += c
- has_escape = True
- c = self._get_char()
- if c == '' or c == '\n':
- raise dns.exception.UnexpectedEnd
- token += c
- if token == '' and ttype != QUOTED_STRING:
- if self.multiline:
- raise dns.exception.SyntaxError('unbalanced parentheses')
- ttype = EOF
- return Token(ttype, token, has_escape)
-
- def unget(self, token):
- """Unget a token.
-
- The unget buffer for tokens is only one token large; it is
- an error to try to unget a token when the unget buffer is not
- empty.
-
- token: the token to unget
-
- Raises UngetBufferFull: there is already an ungotten token
- """
-
- if self.ungotten_token is not None:
- raise UngetBufferFull
- self.ungotten_token = token
-
- def next(self):
- """Return the next item in an iteration.
-
- Returns a Token.
- """
-
- token = self.get()
- if token.is_eof():
- raise StopIteration
- return token
-
- __next__ = next
-
- def __iter__(self):
- return self
-
- # Helpers
-
- def get_int(self, base=10):
- """Read the next token and interpret it as an integer.
-
- Raises dns.exception.SyntaxError if not an integer.
-
- Returns an int.
- """
-
- token = self.get().unescape()
- if not token.is_identifier():
- raise dns.exception.SyntaxError('expecting an identifier')
- if not token.value.isdigit():
- raise dns.exception.SyntaxError('expecting an integer')
- return int(token.value, base)
-
- def get_uint8(self):
- """Read the next token and interpret it as an 8-bit unsigned
- integer.
-
- Raises dns.exception.SyntaxError if not an 8-bit unsigned integer.
-
- Returns an int.
- """
-
- value = self.get_int()
- if value < 0 or value > 255:
- raise dns.exception.SyntaxError(
- '%d is not an unsigned 8-bit integer' % value)
- return value
-
- def get_uint16(self, base=10):
- """Read the next token and interpret it as a 16-bit unsigned
- integer.
-
- Raises dns.exception.SyntaxError if not a 16-bit unsigned integer.
-
- Returns an int.
- """
-
- value = self.get_int(base=base)
- if value < 0 or value > 65535:
- if base == 8:
- raise dns.exception.SyntaxError(
- '%o is not an octal unsigned 16-bit integer' % value)
- else:
- raise dns.exception.SyntaxError(
- '%d is not an unsigned 16-bit integer' % value)
- return value
-
- def get_uint32(self):
- """Read the next token and interpret it as a 32-bit unsigned
- integer.
-
- Raises dns.exception.SyntaxError if not a 32-bit unsigned integer.
-
- Returns an int.
- """
-
- token = self.get().unescape()
- if not token.is_identifier():
- raise dns.exception.SyntaxError('expecting an identifier')
- if not token.value.isdigit():
- raise dns.exception.SyntaxError('expecting an integer')
- value = long(token.value)
- if value < 0 or value > long(4294967296):
- raise dns.exception.SyntaxError(
- '%d is not an unsigned 32-bit integer' % value)
- return value
-
- def get_string(self, origin=None):
- """Read the next token and interpret it as a string.
-
- Raises dns.exception.SyntaxError if not a string.
-
- Returns a string.
- """
-
- token = self.get().unescape()
- if not (token.is_identifier() or token.is_quoted_string()):
- raise dns.exception.SyntaxError('expecting a string')
- return token.value
-
- def get_identifier(self, origin=None):
- """Read the next token, which should be an identifier.
-
- Raises dns.exception.SyntaxError if not an identifier.
-
- Returns a string.
- """
-
- token = self.get().unescape()
- if not token.is_identifier():
- raise dns.exception.SyntaxError('expecting an identifier')
- return token.value
-
- def get_name(self, origin=None):
- """Read the next token and interpret it as a DNS name.
-
- Raises dns.exception.SyntaxError if not a name.
-
- Returns a dns.name.Name.
- """
-
- token = self.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError('expecting an identifier')
- return dns.name.from_text(token.value, origin)
-
- def get_eol(self):
- """Read the next token and raise an exception if it isn't EOL or
- EOF.
-
- Returns a string.
- """
-
- token = self.get()
- if not token.is_eol_or_eof():
- raise dns.exception.SyntaxError(
- 'expected EOL or EOF, got %d "%s"' % (token.ttype,
- token.value))
- return token.value
-
- def get_ttl(self):
- """Read the next token and interpret it as a DNS TTL.
-
- Raises dns.exception.SyntaxError or dns.ttl.BadTTL if not an
- identifier or badly formed.
-
- Returns an int.
- """
-
- token = self.get().unescape()
- if not token.is_identifier():
- raise dns.exception.SyntaxError('expecting an identifier')
- return dns.ttl.from_text(token.value)
diff --git a/client/ayon_core/vendor/python/python_2/dns/tsig.py b/client/ayon_core/vendor/python/python_2/dns/tsig.py
deleted file mode 100644
index 3daa387855..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/tsig.py
+++ /dev/null
@@ -1,236 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS TSIG support."""
-
-import hashlib
-import hmac
-import struct
-
-import dns.exception
-import dns.rdataclass
-import dns.name
-from ._compat import long, string_types, text_type
-
-class BadTime(dns.exception.DNSException):
-
- """The current time is not within the TSIG's validity time."""
-
-
-class BadSignature(dns.exception.DNSException):
-
- """The TSIG signature fails to verify."""
-
-
-class PeerError(dns.exception.DNSException):
-
- """Base class for all TSIG errors generated by the remote peer"""
-
-
-class PeerBadKey(PeerError):
-
- """The peer didn't know the key we used"""
-
-
-class PeerBadSignature(PeerError):
-
- """The peer didn't like the signature we sent"""
-
-
-class PeerBadTime(PeerError):
-
- """The peer didn't like the time we sent"""
-
-
-class PeerBadTruncation(PeerError):
-
- """The peer didn't like amount of truncation in the TSIG we sent"""
-
-# TSIG Algorithms
-
-HMAC_MD5 = dns.name.from_text("HMAC-MD5.SIG-ALG.REG.INT")
-HMAC_SHA1 = dns.name.from_text("hmac-sha1")
-HMAC_SHA224 = dns.name.from_text("hmac-sha224")
-HMAC_SHA256 = dns.name.from_text("hmac-sha256")
-HMAC_SHA384 = dns.name.from_text("hmac-sha384")
-HMAC_SHA512 = dns.name.from_text("hmac-sha512")
-
-_hashes = {
- HMAC_SHA224: hashlib.sha224,
- HMAC_SHA256: hashlib.sha256,
- HMAC_SHA384: hashlib.sha384,
- HMAC_SHA512: hashlib.sha512,
- HMAC_SHA1: hashlib.sha1,
- HMAC_MD5: hashlib.md5,
-}
-
-default_algorithm = HMAC_MD5
-
-BADSIG = 16
-BADKEY = 17
-BADTIME = 18
-BADTRUNC = 22
-
-
-def sign(wire, keyname, secret, time, fudge, original_id, error,
- other_data, request_mac, ctx=None, multi=False, first=True,
- algorithm=default_algorithm):
- """Return a (tsig_rdata, mac, ctx) tuple containing the HMAC TSIG rdata
- for the input parameters, the HMAC MAC calculated by applying the
- TSIG signature algorithm, and the TSIG digest context.
- @rtype: (string, string, hmac.HMAC object)
- @raises ValueError: I{other_data} is too long
- @raises NotImplementedError: I{algorithm} is not supported
- """
-
- if isinstance(other_data, text_type):
- other_data = other_data.encode()
- (algorithm_name, digestmod) = get_algorithm(algorithm)
- if first:
- ctx = hmac.new(secret, digestmod=digestmod)
- ml = len(request_mac)
- if ml > 0:
- ctx.update(struct.pack('!H', ml))
- ctx.update(request_mac)
- id = struct.pack('!H', original_id)
- ctx.update(id)
- ctx.update(wire[2:])
- if first:
- ctx.update(keyname.to_digestable())
- ctx.update(struct.pack('!H', dns.rdataclass.ANY))
- ctx.update(struct.pack('!I', 0))
- long_time = time + long(0)
- upper_time = (long_time >> 32) & long(0xffff)
- lower_time = long_time & long(0xffffffff)
- time_mac = struct.pack('!HIH', upper_time, lower_time, fudge)
- pre_mac = algorithm_name + time_mac
- ol = len(other_data)
- if ol > 65535:
- raise ValueError('TSIG Other Data is > 65535 bytes')
- post_mac = struct.pack('!HH', error, ol) + other_data
- if first:
- ctx.update(pre_mac)
- ctx.update(post_mac)
- else:
- ctx.update(time_mac)
- mac = ctx.digest()
- mpack = struct.pack('!H', len(mac))
- tsig_rdata = pre_mac + mpack + mac + id + post_mac
- if multi:
- ctx = hmac.new(secret, digestmod=digestmod)
- ml = len(mac)
- ctx.update(struct.pack('!H', ml))
- ctx.update(mac)
- else:
- ctx = None
- return (tsig_rdata, mac, ctx)
-
-
-def hmac_md5(wire, keyname, secret, time, fudge, original_id, error,
- other_data, request_mac, ctx=None, multi=False, first=True,
- algorithm=default_algorithm):
- return sign(wire, keyname, secret, time, fudge, original_id, error,
- other_data, request_mac, ctx, multi, first, algorithm)
-
-
-def validate(wire, keyname, secret, now, request_mac, tsig_start, tsig_rdata,
- tsig_rdlen, ctx=None, multi=False, first=True):
- """Validate the specified TSIG rdata against the other input parameters.
-
- @raises FormError: The TSIG is badly formed.
- @raises BadTime: There is too much time skew between the client and the
- server.
- @raises BadSignature: The TSIG signature did not validate
- @rtype: hmac.HMAC object"""
-
- (adcount,) = struct.unpack("!H", wire[10:12])
- if adcount == 0:
- raise dns.exception.FormError
- adcount -= 1
- new_wire = wire[0:10] + struct.pack("!H", adcount) + wire[12:tsig_start]
- current = tsig_rdata
- (aname, used) = dns.name.from_wire(wire, current)
- current = current + used
- (upper_time, lower_time, fudge, mac_size) = \
- struct.unpack("!HIHH", wire[current:current + 10])
- time = ((upper_time + long(0)) << 32) + (lower_time + long(0))
- current += 10
- mac = wire[current:current + mac_size]
- current += mac_size
- (original_id, error, other_size) = \
- struct.unpack("!HHH", wire[current:current + 6])
- current += 6
- other_data = wire[current:current + other_size]
- current += other_size
- if current != tsig_rdata + tsig_rdlen:
- raise dns.exception.FormError
- if error != 0:
- if error == BADSIG:
- raise PeerBadSignature
- elif error == BADKEY:
- raise PeerBadKey
- elif error == BADTIME:
- raise PeerBadTime
- elif error == BADTRUNC:
- raise PeerBadTruncation
- else:
- raise PeerError('unknown TSIG error code %d' % error)
- time_low = time - fudge
- time_high = time + fudge
- if now < time_low or now > time_high:
- raise BadTime
- (junk, our_mac, ctx) = sign(new_wire, keyname, secret, time, fudge,
- original_id, error, other_data,
- request_mac, ctx, multi, first, aname)
- if our_mac != mac:
- raise BadSignature
- return ctx
-
-
-def get_algorithm(algorithm):
- """Returns the wire format string and the hash module to use for the
- specified TSIG algorithm
-
- @rtype: (string, hash constructor)
- @raises NotImplementedError: I{algorithm} is not supported
- """
-
- if isinstance(algorithm, string_types):
- algorithm = dns.name.from_text(algorithm)
-
- try:
- return (algorithm.to_digestable(), _hashes[algorithm])
- except KeyError:
- raise NotImplementedError("TSIG algorithm " + str(algorithm) +
- " is not supported")
-
-
-def get_algorithm_and_mac(wire, tsig_rdata, tsig_rdlen):
- """Return the tsig algorithm for the specified tsig_rdata
- @raises FormError: The TSIG is badly formed.
- """
- current = tsig_rdata
- (aname, used) = dns.name.from_wire(wire, current)
- current = current + used
- (upper_time, lower_time, fudge, mac_size) = \
- struct.unpack("!HIHH", wire[current:current + 10])
- current += 10
- mac = wire[current:current + mac_size]
- current += mac_size
- if current > tsig_rdata + tsig_rdlen:
- raise dns.exception.FormError
- return (aname, mac)
diff --git a/client/ayon_core/vendor/python/python_2/dns/tsigkeyring.py b/client/ayon_core/vendor/python/python_2/dns/tsigkeyring.py
deleted file mode 100644
index 5e5fe1cbe4..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/tsigkeyring.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""A place to store TSIG keys."""
-
-from dns._compat import maybe_decode, maybe_encode
-
-import base64
-
-import dns.name
-
-
-def from_text(textring):
- """Convert a dictionary containing (textual DNS name, base64 secret) pairs
- into a binary keyring which has (dns.name.Name, binary secret) pairs.
- @rtype: dict"""
-
- keyring = {}
- for keytext in textring:
- keyname = dns.name.from_text(keytext)
- secret = base64.decodestring(maybe_encode(textring[keytext]))
- keyring[keyname] = secret
- return keyring
-
-
-def to_text(keyring):
- """Convert a dictionary containing (dns.name.Name, binary secret) pairs
- into a text keyring which has (textual DNS name, base64 secret) pairs.
- @rtype: dict"""
-
- textring = {}
- for keyname in keyring:
- keytext = maybe_decode(keyname.to_text())
- secret = maybe_decode(base64.encodestring(keyring[keyname]))
- textring[keytext] = secret
- return textring
diff --git a/client/ayon_core/vendor/python/python_2/dns/ttl.py b/client/ayon_core/vendor/python/python_2/dns/ttl.py
deleted file mode 100644
index 4be16bee5b..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/ttl.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS TTL conversion."""
-
-import dns.exception
-from ._compat import long
-
-
-class BadTTL(dns.exception.SyntaxError):
- """DNS TTL value is not well-formed."""
-
-
-def from_text(text):
- """Convert the text form of a TTL to an integer.
-
- The BIND 8 units syntax for TTLs (e.g. '1w6d4h3m10s') is supported.
-
- *text*, a ``text``, the textual TTL.
-
- Raises ``dns.ttl.BadTTL`` if the TTL is not well-formed.
-
- Returns an ``int``.
- """
-
- if text.isdigit():
- total = long(text)
- else:
- if not text[0].isdigit():
- raise BadTTL
- total = long(0)
- current = long(0)
- for c in text:
- if c.isdigit():
- current *= 10
- current += long(c)
- else:
- c = c.lower()
- if c == 'w':
- total += current * long(604800)
- elif c == 'd':
- total += current * long(86400)
- elif c == 'h':
- total += current * long(3600)
- elif c == 'm':
- total += current * long(60)
- elif c == 's':
- total += current
- else:
- raise BadTTL("unknown unit '%s'" % c)
- current = 0
- if not current == 0:
- raise BadTTL("trailing integer")
- if total < long(0) or total > long(2147483647):
- raise BadTTL("TTL should be between 0 and 2^31 - 1 (inclusive)")
- return total
diff --git a/client/ayon_core/vendor/python/python_2/dns/update.py b/client/ayon_core/vendor/python/python_2/dns/update.py
deleted file mode 100644
index 96a00d5dbe..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/update.py
+++ /dev/null
@@ -1,279 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Dynamic Update Support"""
-
-
-import dns.message
-import dns.name
-import dns.opcode
-import dns.rdata
-import dns.rdataclass
-import dns.rdataset
-import dns.tsig
-from ._compat import string_types
-
-
-class Update(dns.message.Message):
-
- def __init__(self, zone, rdclass=dns.rdataclass.IN, keyring=None,
- keyname=None, keyalgorithm=dns.tsig.default_algorithm):
- """Initialize a new DNS Update object.
-
- See the documentation of the Message class for a complete
- description of the keyring dictionary.
-
- *zone*, a ``dns.name.Name`` or ``text``, the zone which is being
- updated.
-
- *rdclass*, an ``int`` or ``text``, the class of the zone.
-
- *keyring*, a ``dict``, the TSIG keyring to use. If a
- *keyring* is specified but a *keyname* is not, then the key
- used will be the first key in the *keyring*. Note that the
- order of keys in a dictionary is not defined, so applications
- should supply a keyname when a keyring is used, unless they
- know the keyring contains only one key.
-
- *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key
- to use; defaults to ``None``. The key must be defined in the keyring.
-
- *keyalgorithm*, a ``dns.name.Name``, the TSIG algorithm to use.
- """
- super(Update, self).__init__()
- self.flags |= dns.opcode.to_flags(dns.opcode.UPDATE)
- if isinstance(zone, string_types):
- zone = dns.name.from_text(zone)
- self.origin = zone
- if isinstance(rdclass, string_types):
- rdclass = dns.rdataclass.from_text(rdclass)
- self.zone_rdclass = rdclass
- self.find_rrset(self.question, self.origin, rdclass, dns.rdatatype.SOA,
- create=True, force_unique=True)
- if keyring is not None:
- self.use_tsig(keyring, keyname, algorithm=keyalgorithm)
-
- def _add_rr(self, name, ttl, rd, deleting=None, section=None):
- """Add a single RR to the update section."""
-
- if section is None:
- section = self.authority
- covers = rd.covers()
- rrset = self.find_rrset(section, name, self.zone_rdclass, rd.rdtype,
- covers, deleting, True, True)
- rrset.add(rd, ttl)
-
- def _add(self, replace, section, name, *args):
- """Add records.
-
- *replace* is the replacement mode. If ``False``,
- RRs are added to an existing RRset; if ``True``, the RRset
- is replaced with the specified contents. The second
- argument is the section to add to. The third argument
- is always a name. The other arguments can be:
-
- - rdataset...
-
- - ttl, rdata...
-
- - ttl, rdtype, string...
- """
-
- if isinstance(name, string_types):
- name = dns.name.from_text(name, None)
- if isinstance(args[0], dns.rdataset.Rdataset):
- for rds in args:
- if replace:
- self.delete(name, rds.rdtype)
- for rd in rds:
- self._add_rr(name, rds.ttl, rd, section=section)
- else:
- args = list(args)
- ttl = int(args.pop(0))
- if isinstance(args[0], dns.rdata.Rdata):
- if replace:
- self.delete(name, args[0].rdtype)
- for rd in args:
- self._add_rr(name, ttl, rd, section=section)
- else:
- rdtype = args.pop(0)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if replace:
- self.delete(name, rdtype)
- for s in args:
- rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s,
- self.origin)
- self._add_rr(name, ttl, rd, section=section)
-
- def add(self, name, *args):
- """Add records.
-
- The first argument is always a name. The other
- arguments can be:
-
- - rdataset...
-
- - ttl, rdata...
-
- - ttl, rdtype, string...
- """
-
- self._add(False, self.authority, name, *args)
-
- def delete(self, name, *args):
- """Delete records.
-
- The first argument is always a name. The other
- arguments can be:
-
- - *empty*
-
- - rdataset...
-
- - rdata...
-
- - rdtype, [string...]
- """
-
- if isinstance(name, string_types):
- name = dns.name.from_text(name, None)
- if len(args) == 0:
- self.find_rrset(self.authority, name, dns.rdataclass.ANY,
- dns.rdatatype.ANY, dns.rdatatype.NONE,
- dns.rdatatype.ANY, True, True)
- elif isinstance(args[0], dns.rdataset.Rdataset):
- for rds in args:
- for rd in rds:
- self._add_rr(name, 0, rd, dns.rdataclass.NONE)
- else:
- args = list(args)
- if isinstance(args[0], dns.rdata.Rdata):
- for rd in args:
- self._add_rr(name, 0, rd, dns.rdataclass.NONE)
- else:
- rdtype = args.pop(0)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if len(args) == 0:
- self.find_rrset(self.authority, name,
- self.zone_rdclass, rdtype,
- dns.rdatatype.NONE,
- dns.rdataclass.ANY,
- True, True)
- else:
- for s in args:
- rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s,
- self.origin)
- self._add_rr(name, 0, rd, dns.rdataclass.NONE)
-
- def replace(self, name, *args):
- """Replace records.
-
- The first argument is always a name. The other
- arguments can be:
-
- - rdataset...
-
- - ttl, rdata...
-
- - ttl, rdtype, string...
-
- Note that if you want to replace the entire node, you should do
- a delete of the name followed by one or more calls to add.
- """
-
- self._add(True, self.authority, name, *args)
-
- def present(self, name, *args):
- """Require that an owner name (and optionally an rdata type,
- or specific rdataset) exists as a prerequisite to the
- execution of the update.
-
- The first argument is always a name.
- The other arguments can be:
-
- - rdataset...
-
- - rdata...
-
- - rdtype, string...
- """
-
- if isinstance(name, string_types):
- name = dns.name.from_text(name, None)
- if len(args) == 0:
- self.find_rrset(self.answer, name,
- dns.rdataclass.ANY, dns.rdatatype.ANY,
- dns.rdatatype.NONE, None,
- True, True)
- elif isinstance(args[0], dns.rdataset.Rdataset) or \
- isinstance(args[0], dns.rdata.Rdata) or \
- len(args) > 1:
- if not isinstance(args[0], dns.rdataset.Rdataset):
- # Add a 0 TTL
- args = list(args)
- args.insert(0, 0)
- self._add(False, self.answer, name, *args)
- else:
- rdtype = args[0]
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- self.find_rrset(self.answer, name,
- dns.rdataclass.ANY, rdtype,
- dns.rdatatype.NONE, None,
- True, True)
-
- def absent(self, name, rdtype=None):
- """Require that an owner name (and optionally an rdata type) does
- not exist as a prerequisite to the execution of the update."""
-
- if isinstance(name, string_types):
- name = dns.name.from_text(name, None)
- if rdtype is None:
- self.find_rrset(self.answer, name,
- dns.rdataclass.NONE, dns.rdatatype.ANY,
- dns.rdatatype.NONE, None,
- True, True)
- else:
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- self.find_rrset(self.answer, name,
- dns.rdataclass.NONE, rdtype,
- dns.rdatatype.NONE, None,
- True, True)
-
- def to_wire(self, origin=None, max_size=65535):
- """Return a string containing the update in DNS compressed wire
- format.
-
- *origin*, a ``dns.name.Name`` or ``None``, the origin to be
- appended to any relative names. If *origin* is ``None``, then
- the origin of the ``dns.update.Update`` message object is used
- (i.e. the *zone* parameter passed when the Update object was
- created).
-
- *max_size*, an ``int``, the maximum size of the wire format
- output; default is 0, which means "the message's request
- payload, if nonzero, or 65535".
-
- Returns a ``binary``.
- """
-
- if origin is None:
- origin = self.origin
- return super(Update, self).to_wire(origin, max_size)
diff --git a/client/ayon_core/vendor/python/python_2/dns/version.py b/client/ayon_core/vendor/python/python_2/dns/version.py
deleted file mode 100644
index f116904b46..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/version.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""dnspython release version information."""
-
-#: MAJOR
-MAJOR = 1
-#: MINOR
-MINOR = 16
-#: MICRO
-MICRO = 0
-#: RELEASELEVEL
-RELEASELEVEL = 0x0f
-#: SERIAL
-SERIAL = 0
-
-if RELEASELEVEL == 0x0f:
- #: version
- version = '%d.%d.%d' % (MAJOR, MINOR, MICRO)
-elif RELEASELEVEL == 0x00:
- version = '%d.%d.%dx%d' % \
- (MAJOR, MINOR, MICRO, SERIAL)
-else:
- version = '%d.%d.%d%x%d' % \
- (MAJOR, MINOR, MICRO, RELEASELEVEL, SERIAL)
-
-#: hexversion
-hexversion = MAJOR << 24 | MINOR << 16 | MICRO << 8 | RELEASELEVEL << 4 | \
- SERIAL
diff --git a/client/ayon_core/vendor/python/python_2/dns/wiredata.py b/client/ayon_core/vendor/python/python_2/dns/wiredata.py
deleted file mode 100644
index ea3c1e67d6..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/wiredata.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2011,2017 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Wire Data Helper"""
-
-import dns.exception
-from ._compat import binary_type, string_types, PY2
-
-# Figure out what constant python passes for an unspecified slice bound.
-# It's supposed to be sys.maxint, yet on 64-bit windows sys.maxint is 2^31 - 1
-# but Python uses 2^63 - 1 as the constant. Rather than making pointless
-# extra comparisons, duplicating code, or weakening WireData, we just figure
-# out what constant Python will use.
-
-
-class _SliceUnspecifiedBound(binary_type):
-
- def __getitem__(self, key):
- return key.stop
-
- if PY2:
- def __getslice__(self, i, j): # pylint: disable=getslice-method
- return self.__getitem__(slice(i, j))
-
-_unspecified_bound = _SliceUnspecifiedBound()[1:]
-
-
-class WireData(binary_type):
- # WireData is a binary type with stricter slicing
-
- def __getitem__(self, key):
- try:
- if isinstance(key, slice):
- # make sure we are not going outside of valid ranges,
- # do stricter control of boundaries than python does
- # by default
- start = key.start
- stop = key.stop
-
- if PY2:
- if stop == _unspecified_bound:
- # handle the case where the right bound is unspecified
- stop = len(self)
-
- if start < 0 or stop < 0:
- raise dns.exception.FormError
- # If it's not an empty slice, access left and right bounds
- # to make sure they're valid
- if start != stop:
- super(WireData, self).__getitem__(start)
- super(WireData, self).__getitem__(stop - 1)
- else:
- for index in (start, stop):
- if index is None:
- continue
- elif abs(index) > len(self):
- raise dns.exception.FormError
-
- return WireData(super(WireData, self).__getitem__(
- slice(start, stop)))
- return bytearray(self.unwrap())[key]
- except IndexError:
- raise dns.exception.FormError
-
- if PY2:
- def __getslice__(self, i, j): # pylint: disable=getslice-method
- return self.__getitem__(slice(i, j))
-
- def __iter__(self):
- i = 0
- while 1:
- try:
- yield self[i]
- i += 1
- except dns.exception.FormError:
- raise StopIteration
-
- def unwrap(self):
- return binary_type(self)
-
-
-def maybe_wrap(wire):
- if isinstance(wire, WireData):
- return wire
- elif isinstance(wire, binary_type):
- return WireData(wire)
- elif isinstance(wire, string_types):
- return WireData(wire.encode())
- raise ValueError("unhandled type %s" % type(wire))
diff --git a/client/ayon_core/vendor/python/python_2/dns/zone.py b/client/ayon_core/vendor/python/python_2/dns/zone.py
deleted file mode 100644
index 1e2fe78168..0000000000
--- a/client/ayon_core/vendor/python/python_2/dns/zone.py
+++ /dev/null
@@ -1,1127 +0,0 @@
-# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
-
-# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose with or without fee is hereby granted,
-# provided that the above copyright notice and this permission notice
-# appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""DNS Zones."""
-
-from __future__ import generators
-
-import sys
-import re
-import os
-from io import BytesIO
-
-import dns.exception
-import dns.name
-import dns.node
-import dns.rdataclass
-import dns.rdatatype
-import dns.rdata
-import dns.rdtypes.ANY.SOA
-import dns.rrset
-import dns.tokenizer
-import dns.ttl
-import dns.grange
-from ._compat import string_types, text_type, PY3
-
-
-class BadZone(dns.exception.DNSException):
-
- """The DNS zone is malformed."""
-
-
-class NoSOA(BadZone):
-
- """The DNS zone has no SOA RR at its origin."""
-
-
-class NoNS(BadZone):
-
- """The DNS zone has no NS RRset at its origin."""
-
-
-class UnknownOrigin(BadZone):
-
- """The DNS zone's origin is unknown."""
-
-
-class Zone(object):
-
- """A DNS zone.
-
- A Zone is a mapping from names to nodes. The zone object may be
- treated like a Python dictionary, e.g. zone[name] will retrieve
- the node associated with that name. The I{name} may be a
- dns.name.Name object, or it may be a string. In the either case,
- if the name is relative it is treated as relative to the origin of
- the zone.
-
- @ivar rdclass: The zone's rdata class; the default is class IN.
- @type rdclass: int
- @ivar origin: The origin of the zone.
- @type origin: dns.name.Name object
- @ivar nodes: A dictionary mapping the names of nodes in the zone to the
- nodes themselves.
- @type nodes: dict
- @ivar relativize: should names in the zone be relativized?
- @type relativize: bool
- @cvar node_factory: the factory used to create a new node
- @type node_factory: class or callable
- """
-
- node_factory = dns.node.Node
-
- __slots__ = ['rdclass', 'origin', 'nodes', 'relativize']
-
- def __init__(self, origin, rdclass=dns.rdataclass.IN, relativize=True):
- """Initialize a zone object.
-
- @param origin: The origin of the zone.
- @type origin: dns.name.Name object
- @param rdclass: The zone's rdata class; the default is class IN.
- @type rdclass: int"""
-
- if origin is not None:
- if isinstance(origin, string_types):
- origin = dns.name.from_text(origin)
- elif not isinstance(origin, dns.name.Name):
- raise ValueError("origin parameter must be convertible to a "
- "DNS name")
- if not origin.is_absolute():
- raise ValueError("origin parameter must be an absolute name")
- self.origin = origin
- self.rdclass = rdclass
- self.nodes = {}
- self.relativize = relativize
-
- def __eq__(self, other):
- """Two zones are equal if they have the same origin, class, and
- nodes.
- @rtype: bool
- """
-
- if not isinstance(other, Zone):
- return False
- if self.rdclass != other.rdclass or \
- self.origin != other.origin or \
- self.nodes != other.nodes:
- return False
- return True
-
- def __ne__(self, other):
- """Are two zones not equal?
- @rtype: bool
- """
-
- return not self.__eq__(other)
-
- def _validate_name(self, name):
- if isinstance(name, string_types):
- name = dns.name.from_text(name, None)
- elif not isinstance(name, dns.name.Name):
- raise KeyError("name parameter must be convertible to a DNS name")
- if name.is_absolute():
- if not name.is_subdomain(self.origin):
- raise KeyError(
- "name parameter must be a subdomain of the zone origin")
- if self.relativize:
- name = name.relativize(self.origin)
- return name
-
- def __getitem__(self, key):
- key = self._validate_name(key)
- return self.nodes[key]
-
- def __setitem__(self, key, value):
- key = self._validate_name(key)
- self.nodes[key] = value
-
- def __delitem__(self, key):
- key = self._validate_name(key)
- del self.nodes[key]
-
- def __iter__(self):
- return self.nodes.__iter__()
-
- def iterkeys(self):
- if PY3:
- return self.nodes.keys() # pylint: disable=dict-keys-not-iterating
- else:
- return self.nodes.iterkeys() # pylint: disable=dict-iter-method
-
- def keys(self):
- return self.nodes.keys() # pylint: disable=dict-keys-not-iterating
-
- def itervalues(self):
- if PY3:
- return self.nodes.values() # pylint: disable=dict-values-not-iterating
- else:
- return self.nodes.itervalues() # pylint: disable=dict-iter-method
-
- def values(self):
- return self.nodes.values() # pylint: disable=dict-values-not-iterating
-
- def items(self):
- return self.nodes.items() # pylint: disable=dict-items-not-iterating
-
- iteritems = items
-
- def get(self, key):
- key = self._validate_name(key)
- return self.nodes.get(key)
-
- def __contains__(self, other):
- return other in self.nodes
-
- def find_node(self, name, create=False):
- """Find a node in the zone, possibly creating it.
-
- @param name: the name of the node to find
- @type name: dns.name.Name object or string
- @param create: should the node be created if it doesn't exist?
- @type create: bool
- @raises KeyError: the name is not known and create was not specified.
- @rtype: dns.node.Node object
- """
-
- name = self._validate_name(name)
- node = self.nodes.get(name)
- if node is None:
- if not create:
- raise KeyError
- node = self.node_factory()
- self.nodes[name] = node
- return node
-
- def get_node(self, name, create=False):
- """Get a node in the zone, possibly creating it.
-
- This method is like L{find_node}, except it returns None instead
- of raising an exception if the node does not exist and creation
- has not been requested.
-
- @param name: the name of the node to find
- @type name: dns.name.Name object or string
- @param create: should the node be created if it doesn't exist?
- @type create: bool
- @rtype: dns.node.Node object or None
- """
-
- try:
- node = self.find_node(name, create)
- except KeyError:
- node = None
- return node
-
- def delete_node(self, name):
- """Delete the specified node if it exists.
-
- It is not an error if the node does not exist.
- """
-
- name = self._validate_name(name)
- if name in self.nodes:
- del self.nodes[name]
-
- def find_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE,
- create=False):
- """Look for rdata with the specified name and type in the zone,
- and return an rdataset encapsulating it.
-
- The I{name}, I{rdtype}, and I{covers} parameters may be
- strings, in which case they will be converted to their proper
- type.
-
- The rdataset returned is not a copy; changes to it will change
- the zone.
-
- KeyError is raised if the name or type are not found.
- Use L{get_rdataset} if you want to have None returned instead.
-
- @param name: the owner name to look for
- @type name: DNS.name.Name object or string
- @param rdtype: the rdata type desired
- @type rdtype: int or string
- @param covers: the covered type (defaults to None)
- @type covers: int or string
- @param create: should the node and rdataset be created if they do not
- exist?
- @type create: bool
- @raises KeyError: the node or rdata could not be found
- @rtype: dns.rdataset.Rdataset object
- """
-
- name = self._validate_name(name)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if isinstance(covers, string_types):
- covers = dns.rdatatype.from_text(covers)
- node = self.find_node(name, create)
- return node.find_rdataset(self.rdclass, rdtype, covers, create)
-
- def get_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE,
- create=False):
- """Look for rdata with the specified name and type in the zone,
- and return an rdataset encapsulating it.
-
- The I{name}, I{rdtype}, and I{covers} parameters may be
- strings, in which case they will be converted to their proper
- type.
-
- The rdataset returned is not a copy; changes to it will change
- the zone.
-
- None is returned if the name or type are not found.
- Use L{find_rdataset} if you want to have KeyError raised instead.
-
- @param name: the owner name to look for
- @type name: DNS.name.Name object or string
- @param rdtype: the rdata type desired
- @type rdtype: int or string
- @param covers: the covered type (defaults to None)
- @type covers: int or string
- @param create: should the node and rdataset be created if they do not
- exist?
- @type create: bool
- @rtype: dns.rdataset.Rdataset object or None
- """
-
- try:
- rdataset = self.find_rdataset(name, rdtype, covers, create)
- except KeyError:
- rdataset = None
- return rdataset
-
- def delete_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE):
- """Delete the rdataset matching I{rdtype} and I{covers}, if it
- exists at the node specified by I{name}.
-
- The I{name}, I{rdtype}, and I{covers} parameters may be
- strings, in which case they will be converted to their proper
- type.
-
- It is not an error if the node does not exist, or if there is no
- matching rdataset at the node.
-
- If the node has no rdatasets after the deletion, it will itself
- be deleted.
-
- @param name: the owner name to look for
- @type name: DNS.name.Name object or string
- @param rdtype: the rdata type desired
- @type rdtype: int or string
- @param covers: the covered type (defaults to None)
- @type covers: int or string
- """
-
- name = self._validate_name(name)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if isinstance(covers, string_types):
- covers = dns.rdatatype.from_text(covers)
- node = self.get_node(name)
- if node is not None:
- node.delete_rdataset(self.rdclass, rdtype, covers)
- if len(node) == 0:
- self.delete_node(name)
-
- def replace_rdataset(self, name, replacement):
- """Replace an rdataset at name.
-
- It is not an error if there is no rdataset matching I{replacement}.
-
- Ownership of the I{replacement} object is transferred to the zone;
- in other words, this method does not store a copy of I{replacement}
- at the node, it stores I{replacement} itself.
-
- If the I{name} node does not exist, it is created.
-
- @param name: the owner name
- @type name: DNS.name.Name object or string
- @param replacement: the replacement rdataset
- @type replacement: dns.rdataset.Rdataset
- """
-
- if replacement.rdclass != self.rdclass:
- raise ValueError('replacement.rdclass != zone.rdclass')
- node = self.find_node(name, True)
- node.replace_rdataset(replacement)
-
- def find_rrset(self, name, rdtype, covers=dns.rdatatype.NONE):
- """Look for rdata with the specified name and type in the zone,
- and return an RRset encapsulating it.
-
- The I{name}, I{rdtype}, and I{covers} parameters may be
- strings, in which case they will be converted to their proper
- type.
-
- This method is less efficient than the similar
- L{find_rdataset} because it creates an RRset instead of
- returning the matching rdataset. It may be more convenient
- for some uses since it returns an object which binds the owner
- name to the rdata.
-
- This method may not be used to create new nodes or rdatasets;
- use L{find_rdataset} instead.
-
- KeyError is raised if the name or type are not found.
- Use L{get_rrset} if you want to have None returned instead.
-
- @param name: the owner name to look for
- @type name: DNS.name.Name object or string
- @param rdtype: the rdata type desired
- @type rdtype: int or string
- @param covers: the covered type (defaults to None)
- @type covers: int or string
- @raises KeyError: the node or rdata could not be found
- @rtype: dns.rrset.RRset object
- """
-
- name = self._validate_name(name)
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if isinstance(covers, string_types):
- covers = dns.rdatatype.from_text(covers)
- rdataset = self.nodes[name].find_rdataset(self.rdclass, rdtype, covers)
- rrset = dns.rrset.RRset(name, self.rdclass, rdtype, covers)
- rrset.update(rdataset)
- return rrset
-
- def get_rrset(self, name, rdtype, covers=dns.rdatatype.NONE):
- """Look for rdata with the specified name and type in the zone,
- and return an RRset encapsulating it.
-
- The I{name}, I{rdtype}, and I{covers} parameters may be
- strings, in which case they will be converted to their proper
- type.
-
- This method is less efficient than the similar L{get_rdataset}
- because it creates an RRset instead of returning the matching
- rdataset. It may be more convenient for some uses since it
- returns an object which binds the owner name to the rdata.
-
- This method may not be used to create new nodes or rdatasets;
- use L{find_rdataset} instead.
-
- None is returned if the name or type are not found.
- Use L{find_rrset} if you want to have KeyError raised instead.
-
- @param name: the owner name to look for
- @type name: DNS.name.Name object or string
- @param rdtype: the rdata type desired
- @type rdtype: int or string
- @param covers: the covered type (defaults to None)
- @type covers: int or string
- @rtype: dns.rrset.RRset object
- """
-
- try:
- rrset = self.find_rrset(name, rdtype, covers)
- except KeyError:
- rrset = None
- return rrset
-
- def iterate_rdatasets(self, rdtype=dns.rdatatype.ANY,
- covers=dns.rdatatype.NONE):
- """Return a generator which yields (name, rdataset) tuples for
- all rdatasets in the zone which have the specified I{rdtype}
- and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default,
- then all rdatasets will be matched.
-
- @param rdtype: int or string
- @type rdtype: int or string
- @param covers: the covered type (defaults to None)
- @type covers: int or string
- """
-
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if isinstance(covers, string_types):
- covers = dns.rdatatype.from_text(covers)
- for (name, node) in self.iteritems(): # pylint: disable=dict-iter-method
- for rds in node:
- if rdtype == dns.rdatatype.ANY or \
- (rds.rdtype == rdtype and rds.covers == covers):
- yield (name, rds)
-
- def iterate_rdatas(self, rdtype=dns.rdatatype.ANY,
- covers=dns.rdatatype.NONE):
- """Return a generator which yields (name, ttl, rdata) tuples for
- all rdatas in the zone which have the specified I{rdtype}
- and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default,
- then all rdatas will be matched.
-
- @param rdtype: int or string
- @type rdtype: int or string
- @param covers: the covered type (defaults to None)
- @type covers: int or string
- """
-
- if isinstance(rdtype, string_types):
- rdtype = dns.rdatatype.from_text(rdtype)
- if isinstance(covers, string_types):
- covers = dns.rdatatype.from_text(covers)
- for (name, node) in self.iteritems(): # pylint: disable=dict-iter-method
- for rds in node:
- if rdtype == dns.rdatatype.ANY or \
- (rds.rdtype == rdtype and rds.covers == covers):
- for rdata in rds:
- yield (name, rds.ttl, rdata)
-
- def to_file(self, f, sorted=True, relativize=True, nl=None):
- """Write a zone to a file.
-
- @param f: file or string. If I{f} is a string, it is treated
- as the name of a file to open.
- @param sorted: if True, the file will be written with the
- names sorted in DNSSEC order from least to greatest. Otherwise
- the names will be written in whatever order they happen to have
- in the zone's dictionary.
- @param relativize: if True, domain names in the output will be
- relativized to the zone's origin (if possible).
- @type relativize: bool
- @param nl: The end of line string. If not specified, the
- output will use the platform's native end-of-line marker (i.e.
- LF on POSIX, CRLF on Windows, CR on Macintosh).
- @type nl: string or None
- """
-
- if isinstance(f, string_types):
- f = open(f, 'wb')
- want_close = True
- else:
- want_close = False
-
- # must be in this way, f.encoding may contain None, or even attribute
- # may not be there
- file_enc = getattr(f, 'encoding', None)
- if file_enc is None:
- file_enc = 'utf-8'
-
- if nl is None:
- nl_b = os.linesep.encode(file_enc) # binary mode, '\n' is not enough
- nl = u'\n'
- elif isinstance(nl, string_types):
- nl_b = nl.encode(file_enc)
- else:
- nl_b = nl
- nl = nl.decode()
-
- try:
- if sorted:
- names = list(self.keys())
- names.sort()
- else:
- names = self.iterkeys() # pylint: disable=dict-iter-method
- for n in names:
- l = self[n].to_text(n, origin=self.origin,
- relativize=relativize)
- if isinstance(l, text_type):
- l_b = l.encode(file_enc)
- else:
- l_b = l
- l = l.decode()
-
- try:
- f.write(l_b)
- f.write(nl_b)
- except TypeError: # textual mode
- f.write(l)
- f.write(nl)
- finally:
- if want_close:
- f.close()
-
- def to_text(self, sorted=True, relativize=True, nl=None):
- """Return a zone's text as though it were written to a file.
-
- @param sorted: if True, the file will be written with the
- names sorted in DNSSEC order from least to greatest. Otherwise
- the names will be written in whatever order they happen to have
- in the zone's dictionary.
- @param relativize: if True, domain names in the output will be
- relativized to the zone's origin (if possible).
- @type relativize: bool
- @param nl: The end of line string. If not specified, the
- output will use the platform's native end-of-line marker (i.e.
- LF on POSIX, CRLF on Windows, CR on Macintosh).
- @type nl: string or None
- """
- temp_buffer = BytesIO()
- self.to_file(temp_buffer, sorted, relativize, nl)
- return_value = temp_buffer.getvalue()
- temp_buffer.close()
- return return_value
-
- def check_origin(self):
- """Do some simple checking of the zone's origin.
-
- @raises dns.zone.NoSOA: there is no SOA RR
- @raises dns.zone.NoNS: there is no NS RRset
- @raises KeyError: there is no origin node
- """
- if self.relativize:
- name = dns.name.empty
- else:
- name = self.origin
- if self.get_rdataset(name, dns.rdatatype.SOA) is None:
- raise NoSOA
- if self.get_rdataset(name, dns.rdatatype.NS) is None:
- raise NoNS
-
-
-class _MasterReader(object):
-
- """Read a DNS master file
-
- @ivar tok: The tokenizer
- @type tok: dns.tokenizer.Tokenizer object
- @ivar last_ttl: The last seen explicit TTL for an RR
- @type last_ttl: int
- @ivar last_ttl_known: Has last TTL been detected
- @type last_ttl_known: bool
- @ivar default_ttl: The default TTL from a $TTL directive or SOA RR
- @type default_ttl: int
- @ivar default_ttl_known: Has default TTL been detected
- @type default_ttl_known: bool
- @ivar last_name: The last name read
- @type last_name: dns.name.Name object
- @ivar current_origin: The current origin
- @type current_origin: dns.name.Name object
- @ivar relativize: should names in the zone be relativized?
- @type relativize: bool
- @ivar zone: the zone
- @type zone: dns.zone.Zone object
- @ivar saved_state: saved reader state (used when processing $INCLUDE)
- @type saved_state: list of (tokenizer, current_origin, last_name, file,
- last_ttl, last_ttl_known, default_ttl, default_ttl_known) tuples.
- @ivar current_file: the file object of the $INCLUDed file being parsed
- (None if no $INCLUDE is active).
- @ivar allow_include: is $INCLUDE allowed?
- @type allow_include: bool
- @ivar check_origin: should sanity checks of the origin node be done?
- The default is True.
- @type check_origin: bool
- """
-
- def __init__(self, tok, origin, rdclass, relativize, zone_factory=Zone,
- allow_include=False, check_origin=True):
- if isinstance(origin, string_types):
- origin = dns.name.from_text(origin)
- self.tok = tok
- self.current_origin = origin
- self.relativize = relativize
- self.last_ttl = 0
- self.last_ttl_known = False
- self.default_ttl = 0
- self.default_ttl_known = False
- self.last_name = self.current_origin
- self.zone = zone_factory(origin, rdclass, relativize=relativize)
- self.saved_state = []
- self.current_file = None
- self.allow_include = allow_include
- self.check_origin = check_origin
-
- def _eat_line(self):
- while 1:
- token = self.tok.get()
- if token.is_eol_or_eof():
- break
-
- def _rr_line(self):
- """Process one line from a DNS master file."""
- # Name
- if self.current_origin is None:
- raise UnknownOrigin
- token = self.tok.get(want_leading=True)
- if not token.is_whitespace():
- self.last_name = dns.name.from_text(
- token.value, self.current_origin)
- else:
- token = self.tok.get()
- if token.is_eol_or_eof():
- # treat leading WS followed by EOL/EOF as if they were EOL/EOF.
- return
- self.tok.unget(token)
- name = self.last_name
- if not name.is_subdomain(self.zone.origin):
- self._eat_line()
- return
- if self.relativize:
- name = name.relativize(self.zone.origin)
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- # TTL
- try:
- ttl = dns.ttl.from_text(token.value)
- self.last_ttl = ttl
- self.last_ttl_known = True
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except dns.ttl.BadTTL:
- if not (self.last_ttl_known or self.default_ttl_known):
- raise dns.exception.SyntaxError("Missing default TTL value")
- if self.default_ttl_known:
- ttl = self.default_ttl
- else:
- ttl = self.last_ttl
- # Class
- try:
- rdclass = dns.rdataclass.from_text(token.value)
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except dns.exception.SyntaxError:
- raise dns.exception.SyntaxError
- except Exception:
- rdclass = self.zone.rdclass
- if rdclass != self.zone.rdclass:
- raise dns.exception.SyntaxError("RR class is not zone's class")
- # Type
- try:
- rdtype = dns.rdatatype.from_text(token.value)
- except:
- raise dns.exception.SyntaxError(
- "unknown rdatatype '%s'" % token.value)
- n = self.zone.nodes.get(name)
- if n is None:
- n = self.zone.node_factory()
- self.zone.nodes[name] = n
- try:
- rd = dns.rdata.from_text(rdclass, rdtype, self.tok,
- self.current_origin, False)
- except dns.exception.SyntaxError:
- # Catch and reraise.
- (ty, va) = sys.exc_info()[:2]
- raise va
- except:
- # All exceptions that occur in the processing of rdata
- # are treated as syntax errors. This is not strictly
- # correct, but it is correct almost all of the time.
- # We convert them to syntax errors so that we can emit
- # helpful filename:line info.
- (ty, va) = sys.exc_info()[:2]
- raise dns.exception.SyntaxError(
- "caught exception {}: {}".format(str(ty), str(va)))
-
- if not self.default_ttl_known and isinstance(rd, dns.rdtypes.ANY.SOA.SOA):
- # The pre-RFC2308 and pre-BIND9 behavior inherits the zone default
- # TTL from the SOA minttl if no $TTL statement is present before the
- # SOA is parsed.
- self.default_ttl = rd.minimum
- self.default_ttl_known = True
-
- rd.choose_relativity(self.zone.origin, self.relativize)
- covers = rd.covers()
- rds = n.find_rdataset(rdclass, rdtype, covers, True)
- rds.add(rd, ttl)
-
- def _parse_modify(self, side):
- # Here we catch everything in '{' '}' in a group so we can replace it
- # with ''.
- is_generate1 = re.compile("^.*\$({(\+|-?)(\d+),(\d+),(.)}).*$")
- is_generate2 = re.compile("^.*\$({(\+|-?)(\d+)}).*$")
- is_generate3 = re.compile("^.*\$({(\+|-?)(\d+),(\d+)}).*$")
- # Sometimes there are modifiers in the hostname. These come after
- # the dollar sign. They are in the form: ${offset[,width[,base]]}.
- # Make names
- g1 = is_generate1.match(side)
- if g1:
- mod, sign, offset, width, base = g1.groups()
- if sign == '':
- sign = '+'
- g2 = is_generate2.match(side)
- if g2:
- mod, sign, offset = g2.groups()
- if sign == '':
- sign = '+'
- width = 0
- base = 'd'
- g3 = is_generate3.match(side)
- if g3:
- mod, sign, offset, width = g1.groups()
- if sign == '':
- sign = '+'
- width = g1.groups()[2]
- base = 'd'
-
- if not (g1 or g2 or g3):
- mod = ''
- sign = '+'
- offset = 0
- width = 0
- base = 'd'
-
- if base != 'd':
- raise NotImplementedError()
-
- return mod, sign, offset, width, base
-
- def _generate_line(self):
- # range lhs [ttl] [class] type rhs [ comment ]
- """Process one line containing the GENERATE statement from a DNS
- master file."""
- if self.current_origin is None:
- raise UnknownOrigin
-
- token = self.tok.get()
- # Range (required)
- try:
- start, stop, step = dns.grange.from_text(token.value)
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except:
- raise dns.exception.SyntaxError
-
- # lhs (required)
- try:
- lhs = token.value
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except:
- raise dns.exception.SyntaxError
-
- # TTL
- try:
- ttl = dns.ttl.from_text(token.value)
- self.last_ttl = ttl
- self.last_ttl_known = True
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except dns.ttl.BadTTL:
- if not (self.last_ttl_known or self.default_ttl_known):
- raise dns.exception.SyntaxError("Missing default TTL value")
- if self.default_ttl_known:
- ttl = self.default_ttl
- else:
- ttl = self.last_ttl
- # Class
- try:
- rdclass = dns.rdataclass.from_text(token.value)
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except dns.exception.SyntaxError:
- raise dns.exception.SyntaxError
- except Exception:
- rdclass = self.zone.rdclass
- if rdclass != self.zone.rdclass:
- raise dns.exception.SyntaxError("RR class is not zone's class")
- # Type
- try:
- rdtype = dns.rdatatype.from_text(token.value)
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError
- except Exception:
- raise dns.exception.SyntaxError("unknown rdatatype '%s'" %
- token.value)
-
- # lhs (required)
- try:
- rhs = token.value
- except:
- raise dns.exception.SyntaxError
-
- lmod, lsign, loffset, lwidth, lbase = self._parse_modify(lhs)
- rmod, rsign, roffset, rwidth, rbase = self._parse_modify(rhs)
- for i in range(start, stop + 1, step):
- # +1 because bind is inclusive and python is exclusive
-
- if lsign == u'+':
- lindex = i + int(loffset)
- elif lsign == u'-':
- lindex = i - int(loffset)
-
- if rsign == u'-':
- rindex = i - int(roffset)
- elif rsign == u'+':
- rindex = i + int(roffset)
-
- lzfindex = str(lindex).zfill(int(lwidth))
- rzfindex = str(rindex).zfill(int(rwidth))
-
- name = lhs.replace(u'$%s' % (lmod), lzfindex)
- rdata = rhs.replace(u'$%s' % (rmod), rzfindex)
-
- self.last_name = dns.name.from_text(name, self.current_origin)
- name = self.last_name
- if not name.is_subdomain(self.zone.origin):
- self._eat_line()
- return
- if self.relativize:
- name = name.relativize(self.zone.origin)
-
- n = self.zone.nodes.get(name)
- if n is None:
- n = self.zone.node_factory()
- self.zone.nodes[name] = n
- try:
- rd = dns.rdata.from_text(rdclass, rdtype, rdata,
- self.current_origin, False)
- except dns.exception.SyntaxError:
- # Catch and reraise.
- (ty, va) = sys.exc_info()[:2]
- raise va
- except:
- # All exceptions that occur in the processing of rdata
- # are treated as syntax errors. This is not strictly
- # correct, but it is correct almost all of the time.
- # We convert them to syntax errors so that we can emit
- # helpful filename:line info.
- (ty, va) = sys.exc_info()[:2]
- raise dns.exception.SyntaxError("caught exception %s: %s" %
- (str(ty), str(va)))
-
- rd.choose_relativity(self.zone.origin, self.relativize)
- covers = rd.covers()
- rds = n.find_rdataset(rdclass, rdtype, covers, True)
- rds.add(rd, ttl)
-
- def read(self):
- """Read a DNS master file and build a zone object.
-
- @raises dns.zone.NoSOA: No SOA RR was found at the zone origin
- @raises dns.zone.NoNS: No NS RRset was found at the zone origin
- """
-
- try:
- while 1:
- token = self.tok.get(True, True)
- if token.is_eof():
- if self.current_file is not None:
- self.current_file.close()
- if len(self.saved_state) > 0:
- (self.tok,
- self.current_origin,
- self.last_name,
- self.current_file,
- self.last_ttl,
- self.last_ttl_known,
- self.default_ttl,
- self.default_ttl_known) = self.saved_state.pop(-1)
- continue
- break
- elif token.is_eol():
- continue
- elif token.is_comment():
- self.tok.get_eol()
- continue
- elif token.value[0] == u'$':
- c = token.value.upper()
- if c == u'$TTL':
- token = self.tok.get()
- if not token.is_identifier():
- raise dns.exception.SyntaxError("bad $TTL")
- self.default_ttl = dns.ttl.from_text(token.value)
- self.default_ttl_known = True
- self.tok.get_eol()
- elif c == u'$ORIGIN':
- self.current_origin = self.tok.get_name()
- self.tok.get_eol()
- if self.zone.origin is None:
- self.zone.origin = self.current_origin
- elif c == u'$INCLUDE' and self.allow_include:
- token = self.tok.get()
- filename = token.value
- token = self.tok.get()
- if token.is_identifier():
- new_origin =\
- dns.name.from_text(token.value,
- self.current_origin)
- self.tok.get_eol()
- elif not token.is_eol_or_eof():
- raise dns.exception.SyntaxError(
- "bad origin in $INCLUDE")
- else:
- new_origin = self.current_origin
- self.saved_state.append((self.tok,
- self.current_origin,
- self.last_name,
- self.current_file,
- self.last_ttl,
- self.last_ttl_known,
- self.default_ttl,
- self.default_ttl_known))
- self.current_file = open(filename, 'r')
- self.tok = dns.tokenizer.Tokenizer(self.current_file,
- filename)
- self.current_origin = new_origin
- elif c == u'$GENERATE':
- self._generate_line()
- else:
- raise dns.exception.SyntaxError(
- "Unknown master file directive '" + c + "'")
- continue
- self.tok.unget(token)
- self._rr_line()
- except dns.exception.SyntaxError as detail:
- (filename, line_number) = self.tok.where()
- if detail is None:
- detail = "syntax error"
- raise dns.exception.SyntaxError(
- "%s:%d: %s" % (filename, line_number, detail))
-
- # Now that we're done reading, do some basic checking of the zone.
- if self.check_origin:
- self.zone.check_origin()
-
-
-def from_text(text, origin=None, rdclass=dns.rdataclass.IN,
- relativize=True, zone_factory=Zone, filename=None,
- allow_include=False, check_origin=True):
- """Build a zone object from a master file format string.
-
- @param text: the master file format input
- @type text: string.
- @param origin: The origin of the zone; if not specified, the first
- $ORIGIN statement in the master file will determine the origin of the
- zone.
- @type origin: dns.name.Name object or string
- @param rdclass: The zone's rdata class; the default is class IN.
- @type rdclass: int
- @param relativize: should names be relativized? The default is True
- @type relativize: bool
- @param zone_factory: The zone factory to use
- @type zone_factory: function returning a Zone
- @param filename: The filename to emit when describing where an error
- occurred; the default is ''.
- @type filename: string
- @param allow_include: is $INCLUDE allowed?
- @type allow_include: bool
- @param check_origin: should sanity checks of the origin node be done?
- The default is True.
- @type check_origin: bool
- @raises dns.zone.NoSOA: No SOA RR was found at the zone origin
- @raises dns.zone.NoNS: No NS RRset was found at the zone origin
- @rtype: dns.zone.Zone object
- """
-
- # 'text' can also be a file, but we don't publish that fact
- # since it's an implementation detail. The official file
- # interface is from_file().
-
- if filename is None:
- filename = ''
- tok = dns.tokenizer.Tokenizer(text, filename)
- reader = _MasterReader(tok, origin, rdclass, relativize, zone_factory,
- allow_include=allow_include,
- check_origin=check_origin)
- reader.read()
- return reader.zone
-
-
-def from_file(f, origin=None, rdclass=dns.rdataclass.IN,
- relativize=True, zone_factory=Zone, filename=None,
- allow_include=True, check_origin=True):
- """Read a master file and build a zone object.
-
- @param f: file or string. If I{f} is a string, it is treated
- as the name of a file to open.
- @param origin: The origin of the zone; if not specified, the first
- $ORIGIN statement in the master file will determine the origin of the
- zone.
- @type origin: dns.name.Name object or string
- @param rdclass: The zone's rdata class; the default is class IN.
- @type rdclass: int
- @param relativize: should names be relativized? The default is True
- @type relativize: bool
- @param zone_factory: The zone factory to use
- @type zone_factory: function returning a Zone
- @param filename: The filename to emit when describing where an error
- occurred; the default is '', or the value of I{f} if I{f} is a
- string.
- @type filename: string
- @param allow_include: is $INCLUDE allowed?
- @type allow_include: bool
- @param check_origin: should sanity checks of the origin node be done?
- The default is True.
- @type check_origin: bool
- @raises dns.zone.NoSOA: No SOA RR was found at the zone origin
- @raises dns.zone.NoNS: No NS RRset was found at the zone origin
- @rtype: dns.zone.Zone object
- """
-
- str_type = string_types
- if PY3:
- opts = 'r'
- else:
- opts = 'rU'
-
- if isinstance(f, str_type):
- if filename is None:
- filename = f
- f = open(f, opts)
- want_close = True
- else:
- if filename is None:
- filename = ''
- want_close = False
-
- try:
- z = from_text(f, origin, rdclass, relativize, zone_factory,
- filename, allow_include, check_origin)
- finally:
- if want_close:
- f.close()
- return z
-
-
-def from_xfr(xfr, zone_factory=Zone, relativize=True, check_origin=True):
- """Convert the output of a zone transfer generator into a zone object.
-
- @param xfr: The xfr generator
- @type xfr: generator of dns.message.Message objects
- @param relativize: should names be relativized? The default is True.
- It is essential that the relativize setting matches the one specified
- to dns.query.xfr().
- @type relativize: bool
- @param check_origin: should sanity checks of the origin node be done?
- The default is True.
- @type check_origin: bool
- @raises dns.zone.NoSOA: No SOA RR was found at the zone origin
- @raises dns.zone.NoNS: No NS RRset was found at the zone origin
- @rtype: dns.zone.Zone object
- """
-
- z = None
- for r in xfr:
- if z is None:
- if relativize:
- origin = r.origin
- else:
- origin = r.answer[0].name
- rdclass = r.answer[0].rdclass
- z = zone_factory(origin, rdclass, relativize=relativize)
- for rrset in r.answer:
- znode = z.nodes.get(rrset.name)
- if not znode:
- znode = z.node_factory()
- z.nodes[rrset.name] = znode
- zrds = znode.find_rdataset(rrset.rdclass, rrset.rdtype,
- rrset.covers, True)
- zrds.update_ttl(rrset.ttl)
- for rd in rrset:
- rd.choose_relativity(z.origin, relativize)
- zrds.add(rd)
- if check_origin:
- z.check_origin()
- return z
diff --git a/client/ayon_core/vendor/python/python_2/engineio/__init__.py b/client/ayon_core/vendor/python/python_2/engineio/__init__.py
deleted file mode 100644
index 888bf40190..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/__init__.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import sys
-
-from .client import Client
-from .middleware import WSGIApp, Middleware
-from .server import Server
-if sys.version_info >= (3, 5): # pragma: no cover
- from .asyncio_server import AsyncServer
- from .asyncio_client import AsyncClient
- from .async_drivers.asgi import ASGIApp
- try:
- from .async_drivers.tornado import get_tornado_handler
- except ImportError:
- get_tornado_handler = None
-else: # pragma: no cover
- AsyncServer = None
- AsyncClient = None
- get_tornado_handler = None
- ASGIApp = None
-
-__version__ = '3.8.2.post1'
-
-__all__ = ['__version__', 'Server', 'WSGIApp', 'Middleware', 'Client']
-if AsyncServer is not None: # pragma: no cover
- __all__ += ['AsyncServer', 'ASGIApp', 'get_tornado_handler',
- 'AsyncClient'],
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_aiohttp.py b/client/ayon_core/vendor/python/python_2/engineio/async_aiohttp.py
deleted file mode 100644
index ad0252dff9..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_aiohttp.py
+++ /dev/null
@@ -1,129 +0,0 @@
-import asyncio
-import sys
-from urllib.parse import urlsplit
-
-from aiohttp.web import Response, WebSocketResponse
-import six
-
-
-def create_route(app, engineio_server, engineio_endpoint):
- """This function sets up the engine.io endpoint as a route for the
- application.
-
- Note that both GET and POST requests must be hooked up on the engine.io
- endpoint.
- """
- app.router.add_get(engineio_endpoint, engineio_server.handle_request)
- app.router.add_post(engineio_endpoint, engineio_server.handle_request)
- app.router.add_route('OPTIONS', engineio_endpoint,
- engineio_server.handle_request)
-
-
-def translate_request(request):
- """This function takes the arguments passed to the request handler and
- uses them to generate a WSGI compatible environ dictionary.
- """
- message = request._message
- payload = request._payload
-
- uri_parts = urlsplit(message.path)
- environ = {
- 'wsgi.input': payload,
- 'wsgi.errors': sys.stderr,
- 'wsgi.version': (1, 0),
- 'wsgi.async': True,
- 'wsgi.multithread': False,
- 'wsgi.multiprocess': False,
- 'wsgi.run_once': False,
- 'SERVER_SOFTWARE': 'aiohttp',
- 'REQUEST_METHOD': message.method,
- 'QUERY_STRING': uri_parts.query or '',
- 'RAW_URI': message.path,
- 'SERVER_PROTOCOL': 'HTTP/%s.%s' % message.version,
- 'REMOTE_ADDR': '127.0.0.1',
- 'REMOTE_PORT': '0',
- 'SERVER_NAME': 'aiohttp',
- 'SERVER_PORT': '0',
- 'aiohttp.request': request
- }
-
- for hdr_name, hdr_value in message.headers.items():
- hdr_name = hdr_name.upper()
- if hdr_name == 'CONTENT-TYPE':
- environ['CONTENT_TYPE'] = hdr_value
- continue
- elif hdr_name == 'CONTENT-LENGTH':
- environ['CONTENT_LENGTH'] = hdr_value
- continue
-
- key = 'HTTP_%s' % hdr_name.replace('-', '_')
- if key in environ:
- hdr_value = '%s,%s' % (environ[key], hdr_value)
-
- environ[key] = hdr_value
-
- environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http')
-
- path_info = uri_parts.path
-
- environ['PATH_INFO'] = path_info
- environ['SCRIPT_NAME'] = ''
-
- return environ
-
-
-def make_response(status, headers, payload, environ):
- """This function generates an appropriate response object for this async
- mode.
- """
- return Response(body=payload, status=int(status.split()[0]),
- headers=headers)
-
-
-class WebSocket(object): # pragma: no cover
- """
- This wrapper class provides a aiohttp WebSocket interface that is
- somewhat compatible with eventlet's implementation.
- """
- def __init__(self, handler):
- self.handler = handler
- self._sock = None
-
- async def __call__(self, environ):
- request = environ['aiohttp.request']
- self._sock = WebSocketResponse()
- await self._sock.prepare(request)
-
- self.environ = environ
- await self.handler(self)
- return self._sock
-
- async def close(self):
- await self._sock.close()
-
- async def send(self, message):
- if isinstance(message, bytes):
- f = self._sock.send_bytes
- else:
- f = self._sock.send_str
- if asyncio.iscoroutinefunction(f):
- await f(message)
- else:
- f(message)
-
- async def wait(self):
- msg = await self._sock.receive()
- if not isinstance(msg.data, six.binary_type) and \
- not isinstance(msg.data, six.text_type):
- raise IOError()
- return msg.data
-
-
-_async = {
- 'asyncio': True,
- 'create_route': create_route,
- 'translate_request': translate_request,
- 'make_response': make_response,
- 'websocket': sys.modules[__name__],
- 'websocket_class': 'WebSocket'
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_asgi.py b/client/ayon_core/vendor/python/python_2/engineio/async_asgi.py
deleted file mode 100644
index d216f31c77..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_asgi.py
+++ /dev/null
@@ -1,223 +0,0 @@
-import sys
-
-
-class ASGIApp:
- """ASGI application middleware for Engine.IO.
-
- This middleware dispatches traffic to an Engine.IO application. It can
- also serve a list of static files to the client, or forward unrelated
- HTTP traffic to another ASGI application.
-
- :param engineio_server: The Engine.IO server. Must be an instance of the
- ``engineio.AsyncServer`` class.
- :param static_files: A dictionary where the keys are URLs that should be
- served as static files. For each URL, the value is
- a dictionary with ``content_type`` and ``filename``
- keys. This option is intended to be used for serving
- client files during development.
- :param other_asgi_app: A separate ASGI app that receives all other traffic.
- :param engineio_path: The endpoint where the Engine.IO application should
- be installed. The default value is appropriate for
- most cases.
-
- Example usage::
-
- import engineio
- import uvicorn
-
- eio = engineio.AsyncServer()
- app = engineio.ASGIApp(eio, static_files={
- '/': {'content_type': 'text/html', 'filename': 'index.html'},
- '/index.html': {'content_type': 'text/html',
- 'filename': 'index.html'},
- })
- uvicorn.run(app, '127.0.0.1', 5000)
- """
- def __init__(self, engineio_server, other_asgi_app=None,
- static_files=None, engineio_path='engine.io'):
- self.engineio_server = engineio_server
- self.other_asgi_app = other_asgi_app
- self.engineio_path = engineio_path.strip('/')
- self.static_files = static_files or {}
-
- def __call__(self, scope):
- if scope['type'] in ['http', 'websocket'] and \
- scope['path'].startswith('/{0}/'.format(self.engineio_path)):
- return self.engineio_asgi_app(scope)
- elif scope['type'] == 'http' and scope['path'] in self.static_files:
- return self.serve_static_file(scope)
- elif self.other_asgi_app is not None:
- return self.other_asgi_app(scope)
- elif scope['type'] == 'lifespan':
- return self.lifespan
- else:
- return self.not_found
-
- def engineio_asgi_app(self, scope):
- async def _app(receive, send):
- await self.engineio_server.handle_request(scope, receive, send)
- return _app
-
- def serve_static_file(self, scope):
- async def _send_static_file(receive, send): # pragma: no cover
- event = await receive()
- if event['type'] == 'http.request':
- if scope['path'] in self.static_files:
- content_type = self.static_files[scope['path']][
- 'content_type'].encode('utf-8')
- filename = self.static_files[scope['path']]['filename']
- status_code = 200
- with open(filename, 'rb') as f:
- payload = f.read()
- else:
- content_type = b'text/plain'
- status_code = 404
- payload = b'not found'
- await send({'type': 'http.response.start',
- 'status': status_code,
- 'headers': [(b'Content-Type', content_type)]})
- await send({'type': 'http.response.body',
- 'body': payload})
- return _send_static_file
-
- async def lifespan(self, receive, send):
- event = await receive()
- if event['type'] == 'lifespan.startup':
- await send({'type': 'lifespan.startup.complete'})
- elif event['type'] == 'lifespan.shutdown':
- await send({'type': 'lifespan.shutdown.complete'})
-
- async def not_found(self, receive, send):
- """Return a 404 Not Found error to the client."""
- await send({'type': 'http.response.start',
- 'status': 404,
- 'headers': [(b'Content-Type', b'text/plain')]})
- await send({'type': 'http.response.body',
- 'body': b'not found'})
-
-
-async def translate_request(scope, receive, send):
- class AwaitablePayload(object): # pragma: no cover
- def __init__(self, payload):
- self.payload = payload or b''
-
- async def read(self, length=None):
- if length is None:
- r = self.payload
- self.payload = b''
- else:
- r = self.payload[:length]
- self.payload = self.payload[length:]
- return r
-
- event = await receive()
- payload = b''
- if event['type'] == 'http.request':
- payload += event.get('body') or b''
- while event.get('more_body'):
- event = await receive()
- if event['type'] == 'http.request':
- payload += event.get('body') or b''
- elif event['type'] == 'websocket.connect':
- await send({'type': 'websocket.accept'})
- else:
- return {}
-
- raw_uri = scope['path'].encode('utf-8')
- if 'query_string' in scope and scope['query_string']:
- raw_uri += b'?' + scope['query_string']
- environ = {
- 'wsgi.input': AwaitablePayload(payload),
- 'wsgi.errors': sys.stderr,
- 'wsgi.version': (1, 0),
- 'wsgi.async': True,
- 'wsgi.multithread': False,
- 'wsgi.multiprocess': False,
- 'wsgi.run_once': False,
- 'SERVER_SOFTWARE': 'asgi',
- 'REQUEST_METHOD': scope.get('method', 'GET'),
- 'PATH_INFO': scope['path'],
- 'QUERY_STRING': scope.get('query_string', b'').decode('utf-8'),
- 'RAW_URI': raw_uri.decode('utf-8'),
- 'SCRIPT_NAME': '',
- 'SERVER_PROTOCOL': 'HTTP/1.1',
- 'REMOTE_ADDR': '127.0.0.1',
- 'REMOTE_PORT': '0',
- 'SERVER_NAME': 'asgi',
- 'SERVER_PORT': '0',
- 'asgi.receive': receive,
- 'asgi.send': send,
- }
-
- for hdr_name, hdr_value in scope['headers']:
- hdr_name = hdr_name.upper().decode('utf-8')
- hdr_value = hdr_value.decode('utf-8')
- if hdr_name == 'CONTENT-TYPE':
- environ['CONTENT_TYPE'] = hdr_value
- continue
- elif hdr_name == 'CONTENT-LENGTH':
- environ['CONTENT_LENGTH'] = hdr_value
- continue
-
- key = 'HTTP_%s' % hdr_name.replace('-', '_')
- if key in environ:
- hdr_value = '%s,%s' % (environ[key], hdr_value)
-
- environ[key] = hdr_value
-
- environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http')
- return environ
-
-
-async def make_response(status, headers, payload, environ):
- headers = [(h[0].encode('utf-8'), h[1].encode('utf-8')) for h in headers]
- await environ['asgi.send']({'type': 'http.response.start',
- 'status': int(status.split(' ')[0]),
- 'headers': headers})
- await environ['asgi.send']({'type': 'http.response.body',
- 'body': payload})
-
-
-class WebSocket(object): # pragma: no cover
- """
- This wrapper class provides an asgi WebSocket interface that is
- somewhat compatible with eventlet's implementation.
- """
- def __init__(self, handler):
- self.handler = handler
- self.asgi_receive = None
- self.asgi_send = None
-
- async def __call__(self, environ):
- self.asgi_receive = environ['asgi.receive']
- self.asgi_send = environ['asgi.send']
- await self.handler(self)
-
- async def close(self):
- await self.asgi_send({'type': 'websocket.close'})
-
- async def send(self, message):
- msg_bytes = None
- msg_text = None
- if isinstance(message, bytes):
- msg_bytes = message
- else:
- msg_text = message
- await self.asgi_send({'type': 'websocket.send',
- 'bytes': msg_bytes,
- 'text': msg_text})
-
- async def wait(self):
- event = await self.asgi_receive()
- if event['type'] != 'websocket.receive':
- raise IOError()
- return event.get('bytes') or event.get('text')
-
-
-_async = {
- 'asyncio': True,
- 'translate_request': translate_request,
- 'make_response': make_response,
- 'websocket': sys.modules[__name__],
- 'websocket_class': 'WebSocket'
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/__init__.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/aiohttp.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/aiohttp.py
deleted file mode 100644
index ad6987649d..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/aiohttp.py
+++ /dev/null
@@ -1,128 +0,0 @@
-import asyncio
-import sys
-from urllib.parse import urlsplit
-
-from aiohttp.web import Response, WebSocketResponse
-import six
-
-
-def create_route(app, engineio_server, engineio_endpoint):
- """This function sets up the engine.io endpoint as a route for the
- application.
-
- Note that both GET and POST requests must be hooked up on the engine.io
- endpoint.
- """
- app.router.add_get(engineio_endpoint, engineio_server.handle_request)
- app.router.add_post(engineio_endpoint, engineio_server.handle_request)
- app.router.add_route('OPTIONS', engineio_endpoint,
- engineio_server.handle_request)
-
-
-def translate_request(request):
- """This function takes the arguments passed to the request handler and
- uses them to generate a WSGI compatible environ dictionary.
- """
- message = request._message
- payload = request._payload
-
- uri_parts = urlsplit(message.path)
- environ = {
- 'wsgi.input': payload,
- 'wsgi.errors': sys.stderr,
- 'wsgi.version': (1, 0),
- 'wsgi.async': True,
- 'wsgi.multithread': False,
- 'wsgi.multiprocess': False,
- 'wsgi.run_once': False,
- 'SERVER_SOFTWARE': 'aiohttp',
- 'REQUEST_METHOD': message.method,
- 'QUERY_STRING': uri_parts.query or '',
- 'RAW_URI': message.path,
- 'SERVER_PROTOCOL': 'HTTP/%s.%s' % message.version,
- 'REMOTE_ADDR': '127.0.0.1',
- 'REMOTE_PORT': '0',
- 'SERVER_NAME': 'aiohttp',
- 'SERVER_PORT': '0',
- 'aiohttp.request': request
- }
-
- for hdr_name, hdr_value in message.headers.items():
- hdr_name = hdr_name.upper()
- if hdr_name == 'CONTENT-TYPE':
- environ['CONTENT_TYPE'] = hdr_value
- continue
- elif hdr_name == 'CONTENT-LENGTH':
- environ['CONTENT_LENGTH'] = hdr_value
- continue
-
- key = 'HTTP_%s' % hdr_name.replace('-', '_')
- if key in environ:
- hdr_value = '%s,%s' % (environ[key], hdr_value)
-
- environ[key] = hdr_value
-
- environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http')
-
- path_info = uri_parts.path
-
- environ['PATH_INFO'] = path_info
- environ['SCRIPT_NAME'] = ''
-
- return environ
-
-
-def make_response(status, headers, payload, environ):
- """This function generates an appropriate response object for this async
- mode.
- """
- return Response(body=payload, status=int(status.split()[0]),
- headers=headers)
-
-
-class WebSocket(object): # pragma: no cover
- """
- This wrapper class provides a aiohttp WebSocket interface that is
- somewhat compatible with eventlet's implementation.
- """
- def __init__(self, handler):
- self.handler = handler
- self._sock = None
-
- async def __call__(self, environ):
- request = environ['aiohttp.request']
- self._sock = WebSocketResponse()
- await self._sock.prepare(request)
-
- self.environ = environ
- await self.handler(self)
- return self._sock
-
- async def close(self):
- await self._sock.close()
-
- async def send(self, message):
- if isinstance(message, bytes):
- f = self._sock.send_bytes
- else:
- f = self._sock.send_str
- if asyncio.iscoroutinefunction(f):
- await f(message)
- else:
- f(message)
-
- async def wait(self):
- msg = await self._sock.receive()
- if not isinstance(msg.data, six.binary_type) and \
- not isinstance(msg.data, six.text_type):
- raise IOError()
- return msg.data
-
-
-_async = {
- 'asyncio': True,
- 'create_route': create_route,
- 'translate_request': translate_request,
- 'make_response': make_response,
- 'websocket': WebSocket,
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/asgi.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/asgi.py
deleted file mode 100644
index 9f14ef05ff..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/asgi.py
+++ /dev/null
@@ -1,214 +0,0 @@
-import os
-import sys
-
-from engineio.static_files import get_static_file
-
-
-class ASGIApp:
- """ASGI application middleware for Engine.IO.
-
- This middleware dispatches traffic to an Engine.IO application. It can
- also serve a list of static files to the client, or forward unrelated
- HTTP traffic to another ASGI application.
-
- :param engineio_server: The Engine.IO server. Must be an instance of the
- ``engineio.AsyncServer`` class.
- :param static_files: A dictionary with static file mapping rules. See the
- documentation for details on this argument.
- :param other_asgi_app: A separate ASGI app that receives all other traffic.
- :param engineio_path: The endpoint where the Engine.IO application should
- be installed. The default value is appropriate for
- most cases.
-
- Example usage::
-
- import engineio
- import uvicorn
-
- eio = engineio.AsyncServer()
- app = engineio.ASGIApp(eio, static_files={
- '/': {'content_type': 'text/html', 'filename': 'index.html'},
- '/index.html': {'content_type': 'text/html',
- 'filename': 'index.html'},
- })
- uvicorn.run(app, '127.0.0.1', 5000)
- """
- def __init__(self, engineio_server, other_asgi_app=None,
- static_files=None, engineio_path='engine.io'):
- self.engineio_server = engineio_server
- self.other_asgi_app = other_asgi_app
- self.engineio_path = engineio_path.strip('/')
- self.static_files = static_files or {}
-
- async def __call__(self, scope, receive, send):
- if scope['type'] in ['http', 'websocket'] and \
- scope['path'].startswith('/{0}/'.format(self.engineio_path)):
- await self.engineio_server.handle_request(scope, receive, send)
- else:
- static_file = get_static_file(scope['path'], self.static_files) \
- if scope['type'] == 'http' and self.static_files else None
- if static_file:
- await self.serve_static_file(static_file, receive, send)
- elif self.other_asgi_app is not None:
- await self.other_asgi_app(scope, receive, send)
- elif scope['type'] == 'lifespan':
- await self.lifespan(receive, send)
- else:
- await self.not_found(receive, send)
-
- async def serve_static_file(self, static_file, receive,
- send): # pragma: no cover
- event = await receive()
- if event['type'] == 'http.request':
- if os.path.exists(static_file['filename']):
- with open(static_file['filename'], 'rb') as f:
- payload = f.read()
- await send({'type': 'http.response.start',
- 'status': 200,
- 'headers': [(b'Content-Type', static_file[
- 'content_type'].encode('utf-8'))]})
- await send({'type': 'http.response.body',
- 'body': payload})
- else:
- await self.not_found(receive, send)
-
- async def lifespan(self, receive, send):
- event = await receive()
- if event['type'] == 'lifespan.startup':
- await send({'type': 'lifespan.startup.complete'})
- elif event['type'] == 'lifespan.shutdown':
- await send({'type': 'lifespan.shutdown.complete'})
-
- async def not_found(self, receive, send):
- """Return a 404 Not Found error to the client."""
- await send({'type': 'http.response.start',
- 'status': 404,
- 'headers': [(b'Content-Type', b'text/plain')]})
- await send({'type': 'http.response.body',
- 'body': b'Not Found'})
-
-
-async def translate_request(scope, receive, send):
- class AwaitablePayload(object): # pragma: no cover
- def __init__(self, payload):
- self.payload = payload or b''
-
- async def read(self, length=None):
- if length is None:
- r = self.payload
- self.payload = b''
- else:
- r = self.payload[:length]
- self.payload = self.payload[length:]
- return r
-
- event = await receive()
- payload = b''
- if event['type'] == 'http.request':
- payload += event.get('body') or b''
- while event.get('more_body'):
- event = await receive()
- if event['type'] == 'http.request':
- payload += event.get('body') or b''
- elif event['type'] == 'websocket.connect':
- await send({'type': 'websocket.accept'})
- else:
- return {}
-
- raw_uri = scope['path'].encode('utf-8')
- if 'query_string' in scope and scope['query_string']:
- raw_uri += b'?' + scope['query_string']
- environ = {
- 'wsgi.input': AwaitablePayload(payload),
- 'wsgi.errors': sys.stderr,
- 'wsgi.version': (1, 0),
- 'wsgi.async': True,
- 'wsgi.multithread': False,
- 'wsgi.multiprocess': False,
- 'wsgi.run_once': False,
- 'SERVER_SOFTWARE': 'asgi',
- 'REQUEST_METHOD': scope.get('method', 'GET'),
- 'PATH_INFO': scope['path'],
- 'QUERY_STRING': scope.get('query_string', b'').decode('utf-8'),
- 'RAW_URI': raw_uri.decode('utf-8'),
- 'SCRIPT_NAME': '',
- 'SERVER_PROTOCOL': 'HTTP/1.1',
- 'REMOTE_ADDR': '127.0.0.1',
- 'REMOTE_PORT': '0',
- 'SERVER_NAME': 'asgi',
- 'SERVER_PORT': '0',
- 'asgi.receive': receive,
- 'asgi.send': send,
- }
-
- for hdr_name, hdr_value in scope['headers']:
- hdr_name = hdr_name.upper().decode('utf-8')
- hdr_value = hdr_value.decode('utf-8')
- if hdr_name == 'CONTENT-TYPE':
- environ['CONTENT_TYPE'] = hdr_value
- continue
- elif hdr_name == 'CONTENT-LENGTH':
- environ['CONTENT_LENGTH'] = hdr_value
- continue
-
- key = 'HTTP_%s' % hdr_name.replace('-', '_')
- if key in environ:
- hdr_value = '%s,%s' % (environ[key], hdr_value)
-
- environ[key] = hdr_value
-
- environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http')
- return environ
-
-
-async def make_response(status, headers, payload, environ):
- headers = [(h[0].encode('utf-8'), h[1].encode('utf-8')) for h in headers]
- await environ['asgi.send']({'type': 'http.response.start',
- 'status': int(status.split(' ')[0]),
- 'headers': headers})
- await environ['asgi.send']({'type': 'http.response.body',
- 'body': payload})
-
-
-class WebSocket(object): # pragma: no cover
- """
- This wrapper class provides an asgi WebSocket interface that is
- somewhat compatible with eventlet's implementation.
- """
- def __init__(self, handler):
- self.handler = handler
- self.asgi_receive = None
- self.asgi_send = None
-
- async def __call__(self, environ):
- self.asgi_receive = environ['asgi.receive']
- self.asgi_send = environ['asgi.send']
- await self.handler(self)
-
- async def close(self):
- await self.asgi_send({'type': 'websocket.close'})
-
- async def send(self, message):
- msg_bytes = None
- msg_text = None
- if isinstance(message, bytes):
- msg_bytes = message
- else:
- msg_text = message
- await self.asgi_send({'type': 'websocket.send',
- 'bytes': msg_bytes,
- 'text': msg_text})
-
- async def wait(self):
- event = await self.asgi_receive()
- if event['type'] != 'websocket.receive':
- raise IOError()
- return event.get('bytes') or event.get('text')
-
-
-_async = {
- 'asyncio': True,
- 'translate_request': translate_request,
- 'make_response': make_response,
- 'websocket': WebSocket,
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/eventlet.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/eventlet.py
deleted file mode 100644
index 9be3797cd8..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/eventlet.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from __future__ import absolute_import
-
-from eventlet.green.threading import Thread, Event
-from eventlet import queue
-from eventlet import sleep
-from eventlet.websocket import WebSocketWSGI as _WebSocketWSGI
-
-
-class WebSocketWSGI(_WebSocketWSGI):
- def __init__(self, *args, **kwargs):
- super(WebSocketWSGI, self).__init__(*args, **kwargs)
- self._sock = None
-
- def __call__(self, environ, start_response):
- if 'eventlet.input' not in environ:
- raise RuntimeError('You need to use the eventlet server. '
- 'See the Deployment section of the '
- 'documentation for more information.')
- self._sock = environ['eventlet.input'].get_socket()
- return super(WebSocketWSGI, self).__call__(environ, start_response)
-
-
-_async = {
- 'thread': Thread,
- 'queue': queue.Queue,
- 'queue_empty': queue.Empty,
- 'event': Event,
- 'websocket': WebSocketWSGI,
- 'sleep': sleep,
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/gevent.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/gevent.py
deleted file mode 100644
index 024dd0aad5..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/gevent.py
+++ /dev/null
@@ -1,63 +0,0 @@
-from __future__ import absolute_import
-
-import gevent
-from gevent import queue
-from gevent.event import Event
-try:
- import geventwebsocket # noqa
- _websocket_available = True
-except ImportError:
- _websocket_available = False
-
-
-class Thread(gevent.Greenlet): # pragma: no cover
- """
- This wrapper class provides gevent Greenlet interface that is compatible
- with the standard library's Thread class.
- """
- def __init__(self, target, args=[], kwargs={}):
- super(Thread, self).__init__(target, *args, **kwargs)
-
- def _run(self):
- return self.run()
-
-
-class WebSocketWSGI(object): # pragma: no cover
- """
- This wrapper class provides a gevent WebSocket interface that is
- compatible with eventlet's implementation.
- """
- def __init__(self, app):
- self.app = app
-
- def __call__(self, environ, start_response):
- if 'wsgi.websocket' not in environ:
- raise RuntimeError('You need to use the gevent-websocket server. '
- 'See the Deployment section of the '
- 'documentation for more information.')
- self._sock = environ['wsgi.websocket']
- self.environ = environ
- self.version = self._sock.version
- self.path = self._sock.path
- self.origin = self._sock.origin
- self.protocol = self._sock.protocol
- return self.app(self)
-
- def close(self):
- return self._sock.close()
-
- def send(self, message):
- return self._sock.send(message)
-
- def wait(self):
- return self._sock.receive()
-
-
-_async = {
- 'thread': Thread,
- 'queue': queue.JoinableQueue,
- 'queue_empty': queue.Empty,
- 'event': Event,
- 'websocket': WebSocketWSGI if _websocket_available else None,
- 'sleep': gevent.sleep,
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/gevent_uwsgi.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/gevent_uwsgi.py
deleted file mode 100644
index 07fa2a79df..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/gevent_uwsgi.py
+++ /dev/null
@@ -1,156 +0,0 @@
-from __future__ import absolute_import
-
-import six
-
-import gevent
-from gevent import queue
-from gevent.event import Event
-import uwsgi
-_websocket_available = hasattr(uwsgi, 'websocket_handshake')
-
-
-class Thread(gevent.Greenlet): # pragma: no cover
- """
- This wrapper class provides gevent Greenlet interface that is compatible
- with the standard library's Thread class.
- """
- def __init__(self, target, args=[], kwargs={}):
- super(Thread, self).__init__(target, *args, **kwargs)
-
- def _run(self):
- return self.run()
-
-
-class uWSGIWebSocket(object): # pragma: no cover
- """
- This wrapper class provides a uWSGI WebSocket interface that is
- compatible with eventlet's implementation.
- """
- def __init__(self, app):
- self.app = app
- self._sock = None
-
- def __call__(self, environ, start_response):
- self._sock = uwsgi.connection_fd()
- self.environ = environ
-
- uwsgi.websocket_handshake()
-
- self._req_ctx = None
- if hasattr(uwsgi, 'request_context'):
- # uWSGI >= 2.1.x with support for api access across-greenlets
- self._req_ctx = uwsgi.request_context()
- else:
- # use event and queue for sending messages
- from gevent.event import Event
- from gevent.queue import Queue
- from gevent.select import select
- self._event = Event()
- self._send_queue = Queue()
-
- # spawn a select greenlet
- def select_greenlet_runner(fd, event):
- """Sets event when data becomes available to read on fd."""
- while True:
- event.set()
- try:
- select([fd], [], [])[0]
- except ValueError:
- break
- self._select_greenlet = gevent.spawn(
- select_greenlet_runner,
- self._sock,
- self._event)
-
- self.app(self)
-
- def close(self):
- """Disconnects uWSGI from the client."""
- uwsgi.disconnect()
- if self._req_ctx is None:
- # better kill it here in case wait() is not called again
- self._select_greenlet.kill()
- self._event.set()
-
- def _send(self, msg):
- """Transmits message either in binary or UTF-8 text mode,
- depending on its type."""
- if isinstance(msg, six.binary_type):
- method = uwsgi.websocket_send_binary
- else:
- method = uwsgi.websocket_send
- if self._req_ctx is not None:
- method(msg, request_context=self._req_ctx)
- else:
- method(msg)
-
- def _decode_received(self, msg):
- """Returns either bytes or str, depending on message type."""
- if not isinstance(msg, six.binary_type):
- # already decoded - do nothing
- return msg
- # only decode from utf-8 if message is not binary data
- type = six.byte2int(msg[0:1])
- if type >= 48: # no binary
- return msg.decode('utf-8')
- # binary message, don't try to decode
- return msg
-
- def send(self, msg):
- """Queues a message for sending. Real transmission is done in
- wait method.
- Sends directly if uWSGI version is new enough."""
- if self._req_ctx is not None:
- self._send(msg)
- else:
- self._send_queue.put(msg)
- self._event.set()
-
- def wait(self):
- """Waits and returns received messages.
- If running in compatibility mode for older uWSGI versions,
- it also sends messages that have been queued by send().
- A return value of None means that connection was closed.
- This must be called repeatedly. For uWSGI < 2.1.x it must
- be called from the main greenlet."""
- while True:
- if self._req_ctx is not None:
- try:
- msg = uwsgi.websocket_recv(request_context=self._req_ctx)
- except IOError: # connection closed
- return None
- return self._decode_received(msg)
- else:
- # we wake up at least every 3 seconds to let uWSGI
- # do its ping/ponging
- event_set = self._event.wait(timeout=3)
- if event_set:
- self._event.clear()
- # maybe there is something to send
- msgs = []
- while True:
- try:
- msgs.append(self._send_queue.get(block=False))
- except gevent.queue.Empty:
- break
- for msg in msgs:
- self._send(msg)
- # maybe there is something to receive, if not, at least
- # ensure uWSGI does its ping/ponging
- try:
- msg = uwsgi.websocket_recv_nb()
- except IOError: # connection closed
- self._select_greenlet.kill()
- return None
- if msg: # message available
- return self._decode_received(msg)
-
-
-_async = {
- 'thread': Thread,
- 'queue': queue.JoinableQueue,
- 'queue_empty': queue.Empty,
- 'event': Event,
- 'websocket': uWSGIWebSocket if _websocket_available else None,
- 'sleep': gevent.sleep,
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/sanic.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/sanic.py
deleted file mode 100644
index 6929654b92..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/sanic.py
+++ /dev/null
@@ -1,144 +0,0 @@
-import sys
-from urllib.parse import urlsplit
-
-from sanic.response import HTTPResponse
-try:
- from sanic.websocket import WebSocketProtocol
-except ImportError:
- # the installed version of sanic does not have websocket support
- WebSocketProtocol = None
-import six
-
-
-def create_route(app, engineio_server, engineio_endpoint):
- """This function sets up the engine.io endpoint as a route for the
- application.
-
- Note that both GET and POST requests must be hooked up on the engine.io
- endpoint.
- """
- app.add_route(engineio_server.handle_request, engineio_endpoint,
- methods=['GET', 'POST', 'OPTIONS'])
- try:
- app.enable_websocket()
- except AttributeError:
- # ignore, this version does not support websocket
- pass
-
-
-def translate_request(request):
- """This function takes the arguments passed to the request handler and
- uses them to generate a WSGI compatible environ dictionary.
- """
- class AwaitablePayload(object):
- def __init__(self, payload):
- self.payload = payload or b''
-
- async def read(self, length=None):
- if length is None:
- r = self.payload
- self.payload = b''
- else:
- r = self.payload[:length]
- self.payload = self.payload[length:]
- return r
-
- uri_parts = urlsplit(request.url)
- environ = {
- 'wsgi.input': AwaitablePayload(request.body),
- 'wsgi.errors': sys.stderr,
- 'wsgi.version': (1, 0),
- 'wsgi.async': True,
- 'wsgi.multithread': False,
- 'wsgi.multiprocess': False,
- 'wsgi.run_once': False,
- 'SERVER_SOFTWARE': 'sanic',
- 'REQUEST_METHOD': request.method,
- 'QUERY_STRING': uri_parts.query or '',
- 'RAW_URI': request.url,
- 'SERVER_PROTOCOL': 'HTTP/' + request.version,
- 'REMOTE_ADDR': '127.0.0.1',
- 'REMOTE_PORT': '0',
- 'SERVER_NAME': 'sanic',
- 'SERVER_PORT': '0',
- 'sanic.request': request
- }
-
- for hdr_name, hdr_value in request.headers.items():
- hdr_name = hdr_name.upper()
- if hdr_name == 'CONTENT-TYPE':
- environ['CONTENT_TYPE'] = hdr_value
- continue
- elif hdr_name == 'CONTENT-LENGTH':
- environ['CONTENT_LENGTH'] = hdr_value
- continue
-
- key = 'HTTP_%s' % hdr_name.replace('-', '_')
- if key in environ:
- hdr_value = '%s,%s' % (environ[key], hdr_value)
-
- environ[key] = hdr_value
-
- environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http')
-
- path_info = uri_parts.path
-
- environ['PATH_INFO'] = path_info
- environ['SCRIPT_NAME'] = ''
-
- return environ
-
-
-def make_response(status, headers, payload, environ):
- """This function generates an appropriate response object for this async
- mode.
- """
- headers_dict = {}
- content_type = None
- for h in headers:
- if h[0].lower() == 'content-type':
- content_type = h[1]
- else:
- headers_dict[h[0]] = h[1]
- return HTTPResponse(body_bytes=payload, content_type=content_type,
- status=int(status.split()[0]), headers=headers_dict)
-
-
-class WebSocket(object): # pragma: no cover
- """
- This wrapper class provides a sanic WebSocket interface that is
- somewhat compatible with eventlet's implementation.
- """
- def __init__(self, handler):
- self.handler = handler
- self._sock = None
-
- async def __call__(self, environ):
- request = environ['sanic.request']
- protocol = request.transport.get_protocol()
- self._sock = await protocol.websocket_handshake(request)
-
- self.environ = environ
- await self.handler(self)
-
- async def close(self):
- await self._sock.close()
-
- async def send(self, message):
- await self._sock.send(message)
-
- async def wait(self):
- data = await self._sock.recv()
- if not isinstance(data, six.binary_type) and \
- not isinstance(data, six.text_type):
- raise IOError()
- return data
-
-
-_async = {
- 'asyncio': True,
- 'create_route': create_route,
- 'translate_request': translate_request,
- 'make_response': make_response,
- 'websocket': WebSocket if WebSocketProtocol else None,
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/threading.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/threading.py
deleted file mode 100644
index 9b53756681..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/threading.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from __future__ import absolute_import
-import threading
-import time
-
-try:
- import queue
-except ImportError: # pragma: no cover
- import Queue as queue
-
-_async = {
- 'thread': threading.Thread,
- 'queue': queue.Queue,
- 'queue_empty': queue.Empty,
- 'event': threading.Event,
- 'websocket': None,
- 'sleep': time.sleep,
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/tornado.py b/client/ayon_core/vendor/python/python_2/engineio/async_drivers/tornado.py
deleted file mode 100644
index adfe18f5a2..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_drivers/tornado.py
+++ /dev/null
@@ -1,184 +0,0 @@
-import asyncio
-import sys
-from urllib.parse import urlsplit
-from .. import exceptions
-
-import tornado.web
-import tornado.websocket
-import six
-
-
-def get_tornado_handler(engineio_server):
- class Handler(tornado.websocket.WebSocketHandler): # pragma: no cover
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- if isinstance(engineio_server.cors_allowed_origins,
- six.string_types):
- if engineio_server.cors_allowed_origins == '*':
- self.allowed_origins = None
- else:
- self.allowed_origins = [
- engineio_server.cors_allowed_origins]
- else:
- self.allowed_origins = engineio_server.cors_allowed_origins
- self.receive_queue = asyncio.Queue()
-
- async def get(self, *args, **kwargs):
- if self.request.headers.get('Upgrade', '').lower() == 'websocket':
- ret = super().get(*args, **kwargs)
- if asyncio.iscoroutine(ret):
- await ret
- else:
- await engineio_server.handle_request(self)
-
- async def open(self, *args, **kwargs):
- # this is the handler for the websocket request
- asyncio.ensure_future(engineio_server.handle_request(self))
-
- async def post(self, *args, **kwargs):
- await engineio_server.handle_request(self)
-
- async def options(self, *args, **kwargs):
- await engineio_server.handle_request(self)
-
- async def on_message(self, message):
- await self.receive_queue.put(message)
-
- async def get_next_message(self):
- return await self.receive_queue.get()
-
- def on_close(self):
- self.receive_queue.put_nowait(None)
-
- def check_origin(self, origin):
- if self.allowed_origins is None or origin in self.allowed_origins:
- return True
- return super().check_origin(origin)
-
- def get_compression_options(self):
- # enable compression
- return {}
-
- return Handler
-
-
-def translate_request(handler):
- """This function takes the arguments passed to the request handler and
- uses them to generate a WSGI compatible environ dictionary.
- """
- class AwaitablePayload(object):
- def __init__(self, payload):
- self.payload = payload or b''
-
- async def read(self, length=None):
- if length is None:
- r = self.payload
- self.payload = b''
- else:
- r = self.payload[:length]
- self.payload = self.payload[length:]
- return r
-
- payload = handler.request.body
-
- uri_parts = urlsplit(handler.request.path)
- full_uri = handler.request.path
- if handler.request.query: # pragma: no cover
- full_uri += '?' + handler.request.query
- environ = {
- 'wsgi.input': AwaitablePayload(payload),
- 'wsgi.errors': sys.stderr,
- 'wsgi.version': (1, 0),
- 'wsgi.async': True,
- 'wsgi.multithread': False,
- 'wsgi.multiprocess': False,
- 'wsgi.run_once': False,
- 'SERVER_SOFTWARE': 'aiohttp',
- 'REQUEST_METHOD': handler.request.method,
- 'QUERY_STRING': handler.request.query or '',
- 'RAW_URI': full_uri,
- 'SERVER_PROTOCOL': 'HTTP/%s' % handler.request.version,
- 'REMOTE_ADDR': '127.0.0.1',
- 'REMOTE_PORT': '0',
- 'SERVER_NAME': 'aiohttp',
- 'SERVER_PORT': '0',
- 'tornado.handler': handler
- }
-
- for hdr_name, hdr_value in handler.request.headers.items():
- hdr_name = hdr_name.upper()
- if hdr_name == 'CONTENT-TYPE':
- environ['CONTENT_TYPE'] = hdr_value
- continue
- elif hdr_name == 'CONTENT-LENGTH':
- environ['CONTENT_LENGTH'] = hdr_value
- continue
-
- key = 'HTTP_%s' % hdr_name.replace('-', '_')
- environ[key] = hdr_value
-
- environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http')
-
- path_info = uri_parts.path
-
- environ['PATH_INFO'] = path_info
- environ['SCRIPT_NAME'] = ''
-
- return environ
-
-
-def make_response(status, headers, payload, environ):
- """This function generates an appropriate response object for this async
- mode.
- """
- tornado_handler = environ['tornado.handler']
- try:
- tornado_handler.set_status(int(status.split()[0]))
- except RuntimeError: # pragma: no cover
- # for websocket connections Tornado does not accept a response, since
- # it already emitted the 101 status code
- return
- for header, value in headers:
- tornado_handler.set_header(header, value)
- tornado_handler.write(payload)
- tornado_handler.finish()
-
-
-class WebSocket(object): # pragma: no cover
- """
- This wrapper class provides a tornado WebSocket interface that is
- somewhat compatible with eventlet's implementation.
- """
- def __init__(self, handler):
- self.handler = handler
- self.tornado_handler = None
-
- async def __call__(self, environ):
- self.tornado_handler = environ['tornado.handler']
- self.environ = environ
- await self.handler(self)
-
- async def close(self):
- self.tornado_handler.close()
-
- async def send(self, message):
- try:
- self.tornado_handler.write_message(
- message, binary=isinstance(message, bytes))
- except tornado.websocket.WebSocketClosedError:
- raise exceptions.EngineIOError()
-
- async def wait(self):
- msg = await self.tornado_handler.get_next_message()
- if not isinstance(msg, six.binary_type) and \
- not isinstance(msg, six.text_type):
- raise IOError()
- return msg
-
-
-_async = {
- 'asyncio': True,
- 'translate_request': translate_request,
- 'make_response': make_response,
- 'websocket': WebSocket,
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_eventlet.py b/client/ayon_core/vendor/python/python_2/engineio/async_eventlet.py
deleted file mode 100644
index 042a67499b..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_eventlet.py
+++ /dev/null
@@ -1,30 +0,0 @@
-import importlib
-import sys
-
-from eventlet import sleep
-from eventlet.websocket import WebSocketWSGI as _WebSocketWSGI
-
-
-class WebSocketWSGI(_WebSocketWSGI):
- def __init__(self, *args, **kwargs):
- super(WebSocketWSGI, self).__init__(*args, **kwargs)
- self._sock = None
-
- def __call__(self, environ, start_response):
- if 'eventlet.input' not in environ:
- raise RuntimeError('You need to use the eventlet server. '
- 'See the Deployment section of the '
- 'documentation for more information.')
- self._sock = environ['eventlet.input'].get_socket()
- return super(WebSocketWSGI, self).__call__(environ, start_response)
-
-
-_async = {
- 'threading': importlib.import_module('eventlet.green.threading'),
- 'thread_class': 'Thread',
- 'queue': importlib.import_module('eventlet.queue'),
- 'queue_class': 'Queue',
- 'websocket': sys.modules[__name__],
- 'websocket_class': 'WebSocketWSGI',
- 'sleep': sleep
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_gevent.py b/client/ayon_core/vendor/python/python_2/engineio/async_gevent.py
deleted file mode 100644
index 34a9e43ce3..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_gevent.py
+++ /dev/null
@@ -1,63 +0,0 @@
-import importlib
-import sys
-
-import gevent
-try:
- import geventwebsocket # noqa
- _websocket_available = True
-except ImportError:
- _websocket_available = False
-
-
-class Thread(gevent.Greenlet): # pragma: no cover
- """
- This wrapper class provides gevent Greenlet interface that is compatible
- with the standard library's Thread class.
- """
- def __init__(self, target, args=[], kwargs={}):
- super(Thread, self).__init__(target, *args, **kwargs)
-
- def _run(self):
- return self.run()
-
-
-class WebSocketWSGI(object): # pragma: no cover
- """
- This wrapper class provides a gevent WebSocket interface that is
- compatible with eventlet's implementation.
- """
- def __init__(self, app):
- self.app = app
-
- def __call__(self, environ, start_response):
- if 'wsgi.websocket' not in environ:
- raise RuntimeError('You need to use the gevent-websocket server. '
- 'See the Deployment section of the '
- 'documentation for more information.')
- self._sock = environ['wsgi.websocket']
- self.environ = environ
- self.version = self._sock.version
- self.path = self._sock.path
- self.origin = self._sock.origin
- self.protocol = self._sock.protocol
- return self.app(self)
-
- def close(self):
- return self._sock.close()
-
- def send(self, message):
- return self._sock.send(message)
-
- def wait(self):
- return self._sock.receive()
-
-
-_async = {
- 'threading': sys.modules[__name__],
- 'thread_class': 'Thread',
- 'queue': importlib.import_module('gevent.queue'),
- 'queue_class': 'JoinableQueue',
- 'websocket': sys.modules[__name__] if _websocket_available else None,
- 'websocket_class': 'WebSocketWSGI' if _websocket_available else None,
- 'sleep': gevent.sleep
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_gevent_uwsgi.py b/client/ayon_core/vendor/python/python_2/engineio/async_gevent_uwsgi.py
deleted file mode 100644
index d2d6983893..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_gevent_uwsgi.py
+++ /dev/null
@@ -1,155 +0,0 @@
-import importlib
-import sys
-import six
-
-import gevent
-import uwsgi
-_websocket_available = hasattr(uwsgi, 'websocket_handshake')
-
-
-class Thread(gevent.Greenlet): # pragma: no cover
- """
- This wrapper class provides gevent Greenlet interface that is compatible
- with the standard library's Thread class.
- """
- def __init__(self, target, args=[], kwargs={}):
- super(Thread, self).__init__(target, *args, **kwargs)
-
- def _run(self):
- return self.run()
-
-
-class uWSGIWebSocket(object): # pragma: no cover
- """
- This wrapper class provides a uWSGI WebSocket interface that is
- compatible with eventlet's implementation.
- """
- def __init__(self, app):
- self.app = app
- self._sock = None
-
- def __call__(self, environ, start_response):
- self._sock = uwsgi.connection_fd()
- self.environ = environ
-
- uwsgi.websocket_handshake()
-
- self._req_ctx = None
- if hasattr(uwsgi, 'request_context'):
- # uWSGI >= 2.1.x with support for api access across-greenlets
- self._req_ctx = uwsgi.request_context()
- else:
- # use event and queue for sending messages
- from gevent.event import Event
- from gevent.queue import Queue
- from gevent.select import select
- self._event = Event()
- self._send_queue = Queue()
-
- # spawn a select greenlet
- def select_greenlet_runner(fd, event):
- """Sets event when data becomes available to read on fd."""
- while True:
- event.set()
- try:
- select([fd], [], [])[0]
- except ValueError:
- break
- self._select_greenlet = gevent.spawn(
- select_greenlet_runner,
- self._sock,
- self._event)
-
- self.app(self)
-
- def close(self):
- """Disconnects uWSGI from the client."""
- uwsgi.disconnect()
- if self._req_ctx is None:
- # better kill it here in case wait() is not called again
- self._select_greenlet.kill()
- self._event.set()
-
- def _send(self, msg):
- """Transmits message either in binary or UTF-8 text mode,
- depending on its type."""
- if isinstance(msg, six.binary_type):
- method = uwsgi.websocket_send_binary
- else:
- method = uwsgi.websocket_send
- if self._req_ctx is not None:
- method(msg, request_context=self._req_ctx)
- else:
- method(msg)
-
- def _decode_received(self, msg):
- """Returns either bytes or str, depending on message type."""
- if not isinstance(msg, six.binary_type):
- # already decoded - do nothing
- return msg
- # only decode from utf-8 if message is not binary data
- type = six.byte2int(msg[0:1])
- if type >= 48: # no binary
- return msg.decode('utf-8')
- # binary message, don't try to decode
- return msg
-
- def send(self, msg):
- """Queues a message for sending. Real transmission is done in
- wait method.
- Sends directly if uWSGI version is new enough."""
- if self._req_ctx is not None:
- self._send(msg)
- else:
- self._send_queue.put(msg)
- self._event.set()
-
- def wait(self):
- """Waits and returns received messages.
- If running in compatibility mode for older uWSGI versions,
- it also sends messages that have been queued by send().
- A return value of None means that connection was closed.
- This must be called repeatedly. For uWSGI < 2.1.x it must
- be called from the main greenlet."""
- while True:
- if self._req_ctx is not None:
- try:
- msg = uwsgi.websocket_recv(request_context=self._req_ctx)
- except IOError: # connection closed
- return None
- return self._decode_received(msg)
- else:
- # we wake up at least every 3 seconds to let uWSGI
- # do its ping/ponging
- event_set = self._event.wait(timeout=3)
- if event_set:
- self._event.clear()
- # maybe there is something to send
- msgs = []
- while True:
- try:
- msgs.append(self._send_queue.get(block=False))
- except gevent.queue.Empty:
- break
- for msg in msgs:
- self._send(msg)
- # maybe there is something to receive, if not, at least
- # ensure uWSGI does its ping/ponging
- try:
- msg = uwsgi.websocket_recv_nb()
- except IOError: # connection closed
- self._select_greenlet.kill()
- return None
- if msg: # message available
- return self._decode_received(msg)
-
-
-_async = {
- 'threading': sys.modules[__name__],
- 'thread_class': 'Thread',
- 'queue': importlib.import_module('gevent.queue'),
- 'queue_class': 'JoinableQueue',
- 'websocket': sys.modules[__name__] if _websocket_available else None,
- 'websocket_class': 'uWSGIWebSocket' if _websocket_available else None,
- 'sleep': gevent.sleep
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_sanic.py b/client/ayon_core/vendor/python/python_2/engineio/async_sanic.py
deleted file mode 100644
index d150aac0e6..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_sanic.py
+++ /dev/null
@@ -1,145 +0,0 @@
-import sys
-from urllib.parse import urlsplit
-
-from sanic.response import HTTPResponse
-try:
- from sanic.websocket import WebSocketProtocol
-except ImportError:
- # the installed version of sanic does not have websocket support
- WebSocketProtocol = None
-import six
-
-
-def create_route(app, engineio_server, engineio_endpoint):
- """This function sets up the engine.io endpoint as a route for the
- application.
-
- Note that both GET and POST requests must be hooked up on the engine.io
- endpoint.
- """
- app.add_route(engineio_server.handle_request, engineio_endpoint,
- methods=['GET', 'POST', 'OPTIONS'])
- try:
- app.enable_websocket()
- except AttributeError:
- # ignore, this version does not support websocket
- pass
-
-
-def translate_request(request):
- """This function takes the arguments passed to the request handler and
- uses them to generate a WSGI compatible environ dictionary.
- """
- class AwaitablePayload(object):
- def __init__(self, payload):
- self.payload = payload or b''
-
- async def read(self, length=None):
- if length is None:
- r = self.payload
- self.payload = b''
- else:
- r = self.payload[:length]
- self.payload = self.payload[length:]
- return r
-
- uri_parts = urlsplit(request.url)
- environ = {
- 'wsgi.input': AwaitablePayload(request.body),
- 'wsgi.errors': sys.stderr,
- 'wsgi.version': (1, 0),
- 'wsgi.async': True,
- 'wsgi.multithread': False,
- 'wsgi.multiprocess': False,
- 'wsgi.run_once': False,
- 'SERVER_SOFTWARE': 'sanic',
- 'REQUEST_METHOD': request.method,
- 'QUERY_STRING': uri_parts.query or '',
- 'RAW_URI': request.url,
- 'SERVER_PROTOCOL': 'HTTP/' + request.version,
- 'REMOTE_ADDR': '127.0.0.1',
- 'REMOTE_PORT': '0',
- 'SERVER_NAME': 'sanic',
- 'SERVER_PORT': '0',
- 'sanic.request': request
- }
-
- for hdr_name, hdr_value in request.headers.items():
- hdr_name = hdr_name.upper()
- if hdr_name == 'CONTENT-TYPE':
- environ['CONTENT_TYPE'] = hdr_value
- continue
- elif hdr_name == 'CONTENT-LENGTH':
- environ['CONTENT_LENGTH'] = hdr_value
- continue
-
- key = 'HTTP_%s' % hdr_name.replace('-', '_')
- if key in environ:
- hdr_value = '%s,%s' % (environ[key], hdr_value)
-
- environ[key] = hdr_value
-
- environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http')
-
- path_info = uri_parts.path
-
- environ['PATH_INFO'] = path_info
- environ['SCRIPT_NAME'] = ''
-
- return environ
-
-
-def make_response(status, headers, payload, environ):
- """This function generates an appropriate response object for this async
- mode.
- """
- headers_dict = {}
- content_type = None
- for h in headers:
- if h[0].lower() == 'content-type':
- content_type = h[1]
- else:
- headers_dict[h[0]] = h[1]
- return HTTPResponse(body_bytes=payload, content_type=content_type,
- status=int(status.split()[0]), headers=headers_dict)
-
-
-class WebSocket(object): # pragma: no cover
- """
- This wrapper class provides a sanic WebSocket interface that is
- somewhat compatible with eventlet's implementation.
- """
- def __init__(self, handler):
- self.handler = handler
- self._sock = None
-
- async def __call__(self, environ):
- request = environ['sanic.request']
- protocol = request.transport.get_protocol()
- self._sock = await protocol.websocket_handshake(request)
-
- self.environ = environ
- await self.handler(self)
-
- async def close(self):
- await self._sock.close()
-
- async def send(self, message):
- await self._sock.send(message)
-
- async def wait(self):
- data = await self._sock.recv()
- if not isinstance(data, six.binary_type) and \
- not isinstance(data, six.text_type):
- raise IOError()
- return data
-
-
-_async = {
- 'asyncio': True,
- 'create_route': create_route,
- 'translate_request': translate_request,
- 'make_response': make_response,
- 'websocket': sys.modules[__name__] if WebSocketProtocol else None,
- 'websocket_class': 'WebSocket' if WebSocketProtocol else None
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_threading.py b/client/ayon_core/vendor/python/python_2/engineio/async_threading.py
deleted file mode 100644
index fb458b07af..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_threading.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import importlib
-import time
-
-try:
- queue = importlib.import_module('queue')
-except ImportError: # pragma: no cover
- queue = importlib.import_module('Queue') # pragma: no cover
-
-_async = {
- 'threading': importlib.import_module('threading'),
- 'thread_class': 'Thread',
- 'queue': queue,
- 'queue_class': 'Queue',
- 'websocket': None,
- 'websocket_class': None,
- 'sleep': time.sleep
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/async_tornado.py b/client/ayon_core/vendor/python/python_2/engineio/async_tornado.py
deleted file mode 100644
index 4b4f9c7572..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/async_tornado.py
+++ /dev/null
@@ -1,154 +0,0 @@
-import asyncio
-import sys
-from urllib.parse import urlsplit
-
-try:
- import tornado.web
- import tornado.websocket
-except ImportError: # pragma: no cover
- pass
-import six
-
-
-def get_tornado_handler(engineio_server):
- class Handler(tornado.websocket.WebSocketHandler): # pragma: no cover
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.receive_queue = asyncio.Queue()
-
- async def get(self):
- if self.request.headers.get('Upgrade', '').lower() == 'websocket':
- super().get()
- await engineio_server.handle_request(self)
-
- async def post(self):
- await engineio_server.handle_request(self)
-
- async def options(self):
- await engineio_server.handle_request(self)
-
- async def on_message(self, message):
- await self.receive_queue.put(message)
-
- async def get_next_message(self):
- return await self.receive_queue.get()
-
- def on_close(self):
- self.receive_queue.put_nowait(None)
-
- return Handler
-
-
-def translate_request(handler):
- """This function takes the arguments passed to the request handler and
- uses them to generate a WSGI compatible environ dictionary.
- """
- class AwaitablePayload(object):
- def __init__(self, payload):
- self.payload = payload or b''
-
- async def read(self, length=None):
- if length is None:
- r = self.payload
- self.payload = b''
- else:
- r = self.payload[:length]
- self.payload = self.payload[length:]
- return r
-
- payload = handler.request.body
-
- uri_parts = urlsplit(handler.request.path)
- full_uri = handler.request.path
- if handler.request.query: # pragma: no cover
- full_uri += '?' + handler.request.query
- environ = {
- 'wsgi.input': AwaitablePayload(payload),
- 'wsgi.errors': sys.stderr,
- 'wsgi.version': (1, 0),
- 'wsgi.async': True,
- 'wsgi.multithread': False,
- 'wsgi.multiprocess': False,
- 'wsgi.run_once': False,
- 'SERVER_SOFTWARE': 'aiohttp',
- 'REQUEST_METHOD': handler.request.method,
- 'QUERY_STRING': handler.request.query or '',
- 'RAW_URI': full_uri,
- 'SERVER_PROTOCOL': 'HTTP/%s' % handler.request.version,
- 'REMOTE_ADDR': '127.0.0.1',
- 'REMOTE_PORT': '0',
- 'SERVER_NAME': 'aiohttp',
- 'SERVER_PORT': '0',
- 'tornado.handler': handler
- }
-
- for hdr_name, hdr_value in handler.request.headers.items():
- hdr_name = hdr_name.upper()
- if hdr_name == 'CONTENT-TYPE':
- environ['CONTENT_TYPE'] = hdr_value
- continue
- elif hdr_name == 'CONTENT-LENGTH':
- environ['CONTENT_LENGTH'] = hdr_value
- continue
-
- key = 'HTTP_%s' % hdr_name.replace('-', '_')
- environ[key] = hdr_value
-
- environ['wsgi.url_scheme'] = environ.get('HTTP_X_FORWARDED_PROTO', 'http')
-
- path_info = uri_parts.path
-
- environ['PATH_INFO'] = path_info
- environ['SCRIPT_NAME'] = ''
-
- return environ
-
-
-def make_response(status, headers, payload, environ):
- """This function generates an appropriate response object for this async
- mode.
- """
- tornado_handler = environ['tornado.handler']
- tornado_handler.set_status(int(status.split()[0]))
- for header, value in headers:
- tornado_handler.set_header(header, value)
- tornado_handler.write(payload)
- tornado_handler.finish()
-
-
-class WebSocket(object): # pragma: no cover
- """
- This wrapper class provides a tornado WebSocket interface that is
- somewhat compatible with eventlet's implementation.
- """
- def __init__(self, handler):
- self.handler = handler
- self.tornado_handler = None
-
- async def __call__(self, environ):
- self.tornado_handler = environ['tornado.handler']
- self.environ = environ
- await self.handler(self)
-
- async def close(self):
- self.tornado_handler.close()
-
- async def send(self, message):
- self.tornado_handler.write_message(
- message, binary=isinstance(message, bytes))
-
- async def wait(self):
- msg = await self.tornado_handler.get_next_message()
- if not isinstance(msg, six.binary_type) and \
- not isinstance(msg, six.text_type):
- raise IOError()
- return msg
-
-
-_async = {
- 'asyncio': True,
- 'translate_request': translate_request,
- 'make_response': make_response,
- 'websocket': sys.modules[__name__],
- 'websocket_class': 'WebSocket'
-}
diff --git a/client/ayon_core/vendor/python/python_2/engineio/asyncio_client.py b/client/ayon_core/vendor/python/python_2/engineio/asyncio_client.py
deleted file mode 100644
index 340cf278b7..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/asyncio_client.py
+++ /dev/null
@@ -1,556 +0,0 @@
-import asyncio
-
-try:
- import aiohttp
-except ImportError: # pragma: no cover
- aiohttp = None
-import six
-try:
- import websockets
-except ImportError: # pragma: no cover
- websockets = None
-
-from . import client
-from . import exceptions
-from . import packet
-from . import payload
-
-
-class AsyncClient(client.Client):
- """An Engine.IO client for asyncio.
-
- This class implements a fully compliant Engine.IO web client with support
- for websocket and long-polling transports, compatible with the asyncio
- framework on Python 3.5 or newer.
-
- :param logger: To enable logging set to ``True`` or pass a logger object to
- use. To disable logging set to ``False``. The default is
- ``False``.
- :param json: An alternative json module to use for encoding and decoding
- packets. Custom json modules must have ``dumps`` and ``loads``
- functions that are compatible with the standard library
- versions.
- """
- def is_asyncio_based(self):
- return True
-
- async def connect(self, url, headers={}, transports=None,
- engineio_path='engine.io'):
- """Connect to an Engine.IO server.
-
- :param url: The URL of the Engine.IO server. It can include custom
- query string parameters if required by the server.
- :param headers: A dictionary with custom headers to send with the
- connection request.
- :param transports: The list of allowed transports. Valid transports
- are ``'polling'`` and ``'websocket'``. If not
- given, the polling transport is connected first,
- then an upgrade to websocket is attempted.
- :param engineio_path: The endpoint where the Engine.IO server is
- installed. The default value is appropriate for
- most cases.
-
- Note: this method is a coroutine.
-
- Example usage::
-
- eio = engineio.Client()
- await eio.connect('http://localhost:5000')
- """
- if self.state != 'disconnected':
- raise ValueError('Client is not in a disconnected state')
- valid_transports = ['polling', 'websocket']
- if transports is not None:
- if isinstance(transports, six.text_type):
- transports = [transports]
- transports = [transport for transport in transports
- if transport in valid_transports]
- if not transports:
- raise ValueError('No valid transports provided')
- self.transports = transports or valid_transports
- self.queue = self.create_queue()
- return await getattr(self, '_connect_' + self.transports[0])(
- url, headers, engineio_path)
-
- async def wait(self):
- """Wait until the connection with the server ends.
-
- Client applications can use this function to block the main thread
- during the life of the connection.
-
- Note: this method is a coroutine.
- """
- if self.read_loop_task:
- await self.read_loop_task
-
- async def send(self, data, binary=None):
- """Send a message to a client.
-
- :param data: The data to send to the client. Data can be of type
- ``str``, ``bytes``, ``list`` or ``dict``. If a ``list``
- or ``dict``, the data will be serialized as JSON.
- :param binary: ``True`` to send packet as binary, ``False`` to send
- as text. If not given, unicode (Python 2) and str
- (Python 3) are sent as text, and str (Python 2) and
- bytes (Python 3) are sent as binary.
-
- Note: this method is a coroutine.
- """
- await self._send_packet(packet.Packet(packet.MESSAGE, data=data,
- binary=binary))
-
- async def disconnect(self, abort=False):
- """Disconnect from the server.
-
- :param abort: If set to ``True``, do not wait for background tasks
- associated with the connection to end.
-
- Note: this method is a coroutine.
- """
- if self.state == 'connected':
- await self._send_packet(packet.Packet(packet.CLOSE))
- await self.queue.put(None)
- self.state = 'disconnecting'
- await self._trigger_event('disconnect', run_async=False)
- if self.current_transport == 'websocket':
- await self.ws.close()
- if not abort:
- await self.read_loop_task
- self.state = 'disconnected'
- try:
- client.connected_clients.remove(self)
- except ValueError: # pragma: no cover
- pass
- self._reset()
-
- def start_background_task(self, target, *args, **kwargs):
- """Start a background task.
-
- This is a utility function that applications can use to start a
- background task.
-
- :param target: the target function to execute.
- :param args: arguments to pass to the function.
- :param kwargs: keyword arguments to pass to the function.
-
- This function returns an object compatible with the `Thread` class in
- the Python standard library. The `start()` method on this object is
- already called by this function.
-
- Note: this method is a coroutine.
- """
- return asyncio.ensure_future(target(*args, **kwargs))
-
- async def sleep(self, seconds=0):
- """Sleep for the requested amount of time.
-
- Note: this method is a coroutine.
- """
- return await asyncio.sleep(seconds)
-
- def create_queue(self):
- """Create a queue object."""
- q = asyncio.Queue()
- q.Empty = asyncio.QueueEmpty
- return q
-
- def create_event(self):
- """Create an event object."""
- return asyncio.Event()
-
- def _reset(self):
- if self.http: # pragma: no cover
- asyncio.ensure_future(self.http.close())
- super()._reset()
-
- async def _connect_polling(self, url, headers, engineio_path):
- """Establish a long-polling connection to the Engine.IO server."""
- if aiohttp is None: # pragma: no cover
- self.logger.error('aiohttp not installed -- cannot make HTTP '
- 'requests!')
- return
- self.base_url = self._get_engineio_url(url, engineio_path, 'polling')
- self.logger.info('Attempting polling connection to ' + self.base_url)
- r = await self._send_request(
- 'GET', self.base_url + self._get_url_timestamp(), headers=headers)
- if r is None:
- self._reset()
- raise exceptions.ConnectionError(
- 'Connection refused by the server')
- if r.status != 200:
- raise exceptions.ConnectionError(
- 'Unexpected status code {} in server response'.format(
- r.status))
- try:
- p = payload.Payload(encoded_payload=await r.read())
- except ValueError:
- six.raise_from(exceptions.ConnectionError(
- 'Unexpected response from server'), None)
- open_packet = p.packets[0]
- if open_packet.packet_type != packet.OPEN:
- raise exceptions.ConnectionError(
- 'OPEN packet not returned by server')
- self.logger.info(
- 'Polling connection accepted with ' + str(open_packet.data))
- self.sid = open_packet.data['sid']
- self.upgrades = open_packet.data['upgrades']
- self.ping_interval = open_packet.data['pingInterval'] / 1000.0
- self.ping_timeout = open_packet.data['pingTimeout'] / 1000.0
- self.current_transport = 'polling'
- self.base_url += '&sid=' + self.sid
-
- self.state = 'connected'
- client.connected_clients.append(self)
- await self._trigger_event('connect', run_async=False)
-
- for pkt in p.packets[1:]:
- await self._receive_packet(pkt)
-
- if 'websocket' in self.upgrades and 'websocket' in self.transports:
- # attempt to upgrade to websocket
- if await self._connect_websocket(url, headers, engineio_path):
- # upgrade to websocket succeeded, we're done here
- return
-
- self.ping_loop_task = self.start_background_task(self._ping_loop)
- self.write_loop_task = self.start_background_task(self._write_loop)
- self.read_loop_task = self.start_background_task(
- self._read_loop_polling)
-
- async def _connect_websocket(self, url, headers, engineio_path):
- """Establish or upgrade to a WebSocket connection with the server."""
- if websockets is None: # pragma: no cover
- self.logger.error('websockets package not installed')
- return False
- websocket_url = self._get_engineio_url(url, engineio_path,
- 'websocket')
- if self.sid:
- self.logger.info(
- 'Attempting WebSocket upgrade to ' + websocket_url)
- upgrade = True
- websocket_url += '&sid=' + self.sid
- else:
- upgrade = False
- self.base_url = websocket_url
- self.logger.info(
- 'Attempting WebSocket connection to ' + websocket_url)
-
- # get the cookies from the long-polling connection so that they can
- # also be sent the the WebSocket route
- cookies = None
- if self.http:
- cookies = '; '.join(["{}={}".format(cookie.key, cookie.value)
- for cookie in self.http._cookie_jar])
- headers = headers.copy()
- headers['Cookie'] = cookies
-
- try:
- ws = await websockets.connect(
- websocket_url + self._get_url_timestamp(),
- extra_headers=headers)
- except (websockets.exceptions.InvalidURI,
- websockets.exceptions.InvalidHandshake):
- if upgrade:
- self.logger.warning(
- 'WebSocket upgrade failed: connection error')
- return False
- else:
- raise exceptions.ConnectionError('Connection error')
- if upgrade:
- p = packet.Packet(packet.PING, data='probe').encode(
- always_bytes=False)
- try:
- await ws.send(p)
- except Exception as e: # pragma: no cover
- self.logger.warning(
- 'WebSocket upgrade failed: unexpected send exception: %s',
- str(e))
- return False
- try:
- p = await ws.recv()
- except Exception as e: # pragma: no cover
- self.logger.warning(
- 'WebSocket upgrade failed: unexpected recv exception: %s',
- str(e))
- return False
- pkt = packet.Packet(encoded_packet=p)
- if pkt.packet_type != packet.PONG or pkt.data != 'probe':
- self.logger.warning(
- 'WebSocket upgrade failed: no PONG packet')
- return False
- p = packet.Packet(packet.UPGRADE).encode(always_bytes=False)
- try:
- await ws.send(p)
- except Exception as e: # pragma: no cover
- self.logger.warning(
- 'WebSocket upgrade failed: unexpected send exception: %s',
- str(e))
- return False
- self.current_transport = 'websocket'
- if self.http: # pragma: no cover
- await self.http.close()
- self.logger.info('WebSocket upgrade was successful')
- else:
- try:
- p = await ws.recv()
- except Exception as e: # pragma: no cover
- raise exceptions.ConnectionError(
- 'Unexpected recv exception: ' + str(e))
- open_packet = packet.Packet(encoded_packet=p)
- if open_packet.packet_type != packet.OPEN:
- raise exceptions.ConnectionError('no OPEN packet')
- self.logger.info(
- 'WebSocket connection accepted with ' + str(open_packet.data))
- self.sid = open_packet.data['sid']
- self.upgrades = open_packet.data['upgrades']
- self.ping_interval = open_packet.data['pingInterval'] / 1000.0
- self.ping_timeout = open_packet.data['pingTimeout'] / 1000.0
- self.current_transport = 'websocket'
-
- self.state = 'connected'
- client.connected_clients.append(self)
- await self._trigger_event('connect', run_async=False)
-
- self.ws = ws
- self.ping_loop_task = self.start_background_task(self._ping_loop)
- self.write_loop_task = self.start_background_task(self._write_loop)
- self.read_loop_task = self.start_background_task(
- self._read_loop_websocket)
- return True
-
- async def _receive_packet(self, pkt):
- """Handle incoming packets from the server."""
- packet_name = packet.packet_names[pkt.packet_type] \
- if pkt.packet_type < len(packet.packet_names) else 'UNKNOWN'
- self.logger.info(
- 'Received packet %s data %s', packet_name,
- pkt.data if not isinstance(pkt.data, bytes) else '')
- if pkt.packet_type == packet.MESSAGE:
- await self._trigger_event('message', pkt.data, run_async=True)
- elif pkt.packet_type == packet.PONG:
- self.pong_received = True
- elif pkt.packet_type == packet.CLOSE:
- await self.disconnect(abort=True)
- elif pkt.packet_type == packet.NOOP:
- pass
- else:
- self.logger.error('Received unexpected packet of type %s',
- pkt.packet_type)
-
- async def _send_packet(self, pkt):
- """Queue a packet to be sent to the server."""
- if self.state != 'connected':
- return
- await self.queue.put(pkt)
- self.logger.info(
- 'Sending packet %s data %s',
- packet.packet_names[pkt.packet_type],
- pkt.data if not isinstance(pkt.data, bytes) else '')
-
- async def _send_request(
- self, method, url, headers=None, body=None): # pragma: no cover
- if self.http is None or self.http.closed:
- self.http = aiohttp.ClientSession()
- method = getattr(self.http, method.lower())
- try:
- return await method(url, headers=headers, data=body)
- except aiohttp.ClientError:
- return
-
- async def _trigger_event(self, event, *args, **kwargs):
- """Invoke an event handler."""
- run_async = kwargs.pop('run_async', False)
- ret = None
- if event in self.handlers:
- if asyncio.iscoroutinefunction(self.handlers[event]) is True:
- if run_async:
- return self.start_background_task(self.handlers[event],
- *args)
- else:
- try:
- ret = await self.handlers[event](*args)
- except asyncio.CancelledError: # pragma: no cover
- pass
- except:
- self.logger.exception(event + ' async handler error')
- if event == 'connect':
- # if connect handler raised error we reject the
- # connection
- return False
- else:
- if run_async:
- async def async_handler():
- return self.handlers[event](*args)
-
- return self.start_background_task(async_handler)
- else:
- try:
- ret = self.handlers[event](*args)
- except:
- self.logger.exception(event + ' handler error')
- if event == 'connect':
- # if connect handler raised error we reject the
- # connection
- return False
- return ret
-
- async def _ping_loop(self):
- """This background task sends a PING to the server at the requested
- interval.
- """
- self.pong_received = True
- self.ping_loop_event.clear()
- while self.state == 'connected':
- if not self.pong_received:
- self.logger.info(
- 'PONG response has not been received, aborting')
- if self.ws:
- await self.ws.close()
- await self.queue.put(None)
- break
- self.pong_received = False
- await self._send_packet(packet.Packet(packet.PING))
- try:
- await asyncio.wait_for(self.ping_loop_event.wait(),
- self.ping_interval)
- except (asyncio.TimeoutError,
- asyncio.CancelledError): # pragma: no cover
- pass
- self.logger.info('Exiting ping task')
-
- async def _read_loop_polling(self):
- """Read packets by polling the Engine.IO server."""
- while self.state == 'connected':
- self.logger.info(
- 'Sending polling GET request to ' + self.base_url)
- r = await self._send_request(
- 'GET', self.base_url + self._get_url_timestamp())
- if r is None:
- self.logger.warning(
- 'Connection refused by the server, aborting')
- await self.queue.put(None)
- break
- if r.status != 200:
- self.logger.warning('Unexpected status code %s in server '
- 'response, aborting', r.status)
- await self.queue.put(None)
- break
- try:
- p = payload.Payload(encoded_payload=await r.read())
- except ValueError:
- self.logger.warning(
- 'Unexpected packet from server, aborting')
- await self.queue.put(None)
- break
- for pkt in p.packets:
- await self._receive_packet(pkt)
-
- self.logger.info('Waiting for write loop task to end')
- await self.write_loop_task
- self.logger.info('Waiting for ping loop task to end')
- self.ping_loop_event.set()
- await self.ping_loop_task
- if self.state == 'connected':
- await self._trigger_event('disconnect', run_async=False)
- try:
- client.connected_clients.remove(self)
- except ValueError: # pragma: no cover
- pass
- self._reset()
- self.logger.info('Exiting read loop task')
-
- async def _read_loop_websocket(self):
- """Read packets from the Engine.IO WebSocket connection."""
- while self.state == 'connected':
- p = None
- try:
- p = await self.ws.recv()
- except websockets.exceptions.ConnectionClosed:
- self.logger.info(
- 'Read loop: WebSocket connection was closed, aborting')
- await self.queue.put(None)
- break
- except Exception as e:
- self.logger.info(
- 'Unexpected error "%s", aborting', str(e))
- await self.queue.put(None)
- break
- if isinstance(p, six.text_type): # pragma: no cover
- p = p.encode('utf-8')
- pkt = packet.Packet(encoded_packet=p)
- await self._receive_packet(pkt)
-
- self.logger.info('Waiting for write loop task to end')
- await self.write_loop_task
- self.logger.info('Waiting for ping loop task to end')
- self.ping_loop_event.set()
- await self.ping_loop_task
- if self.state == 'connected':
- await self._trigger_event('disconnect', run_async=False)
- try:
- client.connected_clients.remove(self)
- except ValueError: # pragma: no cover
- pass
- self._reset()
- self.logger.info('Exiting read loop task')
-
- async def _write_loop(self):
- """This background task sends packages to the server as they are
- pushed to the send queue.
- """
- while self.state == 'connected':
- # to simplify the timeout handling, use the maximum of the
- # ping interval and ping timeout as timeout, with an extra 5
- # seconds grace period
- timeout = max(self.ping_interval, self.ping_timeout) + 5
- packets = None
- try:
- packets = [await asyncio.wait_for(self.queue.get(), timeout)]
- except (self.queue.Empty, asyncio.TimeoutError,
- asyncio.CancelledError):
- self.logger.error('packet queue is empty, aborting')
- break
- if packets == [None]:
- self.queue.task_done()
- packets = []
- else:
- while True:
- try:
- packets.append(self.queue.get_nowait())
- except self.queue.Empty:
- break
- if packets[-1] is None:
- packets = packets[:-1]
- self.queue.task_done()
- break
- if not packets:
- # empty packet list returned -> connection closed
- break
- if self.current_transport == 'polling':
- p = payload.Payload(packets=packets)
- r = await self._send_request(
- 'POST', self.base_url, body=p.encode(),
- headers={'Content-Type': 'application/octet-stream'})
- for pkt in packets:
- self.queue.task_done()
- if r is None:
- self.logger.warning(
- 'Connection refused by the server, aborting')
- break
- if r.status != 200:
- self.logger.warning('Unexpected status code %s in server '
- 'response, aborting', r.status)
- self._reset()
- break
- else:
- # websocket
- try:
- for pkt in packets:
- await self.ws.send(pkt.encode(always_bytes=False))
- self.queue.task_done()
- except websockets.exceptions.ConnectionClosed:
- self.logger.info(
- 'Write loop: WebSocket connection was closed, '
- 'aborting')
- break
- self.logger.info('Exiting write loop task')
diff --git a/client/ayon_core/vendor/python/python_2/engineio/asyncio_server.py b/client/ayon_core/vendor/python/python_2/engineio/asyncio_server.py
deleted file mode 100644
index cc5ed8007c..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/asyncio_server.py
+++ /dev/null
@@ -1,444 +0,0 @@
-import asyncio
-
-import six
-from six.moves import urllib
-
-from . import exceptions
-from . import packet
-from . import server
-from . import asyncio_socket
-
-
-class AsyncServer(server.Server):
- """An Engine.IO server for asyncio.
-
- This class implements a fully compliant Engine.IO web server with support
- for websocket and long-polling transports, compatible with the asyncio
- framework on Python 3.5 or newer.
-
- :param async_mode: The asynchronous model to use. See the Deployment
- section in the documentation for a description of the
- available options. Valid async modes are "aiohttp",
- "sanic", "tornado" and "asgi". If this argument is not
- given, "aiohttp" is tried first, followed by "sanic",
- "tornado", and finally "asgi". The first async mode that
- has all its dependencies installed is the one that is
- chosen.
- :param ping_timeout: The time in seconds that the client waits for the
- server to respond before disconnecting.
- :param ping_interval: The interval in seconds at which the client pings
- the server.
- :param max_http_buffer_size: The maximum size of a message when using the
- polling transport.
- :param allow_upgrades: Whether to allow transport upgrades or not.
- :param http_compression: Whether to compress packages when using the
- polling transport.
- :param compression_threshold: Only compress messages when their byte size
- is greater than this value.
- :param cookie: Name of the HTTP cookie that contains the client session
- id. If set to ``None``, a cookie is not sent to the client.
- :param cors_allowed_origins: List of origins that are allowed to connect
- to this server. All origins are allowed by
- default.
- :param cors_credentials: Whether credentials (cookies, authentication) are
- allowed in requests to this server.
- :param logger: To enable logging set to ``True`` or pass a logger object to
- use. To disable logging set to ``False``.
- :param json: An alternative json module to use for encoding and decoding
- packets. Custom json modules must have ``dumps`` and ``loads``
- functions that are compatible with the standard library
- versions.
- :param async_handlers: If set to ``True``, run message event handlers in
- non-blocking threads. To run handlers synchronously,
- set to ``False``. The default is ``True``.
- :param kwargs: Reserved for future extensions, any additional parameters
- given as keyword arguments will be silently ignored.
- """
- def is_asyncio_based(self):
- return True
-
- def async_modes(self):
- return ['aiohttp', 'sanic', 'tornado', 'asgi']
-
- def attach(self, app, engineio_path='engine.io'):
- """Attach the Engine.IO server to an application."""
- engineio_path = engineio_path.strip('/')
- self._async['create_route'](app, self, '/{}/'.format(engineio_path))
-
- async def send(self, sid, data, binary=None):
- """Send a message to a client.
-
- :param sid: The session id of the recipient client.
- :param data: The data to send to the client. Data can be of type
- ``str``, ``bytes``, ``list`` or ``dict``. If a ``list``
- or ``dict``, the data will be serialized as JSON.
- :param binary: ``True`` to send packet as binary, ``False`` to send
- as text. If not given, unicode (Python 2) and str
- (Python 3) are sent as text, and str (Python 2) and
- bytes (Python 3) are sent as binary.
-
- Note: this method is a coroutine.
- """
- try:
- socket = self._get_socket(sid)
- except KeyError:
- # the socket is not available
- self.logger.warning('Cannot send to sid %s', sid)
- return
- await socket.send(packet.Packet(packet.MESSAGE, data=data,
- binary=binary))
-
- async def get_session(self, sid):
- """Return the user session for a client.
-
- :param sid: The session id of the client.
-
- The return value is a dictionary. Modifications made to this
- dictionary are not guaranteed to be preserved. If you want to modify
- the user session, use the ``session`` context manager instead.
- """
- socket = self._get_socket(sid)
- return socket.session
-
- async def save_session(self, sid, session):
- """Store the user session for a client.
-
- :param sid: The session id of the client.
- :param session: The session dictionary.
- """
- socket = self._get_socket(sid)
- socket.session = session
-
- def session(self, sid):
- """Return the user session for a client with context manager syntax.
-
- :param sid: The session id of the client.
-
- This is a context manager that returns the user session dictionary for
- the client. Any changes that are made to this dictionary inside the
- context manager block are saved back to the session. Example usage::
-
- @eio.on('connect')
- def on_connect(sid, environ):
- username = authenticate_user(environ)
- if not username:
- return False
- with eio.session(sid) as session:
- session['username'] = username
-
- @eio.on('message')
- def on_message(sid, msg):
- async with eio.session(sid) as session:
- print('received message from ', session['username'])
- """
- class _session_context_manager(object):
- def __init__(self, server, sid):
- self.server = server
- self.sid = sid
- self.session = None
-
- async def __aenter__(self):
- self.session = await self.server.get_session(sid)
- return self.session
-
- async def __aexit__(self, *args):
- await self.server.save_session(sid, self.session)
-
- return _session_context_manager(self, sid)
-
- async def disconnect(self, sid=None):
- """Disconnect a client.
-
- :param sid: The session id of the client to close. If this parameter
- is not given, then all clients are closed.
-
- Note: this method is a coroutine.
- """
- if sid is not None:
- try:
- socket = self._get_socket(sid)
- except KeyError: # pragma: no cover
- # the socket was already closed or gone
- pass
- else:
- await socket.close()
- del self.sockets[sid]
- else:
- await asyncio.wait([client.close()
- for client in six.itervalues(self.sockets)])
- self.sockets = {}
-
- async def handle_request(self, *args, **kwargs):
- """Handle an HTTP request from the client.
-
- This is the entry point of the Engine.IO application. This function
- returns the HTTP response to deliver to the client.
-
- Note: this method is a coroutine.
- """
- translate_request = self._async['translate_request']
- if asyncio.iscoroutinefunction(translate_request):
- environ = await translate_request(*args, **kwargs)
- else:
- environ = translate_request(*args, **kwargs)
- method = environ['REQUEST_METHOD']
- query = urllib.parse.parse_qs(environ.get('QUERY_STRING', ''))
-
- sid = query['sid'][0] if 'sid' in query else None
- b64 = False
- jsonp = False
- jsonp_index = None
-
- if 'b64' in query:
- if query['b64'][0] == "1" or query['b64'][0].lower() == "true":
- b64 = True
- if 'j' in query:
- jsonp = True
- try:
- jsonp_index = int(query['j'][0])
- except (ValueError, KeyError, IndexError):
- # Invalid JSONP index number
- pass
-
- if jsonp and jsonp_index is None:
- self.logger.warning('Invalid JSONP index number')
- r = self._bad_request()
- elif method == 'GET':
- if sid is None:
- transport = query.get('transport', ['polling'])[0]
- if transport != 'polling' and transport != 'websocket':
- self.logger.warning('Invalid transport %s', transport)
- r = self._bad_request()
- else:
- r = await self._handle_connect(environ, transport,
- b64, jsonp_index)
- else:
- if sid not in self.sockets:
- self.logger.warning('Invalid session %s', sid)
- r = self._bad_request()
- else:
- socket = self._get_socket(sid)
- try:
- packets = await socket.handle_get_request(environ)
- if isinstance(packets, list):
- r = self._ok(packets, b64=b64,
- jsonp_index=jsonp_index)
- else:
- r = packets
- except exceptions.EngineIOError:
- if sid in self.sockets: # pragma: no cover
- await self.disconnect(sid)
- r = self._bad_request()
- if sid in self.sockets and self.sockets[sid].closed:
- del self.sockets[sid]
- elif method == 'POST':
- if sid is None or sid not in self.sockets:
- self.logger.warning('Invalid session %s', sid)
- r = self._bad_request()
- else:
- socket = self._get_socket(sid)
- try:
- await socket.handle_post_request(environ)
- r = self._ok(jsonp_index=jsonp_index)
- except exceptions.EngineIOError:
- if sid in self.sockets: # pragma: no cover
- await self.disconnect(sid)
- r = self._bad_request()
- except: # pragma: no cover
- # for any other unexpected errors, we log the error
- # and keep going
- self.logger.exception('post request handler error')
- r = self._ok(jsonp_index=jsonp_index)
- elif method == 'OPTIONS':
- r = self._ok()
- else:
- self.logger.warning('Method %s not supported', method)
- r = self._method_not_found()
- if not isinstance(r, dict):
- return r
- if self.http_compression and \
- len(r['response']) >= self.compression_threshold:
- encodings = [e.split(';')[0].strip() for e in
- environ.get('HTTP_ACCEPT_ENCODING', '').split(',')]
- for encoding in encodings:
- if encoding in self.compression_methods:
- r['response'] = \
- getattr(self, '_' + encoding)(r['response'])
- r['headers'] += [('Content-Encoding', encoding)]
- break
- cors_headers = self._cors_headers(environ)
- make_response = self._async['make_response']
- if asyncio.iscoroutinefunction(make_response):
- response = await make_response(r['status'],
- r['headers'] + cors_headers,
- r['response'], environ)
- else:
- response = make_response(r['status'], r['headers'] + cors_headers,
- r['response'], environ)
- return response
-
- def start_background_task(self, target, *args, **kwargs):
- """Start a background task using the appropriate async model.
-
- This is a utility function that applications can use to start a
- background task using the method that is compatible with the
- selected async mode.
-
- :param target: the target function to execute.
- :param args: arguments to pass to the function.
- :param kwargs: keyword arguments to pass to the function.
-
- The return value is a ``asyncio.Task`` object.
- """
- return asyncio.ensure_future(target(*args, **kwargs))
-
- async def sleep(self, seconds=0):
- """Sleep for the requested amount of time using the appropriate async
- model.
-
- This is a utility function that applications can use to put a task to
- sleep without having to worry about using the correct call for the
- selected async mode.
-
- Note: this method is a coroutine.
- """
- return await asyncio.sleep(seconds)
-
- def create_queue(self, *args, **kwargs):
- """Create a queue object using the appropriate async model.
-
- This is a utility function that applications can use to create a queue
- without having to worry about using the correct call for the selected
- async mode. For asyncio based async modes, this returns an instance of
- ``asyncio.Queue``.
- """
- return asyncio.Queue(*args, **kwargs)
-
- def get_queue_empty_exception(self):
- """Return the queue empty exception for the appropriate async model.
-
- This is a utility function that applications can use to work with a
- queue without having to worry about using the correct call for the
- selected async mode. For asyncio based async modes, this returns an
- instance of ``asyncio.QueueEmpty``.
- """
- return asyncio.QueueEmpty
-
- def create_event(self, *args, **kwargs):
- """Create an event object using the appropriate async model.
-
- This is a utility function that applications can use to create an
- event without having to worry about using the correct call for the
- selected async mode. For asyncio based async modes, this returns
- an instance of ``asyncio.Event``.
- """
- return asyncio.Event(*args, **kwargs)
-
- async def _handle_connect(self, environ, transport, b64=False,
- jsonp_index=None):
- """Handle a client connection request."""
- if self.start_service_task:
- # start the service task to monitor connected clients
- self.start_service_task = False
- self.start_background_task(self._service_task)
-
- sid = self._generate_id()
- s = asyncio_socket.AsyncSocket(self, sid)
- self.sockets[sid] = s
-
- pkt = packet.Packet(
- packet.OPEN, {'sid': sid,
- 'upgrades': self._upgrades(sid, transport),
- 'pingTimeout': int(self.ping_timeout * 1000),
- 'pingInterval': int(self.ping_interval * 1000)})
- await s.send(pkt)
-
- ret = await self._trigger_event('connect', sid, environ,
- run_async=False)
- if ret is False:
- del self.sockets[sid]
- self.logger.warning('Application rejected connection')
- return self._unauthorized()
-
- if transport == 'websocket':
- ret = await s.handle_get_request(environ)
- if s.closed:
- # websocket connection ended, so we are done
- del self.sockets[sid]
- return ret
- else:
- s.connected = True
- headers = None
- if self.cookie:
- headers = [('Set-Cookie', self.cookie + '=' + sid)]
- try:
- return self._ok(await s.poll(), headers=headers, b64=b64,
- jsonp_index=jsonp_index)
- except exceptions.QueueEmpty:
- return self._bad_request()
-
- async def _trigger_event(self, event, *args, **kwargs):
- """Invoke an event handler."""
- run_async = kwargs.pop('run_async', False)
- ret = None
- if event in self.handlers:
- if asyncio.iscoroutinefunction(self.handlers[event]) is True:
- if run_async:
- return self.start_background_task(self.handlers[event],
- *args)
- else:
- try:
- ret = await self.handlers[event](*args)
- except asyncio.CancelledError: # pragma: no cover
- pass
- except:
- self.logger.exception(event + ' async handler error')
- if event == 'connect':
- # if connect handler raised error we reject the
- # connection
- return False
- else:
- if run_async:
- async def async_handler():
- return self.handlers[event](*args)
-
- return self.start_background_task(async_handler)
- else:
- try:
- ret = self.handlers[event](*args)
- except:
- self.logger.exception(event + ' handler error')
- if event == 'connect':
- # if connect handler raised error we reject the
- # connection
- return False
- return ret
-
- async def _service_task(self): # pragma: no cover
- """Monitor connected clients and clean up those that time out."""
- while True:
- if len(self.sockets) == 0:
- # nothing to do
- await self.sleep(self.ping_timeout)
- continue
-
- # go through the entire client list in a ping interval cycle
- sleep_interval = self.ping_timeout / len(self.sockets)
-
- try:
- # iterate over the current clients
- for socket in self.sockets.copy().values():
- if not socket.closing and not socket.closed:
- await socket.check_ping_timeout()
- await self.sleep(sleep_interval)
- except (SystemExit, KeyboardInterrupt, asyncio.CancelledError):
- self.logger.info('service task canceled')
- break
- except:
- if asyncio.get_event_loop().is_closed():
- self.logger.info('event loop is closed, exiting service '
- 'task')
- break
-
- # an unexpected exception has occurred, log it and continue
- self.logger.exception('service task exception')
diff --git a/client/ayon_core/vendor/python/python_2/engineio/asyncio_socket.py b/client/ayon_core/vendor/python/python_2/engineio/asyncio_socket.py
deleted file mode 100644
index c4afcfe309..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/asyncio_socket.py
+++ /dev/null
@@ -1,235 +0,0 @@
-import asyncio
-import six
-import sys
-import time
-
-from . import exceptions
-from . import packet
-from . import payload
-from . import socket
-
-
-class AsyncSocket(socket.Socket):
- async def poll(self):
- """Wait for packets to send to the client."""
- try:
- packets = [await asyncio.wait_for(self.queue.get(),
- self.server.ping_timeout)]
- self.queue.task_done()
- except (asyncio.TimeoutError, asyncio.CancelledError):
- raise exceptions.QueueEmpty()
- if packets == [None]:
- return []
- try:
- packets.append(self.queue.get_nowait())
- self.queue.task_done()
- except asyncio.QueueEmpty:
- pass
- return packets
-
- async def receive(self, pkt):
- """Receive packet from the client."""
- self.server.logger.info('%s: Received packet %s data %s',
- self.sid, packet.packet_names[pkt.packet_type],
- pkt.data if not isinstance(pkt.data, bytes)
- else '')
- if pkt.packet_type == packet.PING:
- self.last_ping = time.time()
- await self.send(packet.Packet(packet.PONG, pkt.data))
- elif pkt.packet_type == packet.MESSAGE:
- await self.server._trigger_event(
- 'message', self.sid, pkt.data,
- run_async=self.server.async_handlers)
- elif pkt.packet_type == packet.UPGRADE:
- await self.send(packet.Packet(packet.NOOP))
- elif pkt.packet_type == packet.CLOSE:
- await self.close(wait=False, abort=True)
- else:
- raise exceptions.UnknownPacketError()
-
- async def check_ping_timeout(self):
- """Make sure the client is still sending pings.
-
- This helps detect disconnections for long-polling clients.
- """
- if self.closed:
- raise exceptions.SocketIsClosedError()
- if time.time() - self.last_ping > self.server.ping_interval + 5:
- self.server.logger.info('%s: Client is gone, closing socket',
- self.sid)
- # Passing abort=False here will cause close() to write a
- # CLOSE packet. This has the effect of updating half-open sockets
- # to their correct state of disconnected
- await self.close(wait=False, abort=False)
- return False
- return True
-
- async def send(self, pkt):
- """Send a packet to the client."""
- if not await self.check_ping_timeout():
- return
- if self.upgrading:
- self.packet_backlog.append(pkt)
- else:
- await self.queue.put(pkt)
- self.server.logger.info('%s: Sending packet %s data %s',
- self.sid, packet.packet_names[pkt.packet_type],
- pkt.data if not isinstance(pkt.data, bytes)
- else '')
-
- async def handle_get_request(self, environ):
- """Handle a long-polling GET request from the client."""
- connections = [
- s.strip()
- for s in environ.get('HTTP_CONNECTION', '').lower().split(',')]
- transport = environ.get('HTTP_UPGRADE', '').lower()
- if 'upgrade' in connections and transport in self.upgrade_protocols:
- self.server.logger.info('%s: Received request to upgrade to %s',
- self.sid, transport)
- return await getattr(self, '_upgrade_' + transport)(environ)
- try:
- packets = await self.poll()
- except exceptions.QueueEmpty:
- exc = sys.exc_info()
- await self.close(wait=False)
- six.reraise(*exc)
- return packets
-
- async def handle_post_request(self, environ):
- """Handle a long-polling POST request from the client."""
- length = int(environ.get('CONTENT_LENGTH', '0'))
- if length > self.server.max_http_buffer_size:
- raise exceptions.ContentTooLongError()
- else:
- body = await environ['wsgi.input'].read(length)
- p = payload.Payload(encoded_payload=body)
- for pkt in p.packets:
- await self.receive(pkt)
-
- async def close(self, wait=True, abort=False):
- """Close the socket connection."""
- if not self.closed and not self.closing:
- self.closing = True
- await self.server._trigger_event('disconnect', self.sid)
- if not abort:
- await self.send(packet.Packet(packet.CLOSE))
- self.closed = True
- if wait:
- await self.queue.join()
-
- async def _upgrade_websocket(self, environ):
- """Upgrade the connection from polling to websocket."""
- if self.upgraded:
- raise IOError('Socket has been upgraded already')
- if self.server._async['websocket'] is None:
- # the selected async mode does not support websocket
- return self.server._bad_request()
- ws = self.server._async['websocket'](self._websocket_handler)
- return await ws(environ)
-
- async def _websocket_handler(self, ws):
- """Engine.IO handler for websocket transport."""
- if self.connected:
- # the socket was already connected, so this is an upgrade
- self.upgrading = True # hold packet sends during the upgrade
-
- try:
- pkt = await ws.wait()
- except IOError: # pragma: no cover
- return
- decoded_pkt = packet.Packet(encoded_packet=pkt)
- if decoded_pkt.packet_type != packet.PING or \
- decoded_pkt.data != 'probe':
- self.server.logger.info(
- '%s: Failed websocket upgrade, no PING packet', self.sid)
- return
- await ws.send(packet.Packet(
- packet.PONG,
- data=six.text_type('probe')).encode(always_bytes=False))
- await self.queue.put(packet.Packet(packet.NOOP)) # end poll
-
- try:
- pkt = await ws.wait()
- except IOError: # pragma: no cover
- return
- decoded_pkt = packet.Packet(encoded_packet=pkt)
- if decoded_pkt.packet_type != packet.UPGRADE:
- self.upgraded = False
- self.server.logger.info(
- ('%s: Failed websocket upgrade, expected UPGRADE packet, '
- 'received %s instead.'),
- self.sid, pkt)
- return
- self.upgraded = True
-
- # flush any packets that were sent during the upgrade
- for pkt in self.packet_backlog:
- await self.queue.put(pkt)
- self.packet_backlog = []
- self.upgrading = False
- else:
- self.connected = True
- self.upgraded = True
-
- # start separate writer thread
- async def writer():
- while True:
- packets = None
- try:
- packets = await self.poll()
- except exceptions.QueueEmpty:
- break
- if not packets:
- # empty packet list returned -> connection closed
- break
- try:
- for pkt in packets:
- await ws.send(pkt.encode(always_bytes=False))
- except:
- break
- writer_task = asyncio.ensure_future(writer())
-
- self.server.logger.info(
- '%s: Upgrade to websocket successful', self.sid)
-
- while True:
- p = None
- wait_task = asyncio.ensure_future(ws.wait())
- try:
- p = await asyncio.wait_for(wait_task, self.server.ping_timeout)
- except asyncio.CancelledError: # pragma: no cover
- # there is a bug (https://bugs.python.org/issue30508) in
- # asyncio that causes a "Task exception never retrieved" error
- # to appear when wait_task raises an exception before it gets
- # cancelled. Calling wait_task.exception() prevents the error
- # from being issued in Python 3.6, but causes other errors in
- # other versions, so we run it with all errors suppressed and
- # hope for the best.
- try:
- wait_task.exception()
- except:
- pass
- break
- except:
- break
- if p is None:
- # connection closed by client
- break
- if isinstance(p, six.text_type): # pragma: no cover
- p = p.encode('utf-8')
- pkt = packet.Packet(encoded_packet=p)
- try:
- await self.receive(pkt)
- except exceptions.UnknownPacketError: # pragma: no cover
- pass
- except exceptions.SocketIsClosedError: # pragma: no cover
- self.server.logger.info('Receive error -- socket is closed')
- break
- except: # pragma: no cover
- # if we get an unexpected exception we log the error and exit
- # the connection properly
- self.server.logger.exception('Unknown receive error')
-
- await self.queue.put(None) # unlock the writer task so it can exit
- await asyncio.wait_for(writer_task, timeout=None)
- await self.close(wait=False, abort=True)
diff --git a/client/ayon_core/vendor/python/python_2/engineio/client.py b/client/ayon_core/vendor/python/python_2/engineio/client.py
deleted file mode 100644
index 16dcc94e63..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/client.py
+++ /dev/null
@@ -1,641 +0,0 @@
-import logging
-try:
- import queue
-except ImportError: # pragma: no cover
- import Queue as queue
-import signal
-import threading
-import time
-
-import six
-from six.moves import urllib
-try:
- import requests
-except ImportError: # pragma: no cover
- requests = None
-try:
- import websocket
-except ImportError: # pragma: no cover
- websocket = None
-from . import exceptions
-from . import packet
-from . import payload
-
-default_logger = logging.getLogger('engineio.client')
-connected_clients = []
-
-if six.PY2: # pragma: no cover
- ConnectionError = OSError
-
-
-def signal_handler(sig, frame):
- """SIGINT handler.
-
- Disconnect all active clients and then invoke the original signal handler.
- """
- for client in connected_clients[:]:
- if client.is_asyncio_based():
- client.start_background_task(client.disconnect, abort=True)
- else:
- client.disconnect(abort=True)
- return original_signal_handler(sig, frame)
-
-
-original_signal_handler = signal.signal(signal.SIGINT, signal_handler)
-
-
-class Client(object):
- """An Engine.IO client.
-
- This class implements a fully compliant Engine.IO web client with support
- for websocket and long-polling transports.
-
- :param logger: To enable logging set to ``True`` or pass a logger object to
- use. To disable logging set to ``False``. The default is
- ``False``.
- :param json: An alternative json module to use for encoding and decoding
- packets. Custom json modules must have ``dumps`` and ``loads``
- functions that are compatible with the standard library
- versions.
- """
- event_names = ['connect', 'disconnect', 'message']
-
- def __init__(self, logger=False, json=None):
- self.handlers = {}
- self.base_url = None
- self.transports = None
- self.current_transport = None
- self.sid = None
- self.upgrades = None
- self.ping_interval = None
- self.ping_timeout = None
- self.pong_received = True
- self.http = None
- self.ws = None
- self.read_loop_task = None
- self.write_loop_task = None
- self.ping_loop_task = None
- self.ping_loop_event = self.create_event()
- self.queue = None
- self.state = 'disconnected'
-
- if json is not None:
- packet.Packet.json = json
- if not isinstance(logger, bool):
- self.logger = logger
- else:
- self.logger = default_logger
- if not logging.root.handlers and \
- self.logger.level == logging.NOTSET:
- if logger:
- self.logger.setLevel(logging.INFO)
- else:
- self.logger.setLevel(logging.ERROR)
- self.logger.addHandler(logging.StreamHandler())
-
- def is_asyncio_based(self):
- return False
-
- def on(self, event, handler=None):
- """Register an event handler.
-
- :param event: The event name. Can be ``'connect'``, ``'message'`` or
- ``'disconnect'``.
- :param handler: The function that should be invoked to handle the
- event. When this parameter is not given, the method
- acts as a decorator for the handler function.
-
- Example usage::
-
- # as a decorator:
- @eio.on('connect')
- def connect_handler():
- print('Connection request')
-
- # as a method:
- def message_handler(msg):
- print('Received message: ', msg)
- eio.send('response')
- eio.on('message', message_handler)
- """
- if event not in self.event_names:
- raise ValueError('Invalid event')
-
- def set_handler(handler):
- self.handlers[event] = handler
- return handler
-
- if handler is None:
- return set_handler
- set_handler(handler)
-
- def connect(self, url, headers={}, transports=None,
- engineio_path='engine.io'):
- """Connect to an Engine.IO server.
-
- :param url: The URL of the Engine.IO server. It can include custom
- query string parameters if required by the server.
- :param headers: A dictionary with custom headers to send with the
- connection request.
- :param transports: The list of allowed transports. Valid transports
- are ``'polling'`` and ``'websocket'``. If not
- given, the polling transport is connected first,
- then an upgrade to websocket is attempted.
- :param engineio_path: The endpoint where the Engine.IO server is
- installed. The default value is appropriate for
- most cases.
-
- Example usage::
-
- eio = engineio.Client()
- eio.connect('http://localhost:5000')
- """
- if self.state != 'disconnected':
- raise ValueError('Client is not in a disconnected state')
- valid_transports = ['polling', 'websocket']
- if transports is not None:
- if isinstance(transports, six.string_types):
- transports = [transports]
- transports = [transport for transport in transports
- if transport in valid_transports]
- if not transports:
- raise ValueError('No valid transports provided')
- self.transports = transports or valid_transports
- self.queue = self.create_queue()
- return getattr(self, '_connect_' + self.transports[0])(
- url, headers, engineio_path)
-
- def wait(self):
- """Wait until the connection with the server ends.
-
- Client applications can use this function to block the main thread
- during the life of the connection.
- """
- if self.read_loop_task:
- self.read_loop_task.join()
-
- def send(self, data, binary=None):
- """Send a message to a client.
-
- :param data: The data to send to the client. Data can be of type
- ``str``, ``bytes``, ``list`` or ``dict``. If a ``list``
- or ``dict``, the data will be serialized as JSON.
- :param binary: ``True`` to send packet as binary, ``False`` to send
- as text. If not given, unicode (Python 2) and str
- (Python 3) are sent as text, and str (Python 2) and
- bytes (Python 3) are sent as binary.
- """
- self._send_packet(packet.Packet(packet.MESSAGE, data=data,
- binary=binary))
-
- def disconnect(self, abort=False):
- """Disconnect from the server.
-
- :param abort: If set to ``True``, do not wait for background tasks
- associated with the connection to end.
- """
- if self.state == 'connected':
- self._send_packet(packet.Packet(packet.CLOSE))
- self.queue.put(None)
- self.state = 'disconnecting'
- self._trigger_event('disconnect', run_async=False)
- if self.current_transport == 'websocket':
- self.ws.close()
- if not abort:
- self.read_loop_task.join()
- self.state = 'disconnected'
- try:
- connected_clients.remove(self)
- except ValueError: # pragma: no cover
- pass
- self._reset()
-
- def transport(self):
- """Return the name of the transport currently in use.
-
- The possible values returned by this function are ``'polling'`` and
- ``'websocket'``.
- """
- return self.current_transport
-
- def start_background_task(self, target, *args, **kwargs):
- """Start a background task.
-
- This is a utility function that applications can use to start a
- background task.
-
- :param target: the target function to execute.
- :param args: arguments to pass to the function.
- :param kwargs: keyword arguments to pass to the function.
-
- This function returns an object compatible with the `Thread` class in
- the Python standard library. The `start()` method on this object is
- already called by this function.
- """
- th = threading.Thread(target=target, args=args, kwargs=kwargs)
- th.start()
- return th
-
- def sleep(self, seconds=0):
- """Sleep for the requested amount of time."""
- return time.sleep(seconds)
-
- def create_queue(self, *args, **kwargs):
- """Create a queue object."""
- q = queue.Queue(*args, **kwargs)
- q.Empty = queue.Empty
- return q
-
- def create_event(self, *args, **kwargs):
- """Create an event object."""
- return threading.Event(*args, **kwargs)
-
- def _reset(self):
- self.state = 'disconnected'
- self.sid = None
-
- def _connect_polling(self, url, headers, engineio_path):
- """Establish a long-polling connection to the Engine.IO server."""
- if requests is None: # pragma: no cover
- # not installed
- self.logger.error('requests package is not installed -- cannot '
- 'send HTTP requests!')
- return
- self.base_url = self._get_engineio_url(url, engineio_path, 'polling')
- self.logger.info('Attempting polling connection to ' + self.base_url)
- r = self._send_request(
- 'GET', self.base_url + self._get_url_timestamp(), headers=headers)
- if r is None:
- self._reset()
- raise exceptions.ConnectionError(
- 'Connection refused by the server')
- if r.status_code != 200:
- raise exceptions.ConnectionError(
- 'Unexpected status code {} in server response'.format(
- r.status_code))
- try:
- p = payload.Payload(encoded_payload=r.content)
- except ValueError:
- six.raise_from(exceptions.ConnectionError(
- 'Unexpected response from server'), None)
- open_packet = p.packets[0]
- if open_packet.packet_type != packet.OPEN:
- raise exceptions.ConnectionError(
- 'OPEN packet not returned by server')
- self.logger.info(
- 'Polling connection accepted with ' + str(open_packet.data))
- self.sid = open_packet.data['sid']
- self.upgrades = open_packet.data['upgrades']
- self.ping_interval = open_packet.data['pingInterval'] / 1000.0
- self.ping_timeout = open_packet.data['pingTimeout'] / 1000.0
- self.current_transport = 'polling'
- self.base_url += '&sid=' + self.sid
-
- self.state = 'connected'
- connected_clients.append(self)
- self._trigger_event('connect', run_async=False)
-
- for pkt in p.packets[1:]:
- self._receive_packet(pkt)
-
- if 'websocket' in self.upgrades and 'websocket' in self.transports:
- # attempt to upgrade to websocket
- if self._connect_websocket(url, headers, engineio_path):
- # upgrade to websocket succeeded, we're done here
- return
-
- # start background tasks associated with this client
- self.ping_loop_task = self.start_background_task(self._ping_loop)
- self.write_loop_task = self.start_background_task(self._write_loop)
- self.read_loop_task = self.start_background_task(
- self._read_loop_polling)
-
- def _connect_websocket(self, url, headers, engineio_path):
- """Establish or upgrade to a WebSocket connection with the server."""
- if websocket is None: # pragma: no cover
- # not installed
- self.logger.warning('websocket-client package not installed, only '
- 'polling transport is available')
- return False
- websocket_url = self._get_engineio_url(url, engineio_path, 'websocket')
- if self.sid:
- self.logger.info(
- 'Attempting WebSocket upgrade to ' + websocket_url)
- upgrade = True
- websocket_url += '&sid=' + self.sid
- else:
- upgrade = False
- self.base_url = websocket_url
- self.logger.info(
- 'Attempting WebSocket connection to ' + websocket_url)
-
- # get the cookies from the long-polling connection so that they can
- # also be sent the the WebSocket route
- cookies = None
- if self.http:
- cookies = '; '.join(["{}={}".format(cookie.name, cookie.value)
- for cookie in self.http.cookies])
- try:
- ws = websocket.create_connection(
- websocket_url + self._get_url_timestamp(), header=headers,
- cookie=cookies)
- except ConnectionError:
- if upgrade:
- self.logger.warning(
- 'WebSocket upgrade failed: connection error')
- return False
- else:
- raise exceptions.ConnectionError('Connection error')
- if upgrade:
- p = packet.Packet(packet.PING,
- data=six.text_type('probe')).encode()
- try:
- ws.send(p)
- except Exception as e: # pragma: no cover
- self.logger.warning(
- 'WebSocket upgrade failed: unexpected send exception: %s',
- str(e))
- return False
- try:
- p = ws.recv()
- except Exception as e: # pragma: no cover
- self.logger.warning(
- 'WebSocket upgrade failed: unexpected recv exception: %s',
- str(e))
- return False
- pkt = packet.Packet(encoded_packet=p)
- if pkt.packet_type != packet.PONG or pkt.data != 'probe':
- self.logger.warning(
- 'WebSocket upgrade failed: no PONG packet')
- return False
- p = packet.Packet(packet.UPGRADE).encode()
- try:
- ws.send(p)
- except Exception as e: # pragma: no cover
- self.logger.warning(
- 'WebSocket upgrade failed: unexpected send exception: %s',
- str(e))
- return False
- self.current_transport = 'websocket'
- self.logger.info('WebSocket upgrade was successful')
- else:
- try:
- p = ws.recv()
- except Exception as e: # pragma: no cover
- raise exceptions.ConnectionError(
- 'Unexpected recv exception: ' + str(e))
- open_packet = packet.Packet(encoded_packet=p)
- if open_packet.packet_type != packet.OPEN:
- raise exceptions.ConnectionError('no OPEN packet')
- self.logger.info(
- 'WebSocket connection accepted with ' + str(open_packet.data))
- self.sid = open_packet.data['sid']
- self.upgrades = open_packet.data['upgrades']
- self.ping_interval = open_packet.data['pingInterval'] / 1000.0
- self.ping_timeout = open_packet.data['pingTimeout'] / 1000.0
- self.current_transport = 'websocket'
-
- self.state = 'connected'
- connected_clients.append(self)
- self._trigger_event('connect', run_async=False)
- self.ws = ws
-
- # start background tasks associated with this client
- self.ping_loop_task = self.start_background_task(self._ping_loop)
- self.write_loop_task = self.start_background_task(self._write_loop)
- self.read_loop_task = self.start_background_task(
- self._read_loop_websocket)
- return True
-
- def _receive_packet(self, pkt):
- """Handle incoming packets from the server."""
- packet_name = packet.packet_names[pkt.packet_type] \
- if pkt.packet_type < len(packet.packet_names) else 'UNKNOWN'
- self.logger.info(
- 'Received packet %s data %s', packet_name,
- pkt.data if not isinstance(pkt.data, bytes) else '')
- if pkt.packet_type == packet.MESSAGE:
- self._trigger_event('message', pkt.data, run_async=True)
- elif pkt.packet_type == packet.PONG:
- self.pong_received = True
- elif pkt.packet_type == packet.CLOSE:
- self.disconnect(abort=True)
- elif pkt.packet_type == packet.NOOP:
- pass
- else:
- self.logger.error('Received unexpected packet of type %s',
- pkt.packet_type)
-
- def _send_packet(self, pkt):
- """Queue a packet to be sent to the server."""
- if self.state != 'connected':
- return
- self.queue.put(pkt)
- self.logger.info(
- 'Sending packet %s data %s',
- packet.packet_names[pkt.packet_type],
- pkt.data if not isinstance(pkt.data, bytes) else '')
-
- def _send_request(
- self, method, url, headers=None, body=None): # pragma: no cover
- if self.http is None:
- self.http = requests.Session()
- try:
- return self.http.request(method, url, headers=headers, data=body)
- except requests.exceptions.RequestException:
- pass
-
- def _trigger_event(self, event, *args, **kwargs):
- """Invoke an event handler."""
- run_async = kwargs.pop('run_async', False)
- if event in self.handlers:
- if run_async:
- return self.start_background_task(self.handlers[event], *args)
- else:
- try:
- return self.handlers[event](*args)
- except:
- self.logger.exception(event + ' handler error')
-
- def _get_engineio_url(self, url, engineio_path, transport):
- """Generate the Engine.IO connection URL."""
- engineio_path = engineio_path.strip('/')
- parsed_url = urllib.parse.urlparse(url)
-
- if transport == 'polling':
- scheme = 'http'
- elif transport == 'websocket':
- scheme = 'ws'
- else: # pragma: no cover
- raise ValueError('invalid transport')
- if parsed_url.scheme in ['https', 'wss']:
- scheme += 's'
-
- return ('{scheme}://{netloc}/{path}/?{query}'
- '{sep}transport={transport}&EIO=3').format(
- scheme=scheme, netloc=parsed_url.netloc,
- path=engineio_path, query=parsed_url.query,
- sep='&' if parsed_url.query else '',
- transport=transport)
-
- def _get_url_timestamp(self):
- """Generate the Engine.IO query string timestamp."""
- return '&t=' + str(time.time())
-
- def _ping_loop(self):
- """This background task sends a PING to the server at the requested
- interval.
- """
- self.pong_received = True
- self.ping_loop_event.clear()
- while self.state == 'connected':
- if not self.pong_received:
- self.logger.info(
- 'PONG response has not been received, aborting')
- if self.ws:
- self.ws.close()
- self.queue.put(None)
- break
- self.pong_received = False
- self._send_packet(packet.Packet(packet.PING))
- self.ping_loop_event.wait(timeout=self.ping_interval)
- self.logger.info('Exiting ping task')
-
- def _read_loop_polling(self):
- """Read packets by polling the Engine.IO server."""
- while self.state == 'connected':
- self.logger.info(
- 'Sending polling GET request to ' + self.base_url)
- r = self._send_request(
- 'GET', self.base_url + self._get_url_timestamp())
- if r is None:
- self.logger.warning(
- 'Connection refused by the server, aborting')
- self.queue.put(None)
- break
- if r.status_code != 200:
- self.logger.warning('Unexpected status code %s in server '
- 'response, aborting', r.status_code)
- self.queue.put(None)
- break
- try:
- p = payload.Payload(encoded_payload=r.content)
- except ValueError:
- self.logger.warning(
- 'Unexpected packet from server, aborting')
- self.queue.put(None)
- break
- for pkt in p.packets:
- self._receive_packet(pkt)
-
- self.logger.info('Waiting for write loop task to end')
- self.write_loop_task.join()
- self.logger.info('Waiting for ping loop task to end')
- self.ping_loop_event.set()
- self.ping_loop_task.join()
- if self.state == 'connected':
- self._trigger_event('disconnect', run_async=False)
- try:
- connected_clients.remove(self)
- except ValueError: # pragma: no cover
- pass
- self._reset()
- self.logger.info('Exiting read loop task')
-
- def _read_loop_websocket(self):
- """Read packets from the Engine.IO WebSocket connection."""
- while self.state == 'connected':
- p = None
- try:
- p = self.ws.recv()
- except websocket.WebSocketConnectionClosedException:
- self.logger.warning(
- 'WebSocket connection was closed, aborting')
- self.queue.put(None)
- break
- except Exception as e:
- self.logger.info(
- 'Unexpected error "%s", aborting', str(e))
- self.queue.put(None)
- break
- if isinstance(p, six.text_type): # pragma: no cover
- p = p.encode('utf-8')
- pkt = packet.Packet(encoded_packet=p)
- self._receive_packet(pkt)
-
- self.logger.info('Waiting for write loop task to end')
- self.write_loop_task.join()
- self.logger.info('Waiting for ping loop task to end')
- self.ping_loop_event.set()
- self.ping_loop_task.join()
- if self.state == 'connected':
- self._trigger_event('disconnect', run_async=False)
- try:
- connected_clients.remove(self)
- except ValueError: # pragma: no cover
- pass
- self._reset()
- self.logger.info('Exiting read loop task')
-
- def _write_loop(self):
- """This background task sends packages to the server as they are
- pushed to the send queue.
- """
- while self.state == 'connected':
- # to simplify the timeout handling, use the maximum of the
- # ping interval and ping timeout as timeout, with an extra 5
- # seconds grace period
- timeout = max(self.ping_interval, self.ping_timeout) + 5
- packets = None
- try:
- packets = [self.queue.get(timeout=timeout)]
- except self.queue.Empty:
- self.logger.error('packet queue is empty, aborting')
- break
- if packets == [None]:
- self.queue.task_done()
- packets = []
- else:
- while True:
- try:
- packets.append(self.queue.get(block=False))
- except self.queue.Empty:
- break
- if packets[-1] is None:
- packets = packets[:-1]
- self.queue.task_done()
- break
- if not packets:
- # empty packet list returned -> connection closed
- break
- if self.current_transport == 'polling':
- p = payload.Payload(packets=packets)
- r = self._send_request(
- 'POST', self.base_url, body=p.encode(),
- headers={'Content-Type': 'application/octet-stream'})
- for pkt in packets:
- self.queue.task_done()
- if r is None:
- self.logger.warning(
- 'Connection refused by the server, aborting')
- break
- if r.status_code != 200:
- self.logger.warning('Unexpected status code %s in server '
- 'response, aborting', r.status_code)
- self._reset()
- break
- else:
- # websocket
- try:
- for pkt in packets:
- encoded_packet = pkt.encode(always_bytes=False)
- if pkt.binary:
- self.ws.send_binary(encoded_packet)
- else:
- self.ws.send(encoded_packet)
- self.queue.task_done()
- except websocket.WebSocketConnectionClosedException:
- self.logger.warning(
- 'WebSocket connection was closed, aborting')
- break
- self.logger.info('Exiting write loop task')
diff --git a/client/ayon_core/vendor/python/python_2/engineio/exceptions.py b/client/ayon_core/vendor/python/python_2/engineio/exceptions.py
deleted file mode 100644
index fb0b3e057c..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/exceptions.py
+++ /dev/null
@@ -1,22 +0,0 @@
-class EngineIOError(Exception):
- pass
-
-
-class ContentTooLongError(EngineIOError):
- pass
-
-
-class UnknownPacketError(EngineIOError):
- pass
-
-
-class QueueEmpty(EngineIOError):
- pass
-
-
-class SocketIsClosedError(EngineIOError):
- pass
-
-
-class ConnectionError(EngineIOError):
- pass
diff --git a/client/ayon_core/vendor/python/python_2/engineio/middleware.py b/client/ayon_core/vendor/python/python_2/engineio/middleware.py
deleted file mode 100644
index d0bdcc7476..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/middleware.py
+++ /dev/null
@@ -1,87 +0,0 @@
-import os
-from engineio.static_files import get_static_file
-
-
-class WSGIApp(object):
- """WSGI application middleware for Engine.IO.
-
- This middleware dispatches traffic to an Engine.IO application. It can
- also serve a list of static files to the client, or forward unrelated
- HTTP traffic to another WSGI application.
-
- :param engineio_app: The Engine.IO server. Must be an instance of the
- ``engineio.Server`` class.
- :param wsgi_app: The WSGI app that receives all other traffic.
- :param static_files: A dictionary with static file mapping rules. See the
- documentation for details on this argument.
- :param engineio_path: The endpoint where the Engine.IO application should
- be installed. The default value is appropriate for
- most cases.
-
- Example usage::
-
- import engineio
- import eventlet
-
- eio = engineio.Server()
- app = engineio.WSGIApp(eio, static_files={
- '/': {'content_type': 'text/html', 'filename': 'index.html'},
- '/index.html': {'content_type': 'text/html',
- 'filename': 'index.html'},
- })
- eventlet.wsgi.server(eventlet.listen(('', 8000)), app)
- """
- def __init__(self, engineio_app, wsgi_app=None, static_files=None,
- engineio_path='engine.io'):
- self.engineio_app = engineio_app
- self.wsgi_app = wsgi_app
- self.engineio_path = engineio_path.strip('/')
- self.static_files = static_files or {}
-
- def __call__(self, environ, start_response):
- if 'gunicorn.socket' in environ:
- # gunicorn saves the socket under environ['gunicorn.socket'], while
- # eventlet saves it under environ['eventlet.input']. Eventlet also
- # stores the socket inside a wrapper class, while gunicon writes it
- # directly into the environment. To give eventlet's WebSocket
- # module access to this socket when running under gunicorn, here we
- # copy the socket to the eventlet format.
- class Input(object):
- def __init__(self, socket):
- self.socket = socket
-
- def get_socket(self):
- return self.socket
-
- environ['eventlet.input'] = Input(environ['gunicorn.socket'])
- path = environ['PATH_INFO']
- if path is not None and \
- path.startswith('/{0}/'.format(self.engineio_path)):
- return self.engineio_app.handle_request(environ, start_response)
- else:
- static_file = get_static_file(path, self.static_files) \
- if self.static_files else None
- if static_file:
- if os.path.exists(static_file['filename']):
- start_response(
- '200 OK',
- [('Content-Type', static_file['content_type'])])
- with open(static_file['filename'], 'rb') as f:
- return [f.read()]
- else:
- return self.not_found(start_response)
- elif self.wsgi_app is not None:
- return self.wsgi_app(environ, start_response)
- return self.not_found(start_response)
-
- def not_found(self, start_response):
- start_response("404 Not Found", [('Content-Type', 'text/plain')])
- return [b'Not Found']
-
-
-class Middleware(WSGIApp):
- """This class has been renamed to ``WSGIApp`` and is now deprecated."""
- def __init__(self, engineio_app, wsgi_app=None,
- engineio_path='engine.io'):
- super(Middleware, self).__init__(engineio_app, wsgi_app,
- engineio_path=engineio_path)
diff --git a/client/ayon_core/vendor/python/python_2/engineio/packet.py b/client/ayon_core/vendor/python/python_2/engineio/packet.py
deleted file mode 100644
index a3aa6d4761..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/packet.py
+++ /dev/null
@@ -1,92 +0,0 @@
-import base64
-import json as _json
-
-import six
-
-(OPEN, CLOSE, PING, PONG, MESSAGE, UPGRADE, NOOP) = (0, 1, 2, 3, 4, 5, 6)
-packet_names = ['OPEN', 'CLOSE', 'PING', 'PONG', 'MESSAGE', 'UPGRADE', 'NOOP']
-
-binary_types = (six.binary_type, bytearray)
-
-
-class Packet(object):
- """Engine.IO packet."""
-
- json = _json
-
- def __init__(self, packet_type=NOOP, data=None, binary=None,
- encoded_packet=None):
- self.packet_type = packet_type
- self.data = data
- if binary is not None:
- self.binary = binary
- elif isinstance(data, six.text_type):
- self.binary = False
- elif isinstance(data, binary_types):
- self.binary = True
- else:
- self.binary = False
- if encoded_packet:
- self.decode(encoded_packet)
-
- def encode(self, b64=False, always_bytes=True):
- """Encode the packet for transmission."""
- if self.binary and not b64:
- encoded_packet = six.int2byte(self.packet_type)
- else:
- encoded_packet = six.text_type(self.packet_type)
- if self.binary and b64:
- encoded_packet = 'b' + encoded_packet
- if self.binary:
- if b64:
- encoded_packet += base64.b64encode(self.data).decode('utf-8')
- else:
- encoded_packet += self.data
- elif isinstance(self.data, six.string_types):
- encoded_packet += self.data
- elif isinstance(self.data, dict) or isinstance(self.data, list):
- encoded_packet += self.json.dumps(self.data,
- separators=(',', ':'))
- elif self.data is not None:
- encoded_packet += str(self.data)
- if always_bytes and not isinstance(encoded_packet, binary_types):
- encoded_packet = encoded_packet.encode('utf-8')
- return encoded_packet
-
- def decode(self, encoded_packet):
- """Decode a transmitted package."""
- b64 = False
- if not isinstance(encoded_packet, binary_types):
- encoded_packet = encoded_packet.encode('utf-8')
- elif not isinstance(encoded_packet, bytes):
- encoded_packet = bytes(encoded_packet)
- self.packet_type = six.byte2int(encoded_packet[0:1])
- if self.packet_type == 98: # 'b' --> binary base64 encoded packet
- self.binary = True
- encoded_packet = encoded_packet[1:]
- self.packet_type = six.byte2int(encoded_packet[0:1])
- self.packet_type -= 48
- b64 = True
- elif self.packet_type >= 48:
- self.packet_type -= 48
- self.binary = False
- else:
- self.binary = True
- self.data = None
- if len(encoded_packet) > 1:
- if self.binary:
- if b64:
- self.data = base64.b64decode(encoded_packet[1:])
- else:
- self.data = encoded_packet[1:]
- else:
- try:
- self.data = self.json.loads(
- encoded_packet[1:].decode('utf-8'))
- if isinstance(self.data, int):
- # do not allow integer payloads, see
- # github.com/miguelgrinberg/python-engineio/issues/75
- # for background on this decision
- raise ValueError
- except ValueError:
- self.data = encoded_packet[1:].decode('utf-8')
diff --git a/client/ayon_core/vendor/python/python_2/engineio/payload.py b/client/ayon_core/vendor/python/python_2/engineio/payload.py
deleted file mode 100644
index cfff557f5b..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/payload.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import six
-
-from . import packet
-
-from six.moves import urllib
-
-
-class Payload(object):
- """Engine.IO payload."""
- def __init__(self, packets=None, encoded_payload=None):
- self.packets = packets or []
- if encoded_payload is not None:
- self.decode(encoded_payload)
-
- def encode(self, b64=False, jsonp_index=None):
- """Encode the payload for transmission."""
- encoded_payload = b''
- for pkt in self.packets:
- encoded_packet = pkt.encode(b64=b64)
- packet_len = len(encoded_packet)
- if b64:
- encoded_payload += str(packet_len).encode('utf-8') + b':' + \
- encoded_packet
- else:
- binary_len = b''
- while packet_len != 0:
- binary_len = six.int2byte(packet_len % 10) + binary_len
- packet_len = int(packet_len / 10)
- if not pkt.binary:
- encoded_payload += b'\0'
- else:
- encoded_payload += b'\1'
- encoded_payload += binary_len + b'\xff' + encoded_packet
- if jsonp_index is not None:
- encoded_payload = b'___eio[' + \
- str(jsonp_index).encode() + \
- b']("' + \
- encoded_payload.replace(b'"', b'\\"') + \
- b'");'
- return encoded_payload
-
- def decode(self, encoded_payload):
- """Decode a transmitted payload."""
- self.packets = []
- while encoded_payload:
- # JSONP POST payload starts with 'd='
- if encoded_payload.startswith(b'd='):
- encoded_payload = urllib.parse.parse_qs(
- encoded_payload)[b'd'][0]
-
- if six.byte2int(encoded_payload[0:1]) <= 1:
- packet_len = 0
- i = 1
- while six.byte2int(encoded_payload[i:i + 1]) != 255:
- packet_len = packet_len * 10 + six.byte2int(
- encoded_payload[i:i + 1])
- i += 1
- self.packets.append(packet.Packet(
- encoded_packet=encoded_payload[i + 1:i + 1 + packet_len]))
- else:
- i = encoded_payload.find(b':')
- if i == -1:
- raise ValueError('invalid payload')
-
- # extracting the packet out of the payload is extremely
- # inefficient, because the payload needs to be treated as
- # binary, but the non-binary packets have to be parsed as
- # unicode. Luckily this complication only applies to long
- # polling, as the websocket transport sends packets
- # individually wrapped.
- packet_len = int(encoded_payload[0:i])
- pkt = encoded_payload.decode('utf-8', errors='ignore')[
- i + 1: i + 1 + packet_len].encode('utf-8')
- self.packets.append(packet.Packet(encoded_packet=pkt))
-
- # the engine.io protocol sends the packet length in
- # utf-8 characters, but we need it in bytes to be able to
- # jump to the next packet in the payload
- packet_len = len(pkt)
- encoded_payload = encoded_payload[i + 1 + packet_len:]
diff --git a/client/ayon_core/vendor/python/python_2/engineio/server.py b/client/ayon_core/vendor/python/python_2/engineio/server.py
deleted file mode 100644
index a2ba7d16b4..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/server.py
+++ /dev/null
@@ -1,633 +0,0 @@
-import gzip
-import importlib
-import logging
-import uuid
-import zlib
-
-import six
-from six.moves import urllib
-
-from . import exceptions
-from . import packet
-from . import payload
-from . import socket
-
-default_logger = logging.getLogger('engineio.server')
-
-
-class Server(object):
- """An Engine.IO server.
-
- This class implements a fully compliant Engine.IO web server with support
- for websocket and long-polling transports.
-
- :param async_mode: The asynchronous model to use. See the Deployment
- section in the documentation for a description of the
- available options. Valid async modes are "threading",
- "eventlet", "gevent" and "gevent_uwsgi". If this
- argument is not given, "eventlet" is tried first, then
- "gevent_uwsgi", then "gevent", and finally "threading".
- The first async mode that has all its dependencies
- installed is the one that is chosen.
- :param ping_timeout: The time in seconds that the client waits for the
- server to respond before disconnecting. The default
- is 60 seconds.
- :param ping_interval: The interval in seconds at which the client pings
- the server. The default is 25 seconds.
- :param max_http_buffer_size: The maximum size of a message when using the
- polling transport. The default is 100,000,000
- bytes.
- :param allow_upgrades: Whether to allow transport upgrades or not. The
- default is ``True``.
- :param http_compression: Whether to compress packages when using the
- polling transport. The default is ``True``.
- :param compression_threshold: Only compress messages when their byte size
- is greater than this value. The default is
- 1024 bytes.
- :param cookie: Name of the HTTP cookie that contains the client session
- id. If set to ``None``, a cookie is not sent to the client.
- The default is ``'io'``.
- :param cors_allowed_origins: Origin or list of origins that are allowed to
- connect to this server. All origins are
- allowed by default, which is equivalent to
- setting this argument to ``'*'``.
- :param cors_credentials: Whether credentials (cookies, authentication) are
- allowed in requests to this server. The default
- is ``True``.
- :param logger: To enable logging set to ``True`` or pass a logger object to
- use. To disable logging set to ``False``. The default is
- ``False``.
- :param json: An alternative json module to use for encoding and decoding
- packets. Custom json modules must have ``dumps`` and ``loads``
- functions that are compatible with the standard library
- versions.
- :param async_handlers: If set to ``True``, run message event handlers in
- non-blocking threads. To run handlers synchronously,
- set to ``False``. The default is ``True``.
- :param monitor_clients: If set to ``True``, a background task will ensure
- inactive clients are closed. Set to ``False`` to
- disable the monitoring task (not recommended). The
- default is ``True``.
- :param kwargs: Reserved for future extensions, any additional parameters
- given as keyword arguments will be silently ignored.
- """
- compression_methods = ['gzip', 'deflate']
- event_names = ['connect', 'disconnect', 'message']
- _default_monitor_clients = True
-
- def __init__(self, async_mode=None, ping_timeout=60, ping_interval=25,
- max_http_buffer_size=100000000, allow_upgrades=True,
- http_compression=True, compression_threshold=1024,
- cookie='io', cors_allowed_origins=None,
- cors_credentials=True, logger=False, json=None,
- async_handlers=True, monitor_clients=None, **kwargs):
- self.ping_timeout = ping_timeout
- self.ping_interval = ping_interval
- self.max_http_buffer_size = max_http_buffer_size
- self.allow_upgrades = allow_upgrades
- self.http_compression = http_compression
- self.compression_threshold = compression_threshold
- self.cookie = cookie
- self.cors_allowed_origins = cors_allowed_origins
- self.cors_credentials = cors_credentials
- self.async_handlers = async_handlers
- self.sockets = {}
- self.handlers = {}
- self.start_service_task = monitor_clients \
- if monitor_clients is not None else self._default_monitor_clients
- if json is not None:
- packet.Packet.json = json
- if not isinstance(logger, bool):
- self.logger = logger
- else:
- self.logger = default_logger
- if not logging.root.handlers and \
- self.logger.level == logging.NOTSET:
- if logger:
- self.logger.setLevel(logging.INFO)
- else:
- self.logger.setLevel(logging.ERROR)
- self.logger.addHandler(logging.StreamHandler())
- modes = self.async_modes()
- if async_mode is not None:
- modes = [async_mode] if async_mode in modes else []
- self._async = None
- self.async_mode = None
- for mode in modes:
- try:
- self._async = importlib.import_module(
- 'engineio.async_drivers.' + mode)._async
- asyncio_based = self._async['asyncio'] \
- if 'asyncio' in self._async else False
- if asyncio_based != self.is_asyncio_based():
- continue # pragma: no cover
- self.async_mode = mode
- break
- except ImportError:
- pass
- if self.async_mode is None:
- raise ValueError('Invalid async_mode specified')
- if self.is_asyncio_based() and \
- ('asyncio' not in self._async or not
- self._async['asyncio']): # pragma: no cover
- raise ValueError('The selected async_mode is not asyncio '
- 'compatible')
- if not self.is_asyncio_based() and 'asyncio' in self._async and \
- self._async['asyncio']: # pragma: no cover
- raise ValueError('The selected async_mode requires asyncio and '
- 'must use the AsyncServer class')
- self.logger.info('Server initialized for %s.', self.async_mode)
-
- def is_asyncio_based(self):
- return False
-
- def async_modes(self):
- return ['eventlet', 'gevent_uwsgi', 'gevent', 'threading']
-
- def on(self, event, handler=None):
- """Register an event handler.
-
- :param event: The event name. Can be ``'connect'``, ``'message'`` or
- ``'disconnect'``.
- :param handler: The function that should be invoked to handle the
- event. When this parameter is not given, the method
- acts as a decorator for the handler function.
-
- Example usage::
-
- # as a decorator:
- @eio.on('connect')
- def connect_handler(sid, environ):
- print('Connection request')
- if environ['REMOTE_ADDR'] in blacklisted:
- return False # reject
-
- # as a method:
- def message_handler(sid, msg):
- print('Received message: ', msg)
- eio.send(sid, 'response')
- eio.on('message', message_handler)
-
- The handler function receives the ``sid`` (session ID) for the
- client as first argument. The ``'connect'`` event handler receives the
- WSGI environment as a second argument, and can return ``False`` to
- reject the connection. The ``'message'`` handler receives the message
- payload as a second argument. The ``'disconnect'`` handler does not
- take a second argument.
- """
- if event not in self.event_names:
- raise ValueError('Invalid event')
-
- def set_handler(handler):
- self.handlers[event] = handler
- return handler
-
- if handler is None:
- return set_handler
- set_handler(handler)
-
- def send(self, sid, data, binary=None):
- """Send a message to a client.
-
- :param sid: The session id of the recipient client.
- :param data: The data to send to the client. Data can be of type
- ``str``, ``bytes``, ``list`` or ``dict``. If a ``list``
- or ``dict``, the data will be serialized as JSON.
- :param binary: ``True`` to send packet as binary, ``False`` to send
- as text. If not given, unicode (Python 2) and str
- (Python 3) are sent as text, and str (Python 2) and
- bytes (Python 3) are sent as binary.
- """
- try:
- socket = self._get_socket(sid)
- except KeyError:
- # the socket is not available
- self.logger.warning('Cannot send to sid %s', sid)
- return
- socket.send(packet.Packet(packet.MESSAGE, data=data, binary=binary))
-
- def get_session(self, sid):
- """Return the user session for a client.
-
- :param sid: The session id of the client.
-
- The return value is a dictionary. Modifications made to this
- dictionary are not guaranteed to be preserved unless
- ``save_session()`` is called, or when the ``session`` context manager
- is used.
- """
- socket = self._get_socket(sid)
- return socket.session
-
- def save_session(self, sid, session):
- """Store the user session for a client.
-
- :param sid: The session id of the client.
- :param session: The session dictionary.
- """
- socket = self._get_socket(sid)
- socket.session = session
-
- def session(self, sid):
- """Return the user session for a client with context manager syntax.
-
- :param sid: The session id of the client.
-
- This is a context manager that returns the user session dictionary for
- the client. Any changes that are made to this dictionary inside the
- context manager block are saved back to the session. Example usage::
-
- @eio.on('connect')
- def on_connect(sid, environ):
- username = authenticate_user(environ)
- if not username:
- return False
- with eio.session(sid) as session:
- session['username'] = username
-
- @eio.on('message')
- def on_message(sid, msg):
- with eio.session(sid) as session:
- print('received message from ', session['username'])
- """
- class _session_context_manager(object):
- def __init__(self, server, sid):
- self.server = server
- self.sid = sid
- self.session = None
-
- def __enter__(self):
- self.session = self.server.get_session(sid)
- return self.session
-
- def __exit__(self, *args):
- self.server.save_session(sid, self.session)
-
- return _session_context_manager(self, sid)
-
- def disconnect(self, sid=None):
- """Disconnect a client.
-
- :param sid: The session id of the client to close. If this parameter
- is not given, then all clients are closed.
- """
- if sid is not None:
- try:
- socket = self._get_socket(sid)
- except KeyError: # pragma: no cover
- # the socket was already closed or gone
- pass
- else:
- socket.close()
- del self.sockets[sid]
- else:
- for client in six.itervalues(self.sockets):
- client.close()
- self.sockets = {}
-
- def transport(self, sid):
- """Return the name of the transport used by the client.
-
- The two possible values returned by this function are ``'polling'``
- and ``'websocket'``.
-
- :param sid: The session of the client.
- """
- return 'websocket' if self._get_socket(sid).upgraded else 'polling'
-
- def handle_request(self, environ, start_response):
- """Handle an HTTP request from the client.
-
- This is the entry point of the Engine.IO application, using the same
- interface as a WSGI application. For the typical usage, this function
- is invoked by the :class:`Middleware` instance, but it can be invoked
- directly when the middleware is not used.
-
- :param environ: The WSGI environment.
- :param start_response: The WSGI ``start_response`` function.
-
- This function returns the HTTP response body to deliver to the client
- as a byte sequence.
- """
- method = environ['REQUEST_METHOD']
- query = urllib.parse.parse_qs(environ.get('QUERY_STRING', ''))
-
- sid = query['sid'][0] if 'sid' in query else None
- b64 = False
- jsonp = False
- jsonp_index = None
-
- if 'b64' in query:
- if query['b64'][0] == "1" or query['b64'][0].lower() == "true":
- b64 = True
- if 'j' in query:
- jsonp = True
- try:
- jsonp_index = int(query['j'][0])
- except (ValueError, KeyError, IndexError):
- # Invalid JSONP index number
- pass
-
- if jsonp and jsonp_index is None:
- self.logger.warning('Invalid JSONP index number')
- r = self._bad_request()
- elif method == 'GET':
- if sid is None:
- transport = query.get('transport', ['polling'])[0]
- if transport != 'polling' and transport != 'websocket':
- self.logger.warning('Invalid transport %s', transport)
- r = self._bad_request()
- else:
- r = self._handle_connect(environ, start_response,
- transport, b64, jsonp_index)
- else:
- if sid not in self.sockets:
- self.logger.warning('Invalid session %s', sid)
- r = self._bad_request()
- else:
- socket = self._get_socket(sid)
- try:
- packets = socket.handle_get_request(
- environ, start_response)
- if isinstance(packets, list):
- r = self._ok(packets, b64=b64,
- jsonp_index=jsonp_index)
- else:
- r = packets
- except exceptions.EngineIOError:
- if sid in self.sockets: # pragma: no cover
- self.disconnect(sid)
- r = self._bad_request()
- if sid in self.sockets and self.sockets[sid].closed:
- del self.sockets[sid]
- elif method == 'POST':
- if sid is None or sid not in self.sockets:
- self.logger.warning('Invalid session %s', sid)
- r = self._bad_request()
- else:
- socket = self._get_socket(sid)
- try:
- socket.handle_post_request(environ)
- r = self._ok(jsonp_index=jsonp_index)
- except exceptions.EngineIOError:
- if sid in self.sockets: # pragma: no cover
- self.disconnect(sid)
- r = self._bad_request()
- except: # pragma: no cover
- # for any other unexpected errors, we log the error
- # and keep going
- self.logger.exception('post request handler error')
- r = self._ok(jsonp_index=jsonp_index)
- elif method == 'OPTIONS':
- r = self._ok()
- else:
- self.logger.warning('Method %s not supported', method)
- r = self._method_not_found()
-
- if not isinstance(r, dict):
- return r or []
- if self.http_compression and \
- len(r['response']) >= self.compression_threshold:
- encodings = [e.split(';')[0].strip() for e in
- environ.get('HTTP_ACCEPT_ENCODING', '').split(',')]
- for encoding in encodings:
- if encoding in self.compression_methods:
- r['response'] = \
- getattr(self, '_' + encoding)(r['response'])
- r['headers'] += [('Content-Encoding', encoding)]
- break
- cors_headers = self._cors_headers(environ)
- start_response(r['status'], r['headers'] + cors_headers)
- return [r['response']]
-
- def start_background_task(self, target, *args, **kwargs):
- """Start a background task using the appropriate async model.
-
- This is a utility function that applications can use to start a
- background task using the method that is compatible with the
- selected async mode.
-
- :param target: the target function to execute.
- :param args: arguments to pass to the function.
- :param kwargs: keyword arguments to pass to the function.
-
- This function returns an object compatible with the `Thread` class in
- the Python standard library. The `start()` method on this object is
- already called by this function.
- """
- th = self._async['thread'](target=target, args=args, kwargs=kwargs)
- th.start()
- return th # pragma: no cover
-
- def sleep(self, seconds=0):
- """Sleep for the requested amount of time using the appropriate async
- model.
-
- This is a utility function that applications can use to put a task to
- sleep without having to worry about using the correct call for the
- selected async mode.
- """
- return self._async['sleep'](seconds)
-
- def create_queue(self, *args, **kwargs):
- """Create a queue object using the appropriate async model.
-
- This is a utility function that applications can use to create a queue
- without having to worry about using the correct call for the selected
- async mode.
- """
- return self._async['queue'](*args, **kwargs)
-
- def get_queue_empty_exception(self):
- """Return the queue empty exception for the appropriate async model.
-
- This is a utility function that applications can use to work with a
- queue without having to worry about using the correct call for the
- selected async mode.
- """
- return self._async['queue_empty']
-
- def create_event(self, *args, **kwargs):
- """Create an event object using the appropriate async model.
-
- This is a utility function that applications can use to create an
- event without having to worry about using the correct call for the
- selected async mode.
- """
- return self._async['event'](*args, **kwargs)
-
- def _generate_id(self):
- """Generate a unique session id."""
- return uuid.uuid4().hex
-
- def _handle_connect(self, environ, start_response, transport, b64=False,
- jsonp_index=None):
- """Handle a client connection request."""
- if self.start_service_task:
- # start the service task to monitor connected clients
- self.start_service_task = False
- self.start_background_task(self._service_task)
-
- sid = self._generate_id()
- s = socket.Socket(self, sid)
- self.sockets[sid] = s
-
- pkt = packet.Packet(
- packet.OPEN, {'sid': sid,
- 'upgrades': self._upgrades(sid, transport),
- 'pingTimeout': int(self.ping_timeout * 1000),
- 'pingInterval': int(self.ping_interval * 1000)})
- s.send(pkt)
-
- ret = self._trigger_event('connect', sid, environ, run_async=False)
- if ret is False:
- del self.sockets[sid]
- self.logger.warning('Application rejected connection')
- return self._unauthorized()
-
- if transport == 'websocket':
- ret = s.handle_get_request(environ, start_response)
- if s.closed:
- # websocket connection ended, so we are done
- del self.sockets[sid]
- return ret
- else:
- s.connected = True
- headers = None
- if self.cookie:
- headers = [('Set-Cookie', self.cookie + '=' + sid)]
- try:
- return self._ok(s.poll(), headers=headers, b64=b64,
- jsonp_index=jsonp_index)
- except exceptions.QueueEmpty:
- return self._bad_request()
-
- def _upgrades(self, sid, transport):
- """Return the list of possible upgrades for a client connection."""
- if not self.allow_upgrades or self._get_socket(sid).upgraded or \
- self._async['websocket'] is None or transport == 'websocket':
- return []
- return ['websocket']
-
- def _trigger_event(self, event, *args, **kwargs):
- """Invoke an event handler."""
- run_async = kwargs.pop('run_async', False)
- if event in self.handlers:
- if run_async:
- return self.start_background_task(self.handlers[event], *args)
- else:
- try:
- return self.handlers[event](*args)
- except:
- self.logger.exception(event + ' handler error')
- if event == 'connect':
- # if connect handler raised error we reject the
- # connection
- return False
-
- def _get_socket(self, sid):
- """Return the socket object for a given session."""
- try:
- s = self.sockets[sid]
- except KeyError:
- raise KeyError('Session not found')
- if s.closed:
- del self.sockets[sid]
- raise KeyError('Session is disconnected')
- return s
-
- def _ok(self, packets=None, headers=None, b64=False, jsonp_index=None):
- """Generate a successful HTTP response."""
- if packets is not None:
- if headers is None:
- headers = []
- if b64:
- headers += [('Content-Type', 'text/plain; charset=UTF-8')]
- else:
- headers += [('Content-Type', 'application/octet-stream')]
- return {'status': '200 OK',
- 'headers': headers,
- 'response': payload.Payload(packets=packets).encode(
- b64=b64, jsonp_index=jsonp_index)}
- else:
- return {'status': '200 OK',
- 'headers': [('Content-Type', 'text/plain')],
- 'response': b'OK'}
-
- def _bad_request(self):
- """Generate a bad request HTTP error response."""
- return {'status': '400 BAD REQUEST',
- 'headers': [('Content-Type', 'text/plain')],
- 'response': b'Bad Request'}
-
- def _method_not_found(self):
- """Generate a method not found HTTP error response."""
- return {'status': '405 METHOD NOT FOUND',
- 'headers': [('Content-Type', 'text/plain')],
- 'response': b'Method Not Found'}
-
- def _unauthorized(self):
- """Generate a unauthorized HTTP error response."""
- return {'status': '401 UNAUTHORIZED',
- 'headers': [('Content-Type', 'text/plain')],
- 'response': b'Unauthorized'}
-
- def _cors_headers(self, environ):
- """Return the cross-origin-resource-sharing headers."""
- if isinstance(self.cors_allowed_origins, six.string_types):
- if self.cors_allowed_origins == '*':
- allowed_origins = None
- else:
- allowed_origins = [self.cors_allowed_origins]
- else:
- allowed_origins = self.cors_allowed_origins
- if allowed_origins is not None and \
- environ.get('HTTP_ORIGIN', '') not in allowed_origins:
- return []
- if 'HTTP_ORIGIN' in environ:
- headers = [('Access-Control-Allow-Origin', environ['HTTP_ORIGIN'])]
- else:
- headers = [('Access-Control-Allow-Origin', '*')]
- if environ['REQUEST_METHOD'] == 'OPTIONS':
- headers += [('Access-Control-Allow-Methods', 'OPTIONS, GET, POST')]
- if 'HTTP_ACCESS_CONTROL_REQUEST_HEADERS' in environ:
- headers += [('Access-Control-Allow-Headers',
- environ['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])]
- if self.cors_credentials:
- headers += [('Access-Control-Allow-Credentials', 'true')]
- return headers
-
- def _gzip(self, response):
- """Apply gzip compression to a response."""
- bytesio = six.BytesIO()
- with gzip.GzipFile(fileobj=bytesio, mode='w') as gz:
- gz.write(response)
- return bytesio.getvalue()
-
- def _deflate(self, response):
- """Apply deflate compression to a response."""
- return zlib.compress(response)
-
- def _service_task(self): # pragma: no cover
- """Monitor connected clients and clean up those that time out."""
- while True:
- if len(self.sockets) == 0:
- # nothing to do
- self.sleep(self.ping_timeout)
- continue
-
- # go through the entire client list in a ping interval cycle
- sleep_interval = self.ping_timeout / len(self.sockets)
-
- try:
- # iterate over the current clients
- for s in self.sockets.copy().values():
- if not s.closing and not s.closed:
- s.check_ping_timeout()
- self.sleep(sleep_interval)
- except (SystemExit, KeyboardInterrupt):
- self.logger.info('service task canceled')
- break
- except:
- # an unexpected exception has occurred, log it and continue
- self.logger.exception('service task exception')
diff --git a/client/ayon_core/vendor/python/python_2/engineio/socket.py b/client/ayon_core/vendor/python/python_2/engineio/socket.py
deleted file mode 100644
index 495088ae3e..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/socket.py
+++ /dev/null
@@ -1,247 +0,0 @@
-import six
-import sys
-import time
-
-from . import exceptions
-from . import packet
-from . import payload
-
-
-class Socket(object):
- """An Engine.IO socket."""
- upgrade_protocols = ['websocket']
-
- def __init__(self, server, sid):
- self.server = server
- self.sid = sid
- self.queue = self.server.create_queue()
- self.last_ping = time.time()
- self.connected = False
- self.upgrading = False
- self.upgraded = False
- self.packet_backlog = []
- self.closing = False
- self.closed = False
- self.session = {}
-
- def poll(self):
- """Wait for packets to send to the client."""
- queue_empty = self.server.get_queue_empty_exception()
- try:
- packets = [self.queue.get(timeout=self.server.ping_timeout)]
- self.queue.task_done()
- except queue_empty:
- raise exceptions.QueueEmpty()
- if packets == [None]:
- return []
- while True:
- try:
- packets.append(self.queue.get(block=False))
- self.queue.task_done()
- except queue_empty:
- break
- return packets
-
- def receive(self, pkt):
- """Receive packet from the client."""
- packet_name = packet.packet_names[pkt.packet_type] \
- if pkt.packet_type < len(packet.packet_names) else 'UNKNOWN'
- self.server.logger.info('%s: Received packet %s data %s',
- self.sid, packet_name,
- pkt.data if not isinstance(pkt.data, bytes)
- else '')
- if pkt.packet_type == packet.PING:
- self.last_ping = time.time()
- self.send(packet.Packet(packet.PONG, pkt.data))
- elif pkt.packet_type == packet.MESSAGE:
- self.server._trigger_event('message', self.sid, pkt.data,
- run_async=self.server.async_handlers)
- elif pkt.packet_type == packet.UPGRADE:
- self.send(packet.Packet(packet.NOOP))
- elif pkt.packet_type == packet.CLOSE:
- self.close(wait=False, abort=True)
- else:
- raise exceptions.UnknownPacketError()
-
- def check_ping_timeout(self):
- """Make sure the client is still sending pings.
-
- This helps detect disconnections for long-polling clients.
- """
- if self.closed:
- raise exceptions.SocketIsClosedError()
- if time.time() - self.last_ping > self.server.ping_interval + 5:
- self.server.logger.info('%s: Client is gone, closing socket',
- self.sid)
- # Passing abort=False here will cause close() to write a
- # CLOSE packet. This has the effect of updating half-open sockets
- # to their correct state of disconnected
- self.close(wait=False, abort=False)
- return False
- return True
-
- def send(self, pkt):
- """Send a packet to the client."""
- if not self.check_ping_timeout():
- return
- if self.upgrading:
- self.packet_backlog.append(pkt)
- else:
- self.queue.put(pkt)
- self.server.logger.info('%s: Sending packet %s data %s',
- self.sid, packet.packet_names[pkt.packet_type],
- pkt.data if not isinstance(pkt.data, bytes)
- else '')
-
- def handle_get_request(self, environ, start_response):
- """Handle a long-polling GET request from the client."""
- connections = [
- s.strip()
- for s in environ.get('HTTP_CONNECTION', '').lower().split(',')]
- transport = environ.get('HTTP_UPGRADE', '').lower()
- if 'upgrade' in connections and transport in self.upgrade_protocols:
- self.server.logger.info('%s: Received request to upgrade to %s',
- self.sid, transport)
- return getattr(self, '_upgrade_' + transport)(environ,
- start_response)
- try:
- packets = self.poll()
- except exceptions.QueueEmpty:
- exc = sys.exc_info()
- self.close(wait=False)
- six.reraise(*exc)
- return packets
-
- def handle_post_request(self, environ):
- """Handle a long-polling POST request from the client."""
- length = int(environ.get('CONTENT_LENGTH', '0'))
- if length > self.server.max_http_buffer_size:
- raise exceptions.ContentTooLongError()
- else:
- body = environ['wsgi.input'].read(length)
- p = payload.Payload(encoded_payload=body)
- for pkt in p.packets:
- self.receive(pkt)
-
- def close(self, wait=True, abort=False):
- """Close the socket connection."""
- if not self.closed and not self.closing:
- self.closing = True
- self.server._trigger_event('disconnect', self.sid, run_async=False)
- if not abort:
- self.send(packet.Packet(packet.CLOSE))
- self.closed = True
- self.queue.put(None)
- if wait:
- self.queue.join()
-
- def _upgrade_websocket(self, environ, start_response):
- """Upgrade the connection from polling to websocket."""
- if self.upgraded:
- raise IOError('Socket has been upgraded already')
- if self.server._async['websocket'] is None:
- # the selected async mode does not support websocket
- return self.server._bad_request()
- ws = self.server._async['websocket'](self._websocket_handler)
- return ws(environ, start_response)
-
- def _websocket_handler(self, ws):
- """Engine.IO handler for websocket transport."""
- # try to set a socket timeout matching the configured ping interval
- for attr in ['_sock', 'socket']: # pragma: no cover
- if hasattr(ws, attr) and hasattr(getattr(ws, attr), 'settimeout'):
- getattr(ws, attr).settimeout(self.server.ping_timeout)
-
- if self.connected:
- # the socket was already connected, so this is an upgrade
- self.upgrading = True # hold packet sends during the upgrade
-
- pkt = ws.wait()
- decoded_pkt = packet.Packet(encoded_packet=pkt)
- if decoded_pkt.packet_type != packet.PING or \
- decoded_pkt.data != 'probe':
- self.server.logger.info(
- '%s: Failed websocket upgrade, no PING packet', self.sid)
- return []
- ws.send(packet.Packet(
- packet.PONG,
- data=six.text_type('probe')).encode(always_bytes=False))
- self.queue.put(packet.Packet(packet.NOOP)) # end poll
-
- pkt = ws.wait()
- decoded_pkt = packet.Packet(encoded_packet=pkt)
- if decoded_pkt.packet_type != packet.UPGRADE:
- self.upgraded = False
- self.server.logger.info(
- ('%s: Failed websocket upgrade, expected UPGRADE packet, '
- 'received %s instead.'),
- self.sid, pkt)
- return []
- self.upgraded = True
-
- # flush any packets that were sent during the upgrade
- for pkt in self.packet_backlog:
- self.queue.put(pkt)
- self.packet_backlog = []
- self.upgrading = False
- else:
- self.connected = True
- self.upgraded = True
-
- # start separate writer thread
- def writer():
- while True:
- packets = None
- try:
- packets = self.poll()
- except exceptions.QueueEmpty:
- break
- if not packets:
- # empty packet list returned -> connection closed
- break
- try:
- for pkt in packets:
- ws.send(pkt.encode(always_bytes=False))
- except:
- break
- writer_task = self.server.start_background_task(writer)
-
- self.server.logger.info(
- '%s: Upgrade to websocket successful', self.sid)
-
- while True:
- p = None
- try:
- p = ws.wait()
- except Exception as e:
- # if the socket is already closed, we can assume this is a
- # downstream error of that
- if not self.closed: # pragma: no cover
- self.server.logger.info(
- '%s: Unexpected error "%s", closing connection',
- self.sid, str(e))
- break
- if p is None:
- # connection closed by client
- break
- if isinstance(p, six.text_type): # pragma: no cover
- p = p.encode('utf-8')
- pkt = packet.Packet(encoded_packet=p)
- try:
- self.receive(pkt)
- except exceptions.UnknownPacketError: # pragma: no cover
- pass
- except exceptions.SocketIsClosedError: # pragma: no cover
- self.server.logger.info('Receive error -- socket is closed')
- break
- except: # pragma: no cover
- # if we get an unexpected exception we log the error and exit
- # the connection properly
- self.server.logger.exception('Unknown receive error')
- break
-
- self.queue.put(None) # unlock the writer task so that it can exit
- writer_task.join()
- self.close(wait=False, abort=True)
-
- return []
diff --git a/client/ayon_core/vendor/python/python_2/engineio/static_files.py b/client/ayon_core/vendor/python/python_2/engineio/static_files.py
deleted file mode 100644
index 3058f6ea42..0000000000
--- a/client/ayon_core/vendor/python/python_2/engineio/static_files.py
+++ /dev/null
@@ -1,55 +0,0 @@
-content_types = {
- 'css': 'text/css',
- 'gif': 'image/gif',
- 'html': 'text/html',
- 'jpg': 'image/jpeg',
- 'js': 'application/javascript',
- 'json': 'application/json',
- 'png': 'image/png',
- 'txt': 'text/plain',
-}
-
-
-def get_static_file(path, static_files):
- """Return the local filename and content type for the requested static
- file URL.
-
- :param path: the path portion of the requested URL.
- :param static_files: a static file configuration dictionary.
-
- This function returns a dictionary with two keys, "filename" and
- "content_type". If the requested URL does not match any static file, the
- return value is None.
- """
- if path in static_files:
- f = static_files[path]
- else:
- f = None
- rest = ''
- while path != '':
- path, last = path.rsplit('/', 1)
- rest = '/' + last + rest
- if path in static_files:
- f = static_files[path] + rest
- break
- elif path + '/' in static_files:
- f = static_files[path + '/'] + rest[1:]
- break
- if f:
- if isinstance(f, str):
- f = {'filename': f}
- if f['filename'].endswith('/'):
- if '' in static_files:
- if isinstance(static_files[''], str):
- f['filename'] += static_files['']
- else:
- f['filename'] += static_files['']['filename']
- if 'content_type' in static_files['']:
- f['content_type'] = static_files['']['content_type']
- else:
- f['filename'] += 'index.html'
- if 'content_type' not in f:
- ext = f['filename'].rsplit('.')[-1]
- f['content_type'] = content_types.get(
- ext, 'application/octet-stream')
- return f
diff --git a/client/ayon_core/vendor/python/python_2/functools32/__init__.py b/client/ayon_core/vendor/python/python_2/functools32/__init__.py
deleted file mode 100644
index 837f7fb651..0000000000
--- a/client/ayon_core/vendor/python/python_2/functools32/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from .functools32 import *
diff --git a/client/ayon_core/vendor/python/python_2/functools32/_dummy_thread32.py b/client/ayon_core/vendor/python/python_2/functools32/_dummy_thread32.py
deleted file mode 100644
index 8503b0e3dd..0000000000
--- a/client/ayon_core/vendor/python/python_2/functools32/_dummy_thread32.py
+++ /dev/null
@@ -1,158 +0,0 @@
-"""Drop-in replacement for the thread module.
-
-Meant to be used as a brain-dead substitute so that threaded code does
-not need to be rewritten for when the thread module is not present.
-
-Suggested usage is::
-
- try:
- try:
- import _thread # Python >= 3
- except:
- import thread as _thread # Python < 3
- except ImportError:
- import _dummy_thread as _thread
-
-"""
-# Exports only things specified by thread documentation;
-# skipping obsolete synonyms allocate(), start_new(), exit_thread().
-__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock',
- 'interrupt_main', 'LockType']
-
-# A dummy value
-TIMEOUT_MAX = 2**31
-
-# NOTE: this module can be imported early in the extension building process,
-# and so top level imports of other modules should be avoided. Instead, all
-# imports are done when needed on a function-by-function basis. Since threads
-# are disabled, the import lock should not be an issue anyway (??).
-
-class error(Exception):
- """Dummy implementation of _thread.error."""
-
- def __init__(self, *args):
- self.args = args
-
-def start_new_thread(function, args, kwargs={}):
- """Dummy implementation of _thread.start_new_thread().
-
- Compatibility is maintained by making sure that ``args`` is a
- tuple and ``kwargs`` is a dictionary. If an exception is raised
- and it is SystemExit (which can be done by _thread.exit()) it is
- caught and nothing is done; all other exceptions are printed out
- by using traceback.print_exc().
-
- If the executed function calls interrupt_main the KeyboardInterrupt will be
- raised when the function returns.
-
- """
- if type(args) != type(tuple()):
- raise TypeError("2nd arg must be a tuple")
- if type(kwargs) != type(dict()):
- raise TypeError("3rd arg must be a dict")
- global _main
- _main = False
- try:
- function(*args, **kwargs)
- except SystemExit:
- pass
- except:
- import traceback
- traceback.print_exc()
- _main = True
- global _interrupt
- if _interrupt:
- _interrupt = False
- raise KeyboardInterrupt
-
-def exit():
- """Dummy implementation of _thread.exit()."""
- raise SystemExit
-
-def get_ident():
- """Dummy implementation of _thread.get_ident().
-
- Since this module should only be used when _threadmodule is not
- available, it is safe to assume that the current process is the
- only thread. Thus a constant can be safely returned.
- """
- return -1
-
-def allocate_lock():
- """Dummy implementation of _thread.allocate_lock()."""
- return LockType()
-
-def stack_size(size=None):
- """Dummy implementation of _thread.stack_size()."""
- if size is not None:
- raise error("setting thread stack size not supported")
- return 0
-
-class LockType(object):
- """Class implementing dummy implementation of _thread.LockType.
-
- Compatibility is maintained by maintaining self.locked_status
- which is a boolean that stores the state of the lock. Pickling of
- the lock, though, should not be done since if the _thread module is
- then used with an unpickled ``lock()`` from here problems could
- occur from this class not having atomic methods.
-
- """
-
- def __init__(self):
- self.locked_status = False
-
- def acquire(self, waitflag=None, timeout=-1):
- """Dummy implementation of acquire().
-
- For blocking calls, self.locked_status is automatically set to
- True and returned appropriately based on value of
- ``waitflag``. If it is non-blocking, then the value is
- actually checked and not set if it is already acquired. This
- is all done so that threading.Condition's assert statements
- aren't triggered and throw a little fit.
-
- """
- if waitflag is None or waitflag:
- self.locked_status = True
- return True
- else:
- if not self.locked_status:
- self.locked_status = True
- return True
- else:
- if timeout > 0:
- import time
- time.sleep(timeout)
- return False
-
- __enter__ = acquire
-
- def __exit__(self, typ, val, tb):
- self.release()
-
- def release(self):
- """Release the dummy lock."""
- # XXX Perhaps shouldn't actually bother to test? Could lead
- # to problems for complex, threaded code.
- if not self.locked_status:
- raise error
- self.locked_status = False
- return True
-
- def locked(self):
- return self.locked_status
-
-# Used to signal that interrupt_main was called in a "thread"
-_interrupt = False
-# True when not executing in a "thread"
-_main = True
-
-def interrupt_main():
- """Set _interrupt flag to True to have start_new_thread raise
- KeyboardInterrupt upon exiting."""
- if _main:
- raise KeyboardInterrupt
- else:
- global _interrupt
- _interrupt = True
diff --git a/client/ayon_core/vendor/python/python_2/functools32/functools32.py b/client/ayon_core/vendor/python/python_2/functools32/functools32.py
deleted file mode 100644
index c44551fac0..0000000000
--- a/client/ayon_core/vendor/python/python_2/functools32/functools32.py
+++ /dev/null
@@ -1,423 +0,0 @@
-"""functools.py - Tools for working with functions and callable objects
-"""
-# Python module wrapper for _functools C module
-# to allow utilities written in Python to be added
-# to the functools module.
-# Written by Nick Coghlan
-# and Raymond Hettinger
-# Copyright (C) 2006-2010 Python Software Foundation.
-# See C source code for _functools credits/copyright
-
-__all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES',
- 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial']
-
-from _functools import partial, reduce
-from collections import MutableMapping, namedtuple
-from .reprlib32 import recursive_repr as _recursive_repr
-from weakref import proxy as _proxy
-import sys as _sys
-try:
- from thread import allocate_lock as Lock
-except ImportError:
- from ._dummy_thread32 import allocate_lock as Lock
-
-################################################################################
-### OrderedDict
-################################################################################
-
-class _Link(object):
- __slots__ = 'prev', 'next', 'key', '__weakref__'
-
-class OrderedDict(dict):
- 'Dictionary that remembers insertion order'
- # An inherited dict maps keys to values.
- # The inherited dict provides __getitem__, __len__, __contains__, and get.
- # The remaining methods are order-aware.
- # Big-O running times for all methods are the same as regular dictionaries.
-
- # The internal self.__map dict maps keys to links in a doubly linked list.
- # The circular doubly linked list starts and ends with a sentinel element.
- # The sentinel element never gets deleted (this simplifies the algorithm).
- # The sentinel is in self.__hardroot with a weakref proxy in self.__root.
- # The prev links are weakref proxies (to prevent circular references).
- # Individual links are kept alive by the hard reference in self.__map.
- # Those hard references disappear when a key is deleted from an OrderedDict.
-
- def __init__(self, *args, **kwds):
- '''Initialize an ordered dictionary. The signature is the same as
- regular dictionaries, but keyword arguments are not recommended because
- their insertion order is arbitrary.
-
- '''
- if len(args) > 1:
- raise TypeError('expected at most 1 arguments, got %d' % len(args))
- try:
- self.__root
- except AttributeError:
- self.__hardroot = _Link()
- self.__root = root = _proxy(self.__hardroot)
- root.prev = root.next = root
- self.__map = {}
- self.__update(*args, **kwds)
-
- def __setitem__(self, key, value,
- dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link):
- 'od.__setitem__(i, y) <==> od[i]=y'
- # Setting a new item creates a new link at the end of the linked list,
- # and the inherited dictionary is updated with the new key/value pair.
- if key not in self:
- self.__map[key] = link = Link()
- root = self.__root
- last = root.prev
- link.prev, link.next, link.key = last, root, key
- last.next = link
- root.prev = proxy(link)
- dict_setitem(self, key, value)
-
- def __delitem__(self, key, dict_delitem=dict.__delitem__):
- 'od.__delitem__(y) <==> del od[y]'
- # Deleting an existing item uses self.__map to find the link which gets
- # removed by updating the links in the predecessor and successor nodes.
- dict_delitem(self, key)
- link = self.__map.pop(key)
- link_prev = link.prev
- link_next = link.next
- link_prev.next = link_next
- link_next.prev = link_prev
-
- def __iter__(self):
- 'od.__iter__() <==> iter(od)'
- # Traverse the linked list in order.
- root = self.__root
- curr = root.next
- while curr is not root:
- yield curr.key
- curr = curr.next
-
- def __reversed__(self):
- 'od.__reversed__() <==> reversed(od)'
- # Traverse the linked list in reverse order.
- root = self.__root
- curr = root.prev
- while curr is not root:
- yield curr.key
- curr = curr.prev
-
- def clear(self):
- 'od.clear() -> None. Remove all items from od.'
- root = self.__root
- root.prev = root.next = root
- self.__map.clear()
- dict.clear(self)
-
- def popitem(self, last=True):
- '''od.popitem() -> (k, v), return and remove a (key, value) pair.
- Pairs are returned in LIFO order if last is true or FIFO order if false.
-
- '''
- if not self:
- raise KeyError('dictionary is empty')
- root = self.__root
- if last:
- link = root.prev
- link_prev = link.prev
- link_prev.next = root
- root.prev = link_prev
- else:
- link = root.next
- link_next = link.next
- root.next = link_next
- link_next.prev = root
- key = link.key
- del self.__map[key]
- value = dict.pop(self, key)
- return key, value
-
- def move_to_end(self, key, last=True):
- '''Move an existing element to the end (or beginning if last==False).
-
- Raises KeyError if the element does not exist.
- When last=True, acts like a fast version of self[key]=self.pop(key).
-
- '''
- link = self.__map[key]
- link_prev = link.prev
- link_next = link.next
- link_prev.next = link_next
- link_next.prev = link_prev
- root = self.__root
- if last:
- last = root.prev
- link.prev = last
- link.next = root
- last.next = root.prev = link
- else:
- first = root.next
- link.prev = root
- link.next = first
- root.next = first.prev = link
-
- def __sizeof__(self):
- sizeof = _sys.getsizeof
- n = len(self) + 1 # number of links including root
- size = sizeof(self.__dict__) # instance dictionary
- size += sizeof(self.__map) * 2 # internal dict and inherited dict
- size += sizeof(self.__hardroot) * n # link objects
- size += sizeof(self.__root) * n # proxy objects
- return size
-
- update = __update = MutableMapping.update
- keys = MutableMapping.keys
- values = MutableMapping.values
- items = MutableMapping.items
- __ne__ = MutableMapping.__ne__
-
- __marker = object()
-
- def pop(self, key, default=__marker):
- '''od.pop(k[,d]) -> v, remove specified key and return the corresponding
- value. If key is not found, d is returned if given, otherwise KeyError
- is raised.
-
- '''
- if key in self:
- result = self[key]
- del self[key]
- return result
- if default is self.__marker:
- raise KeyError(key)
- return default
-
- def setdefault(self, key, default=None):
- 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
- if key in self:
- return self[key]
- self[key] = default
- return default
-
- @_recursive_repr()
- def __repr__(self):
- 'od.__repr__() <==> repr(od)'
- if not self:
- return '%s()' % (self.__class__.__name__,)
- return '%s(%r)' % (self.__class__.__name__, list(self.items()))
-
- def __reduce__(self):
- 'Return state information for pickling'
- 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.
- If not specified, the value defaults to None.
-
- '''
- self = cls()
- for key in iterable:
- self[key] = value
- return self
-
- def __eq__(self, other):
- '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
- while comparison to a regular mapping is order-insensitive.
-
- '''
- if isinstance(other, OrderedDict):
- return len(self)==len(other) and \
- all(p==q for p, q in zip(self.items(), other.items()))
- return dict.__eq__(self, other)
-
-# update_wrapper() and wraps() are tools to help write
-# wrapper functions that can handle naive introspection
-
-WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')
-WRAPPER_UPDATES = ('__dict__',)
-def update_wrapper(wrapper,
- wrapped,
- assigned = WRAPPER_ASSIGNMENTS,
- updated = WRAPPER_UPDATES):
- """Update a wrapper function to look like the wrapped function
-
- wrapper is the function to be updated
- wrapped is the original function
- assigned is a tuple naming the attributes assigned directly
- from the wrapped function to the wrapper function (defaults to
- functools.WRAPPER_ASSIGNMENTS)
- updated is a tuple naming the attributes of the wrapper that
- are updated with the corresponding attribute from the wrapped
- function (defaults to functools.WRAPPER_UPDATES)
- """
- wrapper.__wrapped__ = wrapped
- for attr in assigned:
- try:
- value = getattr(wrapped, attr)
- except AttributeError:
- pass
- else:
- setattr(wrapper, attr, value)
- for attr in updated:
- getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
- # Return the wrapper so this can be used as a decorator via partial()
- return wrapper
-
-def wraps(wrapped,
- assigned = WRAPPER_ASSIGNMENTS,
- updated = WRAPPER_UPDATES):
- """Decorator factory to apply update_wrapper() to a wrapper function
-
- Returns a decorator that invokes update_wrapper() with the decorated
- function as the wrapper argument and the arguments to wraps() as the
- remaining arguments. Default arguments are as for update_wrapper().
- This is a convenience function to simplify applying partial() to
- update_wrapper().
- """
- return partial(update_wrapper, wrapped=wrapped,
- assigned=assigned, updated=updated)
-
-def total_ordering(cls):
- """Class decorator that fills in missing ordering methods"""
- convert = {
- '__lt__': [('__gt__', lambda self, other: not (self < other or self == other)),
- ('__le__', lambda self, other: self < other or self == other),
- ('__ge__', lambda self, other: not self < other)],
- '__le__': [('__ge__', lambda self, other: not self <= other or self == other),
- ('__lt__', lambda self, other: self <= other and not self == other),
- ('__gt__', lambda self, other: not self <= other)],
- '__gt__': [('__lt__', lambda self, other: not (self > other or self == other)),
- ('__ge__', lambda self, other: self > other or self == other),
- ('__le__', lambda self, other: not self > other)],
- '__ge__': [('__le__', lambda self, other: (not self >= other) or self == other),
- ('__gt__', lambda self, other: self >= other and not self == other),
- ('__lt__', lambda self, other: not self >= other)]
- }
- roots = set(dir(cls)) & set(convert)
- if not roots:
- raise ValueError('must define at least one ordering operation: < > <= >=')
- root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
- for opname, opfunc in convert[root]:
- if opname not in roots:
- opfunc.__name__ = opname
- opfunc.__doc__ = getattr(int, opname).__doc__
- setattr(cls, opname, opfunc)
- return cls
-
-def cmp_to_key(mycmp):
- """Convert a cmp= function into a key= function"""
- class K(object):
- __slots__ = ['obj']
- def __init__(self, obj):
- self.obj = obj
- def __lt__(self, other):
- return mycmp(self.obj, other.obj) < 0
- def __gt__(self, other):
- return mycmp(self.obj, other.obj) > 0
- def __eq__(self, other):
- return mycmp(self.obj, other.obj) == 0
- def __le__(self, other):
- return mycmp(self.obj, other.obj) <= 0
- def __ge__(self, other):
- return mycmp(self.obj, other.obj) >= 0
- def __ne__(self, other):
- return mycmp(self.obj, other.obj) != 0
- __hash__ = None
- return K
-
-_CacheInfo = namedtuple("CacheInfo", "hits misses maxsize currsize")
-
-def lru_cache(maxsize=100):
- """Least-recently-used cache decorator.
-
- If *maxsize* is set to None, the LRU features are disabled and the cache
- can grow without bound.
-
- Arguments to the cached function must be hashable.
-
- View the cache statistics named tuple (hits, misses, maxsize, currsize) with
- f.cache_info(). Clear the cache and statistics with f.cache_clear().
- Access the underlying function with f.__wrapped__.
-
- See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
-
- """
- # Users should only access the lru_cache through its public API:
- # cache_info, cache_clear, and f.__wrapped__
- # The internals of the lru_cache are encapsulated for thread safety and
- # to allow the implementation to change (including a possible C version).
-
- def decorating_function(user_function,
- tuple=tuple, sorted=sorted, len=len, KeyError=KeyError):
-
- hits, misses = [0], [0]
- kwd_mark = (object(),) # separates positional and keyword args
- lock = Lock() # needed because OrderedDict isn't threadsafe
-
- if maxsize is None:
- cache = dict() # simple cache without ordering or size limit
-
- @wraps(user_function)
- def wrapper(*args, **kwds):
- key = args
- if kwds:
- key += kwd_mark + tuple(sorted(kwds.items()))
- try:
- result = cache[key]
- hits[0] += 1
- return result
- except KeyError:
- pass
- result = user_function(*args, **kwds)
- cache[key] = result
- misses[0] += 1
- return result
- else:
- cache = OrderedDict() # ordered least recent to most recent
- cache_popitem = cache.popitem
- cache_renew = cache.move_to_end
-
- @wraps(user_function)
- def wrapper(*args, **kwds):
- key = args
- if kwds:
- key += kwd_mark + tuple(sorted(kwds.items()))
- with lock:
- try:
- result = cache[key]
- cache_renew(key) # record recent use of this key
- hits[0] += 1
- return result
- except KeyError:
- pass
- result = user_function(*args, **kwds)
- with lock:
- cache[key] = result # record recent use of this key
- misses[0] += 1
- if len(cache) > maxsize:
- cache_popitem(0) # purge least recently used cache entry
- return result
-
- def cache_info():
- """Report cache statistics"""
- with lock:
- return _CacheInfo(hits[0], misses[0], maxsize, len(cache))
-
- def cache_clear():
- """Clear the cache and cache statistics"""
- with lock:
- cache.clear()
- hits[0] = misses[0] = 0
-
- wrapper.cache_info = cache_info
- wrapper.cache_clear = cache_clear
- return wrapper
-
- return decorating_function
diff --git a/client/ayon_core/vendor/python/python_2/functools32/reprlib32.py b/client/ayon_core/vendor/python/python_2/functools32/reprlib32.py
deleted file mode 100644
index af919758ca..0000000000
--- a/client/ayon_core/vendor/python/python_2/functools32/reprlib32.py
+++ /dev/null
@@ -1,157 +0,0 @@
-"""Redo the builtin repr() (representation) but with limits on most sizes."""
-
-__all__ = ["Repr", "repr", "recursive_repr"]
-
-import __builtin__ as builtins
-from itertools import islice
-try:
- from thread import get_ident
-except ImportError:
- from _dummy_thread32 import get_ident
-
-def recursive_repr(fillvalue='...'):
- 'Decorator to make a repr function return fillvalue for a recursive call'
-
- def decorating_function(user_function):
- repr_running = set()
-
- def wrapper(self):
- key = id(self), get_ident()
- if key in repr_running:
- return fillvalue
- repr_running.add(key)
- try:
- result = user_function(self)
- finally:
- repr_running.discard(key)
- return result
-
- # Can't use functools.wraps() here because of bootstrap issues
- wrapper.__module__ = getattr(user_function, '__module__')
- wrapper.__doc__ = getattr(user_function, '__doc__')
- wrapper.__name__ = getattr(user_function, '__name__')
- wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
- return wrapper
-
- return decorating_function
-
-class Repr:
-
- def __init__(self):
- self.maxlevel = 6
- self.maxtuple = 6
- self.maxlist = 6
- self.maxarray = 5
- self.maxdict = 4
- self.maxset = 6
- self.maxfrozenset = 6
- self.maxdeque = 6
- self.maxstring = 30
- self.maxlong = 40
- self.maxother = 30
-
- def repr(self, x):
- return self.repr1(x, self.maxlevel)
-
- def repr1(self, x, level):
- typename = type(x).__name__
- if ' ' in typename:
- parts = typename.split()
- typename = '_'.join(parts)
- if hasattr(self, 'repr_' + typename):
- return getattr(self, 'repr_' + typename)(x, level)
- else:
- return self.repr_instance(x, level)
-
- def _repr_iterable(self, x, level, left, right, maxiter, trail=''):
- n = len(x)
- if level <= 0 and n:
- s = '...'
- else:
- newlevel = level - 1
- repr1 = self.repr1
- pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)]
- if n > maxiter: pieces.append('...')
- s = ', '.join(pieces)
- if n == 1 and trail: right = trail + right
- return '%s%s%s' % (left, s, right)
-
- def repr_tuple(self, x, level):
- return self._repr_iterable(x, level, '(', ')', self.maxtuple, ',')
-
- def repr_list(self, x, level):
- return self._repr_iterable(x, level, '[', ']', self.maxlist)
-
- def repr_array(self, x, level):
- header = "array('%s', [" % x.typecode
- return self._repr_iterable(x, level, header, '])', self.maxarray)
-
- def repr_set(self, x, level):
- x = _possibly_sorted(x)
- return self._repr_iterable(x, level, 'set([', '])', self.maxset)
-
- def repr_frozenset(self, x, level):
- x = _possibly_sorted(x)
- return self._repr_iterable(x, level, 'frozenset([', '])',
- self.maxfrozenset)
-
- def repr_deque(self, x, level):
- return self._repr_iterable(x, level, 'deque([', '])', self.maxdeque)
-
- def repr_dict(self, x, level):
- n = len(x)
- if n == 0: return '{}'
- if level <= 0: return '{...}'
- newlevel = level - 1
- repr1 = self.repr1
- pieces = []
- for key in islice(_possibly_sorted(x), self.maxdict):
- keyrepr = repr1(key, newlevel)
- valrepr = repr1(x[key], newlevel)
- pieces.append('%s: %s' % (keyrepr, valrepr))
- if n > self.maxdict: pieces.append('...')
- s = ', '.join(pieces)
- return '{%s}' % (s,)
-
- def repr_str(self, x, level):
- s = builtins.repr(x[:self.maxstring])
- if len(s) > self.maxstring:
- i = max(0, (self.maxstring-3)//2)
- j = max(0, self.maxstring-3-i)
- s = builtins.repr(x[:i] + x[len(x)-j:])
- s = s[:i] + '...' + s[len(s)-j:]
- return s
-
- def repr_int(self, x, level):
- s = builtins.repr(x) # XXX Hope this isn't too slow...
- if len(s) > self.maxlong:
- i = max(0, (self.maxlong-3)//2)
- j = max(0, self.maxlong-3-i)
- s = s[:i] + '...' + s[len(s)-j:]
- return s
-
- def repr_instance(self, x, level):
- try:
- s = builtins.repr(x)
- # Bugs in x.__repr__() can cause arbitrary
- # exceptions -- then make up something
- except Exception:
- return '<%s instance at %x>' % (x.__class__.__name__, id(x))
- if len(s) > self.maxother:
- i = max(0, (self.maxother-3)//2)
- j = max(0, self.maxother-3-i)
- s = s[:i] + '...' + s[len(s)-j:]
- return s
-
-
-def _possibly_sorted(x):
- # Since not all sequences of items can be sorted and comparison
- # functions may raise arbitrary exceptions, return an unsorted
- # sequence in that case.
- try:
- return sorted(x)
- except Exception:
- return list(x)
-
-aRepr = Repr()
-repr = aRepr.repr
diff --git a/client/ayon_core/vendor/python/python_2/idna/__init__.py b/client/ayon_core/vendor/python/python_2/idna/__init__.py
deleted file mode 100644
index 847bf93547..0000000000
--- a/client/ayon_core/vendor/python/python_2/idna/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from .package_data import __version__
-from .core import *
diff --git a/client/ayon_core/vendor/python/python_2/idna/codec.py b/client/ayon_core/vendor/python/python_2/idna/codec.py
deleted file mode 100644
index 98c65ead14..0000000000
--- a/client/ayon_core/vendor/python/python_2/idna/codec.py
+++ /dev/null
@@ -1,118 +0,0 @@
-from .core import encode, decode, alabel, ulabel, IDNAError
-import codecs
-import re
-
-_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
-
-class Codec(codecs.Codec):
-
- def encode(self, data, errors='strict'):
-
- if errors != 'strict':
- raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
-
- if not data:
- return "", 0
-
- return encode(data), len(data)
-
- def decode(self, data, errors='strict'):
-
- if errors != 'strict':
- raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
-
- if not data:
- return u"", 0
-
- return decode(data), len(data)
-
-class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
- def _buffer_encode(self, data, errors, final):
- if errors != 'strict':
- raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
-
- if not data:
- return ("", 0)
-
- labels = _unicode_dots_re.split(data)
- trailing_dot = u''
- if labels:
- if not labels[-1]:
- trailing_dot = '.'
- del labels[-1]
- elif not final:
- # Keep potentially unfinished label until the next call
- del labels[-1]
- if labels:
- trailing_dot = '.'
-
- result = []
- size = 0
- for label in labels:
- result.append(alabel(label))
- if size:
- size += 1
- size += len(label)
-
- # Join with U+002E
- result = ".".join(result) + trailing_dot
- size += len(trailing_dot)
- return (result, size)
-
-class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
- def _buffer_decode(self, data, errors, final):
- if errors != 'strict':
- raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
-
- if not data:
- return (u"", 0)
-
- # IDNA allows decoding to operate on Unicode strings, too.
- if isinstance(data, unicode):
- labels = _unicode_dots_re.split(data)
- else:
- # Must be ASCII string
- data = str(data)
- unicode(data, "ascii")
- labels = data.split(".")
-
- trailing_dot = u''
- if labels:
- if not labels[-1]:
- trailing_dot = u'.'
- del labels[-1]
- elif not final:
- # Keep potentially unfinished label until the next call
- del labels[-1]
- if labels:
- trailing_dot = u'.'
-
- result = []
- size = 0
- for label in labels:
- result.append(ulabel(label))
- if size:
- size += 1
- size += len(label)
-
- result = u".".join(result) + trailing_dot
- size += len(trailing_dot)
- return (result, size)
-
-
-class StreamWriter(Codec, codecs.StreamWriter):
- pass
-
-class StreamReader(Codec, codecs.StreamReader):
- pass
-
-def getregentry():
- return codecs.CodecInfo(
- name='idna',
- encode=Codec().encode,
- decode=Codec().decode,
- incrementalencoder=IncrementalEncoder,
- incrementaldecoder=IncrementalDecoder,
- streamwriter=StreamWriter,
- streamreader=StreamReader,
- )
diff --git a/client/ayon_core/vendor/python/python_2/idna/compat.py b/client/ayon_core/vendor/python/python_2/idna/compat.py
deleted file mode 100644
index 4d47f336db..0000000000
--- a/client/ayon_core/vendor/python/python_2/idna/compat.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from .core import *
-from .codec import *
-
-def ToASCII(label):
- return encode(label)
-
-def ToUnicode(label):
- return decode(label)
-
-def nameprep(s):
- raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol")
-
diff --git a/client/ayon_core/vendor/python/python_2/idna/core.py b/client/ayon_core/vendor/python/python_2/idna/core.py
deleted file mode 100644
index 41ec5c711d..0000000000
--- a/client/ayon_core/vendor/python/python_2/idna/core.py
+++ /dev/null
@@ -1,400 +0,0 @@
-from . import idnadata
-import bisect
-import unicodedata
-import re
-import sys
-from .intranges import intranges_contain
-
-_virama_combining_class = 9
-_alabel_prefix = b'xn--'
-_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
-
-if sys.version_info[0] >= 3:
- unicode = str
- unichr = chr
-
-class IDNAError(UnicodeError):
- """ Base exception for all IDNA-encoding related problems """
- pass
-
-
-class IDNABidiError(IDNAError):
- """ Exception when bidirectional requirements are not satisfied """
- pass
-
-
-class InvalidCodepoint(IDNAError):
- """ Exception when a disallowed or unallocated codepoint is used """
- pass
-
-
-class InvalidCodepointContext(IDNAError):
- """ Exception when the codepoint is not valid in the context it is used """
- pass
-
-
-def _combining_class(cp):
- v = unicodedata.combining(unichr(cp))
- if v == 0:
- if not unicodedata.name(unichr(cp)):
- raise ValueError("Unknown character in unicodedata")
- return v
-
-def _is_script(cp, script):
- return intranges_contain(ord(cp), idnadata.scripts[script])
-
-def _punycode(s):
- return s.encode('punycode')
-
-def _unot(s):
- return 'U+{0:04X}'.format(s)
-
-
-def valid_label_length(label):
-
- if len(label) > 63:
- return False
- return True
-
-
-def valid_string_length(label, trailing_dot):
-
- if len(label) > (254 if trailing_dot else 253):
- return False
- return True
-
-
-def check_bidi(label, check_ltr=False):
-
- # Bidi rules should only be applied if string contains RTL characters
- bidi_label = False
- for (idx, cp) in enumerate(label, 1):
- direction = unicodedata.bidirectional(cp)
- if direction == '':
- # String likely comes from a newer version of Unicode
- raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx))
- if direction in ['R', 'AL', 'AN']:
- bidi_label = True
- if not bidi_label and not check_ltr:
- return True
-
- # Bidi rule 1
- direction = unicodedata.bidirectional(label[0])
- if direction in ['R', 'AL']:
- rtl = True
- elif direction == 'L':
- rtl = False
- else:
- raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label)))
-
- valid_ending = False
- number_type = False
- for (idx, cp) in enumerate(label, 1):
- direction = unicodedata.bidirectional(cp)
-
- if rtl:
- # Bidi rule 2
- if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
- raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx))
- # Bidi rule 3
- if direction in ['R', 'AL', 'EN', 'AN']:
- valid_ending = True
- elif direction != 'NSM':
- valid_ending = False
- # Bidi rule 4
- if direction in ['AN', 'EN']:
- if not number_type:
- number_type = direction
- else:
- if number_type != direction:
- raise IDNABidiError('Can not mix numeral types in a right-to-left label')
- else:
- # Bidi rule 5
- if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
- raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx))
- # Bidi rule 6
- if direction in ['L', 'EN']:
- valid_ending = True
- elif direction != 'NSM':
- valid_ending = False
-
- if not valid_ending:
- raise IDNABidiError('Label ends with illegal codepoint directionality')
-
- return True
-
-
-def check_initial_combiner(label):
-
- if unicodedata.category(label[0])[0] == 'M':
- raise IDNAError('Label begins with an illegal combining character')
- return True
-
-
-def check_hyphen_ok(label):
-
- if label[2:4] == '--':
- raise IDNAError('Label has disallowed hyphens in 3rd and 4th position')
- if label[0] == '-' or label[-1] == '-':
- raise IDNAError('Label must not start or end with a hyphen')
- return True
-
-
-def check_nfc(label):
-
- if unicodedata.normalize('NFC', label) != label:
- raise IDNAError('Label must be in Normalization Form C')
-
-
-def valid_contextj(label, pos):
-
- cp_value = ord(label[pos])
-
- if cp_value == 0x200c:
-
- if pos > 0:
- if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
- return True
-
- ok = False
- for i in range(pos-1, -1, -1):
- joining_type = idnadata.joining_types.get(ord(label[i]))
- if joining_type == ord('T'):
- continue
- if joining_type in [ord('L'), ord('D')]:
- ok = True
- break
-
- if not ok:
- return False
-
- ok = False
- for i in range(pos+1, len(label)):
- joining_type = idnadata.joining_types.get(ord(label[i]))
- if joining_type == ord('T'):
- continue
- if joining_type in [ord('R'), ord('D')]:
- ok = True
- break
- return ok
-
- if cp_value == 0x200d:
-
- if pos > 0:
- if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
- return True
- return False
-
- else:
-
- return False
-
-
-def valid_contexto(label, pos, exception=False):
-
- cp_value = ord(label[pos])
-
- if cp_value == 0x00b7:
- if 0 < pos < len(label)-1:
- if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c:
- return True
- return False
-
- elif cp_value == 0x0375:
- if pos < len(label)-1 and len(label) > 1:
- return _is_script(label[pos + 1], 'Greek')
- return False
-
- elif cp_value == 0x05f3 or cp_value == 0x05f4:
- if pos > 0:
- return _is_script(label[pos - 1], 'Hebrew')
- return False
-
- elif cp_value == 0x30fb:
- for cp in label:
- if cp == u'\u30fb':
- continue
- if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'):
- return True
- return False
-
- elif 0x660 <= cp_value <= 0x669:
- for cp in label:
- if 0x6f0 <= ord(cp) <= 0x06f9:
- return False
- return True
-
- elif 0x6f0 <= cp_value <= 0x6f9:
- for cp in label:
- if 0x660 <= ord(cp) <= 0x0669:
- return False
- return True
-
-
-def check_label(label):
-
- if isinstance(label, (bytes, bytearray)):
- label = label.decode('utf-8')
- if len(label) == 0:
- raise IDNAError('Empty Label')
-
- check_nfc(label)
- check_hyphen_ok(label)
- check_initial_combiner(label)
-
- for (pos, cp) in enumerate(label):
- cp_value = ord(cp)
- if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
- continue
- elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
- try:
- if not valid_contextj(label, pos):
- raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(
- _unot(cp_value), pos+1, repr(label)))
- except ValueError:
- raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format(
- _unot(cp_value), pos+1, repr(label)))
- elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
- if not valid_contexto(label, pos):
- raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label)))
- else:
- raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
-
- check_bidi(label)
-
-
-def alabel(label):
-
- try:
- label = label.encode('ascii')
- ulabel(label)
- if not valid_label_length(label):
- raise IDNAError('Label too long')
- return label
- except UnicodeEncodeError:
- pass
-
- if not label:
- raise IDNAError('No Input')
-
- label = unicode(label)
- check_label(label)
- label = _punycode(label)
- label = _alabel_prefix + label
-
- if not valid_label_length(label):
- raise IDNAError('Label too long')
-
- return label
-
-
-def ulabel(label):
-
- if not isinstance(label, (bytes, bytearray)):
- try:
- label = label.encode('ascii')
- except UnicodeEncodeError:
- check_label(label)
- return label
-
- label = label.lower()
- if label.startswith(_alabel_prefix):
- label = label[len(_alabel_prefix):]
- if not label:
- raise IDNAError('Malformed A-label, no Punycode eligible content found')
- if label.decode('ascii')[-1] == '-':
- raise IDNAError('A-label must not end with a hyphen')
- else:
- check_label(label)
- return label.decode('ascii')
-
- label = label.decode('punycode')
- check_label(label)
- return label
-
-
-def uts46_remap(domain, std3_rules=True, transitional=False):
- """Re-map the characters in the string according to UTS46 processing."""
- from .uts46data import uts46data
- output = u""
- try:
- for pos, char in enumerate(domain):
- code_point = ord(char)
- uts46row = uts46data[code_point if code_point < 256 else
- bisect.bisect_left(uts46data, (code_point, "Z")) - 1]
- status = uts46row[1]
- replacement = uts46row[2] if len(uts46row) == 3 else None
- if (status == "V" or
- (status == "D" and not transitional) or
- (status == "3" and not std3_rules and replacement is None)):
- output += char
- elif replacement is not None and (status == "M" or
- (status == "3" and not std3_rules) or
- (status == "D" and transitional)):
- output += replacement
- elif status != "I":
- raise IndexError()
- return unicodedata.normalize("NFC", output)
- except IndexError:
- raise InvalidCodepoint(
- "Codepoint {0} not allowed at position {1} in {2}".format(
- _unot(code_point), pos + 1, repr(domain)))
-
-
-def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False):
-
- if isinstance(s, (bytes, bytearray)):
- s = s.decode("ascii")
- if uts46:
- s = uts46_remap(s, std3_rules, transitional)
- trailing_dot = False
- result = []
- if strict:
- labels = s.split('.')
- else:
- labels = _unicode_dots_re.split(s)
- if not labels or labels == ['']:
- raise IDNAError('Empty domain')
- if labels[-1] == '':
- del labels[-1]
- trailing_dot = True
- for label in labels:
- s = alabel(label)
- if s:
- result.append(s)
- else:
- raise IDNAError('Empty label')
- if trailing_dot:
- result.append(b'')
- s = b'.'.join(result)
- if not valid_string_length(s, trailing_dot):
- raise IDNAError('Domain too long')
- return s
-
-
-def decode(s, strict=False, uts46=False, std3_rules=False):
-
- if isinstance(s, (bytes, bytearray)):
- s = s.decode("ascii")
- if uts46:
- s = uts46_remap(s, std3_rules, False)
- trailing_dot = False
- result = []
- if not strict:
- labels = _unicode_dots_re.split(s)
- else:
- labels = s.split(u'.')
- if not labels or labels == ['']:
- raise IDNAError('Empty domain')
- if not labels[-1]:
- del labels[-1]
- trailing_dot = True
- for label in labels:
- s = ulabel(label)
- if s:
- result.append(s)
- else:
- raise IDNAError('Empty label')
- if trailing_dot:
- result.append(u'')
- return u'.'.join(result)
diff --git a/client/ayon_core/vendor/python/python_2/idna/idnadata.py b/client/ayon_core/vendor/python/python_2/idna/idnadata.py
deleted file mode 100644
index a284e4c84a..0000000000
--- a/client/ayon_core/vendor/python/python_2/idna/idnadata.py
+++ /dev/null
@@ -1,2050 +0,0 @@
-# This file is automatically generated by tools/idna-data
-
-__version__ = "13.0.0"
-scripts = {
- 'Greek': (
- 0x37000000374,
- 0x37500000378,
- 0x37a0000037e,
- 0x37f00000380,
- 0x38400000385,
- 0x38600000387,
- 0x3880000038b,
- 0x38c0000038d,
- 0x38e000003a2,
- 0x3a3000003e2,
- 0x3f000000400,
- 0x1d2600001d2b,
- 0x1d5d00001d62,
- 0x1d6600001d6b,
- 0x1dbf00001dc0,
- 0x1f0000001f16,
- 0x1f1800001f1e,
- 0x1f2000001f46,
- 0x1f4800001f4e,
- 0x1f5000001f58,
- 0x1f5900001f5a,
- 0x1f5b00001f5c,
- 0x1f5d00001f5e,
- 0x1f5f00001f7e,
- 0x1f8000001fb5,
- 0x1fb600001fc5,
- 0x1fc600001fd4,
- 0x1fd600001fdc,
- 0x1fdd00001ff0,
- 0x1ff200001ff5,
- 0x1ff600001fff,
- 0x212600002127,
- 0xab650000ab66,
- 0x101400001018f,
- 0x101a0000101a1,
- 0x1d2000001d246,
- ),
- 'Han': (
- 0x2e8000002e9a,
- 0x2e9b00002ef4,
- 0x2f0000002fd6,
- 0x300500003006,
- 0x300700003008,
- 0x30210000302a,
- 0x30380000303c,
- 0x340000004dc0,
- 0x4e0000009ffd,
- 0xf9000000fa6e,
- 0xfa700000fada,
- 0x16ff000016ff2,
- 0x200000002a6de,
- 0x2a7000002b735,
- 0x2b7400002b81e,
- 0x2b8200002cea2,
- 0x2ceb00002ebe1,
- 0x2f8000002fa1e,
- 0x300000003134b,
- ),
- 'Hebrew': (
- 0x591000005c8,
- 0x5d0000005eb,
- 0x5ef000005f5,
- 0xfb1d0000fb37,
- 0xfb380000fb3d,
- 0xfb3e0000fb3f,
- 0xfb400000fb42,
- 0xfb430000fb45,
- 0xfb460000fb50,
- ),
- 'Hiragana': (
- 0x304100003097,
- 0x309d000030a0,
- 0x1b0010001b11f,
- 0x1b1500001b153,
- 0x1f2000001f201,
- ),
- 'Katakana': (
- 0x30a1000030fb,
- 0x30fd00003100,
- 0x31f000003200,
- 0x32d0000032ff,
- 0x330000003358,
- 0xff660000ff70,
- 0xff710000ff9e,
- 0x1b0000001b001,
- 0x1b1640001b168,
- ),
-}
-joining_types = {
- 0x600: 85,
- 0x601: 85,
- 0x602: 85,
- 0x603: 85,
- 0x604: 85,
- 0x605: 85,
- 0x608: 85,
- 0x60b: 85,
- 0x620: 68,
- 0x621: 85,
- 0x622: 82,
- 0x623: 82,
- 0x624: 82,
- 0x625: 82,
- 0x626: 68,
- 0x627: 82,
- 0x628: 68,
- 0x629: 82,
- 0x62a: 68,
- 0x62b: 68,
- 0x62c: 68,
- 0x62d: 68,
- 0x62e: 68,
- 0x62f: 82,
- 0x630: 82,
- 0x631: 82,
- 0x632: 82,
- 0x633: 68,
- 0x634: 68,
- 0x635: 68,
- 0x636: 68,
- 0x637: 68,
- 0x638: 68,
- 0x639: 68,
- 0x63a: 68,
- 0x63b: 68,
- 0x63c: 68,
- 0x63d: 68,
- 0x63e: 68,
- 0x63f: 68,
- 0x640: 67,
- 0x641: 68,
- 0x642: 68,
- 0x643: 68,
- 0x644: 68,
- 0x645: 68,
- 0x646: 68,
- 0x647: 68,
- 0x648: 82,
- 0x649: 68,
- 0x64a: 68,
- 0x66e: 68,
- 0x66f: 68,
- 0x671: 82,
- 0x672: 82,
- 0x673: 82,
- 0x674: 85,
- 0x675: 82,
- 0x676: 82,
- 0x677: 82,
- 0x678: 68,
- 0x679: 68,
- 0x67a: 68,
- 0x67b: 68,
- 0x67c: 68,
- 0x67d: 68,
- 0x67e: 68,
- 0x67f: 68,
- 0x680: 68,
- 0x681: 68,
- 0x682: 68,
- 0x683: 68,
- 0x684: 68,
- 0x685: 68,
- 0x686: 68,
- 0x687: 68,
- 0x688: 82,
- 0x689: 82,
- 0x68a: 82,
- 0x68b: 82,
- 0x68c: 82,
- 0x68d: 82,
- 0x68e: 82,
- 0x68f: 82,
- 0x690: 82,
- 0x691: 82,
- 0x692: 82,
- 0x693: 82,
- 0x694: 82,
- 0x695: 82,
- 0x696: 82,
- 0x697: 82,
- 0x698: 82,
- 0x699: 82,
- 0x69a: 68,
- 0x69b: 68,
- 0x69c: 68,
- 0x69d: 68,
- 0x69e: 68,
- 0x69f: 68,
- 0x6a0: 68,
- 0x6a1: 68,
- 0x6a2: 68,
- 0x6a3: 68,
- 0x6a4: 68,
- 0x6a5: 68,
- 0x6a6: 68,
- 0x6a7: 68,
- 0x6a8: 68,
- 0x6a9: 68,
- 0x6aa: 68,
- 0x6ab: 68,
- 0x6ac: 68,
- 0x6ad: 68,
- 0x6ae: 68,
- 0x6af: 68,
- 0x6b0: 68,
- 0x6b1: 68,
- 0x6b2: 68,
- 0x6b3: 68,
- 0x6b4: 68,
- 0x6b5: 68,
- 0x6b6: 68,
- 0x6b7: 68,
- 0x6b8: 68,
- 0x6b9: 68,
- 0x6ba: 68,
- 0x6bb: 68,
- 0x6bc: 68,
- 0x6bd: 68,
- 0x6be: 68,
- 0x6bf: 68,
- 0x6c0: 82,
- 0x6c1: 68,
- 0x6c2: 68,
- 0x6c3: 82,
- 0x6c4: 82,
- 0x6c5: 82,
- 0x6c6: 82,
- 0x6c7: 82,
- 0x6c8: 82,
- 0x6c9: 82,
- 0x6ca: 82,
- 0x6cb: 82,
- 0x6cc: 68,
- 0x6cd: 82,
- 0x6ce: 68,
- 0x6cf: 82,
- 0x6d0: 68,
- 0x6d1: 68,
- 0x6d2: 82,
- 0x6d3: 82,
- 0x6d5: 82,
- 0x6dd: 85,
- 0x6ee: 82,
- 0x6ef: 82,
- 0x6fa: 68,
- 0x6fb: 68,
- 0x6fc: 68,
- 0x6ff: 68,
- 0x70f: 84,
- 0x710: 82,
- 0x712: 68,
- 0x713: 68,
- 0x714: 68,
- 0x715: 82,
- 0x716: 82,
- 0x717: 82,
- 0x718: 82,
- 0x719: 82,
- 0x71a: 68,
- 0x71b: 68,
- 0x71c: 68,
- 0x71d: 68,
- 0x71e: 82,
- 0x71f: 68,
- 0x720: 68,
- 0x721: 68,
- 0x722: 68,
- 0x723: 68,
- 0x724: 68,
- 0x725: 68,
- 0x726: 68,
- 0x727: 68,
- 0x728: 82,
- 0x729: 68,
- 0x72a: 82,
- 0x72b: 68,
- 0x72c: 82,
- 0x72d: 68,
- 0x72e: 68,
- 0x72f: 82,
- 0x74d: 82,
- 0x74e: 68,
- 0x74f: 68,
- 0x750: 68,
- 0x751: 68,
- 0x752: 68,
- 0x753: 68,
- 0x754: 68,
- 0x755: 68,
- 0x756: 68,
- 0x757: 68,
- 0x758: 68,
- 0x759: 82,
- 0x75a: 82,
- 0x75b: 82,
- 0x75c: 68,
- 0x75d: 68,
- 0x75e: 68,
- 0x75f: 68,
- 0x760: 68,
- 0x761: 68,
- 0x762: 68,
- 0x763: 68,
- 0x764: 68,
- 0x765: 68,
- 0x766: 68,
- 0x767: 68,
- 0x768: 68,
- 0x769: 68,
- 0x76a: 68,
- 0x76b: 82,
- 0x76c: 82,
- 0x76d: 68,
- 0x76e: 68,
- 0x76f: 68,
- 0x770: 68,
- 0x771: 82,
- 0x772: 68,
- 0x773: 82,
- 0x774: 82,
- 0x775: 68,
- 0x776: 68,
- 0x777: 68,
- 0x778: 82,
- 0x779: 82,
- 0x77a: 68,
- 0x77b: 68,
- 0x77c: 68,
- 0x77d: 68,
- 0x77e: 68,
- 0x77f: 68,
- 0x7ca: 68,
- 0x7cb: 68,
- 0x7cc: 68,
- 0x7cd: 68,
- 0x7ce: 68,
- 0x7cf: 68,
- 0x7d0: 68,
- 0x7d1: 68,
- 0x7d2: 68,
- 0x7d3: 68,
- 0x7d4: 68,
- 0x7d5: 68,
- 0x7d6: 68,
- 0x7d7: 68,
- 0x7d8: 68,
- 0x7d9: 68,
- 0x7da: 68,
- 0x7db: 68,
- 0x7dc: 68,
- 0x7dd: 68,
- 0x7de: 68,
- 0x7df: 68,
- 0x7e0: 68,
- 0x7e1: 68,
- 0x7e2: 68,
- 0x7e3: 68,
- 0x7e4: 68,
- 0x7e5: 68,
- 0x7e6: 68,
- 0x7e7: 68,
- 0x7e8: 68,
- 0x7e9: 68,
- 0x7ea: 68,
- 0x7fa: 67,
- 0x840: 82,
- 0x841: 68,
- 0x842: 68,
- 0x843: 68,
- 0x844: 68,
- 0x845: 68,
- 0x846: 82,
- 0x847: 82,
- 0x848: 68,
- 0x849: 82,
- 0x84a: 68,
- 0x84b: 68,
- 0x84c: 68,
- 0x84d: 68,
- 0x84e: 68,
- 0x84f: 68,
- 0x850: 68,
- 0x851: 68,
- 0x852: 68,
- 0x853: 68,
- 0x854: 82,
- 0x855: 68,
- 0x856: 82,
- 0x857: 82,
- 0x858: 82,
- 0x860: 68,
- 0x861: 85,
- 0x862: 68,
- 0x863: 68,
- 0x864: 68,
- 0x865: 68,
- 0x866: 85,
- 0x867: 82,
- 0x868: 68,
- 0x869: 82,
- 0x86a: 82,
- 0x8a0: 68,
- 0x8a1: 68,
- 0x8a2: 68,
- 0x8a3: 68,
- 0x8a4: 68,
- 0x8a5: 68,
- 0x8a6: 68,
- 0x8a7: 68,
- 0x8a8: 68,
- 0x8a9: 68,
- 0x8aa: 82,
- 0x8ab: 82,
- 0x8ac: 82,
- 0x8ad: 85,
- 0x8ae: 82,
- 0x8af: 68,
- 0x8b0: 68,
- 0x8b1: 82,
- 0x8b2: 82,
- 0x8b3: 68,
- 0x8b4: 68,
- 0x8b6: 68,
- 0x8b7: 68,
- 0x8b8: 68,
- 0x8b9: 82,
- 0x8ba: 68,
- 0x8bb: 68,
- 0x8bc: 68,
- 0x8bd: 68,
- 0x8be: 68,
- 0x8bf: 68,
- 0x8c0: 68,
- 0x8c1: 68,
- 0x8c2: 68,
- 0x8c3: 68,
- 0x8c4: 68,
- 0x8c5: 68,
- 0x8c6: 68,
- 0x8c7: 68,
- 0x8e2: 85,
- 0x1806: 85,
- 0x1807: 68,
- 0x180a: 67,
- 0x180e: 85,
- 0x1820: 68,
- 0x1821: 68,
- 0x1822: 68,
- 0x1823: 68,
- 0x1824: 68,
- 0x1825: 68,
- 0x1826: 68,
- 0x1827: 68,
- 0x1828: 68,
- 0x1829: 68,
- 0x182a: 68,
- 0x182b: 68,
- 0x182c: 68,
- 0x182d: 68,
- 0x182e: 68,
- 0x182f: 68,
- 0x1830: 68,
- 0x1831: 68,
- 0x1832: 68,
- 0x1833: 68,
- 0x1834: 68,
- 0x1835: 68,
- 0x1836: 68,
- 0x1837: 68,
- 0x1838: 68,
- 0x1839: 68,
- 0x183a: 68,
- 0x183b: 68,
- 0x183c: 68,
- 0x183d: 68,
- 0x183e: 68,
- 0x183f: 68,
- 0x1840: 68,
- 0x1841: 68,
- 0x1842: 68,
- 0x1843: 68,
- 0x1844: 68,
- 0x1845: 68,
- 0x1846: 68,
- 0x1847: 68,
- 0x1848: 68,
- 0x1849: 68,
- 0x184a: 68,
- 0x184b: 68,
- 0x184c: 68,
- 0x184d: 68,
- 0x184e: 68,
- 0x184f: 68,
- 0x1850: 68,
- 0x1851: 68,
- 0x1852: 68,
- 0x1853: 68,
- 0x1854: 68,
- 0x1855: 68,
- 0x1856: 68,
- 0x1857: 68,
- 0x1858: 68,
- 0x1859: 68,
- 0x185a: 68,
- 0x185b: 68,
- 0x185c: 68,
- 0x185d: 68,
- 0x185e: 68,
- 0x185f: 68,
- 0x1860: 68,
- 0x1861: 68,
- 0x1862: 68,
- 0x1863: 68,
- 0x1864: 68,
- 0x1865: 68,
- 0x1866: 68,
- 0x1867: 68,
- 0x1868: 68,
- 0x1869: 68,
- 0x186a: 68,
- 0x186b: 68,
- 0x186c: 68,
- 0x186d: 68,
- 0x186e: 68,
- 0x186f: 68,
- 0x1870: 68,
- 0x1871: 68,
- 0x1872: 68,
- 0x1873: 68,
- 0x1874: 68,
- 0x1875: 68,
- 0x1876: 68,
- 0x1877: 68,
- 0x1878: 68,
- 0x1880: 85,
- 0x1881: 85,
- 0x1882: 85,
- 0x1883: 85,
- 0x1884: 85,
- 0x1885: 84,
- 0x1886: 84,
- 0x1887: 68,
- 0x1888: 68,
- 0x1889: 68,
- 0x188a: 68,
- 0x188b: 68,
- 0x188c: 68,
- 0x188d: 68,
- 0x188e: 68,
- 0x188f: 68,
- 0x1890: 68,
- 0x1891: 68,
- 0x1892: 68,
- 0x1893: 68,
- 0x1894: 68,
- 0x1895: 68,
- 0x1896: 68,
- 0x1897: 68,
- 0x1898: 68,
- 0x1899: 68,
- 0x189a: 68,
- 0x189b: 68,
- 0x189c: 68,
- 0x189d: 68,
- 0x189e: 68,
- 0x189f: 68,
- 0x18a0: 68,
- 0x18a1: 68,
- 0x18a2: 68,
- 0x18a3: 68,
- 0x18a4: 68,
- 0x18a5: 68,
- 0x18a6: 68,
- 0x18a7: 68,
- 0x18a8: 68,
- 0x18aa: 68,
- 0x200c: 85,
- 0x200d: 67,
- 0x202f: 85,
- 0x2066: 85,
- 0x2067: 85,
- 0x2068: 85,
- 0x2069: 85,
- 0xa840: 68,
- 0xa841: 68,
- 0xa842: 68,
- 0xa843: 68,
- 0xa844: 68,
- 0xa845: 68,
- 0xa846: 68,
- 0xa847: 68,
- 0xa848: 68,
- 0xa849: 68,
- 0xa84a: 68,
- 0xa84b: 68,
- 0xa84c: 68,
- 0xa84d: 68,
- 0xa84e: 68,
- 0xa84f: 68,
- 0xa850: 68,
- 0xa851: 68,
- 0xa852: 68,
- 0xa853: 68,
- 0xa854: 68,
- 0xa855: 68,
- 0xa856: 68,
- 0xa857: 68,
- 0xa858: 68,
- 0xa859: 68,
- 0xa85a: 68,
- 0xa85b: 68,
- 0xa85c: 68,
- 0xa85d: 68,
- 0xa85e: 68,
- 0xa85f: 68,
- 0xa860: 68,
- 0xa861: 68,
- 0xa862: 68,
- 0xa863: 68,
- 0xa864: 68,
- 0xa865: 68,
- 0xa866: 68,
- 0xa867: 68,
- 0xa868: 68,
- 0xa869: 68,
- 0xa86a: 68,
- 0xa86b: 68,
- 0xa86c: 68,
- 0xa86d: 68,
- 0xa86e: 68,
- 0xa86f: 68,
- 0xa870: 68,
- 0xa871: 68,
- 0xa872: 76,
- 0xa873: 85,
- 0x10ac0: 68,
- 0x10ac1: 68,
- 0x10ac2: 68,
- 0x10ac3: 68,
- 0x10ac4: 68,
- 0x10ac5: 82,
- 0x10ac6: 85,
- 0x10ac7: 82,
- 0x10ac8: 85,
- 0x10ac9: 82,
- 0x10aca: 82,
- 0x10acb: 85,
- 0x10acc: 85,
- 0x10acd: 76,
- 0x10ace: 82,
- 0x10acf: 82,
- 0x10ad0: 82,
- 0x10ad1: 82,
- 0x10ad2: 82,
- 0x10ad3: 68,
- 0x10ad4: 68,
- 0x10ad5: 68,
- 0x10ad6: 68,
- 0x10ad7: 76,
- 0x10ad8: 68,
- 0x10ad9: 68,
- 0x10ada: 68,
- 0x10adb: 68,
- 0x10adc: 68,
- 0x10add: 82,
- 0x10ade: 68,
- 0x10adf: 68,
- 0x10ae0: 68,
- 0x10ae1: 82,
- 0x10ae2: 85,
- 0x10ae3: 85,
- 0x10ae4: 82,
- 0x10aeb: 68,
- 0x10aec: 68,
- 0x10aed: 68,
- 0x10aee: 68,
- 0x10aef: 82,
- 0x10b80: 68,
- 0x10b81: 82,
- 0x10b82: 68,
- 0x10b83: 82,
- 0x10b84: 82,
- 0x10b85: 82,
- 0x10b86: 68,
- 0x10b87: 68,
- 0x10b88: 68,
- 0x10b89: 82,
- 0x10b8a: 68,
- 0x10b8b: 68,
- 0x10b8c: 82,
- 0x10b8d: 68,
- 0x10b8e: 82,
- 0x10b8f: 82,
- 0x10b90: 68,
- 0x10b91: 82,
- 0x10ba9: 82,
- 0x10baa: 82,
- 0x10bab: 82,
- 0x10bac: 82,
- 0x10bad: 68,
- 0x10bae: 68,
- 0x10baf: 85,
- 0x10d00: 76,
- 0x10d01: 68,
- 0x10d02: 68,
- 0x10d03: 68,
- 0x10d04: 68,
- 0x10d05: 68,
- 0x10d06: 68,
- 0x10d07: 68,
- 0x10d08: 68,
- 0x10d09: 68,
- 0x10d0a: 68,
- 0x10d0b: 68,
- 0x10d0c: 68,
- 0x10d0d: 68,
- 0x10d0e: 68,
- 0x10d0f: 68,
- 0x10d10: 68,
- 0x10d11: 68,
- 0x10d12: 68,
- 0x10d13: 68,
- 0x10d14: 68,
- 0x10d15: 68,
- 0x10d16: 68,
- 0x10d17: 68,
- 0x10d18: 68,
- 0x10d19: 68,
- 0x10d1a: 68,
- 0x10d1b: 68,
- 0x10d1c: 68,
- 0x10d1d: 68,
- 0x10d1e: 68,
- 0x10d1f: 68,
- 0x10d20: 68,
- 0x10d21: 68,
- 0x10d22: 82,
- 0x10d23: 68,
- 0x10f30: 68,
- 0x10f31: 68,
- 0x10f32: 68,
- 0x10f33: 82,
- 0x10f34: 68,
- 0x10f35: 68,
- 0x10f36: 68,
- 0x10f37: 68,
- 0x10f38: 68,
- 0x10f39: 68,
- 0x10f3a: 68,
- 0x10f3b: 68,
- 0x10f3c: 68,
- 0x10f3d: 68,
- 0x10f3e: 68,
- 0x10f3f: 68,
- 0x10f40: 68,
- 0x10f41: 68,
- 0x10f42: 68,
- 0x10f43: 68,
- 0x10f44: 68,
- 0x10f45: 85,
- 0x10f51: 68,
- 0x10f52: 68,
- 0x10f53: 68,
- 0x10f54: 82,
- 0x10fb0: 68,
- 0x10fb1: 85,
- 0x10fb2: 68,
- 0x10fb3: 68,
- 0x10fb4: 82,
- 0x10fb5: 82,
- 0x10fb6: 82,
- 0x10fb7: 85,
- 0x10fb8: 68,
- 0x10fb9: 82,
- 0x10fba: 82,
- 0x10fbb: 68,
- 0x10fbc: 68,
- 0x10fbd: 82,
- 0x10fbe: 68,
- 0x10fbf: 68,
- 0x10fc0: 85,
- 0x10fc1: 68,
- 0x10fc2: 82,
- 0x10fc3: 82,
- 0x10fc4: 68,
- 0x10fc5: 85,
- 0x10fc6: 85,
- 0x10fc7: 85,
- 0x10fc8: 85,
- 0x10fc9: 82,
- 0x10fca: 68,
- 0x10fcb: 76,
- 0x110bd: 85,
- 0x110cd: 85,
- 0x1e900: 68,
- 0x1e901: 68,
- 0x1e902: 68,
- 0x1e903: 68,
- 0x1e904: 68,
- 0x1e905: 68,
- 0x1e906: 68,
- 0x1e907: 68,
- 0x1e908: 68,
- 0x1e909: 68,
- 0x1e90a: 68,
- 0x1e90b: 68,
- 0x1e90c: 68,
- 0x1e90d: 68,
- 0x1e90e: 68,
- 0x1e90f: 68,
- 0x1e910: 68,
- 0x1e911: 68,
- 0x1e912: 68,
- 0x1e913: 68,
- 0x1e914: 68,
- 0x1e915: 68,
- 0x1e916: 68,
- 0x1e917: 68,
- 0x1e918: 68,
- 0x1e919: 68,
- 0x1e91a: 68,
- 0x1e91b: 68,
- 0x1e91c: 68,
- 0x1e91d: 68,
- 0x1e91e: 68,
- 0x1e91f: 68,
- 0x1e920: 68,
- 0x1e921: 68,
- 0x1e922: 68,
- 0x1e923: 68,
- 0x1e924: 68,
- 0x1e925: 68,
- 0x1e926: 68,
- 0x1e927: 68,
- 0x1e928: 68,
- 0x1e929: 68,
- 0x1e92a: 68,
- 0x1e92b: 68,
- 0x1e92c: 68,
- 0x1e92d: 68,
- 0x1e92e: 68,
- 0x1e92f: 68,
- 0x1e930: 68,
- 0x1e931: 68,
- 0x1e932: 68,
- 0x1e933: 68,
- 0x1e934: 68,
- 0x1e935: 68,
- 0x1e936: 68,
- 0x1e937: 68,
- 0x1e938: 68,
- 0x1e939: 68,
- 0x1e93a: 68,
- 0x1e93b: 68,
- 0x1e93c: 68,
- 0x1e93d: 68,
- 0x1e93e: 68,
- 0x1e93f: 68,
- 0x1e940: 68,
- 0x1e941: 68,
- 0x1e942: 68,
- 0x1e943: 68,
- 0x1e94b: 84,
-}
-codepoint_classes = {
- 'PVALID': (
- 0x2d0000002e,
- 0x300000003a,
- 0x610000007b,
- 0xdf000000f7,
- 0xf800000100,
- 0x10100000102,
- 0x10300000104,
- 0x10500000106,
- 0x10700000108,
- 0x1090000010a,
- 0x10b0000010c,
- 0x10d0000010e,
- 0x10f00000110,
- 0x11100000112,
- 0x11300000114,
- 0x11500000116,
- 0x11700000118,
- 0x1190000011a,
- 0x11b0000011c,
- 0x11d0000011e,
- 0x11f00000120,
- 0x12100000122,
- 0x12300000124,
- 0x12500000126,
- 0x12700000128,
- 0x1290000012a,
- 0x12b0000012c,
- 0x12d0000012e,
- 0x12f00000130,
- 0x13100000132,
- 0x13500000136,
- 0x13700000139,
- 0x13a0000013b,
- 0x13c0000013d,
- 0x13e0000013f,
- 0x14200000143,
- 0x14400000145,
- 0x14600000147,
- 0x14800000149,
- 0x14b0000014c,
- 0x14d0000014e,
- 0x14f00000150,
- 0x15100000152,
- 0x15300000154,
- 0x15500000156,
- 0x15700000158,
- 0x1590000015a,
- 0x15b0000015c,
- 0x15d0000015e,
- 0x15f00000160,
- 0x16100000162,
- 0x16300000164,
- 0x16500000166,
- 0x16700000168,
- 0x1690000016a,
- 0x16b0000016c,
- 0x16d0000016e,
- 0x16f00000170,
- 0x17100000172,
- 0x17300000174,
- 0x17500000176,
- 0x17700000178,
- 0x17a0000017b,
- 0x17c0000017d,
- 0x17e0000017f,
- 0x18000000181,
- 0x18300000184,
- 0x18500000186,
- 0x18800000189,
- 0x18c0000018e,
- 0x19200000193,
- 0x19500000196,
- 0x1990000019c,
- 0x19e0000019f,
- 0x1a1000001a2,
- 0x1a3000001a4,
- 0x1a5000001a6,
- 0x1a8000001a9,
- 0x1aa000001ac,
- 0x1ad000001ae,
- 0x1b0000001b1,
- 0x1b4000001b5,
- 0x1b6000001b7,
- 0x1b9000001bc,
- 0x1bd000001c4,
- 0x1ce000001cf,
- 0x1d0000001d1,
- 0x1d2000001d3,
- 0x1d4000001d5,
- 0x1d6000001d7,
- 0x1d8000001d9,
- 0x1da000001db,
- 0x1dc000001de,
- 0x1df000001e0,
- 0x1e1000001e2,
- 0x1e3000001e4,
- 0x1e5000001e6,
- 0x1e7000001e8,
- 0x1e9000001ea,
- 0x1eb000001ec,
- 0x1ed000001ee,
- 0x1ef000001f1,
- 0x1f5000001f6,
- 0x1f9000001fa,
- 0x1fb000001fc,
- 0x1fd000001fe,
- 0x1ff00000200,
- 0x20100000202,
- 0x20300000204,
- 0x20500000206,
- 0x20700000208,
- 0x2090000020a,
- 0x20b0000020c,
- 0x20d0000020e,
- 0x20f00000210,
- 0x21100000212,
- 0x21300000214,
- 0x21500000216,
- 0x21700000218,
- 0x2190000021a,
- 0x21b0000021c,
- 0x21d0000021e,
- 0x21f00000220,
- 0x22100000222,
- 0x22300000224,
- 0x22500000226,
- 0x22700000228,
- 0x2290000022a,
- 0x22b0000022c,
- 0x22d0000022e,
- 0x22f00000230,
- 0x23100000232,
- 0x2330000023a,
- 0x23c0000023d,
- 0x23f00000241,
- 0x24200000243,
- 0x24700000248,
- 0x2490000024a,
- 0x24b0000024c,
- 0x24d0000024e,
- 0x24f000002b0,
- 0x2b9000002c2,
- 0x2c6000002d2,
- 0x2ec000002ed,
- 0x2ee000002ef,
- 0x30000000340,
- 0x34200000343,
- 0x3460000034f,
- 0x35000000370,
- 0x37100000372,
- 0x37300000374,
- 0x37700000378,
- 0x37b0000037e,
- 0x39000000391,
- 0x3ac000003cf,
- 0x3d7000003d8,
- 0x3d9000003da,
- 0x3db000003dc,
- 0x3dd000003de,
- 0x3df000003e0,
- 0x3e1000003e2,
- 0x3e3000003e4,
- 0x3e5000003e6,
- 0x3e7000003e8,
- 0x3e9000003ea,
- 0x3eb000003ec,
- 0x3ed000003ee,
- 0x3ef000003f0,
- 0x3f3000003f4,
- 0x3f8000003f9,
- 0x3fb000003fd,
- 0x43000000460,
- 0x46100000462,
- 0x46300000464,
- 0x46500000466,
- 0x46700000468,
- 0x4690000046a,
- 0x46b0000046c,
- 0x46d0000046e,
- 0x46f00000470,
- 0x47100000472,
- 0x47300000474,
- 0x47500000476,
- 0x47700000478,
- 0x4790000047a,
- 0x47b0000047c,
- 0x47d0000047e,
- 0x47f00000480,
- 0x48100000482,
- 0x48300000488,
- 0x48b0000048c,
- 0x48d0000048e,
- 0x48f00000490,
- 0x49100000492,
- 0x49300000494,
- 0x49500000496,
- 0x49700000498,
- 0x4990000049a,
- 0x49b0000049c,
- 0x49d0000049e,
- 0x49f000004a0,
- 0x4a1000004a2,
- 0x4a3000004a4,
- 0x4a5000004a6,
- 0x4a7000004a8,
- 0x4a9000004aa,
- 0x4ab000004ac,
- 0x4ad000004ae,
- 0x4af000004b0,
- 0x4b1000004b2,
- 0x4b3000004b4,
- 0x4b5000004b6,
- 0x4b7000004b8,
- 0x4b9000004ba,
- 0x4bb000004bc,
- 0x4bd000004be,
- 0x4bf000004c0,
- 0x4c2000004c3,
- 0x4c4000004c5,
- 0x4c6000004c7,
- 0x4c8000004c9,
- 0x4ca000004cb,
- 0x4cc000004cd,
- 0x4ce000004d0,
- 0x4d1000004d2,
- 0x4d3000004d4,
- 0x4d5000004d6,
- 0x4d7000004d8,
- 0x4d9000004da,
- 0x4db000004dc,
- 0x4dd000004de,
- 0x4df000004e0,
- 0x4e1000004e2,
- 0x4e3000004e4,
- 0x4e5000004e6,
- 0x4e7000004e8,
- 0x4e9000004ea,
- 0x4eb000004ec,
- 0x4ed000004ee,
- 0x4ef000004f0,
- 0x4f1000004f2,
- 0x4f3000004f4,
- 0x4f5000004f6,
- 0x4f7000004f8,
- 0x4f9000004fa,
- 0x4fb000004fc,
- 0x4fd000004fe,
- 0x4ff00000500,
- 0x50100000502,
- 0x50300000504,
- 0x50500000506,
- 0x50700000508,
- 0x5090000050a,
- 0x50b0000050c,
- 0x50d0000050e,
- 0x50f00000510,
- 0x51100000512,
- 0x51300000514,
- 0x51500000516,
- 0x51700000518,
- 0x5190000051a,
- 0x51b0000051c,
- 0x51d0000051e,
- 0x51f00000520,
- 0x52100000522,
- 0x52300000524,
- 0x52500000526,
- 0x52700000528,
- 0x5290000052a,
- 0x52b0000052c,
- 0x52d0000052e,
- 0x52f00000530,
- 0x5590000055a,
- 0x56000000587,
- 0x58800000589,
- 0x591000005be,
- 0x5bf000005c0,
- 0x5c1000005c3,
- 0x5c4000005c6,
- 0x5c7000005c8,
- 0x5d0000005eb,
- 0x5ef000005f3,
- 0x6100000061b,
- 0x62000000640,
- 0x64100000660,
- 0x66e00000675,
- 0x679000006d4,
- 0x6d5000006dd,
- 0x6df000006e9,
- 0x6ea000006f0,
- 0x6fa00000700,
- 0x7100000074b,
- 0x74d000007b2,
- 0x7c0000007f6,
- 0x7fd000007fe,
- 0x8000000082e,
- 0x8400000085c,
- 0x8600000086b,
- 0x8a0000008b5,
- 0x8b6000008c8,
- 0x8d3000008e2,
- 0x8e300000958,
- 0x96000000964,
- 0x96600000970,
- 0x97100000984,
- 0x9850000098d,
- 0x98f00000991,
- 0x993000009a9,
- 0x9aa000009b1,
- 0x9b2000009b3,
- 0x9b6000009ba,
- 0x9bc000009c5,
- 0x9c7000009c9,
- 0x9cb000009cf,
- 0x9d7000009d8,
- 0x9e0000009e4,
- 0x9e6000009f2,
- 0x9fc000009fd,
- 0x9fe000009ff,
- 0xa0100000a04,
- 0xa0500000a0b,
- 0xa0f00000a11,
- 0xa1300000a29,
- 0xa2a00000a31,
- 0xa3200000a33,
- 0xa3500000a36,
- 0xa3800000a3a,
- 0xa3c00000a3d,
- 0xa3e00000a43,
- 0xa4700000a49,
- 0xa4b00000a4e,
- 0xa5100000a52,
- 0xa5c00000a5d,
- 0xa6600000a76,
- 0xa8100000a84,
- 0xa8500000a8e,
- 0xa8f00000a92,
- 0xa9300000aa9,
- 0xaaa00000ab1,
- 0xab200000ab4,
- 0xab500000aba,
- 0xabc00000ac6,
- 0xac700000aca,
- 0xacb00000ace,
- 0xad000000ad1,
- 0xae000000ae4,
- 0xae600000af0,
- 0xaf900000b00,
- 0xb0100000b04,
- 0xb0500000b0d,
- 0xb0f00000b11,
- 0xb1300000b29,
- 0xb2a00000b31,
- 0xb3200000b34,
- 0xb3500000b3a,
- 0xb3c00000b45,
- 0xb4700000b49,
- 0xb4b00000b4e,
- 0xb5500000b58,
- 0xb5f00000b64,
- 0xb6600000b70,
- 0xb7100000b72,
- 0xb8200000b84,
- 0xb8500000b8b,
- 0xb8e00000b91,
- 0xb9200000b96,
- 0xb9900000b9b,
- 0xb9c00000b9d,
- 0xb9e00000ba0,
- 0xba300000ba5,
- 0xba800000bab,
- 0xbae00000bba,
- 0xbbe00000bc3,
- 0xbc600000bc9,
- 0xbca00000bce,
- 0xbd000000bd1,
- 0xbd700000bd8,
- 0xbe600000bf0,
- 0xc0000000c0d,
- 0xc0e00000c11,
- 0xc1200000c29,
- 0xc2a00000c3a,
- 0xc3d00000c45,
- 0xc4600000c49,
- 0xc4a00000c4e,
- 0xc5500000c57,
- 0xc5800000c5b,
- 0xc6000000c64,
- 0xc6600000c70,
- 0xc8000000c84,
- 0xc8500000c8d,
- 0xc8e00000c91,
- 0xc9200000ca9,
- 0xcaa00000cb4,
- 0xcb500000cba,
- 0xcbc00000cc5,
- 0xcc600000cc9,
- 0xcca00000cce,
- 0xcd500000cd7,
- 0xcde00000cdf,
- 0xce000000ce4,
- 0xce600000cf0,
- 0xcf100000cf3,
- 0xd0000000d0d,
- 0xd0e00000d11,
- 0xd1200000d45,
- 0xd4600000d49,
- 0xd4a00000d4f,
- 0xd5400000d58,
- 0xd5f00000d64,
- 0xd6600000d70,
- 0xd7a00000d80,
- 0xd8100000d84,
- 0xd8500000d97,
- 0xd9a00000db2,
- 0xdb300000dbc,
- 0xdbd00000dbe,
- 0xdc000000dc7,
- 0xdca00000dcb,
- 0xdcf00000dd5,
- 0xdd600000dd7,
- 0xdd800000de0,
- 0xde600000df0,
- 0xdf200000df4,
- 0xe0100000e33,
- 0xe3400000e3b,
- 0xe4000000e4f,
- 0xe5000000e5a,
- 0xe8100000e83,
- 0xe8400000e85,
- 0xe8600000e8b,
- 0xe8c00000ea4,
- 0xea500000ea6,
- 0xea700000eb3,
- 0xeb400000ebe,
- 0xec000000ec5,
- 0xec600000ec7,
- 0xec800000ece,
- 0xed000000eda,
- 0xede00000ee0,
- 0xf0000000f01,
- 0xf0b00000f0c,
- 0xf1800000f1a,
- 0xf2000000f2a,
- 0xf3500000f36,
- 0xf3700000f38,
- 0xf3900000f3a,
- 0xf3e00000f43,
- 0xf4400000f48,
- 0xf4900000f4d,
- 0xf4e00000f52,
- 0xf5300000f57,
- 0xf5800000f5c,
- 0xf5d00000f69,
- 0xf6a00000f6d,
- 0xf7100000f73,
- 0xf7400000f75,
- 0xf7a00000f81,
- 0xf8200000f85,
- 0xf8600000f93,
- 0xf9400000f98,
- 0xf9900000f9d,
- 0xf9e00000fa2,
- 0xfa300000fa7,
- 0xfa800000fac,
- 0xfad00000fb9,
- 0xfba00000fbd,
- 0xfc600000fc7,
- 0x10000000104a,
- 0x10500000109e,
- 0x10d0000010fb,
- 0x10fd00001100,
- 0x120000001249,
- 0x124a0000124e,
- 0x125000001257,
- 0x125800001259,
- 0x125a0000125e,
- 0x126000001289,
- 0x128a0000128e,
- 0x1290000012b1,
- 0x12b2000012b6,
- 0x12b8000012bf,
- 0x12c0000012c1,
- 0x12c2000012c6,
- 0x12c8000012d7,
- 0x12d800001311,
- 0x131200001316,
- 0x13180000135b,
- 0x135d00001360,
- 0x138000001390,
- 0x13a0000013f6,
- 0x14010000166d,
- 0x166f00001680,
- 0x16810000169b,
- 0x16a0000016eb,
- 0x16f1000016f9,
- 0x17000000170d,
- 0x170e00001715,
- 0x172000001735,
- 0x174000001754,
- 0x17600000176d,
- 0x176e00001771,
- 0x177200001774,
- 0x1780000017b4,
- 0x17b6000017d4,
- 0x17d7000017d8,
- 0x17dc000017de,
- 0x17e0000017ea,
- 0x18100000181a,
- 0x182000001879,
- 0x1880000018ab,
- 0x18b0000018f6,
- 0x19000000191f,
- 0x19200000192c,
- 0x19300000193c,
- 0x19460000196e,
- 0x197000001975,
- 0x1980000019ac,
- 0x19b0000019ca,
- 0x19d0000019da,
- 0x1a0000001a1c,
- 0x1a2000001a5f,
- 0x1a6000001a7d,
- 0x1a7f00001a8a,
- 0x1a9000001a9a,
- 0x1aa700001aa8,
- 0x1ab000001abe,
- 0x1abf00001ac1,
- 0x1b0000001b4c,
- 0x1b5000001b5a,
- 0x1b6b00001b74,
- 0x1b8000001bf4,
- 0x1c0000001c38,
- 0x1c4000001c4a,
- 0x1c4d00001c7e,
- 0x1cd000001cd3,
- 0x1cd400001cfb,
- 0x1d0000001d2c,
- 0x1d2f00001d30,
- 0x1d3b00001d3c,
- 0x1d4e00001d4f,
- 0x1d6b00001d78,
- 0x1d7900001d9b,
- 0x1dc000001dfa,
- 0x1dfb00001e00,
- 0x1e0100001e02,
- 0x1e0300001e04,
- 0x1e0500001e06,
- 0x1e0700001e08,
- 0x1e0900001e0a,
- 0x1e0b00001e0c,
- 0x1e0d00001e0e,
- 0x1e0f00001e10,
- 0x1e1100001e12,
- 0x1e1300001e14,
- 0x1e1500001e16,
- 0x1e1700001e18,
- 0x1e1900001e1a,
- 0x1e1b00001e1c,
- 0x1e1d00001e1e,
- 0x1e1f00001e20,
- 0x1e2100001e22,
- 0x1e2300001e24,
- 0x1e2500001e26,
- 0x1e2700001e28,
- 0x1e2900001e2a,
- 0x1e2b00001e2c,
- 0x1e2d00001e2e,
- 0x1e2f00001e30,
- 0x1e3100001e32,
- 0x1e3300001e34,
- 0x1e3500001e36,
- 0x1e3700001e38,
- 0x1e3900001e3a,
- 0x1e3b00001e3c,
- 0x1e3d00001e3e,
- 0x1e3f00001e40,
- 0x1e4100001e42,
- 0x1e4300001e44,
- 0x1e4500001e46,
- 0x1e4700001e48,
- 0x1e4900001e4a,
- 0x1e4b00001e4c,
- 0x1e4d00001e4e,
- 0x1e4f00001e50,
- 0x1e5100001e52,
- 0x1e5300001e54,
- 0x1e5500001e56,
- 0x1e5700001e58,
- 0x1e5900001e5a,
- 0x1e5b00001e5c,
- 0x1e5d00001e5e,
- 0x1e5f00001e60,
- 0x1e6100001e62,
- 0x1e6300001e64,
- 0x1e6500001e66,
- 0x1e6700001e68,
- 0x1e6900001e6a,
- 0x1e6b00001e6c,
- 0x1e6d00001e6e,
- 0x1e6f00001e70,
- 0x1e7100001e72,
- 0x1e7300001e74,
- 0x1e7500001e76,
- 0x1e7700001e78,
- 0x1e7900001e7a,
- 0x1e7b00001e7c,
- 0x1e7d00001e7e,
- 0x1e7f00001e80,
- 0x1e8100001e82,
- 0x1e8300001e84,
- 0x1e8500001e86,
- 0x1e8700001e88,
- 0x1e8900001e8a,
- 0x1e8b00001e8c,
- 0x1e8d00001e8e,
- 0x1e8f00001e90,
- 0x1e9100001e92,
- 0x1e9300001e94,
- 0x1e9500001e9a,
- 0x1e9c00001e9e,
- 0x1e9f00001ea0,
- 0x1ea100001ea2,
- 0x1ea300001ea4,
- 0x1ea500001ea6,
- 0x1ea700001ea8,
- 0x1ea900001eaa,
- 0x1eab00001eac,
- 0x1ead00001eae,
- 0x1eaf00001eb0,
- 0x1eb100001eb2,
- 0x1eb300001eb4,
- 0x1eb500001eb6,
- 0x1eb700001eb8,
- 0x1eb900001eba,
- 0x1ebb00001ebc,
- 0x1ebd00001ebe,
- 0x1ebf00001ec0,
- 0x1ec100001ec2,
- 0x1ec300001ec4,
- 0x1ec500001ec6,
- 0x1ec700001ec8,
- 0x1ec900001eca,
- 0x1ecb00001ecc,
- 0x1ecd00001ece,
- 0x1ecf00001ed0,
- 0x1ed100001ed2,
- 0x1ed300001ed4,
- 0x1ed500001ed6,
- 0x1ed700001ed8,
- 0x1ed900001eda,
- 0x1edb00001edc,
- 0x1edd00001ede,
- 0x1edf00001ee0,
- 0x1ee100001ee2,
- 0x1ee300001ee4,
- 0x1ee500001ee6,
- 0x1ee700001ee8,
- 0x1ee900001eea,
- 0x1eeb00001eec,
- 0x1eed00001eee,
- 0x1eef00001ef0,
- 0x1ef100001ef2,
- 0x1ef300001ef4,
- 0x1ef500001ef6,
- 0x1ef700001ef8,
- 0x1ef900001efa,
- 0x1efb00001efc,
- 0x1efd00001efe,
- 0x1eff00001f08,
- 0x1f1000001f16,
- 0x1f2000001f28,
- 0x1f3000001f38,
- 0x1f4000001f46,
- 0x1f5000001f58,
- 0x1f6000001f68,
- 0x1f7000001f71,
- 0x1f7200001f73,
- 0x1f7400001f75,
- 0x1f7600001f77,
- 0x1f7800001f79,
- 0x1f7a00001f7b,
- 0x1f7c00001f7d,
- 0x1fb000001fb2,
- 0x1fb600001fb7,
- 0x1fc600001fc7,
- 0x1fd000001fd3,
- 0x1fd600001fd8,
- 0x1fe000001fe3,
- 0x1fe400001fe8,
- 0x1ff600001ff7,
- 0x214e0000214f,
- 0x218400002185,
- 0x2c3000002c5f,
- 0x2c6100002c62,
- 0x2c6500002c67,
- 0x2c6800002c69,
- 0x2c6a00002c6b,
- 0x2c6c00002c6d,
- 0x2c7100002c72,
- 0x2c7300002c75,
- 0x2c7600002c7c,
- 0x2c8100002c82,
- 0x2c8300002c84,
- 0x2c8500002c86,
- 0x2c8700002c88,
- 0x2c8900002c8a,
- 0x2c8b00002c8c,
- 0x2c8d00002c8e,
- 0x2c8f00002c90,
- 0x2c9100002c92,
- 0x2c9300002c94,
- 0x2c9500002c96,
- 0x2c9700002c98,
- 0x2c9900002c9a,
- 0x2c9b00002c9c,
- 0x2c9d00002c9e,
- 0x2c9f00002ca0,
- 0x2ca100002ca2,
- 0x2ca300002ca4,
- 0x2ca500002ca6,
- 0x2ca700002ca8,
- 0x2ca900002caa,
- 0x2cab00002cac,
- 0x2cad00002cae,
- 0x2caf00002cb0,
- 0x2cb100002cb2,
- 0x2cb300002cb4,
- 0x2cb500002cb6,
- 0x2cb700002cb8,
- 0x2cb900002cba,
- 0x2cbb00002cbc,
- 0x2cbd00002cbe,
- 0x2cbf00002cc0,
- 0x2cc100002cc2,
- 0x2cc300002cc4,
- 0x2cc500002cc6,
- 0x2cc700002cc8,
- 0x2cc900002cca,
- 0x2ccb00002ccc,
- 0x2ccd00002cce,
- 0x2ccf00002cd0,
- 0x2cd100002cd2,
- 0x2cd300002cd4,
- 0x2cd500002cd6,
- 0x2cd700002cd8,
- 0x2cd900002cda,
- 0x2cdb00002cdc,
- 0x2cdd00002cde,
- 0x2cdf00002ce0,
- 0x2ce100002ce2,
- 0x2ce300002ce5,
- 0x2cec00002ced,
- 0x2cee00002cf2,
- 0x2cf300002cf4,
- 0x2d0000002d26,
- 0x2d2700002d28,
- 0x2d2d00002d2e,
- 0x2d3000002d68,
- 0x2d7f00002d97,
- 0x2da000002da7,
- 0x2da800002daf,
- 0x2db000002db7,
- 0x2db800002dbf,
- 0x2dc000002dc7,
- 0x2dc800002dcf,
- 0x2dd000002dd7,
- 0x2dd800002ddf,
- 0x2de000002e00,
- 0x2e2f00002e30,
- 0x300500003008,
- 0x302a0000302e,
- 0x303c0000303d,
- 0x304100003097,
- 0x30990000309b,
- 0x309d0000309f,
- 0x30a1000030fb,
- 0x30fc000030ff,
- 0x310500003130,
- 0x31a0000031c0,
- 0x31f000003200,
- 0x340000004dc0,
- 0x4e0000009ffd,
- 0xa0000000a48d,
- 0xa4d00000a4fe,
- 0xa5000000a60d,
- 0xa6100000a62c,
- 0xa6410000a642,
- 0xa6430000a644,
- 0xa6450000a646,
- 0xa6470000a648,
- 0xa6490000a64a,
- 0xa64b0000a64c,
- 0xa64d0000a64e,
- 0xa64f0000a650,
- 0xa6510000a652,
- 0xa6530000a654,
- 0xa6550000a656,
- 0xa6570000a658,
- 0xa6590000a65a,
- 0xa65b0000a65c,
- 0xa65d0000a65e,
- 0xa65f0000a660,
- 0xa6610000a662,
- 0xa6630000a664,
- 0xa6650000a666,
- 0xa6670000a668,
- 0xa6690000a66a,
- 0xa66b0000a66c,
- 0xa66d0000a670,
- 0xa6740000a67e,
- 0xa67f0000a680,
- 0xa6810000a682,
- 0xa6830000a684,
- 0xa6850000a686,
- 0xa6870000a688,
- 0xa6890000a68a,
- 0xa68b0000a68c,
- 0xa68d0000a68e,
- 0xa68f0000a690,
- 0xa6910000a692,
- 0xa6930000a694,
- 0xa6950000a696,
- 0xa6970000a698,
- 0xa6990000a69a,
- 0xa69b0000a69c,
- 0xa69e0000a6e6,
- 0xa6f00000a6f2,
- 0xa7170000a720,
- 0xa7230000a724,
- 0xa7250000a726,
- 0xa7270000a728,
- 0xa7290000a72a,
- 0xa72b0000a72c,
- 0xa72d0000a72e,
- 0xa72f0000a732,
- 0xa7330000a734,
- 0xa7350000a736,
- 0xa7370000a738,
- 0xa7390000a73a,
- 0xa73b0000a73c,
- 0xa73d0000a73e,
- 0xa73f0000a740,
- 0xa7410000a742,
- 0xa7430000a744,
- 0xa7450000a746,
- 0xa7470000a748,
- 0xa7490000a74a,
- 0xa74b0000a74c,
- 0xa74d0000a74e,
- 0xa74f0000a750,
- 0xa7510000a752,
- 0xa7530000a754,
- 0xa7550000a756,
- 0xa7570000a758,
- 0xa7590000a75a,
- 0xa75b0000a75c,
- 0xa75d0000a75e,
- 0xa75f0000a760,
- 0xa7610000a762,
- 0xa7630000a764,
- 0xa7650000a766,
- 0xa7670000a768,
- 0xa7690000a76a,
- 0xa76b0000a76c,
- 0xa76d0000a76e,
- 0xa76f0000a770,
- 0xa7710000a779,
- 0xa77a0000a77b,
- 0xa77c0000a77d,
- 0xa77f0000a780,
- 0xa7810000a782,
- 0xa7830000a784,
- 0xa7850000a786,
- 0xa7870000a789,
- 0xa78c0000a78d,
- 0xa78e0000a790,
- 0xa7910000a792,
- 0xa7930000a796,
- 0xa7970000a798,
- 0xa7990000a79a,
- 0xa79b0000a79c,
- 0xa79d0000a79e,
- 0xa79f0000a7a0,
- 0xa7a10000a7a2,
- 0xa7a30000a7a4,
- 0xa7a50000a7a6,
- 0xa7a70000a7a8,
- 0xa7a90000a7aa,
- 0xa7af0000a7b0,
- 0xa7b50000a7b6,
- 0xa7b70000a7b8,
- 0xa7b90000a7ba,
- 0xa7bb0000a7bc,
- 0xa7bd0000a7be,
- 0xa7bf0000a7c0,
- 0xa7c30000a7c4,
- 0xa7c80000a7c9,
- 0xa7ca0000a7cb,
- 0xa7f60000a7f8,
- 0xa7fa0000a828,
- 0xa82c0000a82d,
- 0xa8400000a874,
- 0xa8800000a8c6,
- 0xa8d00000a8da,
- 0xa8e00000a8f8,
- 0xa8fb0000a8fc,
- 0xa8fd0000a92e,
- 0xa9300000a954,
- 0xa9800000a9c1,
- 0xa9cf0000a9da,
- 0xa9e00000a9ff,
- 0xaa000000aa37,
- 0xaa400000aa4e,
- 0xaa500000aa5a,
- 0xaa600000aa77,
- 0xaa7a0000aac3,
- 0xaadb0000aade,
- 0xaae00000aaf0,
- 0xaaf20000aaf7,
- 0xab010000ab07,
- 0xab090000ab0f,
- 0xab110000ab17,
- 0xab200000ab27,
- 0xab280000ab2f,
- 0xab300000ab5b,
- 0xab600000ab6a,
- 0xabc00000abeb,
- 0xabec0000abee,
- 0xabf00000abfa,
- 0xac000000d7a4,
- 0xfa0e0000fa10,
- 0xfa110000fa12,
- 0xfa130000fa15,
- 0xfa1f0000fa20,
- 0xfa210000fa22,
- 0xfa230000fa25,
- 0xfa270000fa2a,
- 0xfb1e0000fb1f,
- 0xfe200000fe30,
- 0xfe730000fe74,
- 0x100000001000c,
- 0x1000d00010027,
- 0x100280001003b,
- 0x1003c0001003e,
- 0x1003f0001004e,
- 0x100500001005e,
- 0x10080000100fb,
- 0x101fd000101fe,
- 0x102800001029d,
- 0x102a0000102d1,
- 0x102e0000102e1,
- 0x1030000010320,
- 0x1032d00010341,
- 0x103420001034a,
- 0x103500001037b,
- 0x103800001039e,
- 0x103a0000103c4,
- 0x103c8000103d0,
- 0x104280001049e,
- 0x104a0000104aa,
- 0x104d8000104fc,
- 0x1050000010528,
- 0x1053000010564,
- 0x1060000010737,
- 0x1074000010756,
- 0x1076000010768,
- 0x1080000010806,
- 0x1080800010809,
- 0x1080a00010836,
- 0x1083700010839,
- 0x1083c0001083d,
- 0x1083f00010856,
- 0x1086000010877,
- 0x108800001089f,
- 0x108e0000108f3,
- 0x108f4000108f6,
- 0x1090000010916,
- 0x109200001093a,
- 0x10980000109b8,
- 0x109be000109c0,
- 0x10a0000010a04,
- 0x10a0500010a07,
- 0x10a0c00010a14,
- 0x10a1500010a18,
- 0x10a1900010a36,
- 0x10a3800010a3b,
- 0x10a3f00010a40,
- 0x10a6000010a7d,
- 0x10a8000010a9d,
- 0x10ac000010ac8,
- 0x10ac900010ae7,
- 0x10b0000010b36,
- 0x10b4000010b56,
- 0x10b6000010b73,
- 0x10b8000010b92,
- 0x10c0000010c49,
- 0x10cc000010cf3,
- 0x10d0000010d28,
- 0x10d3000010d3a,
- 0x10e8000010eaa,
- 0x10eab00010ead,
- 0x10eb000010eb2,
- 0x10f0000010f1d,
- 0x10f2700010f28,
- 0x10f3000010f51,
- 0x10fb000010fc5,
- 0x10fe000010ff7,
- 0x1100000011047,
- 0x1106600011070,
- 0x1107f000110bb,
- 0x110d0000110e9,
- 0x110f0000110fa,
- 0x1110000011135,
- 0x1113600011140,
- 0x1114400011148,
- 0x1115000011174,
- 0x1117600011177,
- 0x11180000111c5,
- 0x111c9000111cd,
- 0x111ce000111db,
- 0x111dc000111dd,
- 0x1120000011212,
- 0x1121300011238,
- 0x1123e0001123f,
- 0x1128000011287,
- 0x1128800011289,
- 0x1128a0001128e,
- 0x1128f0001129e,
- 0x1129f000112a9,
- 0x112b0000112eb,
- 0x112f0000112fa,
- 0x1130000011304,
- 0x113050001130d,
- 0x1130f00011311,
- 0x1131300011329,
- 0x1132a00011331,
- 0x1133200011334,
- 0x113350001133a,
- 0x1133b00011345,
- 0x1134700011349,
- 0x1134b0001134e,
- 0x1135000011351,
- 0x1135700011358,
- 0x1135d00011364,
- 0x113660001136d,
- 0x1137000011375,
- 0x114000001144b,
- 0x114500001145a,
- 0x1145e00011462,
- 0x11480000114c6,
- 0x114c7000114c8,
- 0x114d0000114da,
- 0x11580000115b6,
- 0x115b8000115c1,
- 0x115d8000115de,
- 0x1160000011641,
- 0x1164400011645,
- 0x116500001165a,
- 0x11680000116b9,
- 0x116c0000116ca,
- 0x117000001171b,
- 0x1171d0001172c,
- 0x117300001173a,
- 0x118000001183b,
- 0x118c0000118ea,
- 0x118ff00011907,
- 0x119090001190a,
- 0x1190c00011914,
- 0x1191500011917,
- 0x1191800011936,
- 0x1193700011939,
- 0x1193b00011944,
- 0x119500001195a,
- 0x119a0000119a8,
- 0x119aa000119d8,
- 0x119da000119e2,
- 0x119e3000119e5,
- 0x11a0000011a3f,
- 0x11a4700011a48,
- 0x11a5000011a9a,
- 0x11a9d00011a9e,
- 0x11ac000011af9,
- 0x11c0000011c09,
- 0x11c0a00011c37,
- 0x11c3800011c41,
- 0x11c5000011c5a,
- 0x11c7200011c90,
- 0x11c9200011ca8,
- 0x11ca900011cb7,
- 0x11d0000011d07,
- 0x11d0800011d0a,
- 0x11d0b00011d37,
- 0x11d3a00011d3b,
- 0x11d3c00011d3e,
- 0x11d3f00011d48,
- 0x11d5000011d5a,
- 0x11d6000011d66,
- 0x11d6700011d69,
- 0x11d6a00011d8f,
- 0x11d9000011d92,
- 0x11d9300011d99,
- 0x11da000011daa,
- 0x11ee000011ef7,
- 0x11fb000011fb1,
- 0x120000001239a,
- 0x1248000012544,
- 0x130000001342f,
- 0x1440000014647,
- 0x1680000016a39,
- 0x16a4000016a5f,
- 0x16a6000016a6a,
- 0x16ad000016aee,
- 0x16af000016af5,
- 0x16b0000016b37,
- 0x16b4000016b44,
- 0x16b5000016b5a,
- 0x16b6300016b78,
- 0x16b7d00016b90,
- 0x16e6000016e80,
- 0x16f0000016f4b,
- 0x16f4f00016f88,
- 0x16f8f00016fa0,
- 0x16fe000016fe2,
- 0x16fe300016fe5,
- 0x16ff000016ff2,
- 0x17000000187f8,
- 0x1880000018cd6,
- 0x18d0000018d09,
- 0x1b0000001b11f,
- 0x1b1500001b153,
- 0x1b1640001b168,
- 0x1b1700001b2fc,
- 0x1bc000001bc6b,
- 0x1bc700001bc7d,
- 0x1bc800001bc89,
- 0x1bc900001bc9a,
- 0x1bc9d0001bc9f,
- 0x1da000001da37,
- 0x1da3b0001da6d,
- 0x1da750001da76,
- 0x1da840001da85,
- 0x1da9b0001daa0,
- 0x1daa10001dab0,
- 0x1e0000001e007,
- 0x1e0080001e019,
- 0x1e01b0001e022,
- 0x1e0230001e025,
- 0x1e0260001e02b,
- 0x1e1000001e12d,
- 0x1e1300001e13e,
- 0x1e1400001e14a,
- 0x1e14e0001e14f,
- 0x1e2c00001e2fa,
- 0x1e8000001e8c5,
- 0x1e8d00001e8d7,
- 0x1e9220001e94c,
- 0x1e9500001e95a,
- 0x1fbf00001fbfa,
- 0x200000002a6de,
- 0x2a7000002b735,
- 0x2b7400002b81e,
- 0x2b8200002cea2,
- 0x2ceb00002ebe1,
- 0x300000003134b,
- ),
- 'CONTEXTJ': (
- 0x200c0000200e,
- ),
- 'CONTEXTO': (
- 0xb7000000b8,
- 0x37500000376,
- 0x5f3000005f5,
- 0x6600000066a,
- 0x6f0000006fa,
- 0x30fb000030fc,
- ),
-}
diff --git a/client/ayon_core/vendor/python/python_2/idna/intranges.py b/client/ayon_core/vendor/python/python_2/idna/intranges.py
deleted file mode 100644
index fa8a735662..0000000000
--- a/client/ayon_core/vendor/python/python_2/idna/intranges.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""
-Given a list of integers, made up of (hopefully) a small number of long runs
-of consecutive integers, compute a representation of the form
-((start1, end1), (start2, end2) ...). Then answer the question "was x present
-in the original list?" in time O(log(# runs)).
-"""
-
-import bisect
-
-def intranges_from_list(list_):
- """Represent a list of integers as a sequence of ranges:
- ((start_0, end_0), (start_1, end_1), ...), such that the original
- integers are exactly those x such that start_i <= x < end_i for some i.
-
- Ranges are encoded as single integers (start << 32 | end), not as tuples.
- """
-
- sorted_list = sorted(list_)
- ranges = []
- last_write = -1
- for i in range(len(sorted_list)):
- if i+1 < len(sorted_list):
- if sorted_list[i] == sorted_list[i+1]-1:
- continue
- current_range = sorted_list[last_write+1:i+1]
- ranges.append(_encode_range(current_range[0], current_range[-1] + 1))
- last_write = i
-
- return tuple(ranges)
-
-def _encode_range(start, end):
- return (start << 32) | end
-
-def _decode_range(r):
- return (r >> 32), (r & ((1 << 32) - 1))
-
-
-def intranges_contain(int_, ranges):
- """Determine if `int_` falls into one of the ranges in `ranges`."""
- tuple_ = _encode_range(int_, 0)
- pos = bisect.bisect_left(ranges, tuple_)
- # we could be immediately ahead of a tuple (start, end)
- # with start < int_ <= end
- if pos > 0:
- left, right = _decode_range(ranges[pos-1])
- if left <= int_ < right:
- return True
- # or we could be immediately behind a tuple (int_, end)
- if pos < len(ranges):
- left, _ = _decode_range(ranges[pos])
- if left == int_:
- return True
- return False
diff --git a/client/ayon_core/vendor/python/python_2/idna/package_data.py b/client/ayon_core/vendor/python/python_2/idna/package_data.py
deleted file mode 100644
index ce1c521d23..0000000000
--- a/client/ayon_core/vendor/python/python_2/idna/package_data.py
+++ /dev/null
@@ -1,2 +0,0 @@
-__version__ = '2.10'
-
diff --git a/client/ayon_core/vendor/python/python_2/idna/uts46data.py b/client/ayon_core/vendor/python/python_2/idna/uts46data.py
deleted file mode 100644
index 3766dd49f6..0000000000
--- a/client/ayon_core/vendor/python/python_2/idna/uts46data.py
+++ /dev/null
@@ -1,8357 +0,0 @@
-# This file is automatically generated by tools/idna-data
-# vim: set fileencoding=utf-8 :
-
-"""IDNA Mapping Table from UTS46."""
-
-
-__version__ = "13.0.0"
-def _seg_0():
- return [
- (0x0, '3'),
- (0x1, '3'),
- (0x2, '3'),
- (0x3, '3'),
- (0x4, '3'),
- (0x5, '3'),
- (0x6, '3'),
- (0x7, '3'),
- (0x8, '3'),
- (0x9, '3'),
- (0xA, '3'),
- (0xB, '3'),
- (0xC, '3'),
- (0xD, '3'),
- (0xE, '3'),
- (0xF, '3'),
- (0x10, '3'),
- (0x11, '3'),
- (0x12, '3'),
- (0x13, '3'),
- (0x14, '3'),
- (0x15, '3'),
- (0x16, '3'),
- (0x17, '3'),
- (0x18, '3'),
- (0x19, '3'),
- (0x1A, '3'),
- (0x1B, '3'),
- (0x1C, '3'),
- (0x1D, '3'),
- (0x1E, '3'),
- (0x1F, '3'),
- (0x20, '3'),
- (0x21, '3'),
- (0x22, '3'),
- (0x23, '3'),
- (0x24, '3'),
- (0x25, '3'),
- (0x26, '3'),
- (0x27, '3'),
- (0x28, '3'),
- (0x29, '3'),
- (0x2A, '3'),
- (0x2B, '3'),
- (0x2C, '3'),
- (0x2D, 'V'),
- (0x2E, 'V'),
- (0x2F, '3'),
- (0x30, 'V'),
- (0x31, 'V'),
- (0x32, 'V'),
- (0x33, 'V'),
- (0x34, 'V'),
- (0x35, 'V'),
- (0x36, 'V'),
- (0x37, 'V'),
- (0x38, 'V'),
- (0x39, 'V'),
- (0x3A, '3'),
- (0x3B, '3'),
- (0x3C, '3'),
- (0x3D, '3'),
- (0x3E, '3'),
- (0x3F, '3'),
- (0x40, '3'),
- (0x41, 'M', u'a'),
- (0x42, 'M', u'b'),
- (0x43, 'M', u'c'),
- (0x44, 'M', u'd'),
- (0x45, 'M', u'e'),
- (0x46, 'M', u'f'),
- (0x47, 'M', u'g'),
- (0x48, 'M', u'h'),
- (0x49, 'M', u'i'),
- (0x4A, 'M', u'j'),
- (0x4B, 'M', u'k'),
- (0x4C, 'M', u'l'),
- (0x4D, 'M', u'm'),
- (0x4E, 'M', u'n'),
- (0x4F, 'M', u'o'),
- (0x50, 'M', u'p'),
- (0x51, 'M', u'q'),
- (0x52, 'M', u'r'),
- (0x53, 'M', u's'),
- (0x54, 'M', u't'),
- (0x55, 'M', u'u'),
- (0x56, 'M', u'v'),
- (0x57, 'M', u'w'),
- (0x58, 'M', u'x'),
- (0x59, 'M', u'y'),
- (0x5A, 'M', u'z'),
- (0x5B, '3'),
- (0x5C, '3'),
- (0x5D, '3'),
- (0x5E, '3'),
- (0x5F, '3'),
- (0x60, '3'),
- (0x61, 'V'),
- (0x62, 'V'),
- (0x63, 'V'),
- ]
-
-def _seg_1():
- return [
- (0x64, 'V'),
- (0x65, 'V'),
- (0x66, 'V'),
- (0x67, 'V'),
- (0x68, 'V'),
- (0x69, 'V'),
- (0x6A, 'V'),
- (0x6B, 'V'),
- (0x6C, 'V'),
- (0x6D, 'V'),
- (0x6E, 'V'),
- (0x6F, 'V'),
- (0x70, 'V'),
- (0x71, 'V'),
- (0x72, 'V'),
- (0x73, 'V'),
- (0x74, 'V'),
- (0x75, 'V'),
- (0x76, 'V'),
- (0x77, 'V'),
- (0x78, 'V'),
- (0x79, 'V'),
- (0x7A, 'V'),
- (0x7B, '3'),
- (0x7C, '3'),
- (0x7D, '3'),
- (0x7E, '3'),
- (0x7F, '3'),
- (0x80, 'X'),
- (0x81, 'X'),
- (0x82, 'X'),
- (0x83, 'X'),
- (0x84, 'X'),
- (0x85, 'X'),
- (0x86, 'X'),
- (0x87, 'X'),
- (0x88, 'X'),
- (0x89, 'X'),
- (0x8A, 'X'),
- (0x8B, 'X'),
- (0x8C, 'X'),
- (0x8D, 'X'),
- (0x8E, 'X'),
- (0x8F, 'X'),
- (0x90, 'X'),
- (0x91, 'X'),
- (0x92, 'X'),
- (0x93, 'X'),
- (0x94, 'X'),
- (0x95, 'X'),
- (0x96, 'X'),
- (0x97, 'X'),
- (0x98, 'X'),
- (0x99, 'X'),
- (0x9A, 'X'),
- (0x9B, 'X'),
- (0x9C, 'X'),
- (0x9D, 'X'),
- (0x9E, 'X'),
- (0x9F, 'X'),
- (0xA0, '3', u' '),
- (0xA1, 'V'),
- (0xA2, 'V'),
- (0xA3, 'V'),
- (0xA4, 'V'),
- (0xA5, 'V'),
- (0xA6, 'V'),
- (0xA7, 'V'),
- (0xA8, '3', u' ̈'),
- (0xA9, 'V'),
- (0xAA, 'M', u'a'),
- (0xAB, 'V'),
- (0xAC, 'V'),
- (0xAD, 'I'),
- (0xAE, 'V'),
- (0xAF, '3', u' ̄'),
- (0xB0, 'V'),
- (0xB1, 'V'),
- (0xB2, 'M', u'2'),
- (0xB3, 'M', u'3'),
- (0xB4, '3', u' ́'),
- (0xB5, 'M', u'μ'),
- (0xB6, 'V'),
- (0xB7, 'V'),
- (0xB8, '3', u' ̧'),
- (0xB9, 'M', u'1'),
- (0xBA, 'M', u'o'),
- (0xBB, 'V'),
- (0xBC, 'M', u'1⁄4'),
- (0xBD, 'M', u'1⁄2'),
- (0xBE, 'M', u'3⁄4'),
- (0xBF, 'V'),
- (0xC0, 'M', u'à'),
- (0xC1, 'M', u'á'),
- (0xC2, 'M', u'â'),
- (0xC3, 'M', u'ã'),
- (0xC4, 'M', u'ä'),
- (0xC5, 'M', u'å'),
- (0xC6, 'M', u'æ'),
- (0xC7, 'M', u'ç'),
- ]
-
-def _seg_2():
- return [
- (0xC8, 'M', u'è'),
- (0xC9, 'M', u'é'),
- (0xCA, 'M', u'ê'),
- (0xCB, 'M', u'ë'),
- (0xCC, 'M', u'ì'),
- (0xCD, 'M', u'í'),
- (0xCE, 'M', u'î'),
- (0xCF, 'M', u'ï'),
- (0xD0, 'M', u'ð'),
- (0xD1, 'M', u'ñ'),
- (0xD2, 'M', u'ò'),
- (0xD3, 'M', u'ó'),
- (0xD4, 'M', u'ô'),
- (0xD5, 'M', u'õ'),
- (0xD6, 'M', u'ö'),
- (0xD7, 'V'),
- (0xD8, 'M', u'ø'),
- (0xD9, 'M', u'ù'),
- (0xDA, 'M', u'ú'),
- (0xDB, 'M', u'û'),
- (0xDC, 'M', u'ü'),
- (0xDD, 'M', u'ý'),
- (0xDE, 'M', u'þ'),
- (0xDF, 'D', u'ss'),
- (0xE0, 'V'),
- (0xE1, 'V'),
- (0xE2, 'V'),
- (0xE3, 'V'),
- (0xE4, 'V'),
- (0xE5, 'V'),
- (0xE6, 'V'),
- (0xE7, 'V'),
- (0xE8, 'V'),
- (0xE9, 'V'),
- (0xEA, 'V'),
- (0xEB, 'V'),
- (0xEC, 'V'),
- (0xED, 'V'),
- (0xEE, 'V'),
- (0xEF, 'V'),
- (0xF0, 'V'),
- (0xF1, 'V'),
- (0xF2, 'V'),
- (0xF3, 'V'),
- (0xF4, 'V'),
- (0xF5, 'V'),
- (0xF6, 'V'),
- (0xF7, 'V'),
- (0xF8, 'V'),
- (0xF9, 'V'),
- (0xFA, 'V'),
- (0xFB, 'V'),
- (0xFC, 'V'),
- (0xFD, 'V'),
- (0xFE, 'V'),
- (0xFF, 'V'),
- (0x100, 'M', u'ā'),
- (0x101, 'V'),
- (0x102, 'M', u'ă'),
- (0x103, 'V'),
- (0x104, 'M', u'ą'),
- (0x105, 'V'),
- (0x106, 'M', u'ć'),
- (0x107, 'V'),
- (0x108, 'M', u'ĉ'),
- (0x109, 'V'),
- (0x10A, 'M', u'ċ'),
- (0x10B, 'V'),
- (0x10C, 'M', u'č'),
- (0x10D, 'V'),
- (0x10E, 'M', u'ď'),
- (0x10F, 'V'),
- (0x110, 'M', u'đ'),
- (0x111, 'V'),
- (0x112, 'M', u'ē'),
- (0x113, 'V'),
- (0x114, 'M', u'ĕ'),
- (0x115, 'V'),
- (0x116, 'M', u'ė'),
- (0x117, 'V'),
- (0x118, 'M', u'ę'),
- (0x119, 'V'),
- (0x11A, 'M', u'ě'),
- (0x11B, 'V'),
- (0x11C, 'M', u'ĝ'),
- (0x11D, 'V'),
- (0x11E, 'M', u'ğ'),
- (0x11F, 'V'),
- (0x120, 'M', u'ġ'),
- (0x121, 'V'),
- (0x122, 'M', u'ģ'),
- (0x123, 'V'),
- (0x124, 'M', u'ĥ'),
- (0x125, 'V'),
- (0x126, 'M', u'ħ'),
- (0x127, 'V'),
- (0x128, 'M', u'ĩ'),
- (0x129, 'V'),
- (0x12A, 'M', u'ī'),
- (0x12B, 'V'),
- ]
-
-def _seg_3():
- return [
- (0x12C, 'M', u'ĭ'),
- (0x12D, 'V'),
- (0x12E, 'M', u'į'),
- (0x12F, 'V'),
- (0x130, 'M', u'i̇'),
- (0x131, 'V'),
- (0x132, 'M', u'ij'),
- (0x134, 'M', u'ĵ'),
- (0x135, 'V'),
- (0x136, 'M', u'ķ'),
- (0x137, 'V'),
- (0x139, 'M', u'ĺ'),
- (0x13A, 'V'),
- (0x13B, 'M', u'ļ'),
- (0x13C, 'V'),
- (0x13D, 'M', u'ľ'),
- (0x13E, 'V'),
- (0x13F, 'M', u'l·'),
- (0x141, 'M', u'ł'),
- (0x142, 'V'),
- (0x143, 'M', u'ń'),
- (0x144, 'V'),
- (0x145, 'M', u'ņ'),
- (0x146, 'V'),
- (0x147, 'M', u'ň'),
- (0x148, 'V'),
- (0x149, 'M', u'ʼn'),
- (0x14A, 'M', u'ŋ'),
- (0x14B, 'V'),
- (0x14C, 'M', u'ō'),
- (0x14D, 'V'),
- (0x14E, 'M', u'ŏ'),
- (0x14F, 'V'),
- (0x150, 'M', u'ő'),
- (0x151, 'V'),
- (0x152, 'M', u'œ'),
- (0x153, 'V'),
- (0x154, 'M', u'ŕ'),
- (0x155, 'V'),
- (0x156, 'M', u'ŗ'),
- (0x157, 'V'),
- (0x158, 'M', u'ř'),
- (0x159, 'V'),
- (0x15A, 'M', u'ś'),
- (0x15B, 'V'),
- (0x15C, 'M', u'ŝ'),
- (0x15D, 'V'),
- (0x15E, 'M', u'ş'),
- (0x15F, 'V'),
- (0x160, 'M', u'š'),
- (0x161, 'V'),
- (0x162, 'M', u'ţ'),
- (0x163, 'V'),
- (0x164, 'M', u'ť'),
- (0x165, 'V'),
- (0x166, 'M', u'ŧ'),
- (0x167, 'V'),
- (0x168, 'M', u'ũ'),
- (0x169, 'V'),
- (0x16A, 'M', u'ū'),
- (0x16B, 'V'),
- (0x16C, 'M', u'ŭ'),
- (0x16D, 'V'),
- (0x16E, 'M', u'ů'),
- (0x16F, 'V'),
- (0x170, 'M', u'ű'),
- (0x171, 'V'),
- (0x172, 'M', u'ų'),
- (0x173, 'V'),
- (0x174, 'M', u'ŵ'),
- (0x175, 'V'),
- (0x176, 'M', u'ŷ'),
- (0x177, 'V'),
- (0x178, 'M', u'ÿ'),
- (0x179, 'M', u'ź'),
- (0x17A, 'V'),
- (0x17B, 'M', u'ż'),
- (0x17C, 'V'),
- (0x17D, 'M', u'ž'),
- (0x17E, 'V'),
- (0x17F, 'M', u's'),
- (0x180, 'V'),
- (0x181, 'M', u'ɓ'),
- (0x182, 'M', u'ƃ'),
- (0x183, 'V'),
- (0x184, 'M', u'ƅ'),
- (0x185, 'V'),
- (0x186, 'M', u'ɔ'),
- (0x187, 'M', u'ƈ'),
- (0x188, 'V'),
- (0x189, 'M', u'ɖ'),
- (0x18A, 'M', u'ɗ'),
- (0x18B, 'M', u'ƌ'),
- (0x18C, 'V'),
- (0x18E, 'M', u'ǝ'),
- (0x18F, 'M', u'ə'),
- (0x190, 'M', u'ɛ'),
- (0x191, 'M', u'ƒ'),
- (0x192, 'V'),
- (0x193, 'M', u'ɠ'),
- ]
-
-def _seg_4():
- return [
- (0x194, 'M', u'ɣ'),
- (0x195, 'V'),
- (0x196, 'M', u'ɩ'),
- (0x197, 'M', u'ɨ'),
- (0x198, 'M', u'ƙ'),
- (0x199, 'V'),
- (0x19C, 'M', u'ɯ'),
- (0x19D, 'M', u'ɲ'),
- (0x19E, 'V'),
- (0x19F, 'M', u'ɵ'),
- (0x1A0, 'M', u'ơ'),
- (0x1A1, 'V'),
- (0x1A2, 'M', u'ƣ'),
- (0x1A3, 'V'),
- (0x1A4, 'M', u'ƥ'),
- (0x1A5, 'V'),
- (0x1A6, 'M', u'ʀ'),
- (0x1A7, 'M', u'ƨ'),
- (0x1A8, 'V'),
- (0x1A9, 'M', u'ʃ'),
- (0x1AA, 'V'),
- (0x1AC, 'M', u'ƭ'),
- (0x1AD, 'V'),
- (0x1AE, 'M', u'ʈ'),
- (0x1AF, 'M', u'ư'),
- (0x1B0, 'V'),
- (0x1B1, 'M', u'ʊ'),
- (0x1B2, 'M', u'ʋ'),
- (0x1B3, 'M', u'ƴ'),
- (0x1B4, 'V'),
- (0x1B5, 'M', u'ƶ'),
- (0x1B6, 'V'),
- (0x1B7, 'M', u'ʒ'),
- (0x1B8, 'M', u'ƹ'),
- (0x1B9, 'V'),
- (0x1BC, 'M', u'ƽ'),
- (0x1BD, 'V'),
- (0x1C4, 'M', u'dž'),
- (0x1C7, 'M', u'lj'),
- (0x1CA, 'M', u'nj'),
- (0x1CD, 'M', u'ǎ'),
- (0x1CE, 'V'),
- (0x1CF, 'M', u'ǐ'),
- (0x1D0, 'V'),
- (0x1D1, 'M', u'ǒ'),
- (0x1D2, 'V'),
- (0x1D3, 'M', u'ǔ'),
- (0x1D4, 'V'),
- (0x1D5, 'M', u'ǖ'),
- (0x1D6, 'V'),
- (0x1D7, 'M', u'ǘ'),
- (0x1D8, 'V'),
- (0x1D9, 'M', u'ǚ'),
- (0x1DA, 'V'),
- (0x1DB, 'M', u'ǜ'),
- (0x1DC, 'V'),
- (0x1DE, 'M', u'ǟ'),
- (0x1DF, 'V'),
- (0x1E0, 'M', u'ǡ'),
- (0x1E1, 'V'),
- (0x1E2, 'M', u'ǣ'),
- (0x1E3, 'V'),
- (0x1E4, 'M', u'ǥ'),
- (0x1E5, 'V'),
- (0x1E6, 'M', u'ǧ'),
- (0x1E7, 'V'),
- (0x1E8, 'M', u'ǩ'),
- (0x1E9, 'V'),
- (0x1EA, 'M', u'ǫ'),
- (0x1EB, 'V'),
- (0x1EC, 'M', u'ǭ'),
- (0x1ED, 'V'),
- (0x1EE, 'M', u'ǯ'),
- (0x1EF, 'V'),
- (0x1F1, 'M', u'dz'),
- (0x1F4, 'M', u'ǵ'),
- (0x1F5, 'V'),
- (0x1F6, 'M', u'ƕ'),
- (0x1F7, 'M', u'ƿ'),
- (0x1F8, 'M', u'ǹ'),
- (0x1F9, 'V'),
- (0x1FA, 'M', u'ǻ'),
- (0x1FB, 'V'),
- (0x1FC, 'M', u'ǽ'),
- (0x1FD, 'V'),
- (0x1FE, 'M', u'ǿ'),
- (0x1FF, 'V'),
- (0x200, 'M', u'ȁ'),
- (0x201, 'V'),
- (0x202, 'M', u'ȃ'),
- (0x203, 'V'),
- (0x204, 'M', u'ȅ'),
- (0x205, 'V'),
- (0x206, 'M', u'ȇ'),
- (0x207, 'V'),
- (0x208, 'M', u'ȉ'),
- (0x209, 'V'),
- (0x20A, 'M', u'ȋ'),
- (0x20B, 'V'),
- (0x20C, 'M', u'ȍ'),
- ]
-
-def _seg_5():
- return [
- (0x20D, 'V'),
- (0x20E, 'M', u'ȏ'),
- (0x20F, 'V'),
- (0x210, 'M', u'ȑ'),
- (0x211, 'V'),
- (0x212, 'M', u'ȓ'),
- (0x213, 'V'),
- (0x214, 'M', u'ȕ'),
- (0x215, 'V'),
- (0x216, 'M', u'ȗ'),
- (0x217, 'V'),
- (0x218, 'M', u'ș'),
- (0x219, 'V'),
- (0x21A, 'M', u'ț'),
- (0x21B, 'V'),
- (0x21C, 'M', u'ȝ'),
- (0x21D, 'V'),
- (0x21E, 'M', u'ȟ'),
- (0x21F, 'V'),
- (0x220, 'M', u'ƞ'),
- (0x221, 'V'),
- (0x222, 'M', u'ȣ'),
- (0x223, 'V'),
- (0x224, 'M', u'ȥ'),
- (0x225, 'V'),
- (0x226, 'M', u'ȧ'),
- (0x227, 'V'),
- (0x228, 'M', u'ȩ'),
- (0x229, 'V'),
- (0x22A, 'M', u'ȫ'),
- (0x22B, 'V'),
- (0x22C, 'M', u'ȭ'),
- (0x22D, 'V'),
- (0x22E, 'M', u'ȯ'),
- (0x22F, 'V'),
- (0x230, 'M', u'ȱ'),
- (0x231, 'V'),
- (0x232, 'M', u'ȳ'),
- (0x233, 'V'),
- (0x23A, 'M', u'ⱥ'),
- (0x23B, 'M', u'ȼ'),
- (0x23C, 'V'),
- (0x23D, 'M', u'ƚ'),
- (0x23E, 'M', u'ⱦ'),
- (0x23F, 'V'),
- (0x241, 'M', u'ɂ'),
- (0x242, 'V'),
- (0x243, 'M', u'ƀ'),
- (0x244, 'M', u'ʉ'),
- (0x245, 'M', u'ʌ'),
- (0x246, 'M', u'ɇ'),
- (0x247, 'V'),
- (0x248, 'M', u'ɉ'),
- (0x249, 'V'),
- (0x24A, 'M', u'ɋ'),
- (0x24B, 'V'),
- (0x24C, 'M', u'ɍ'),
- (0x24D, 'V'),
- (0x24E, 'M', u'ɏ'),
- (0x24F, 'V'),
- (0x2B0, 'M', u'h'),
- (0x2B1, 'M', u'ɦ'),
- (0x2B2, 'M', u'j'),
- (0x2B3, 'M', u'r'),
- (0x2B4, 'M', u'ɹ'),
- (0x2B5, 'M', u'ɻ'),
- (0x2B6, 'M', u'ʁ'),
- (0x2B7, 'M', u'w'),
- (0x2B8, 'M', u'y'),
- (0x2B9, 'V'),
- (0x2D8, '3', u' ̆'),
- (0x2D9, '3', u' ̇'),
- (0x2DA, '3', u' ̊'),
- (0x2DB, '3', u' ̨'),
- (0x2DC, '3', u' ̃'),
- (0x2DD, '3', u' ̋'),
- (0x2DE, 'V'),
- (0x2E0, 'M', u'ɣ'),
- (0x2E1, 'M', u'l'),
- (0x2E2, 'M', u's'),
- (0x2E3, 'M', u'x'),
- (0x2E4, 'M', u'ʕ'),
- (0x2E5, 'V'),
- (0x340, 'M', u'̀'),
- (0x341, 'M', u'́'),
- (0x342, 'V'),
- (0x343, 'M', u'̓'),
- (0x344, 'M', u'̈́'),
- (0x345, 'M', u'ι'),
- (0x346, 'V'),
- (0x34F, 'I'),
- (0x350, 'V'),
- (0x370, 'M', u'ͱ'),
- (0x371, 'V'),
- (0x372, 'M', u'ͳ'),
- (0x373, 'V'),
- (0x374, 'M', u'ʹ'),
- (0x375, 'V'),
- (0x376, 'M', u'ͷ'),
- (0x377, 'V'),
- ]
-
-def _seg_6():
- return [
- (0x378, 'X'),
- (0x37A, '3', u' ι'),
- (0x37B, 'V'),
- (0x37E, '3', u';'),
- (0x37F, 'M', u'ϳ'),
- (0x380, 'X'),
- (0x384, '3', u' ́'),
- (0x385, '3', u' ̈́'),
- (0x386, 'M', u'ά'),
- (0x387, 'M', u'·'),
- (0x388, 'M', u'έ'),
- (0x389, 'M', u'ή'),
- (0x38A, 'M', u'ί'),
- (0x38B, 'X'),
- (0x38C, 'M', u'ό'),
- (0x38D, 'X'),
- (0x38E, 'M', u'ύ'),
- (0x38F, 'M', u'ώ'),
- (0x390, 'V'),
- (0x391, 'M', u'α'),
- (0x392, 'M', u'β'),
- (0x393, 'M', u'γ'),
- (0x394, 'M', u'δ'),
- (0x395, 'M', u'ε'),
- (0x396, 'M', u'ζ'),
- (0x397, 'M', u'η'),
- (0x398, 'M', u'θ'),
- (0x399, 'M', u'ι'),
- (0x39A, 'M', u'κ'),
- (0x39B, 'M', u'λ'),
- (0x39C, 'M', u'μ'),
- (0x39D, 'M', u'ν'),
- (0x39E, 'M', u'ξ'),
- (0x39F, 'M', u'ο'),
- (0x3A0, 'M', u'π'),
- (0x3A1, 'M', u'ρ'),
- (0x3A2, 'X'),
- (0x3A3, 'M', u'σ'),
- (0x3A4, 'M', u'τ'),
- (0x3A5, 'M', u'υ'),
- (0x3A6, 'M', u'φ'),
- (0x3A7, 'M', u'χ'),
- (0x3A8, 'M', u'ψ'),
- (0x3A9, 'M', u'ω'),
- (0x3AA, 'M', u'ϊ'),
- (0x3AB, 'M', u'ϋ'),
- (0x3AC, 'V'),
- (0x3C2, 'D', u'σ'),
- (0x3C3, 'V'),
- (0x3CF, 'M', u'ϗ'),
- (0x3D0, 'M', u'β'),
- (0x3D1, 'M', u'θ'),
- (0x3D2, 'M', u'υ'),
- (0x3D3, 'M', u'ύ'),
- (0x3D4, 'M', u'ϋ'),
- (0x3D5, 'M', u'φ'),
- (0x3D6, 'M', u'π'),
- (0x3D7, 'V'),
- (0x3D8, 'M', u'ϙ'),
- (0x3D9, 'V'),
- (0x3DA, 'M', u'ϛ'),
- (0x3DB, 'V'),
- (0x3DC, 'M', u'ϝ'),
- (0x3DD, 'V'),
- (0x3DE, 'M', u'ϟ'),
- (0x3DF, 'V'),
- (0x3E0, 'M', u'ϡ'),
- (0x3E1, 'V'),
- (0x3E2, 'M', u'ϣ'),
- (0x3E3, 'V'),
- (0x3E4, 'M', u'ϥ'),
- (0x3E5, 'V'),
- (0x3E6, 'M', u'ϧ'),
- (0x3E7, 'V'),
- (0x3E8, 'M', u'ϩ'),
- (0x3E9, 'V'),
- (0x3EA, 'M', u'ϫ'),
- (0x3EB, 'V'),
- (0x3EC, 'M', u'ϭ'),
- (0x3ED, 'V'),
- (0x3EE, 'M', u'ϯ'),
- (0x3EF, 'V'),
- (0x3F0, 'M', u'κ'),
- (0x3F1, 'M', u'ρ'),
- (0x3F2, 'M', u'σ'),
- (0x3F3, 'V'),
- (0x3F4, 'M', u'θ'),
- (0x3F5, 'M', u'ε'),
- (0x3F6, 'V'),
- (0x3F7, 'M', u'ϸ'),
- (0x3F8, 'V'),
- (0x3F9, 'M', u'σ'),
- (0x3FA, 'M', u'ϻ'),
- (0x3FB, 'V'),
- (0x3FD, 'M', u'ͻ'),
- (0x3FE, 'M', u'ͼ'),
- (0x3FF, 'M', u'ͽ'),
- (0x400, 'M', u'ѐ'),
- (0x401, 'M', u'ё'),
- (0x402, 'M', u'ђ'),
- ]
-
-def _seg_7():
- return [
- (0x403, 'M', u'ѓ'),
- (0x404, 'M', u'є'),
- (0x405, 'M', u'ѕ'),
- (0x406, 'M', u'і'),
- (0x407, 'M', u'ї'),
- (0x408, 'M', u'ј'),
- (0x409, 'M', u'љ'),
- (0x40A, 'M', u'њ'),
- (0x40B, 'M', u'ћ'),
- (0x40C, 'M', u'ќ'),
- (0x40D, 'M', u'ѝ'),
- (0x40E, 'M', u'ў'),
- (0x40F, 'M', u'џ'),
- (0x410, 'M', u'а'),
- (0x411, 'M', u'б'),
- (0x412, 'M', u'в'),
- (0x413, 'M', u'г'),
- (0x414, 'M', u'д'),
- (0x415, 'M', u'е'),
- (0x416, 'M', u'ж'),
- (0x417, 'M', u'з'),
- (0x418, 'M', u'и'),
- (0x419, 'M', u'й'),
- (0x41A, 'M', u'к'),
- (0x41B, 'M', u'л'),
- (0x41C, 'M', u'м'),
- (0x41D, 'M', u'н'),
- (0x41E, 'M', u'о'),
- (0x41F, 'M', u'п'),
- (0x420, 'M', u'р'),
- (0x421, 'M', u'с'),
- (0x422, 'M', u'т'),
- (0x423, 'M', u'у'),
- (0x424, 'M', u'ф'),
- (0x425, 'M', u'х'),
- (0x426, 'M', u'ц'),
- (0x427, 'M', u'ч'),
- (0x428, 'M', u'ш'),
- (0x429, 'M', u'щ'),
- (0x42A, 'M', u'ъ'),
- (0x42B, 'M', u'ы'),
- (0x42C, 'M', u'ь'),
- (0x42D, 'M', u'э'),
- (0x42E, 'M', u'ю'),
- (0x42F, 'M', u'я'),
- (0x430, 'V'),
- (0x460, 'M', u'ѡ'),
- (0x461, 'V'),
- (0x462, 'M', u'ѣ'),
- (0x463, 'V'),
- (0x464, 'M', u'ѥ'),
- (0x465, 'V'),
- (0x466, 'M', u'ѧ'),
- (0x467, 'V'),
- (0x468, 'M', u'ѩ'),
- (0x469, 'V'),
- (0x46A, 'M', u'ѫ'),
- (0x46B, 'V'),
- (0x46C, 'M', u'ѭ'),
- (0x46D, 'V'),
- (0x46E, 'M', u'ѯ'),
- (0x46F, 'V'),
- (0x470, 'M', u'ѱ'),
- (0x471, 'V'),
- (0x472, 'M', u'ѳ'),
- (0x473, 'V'),
- (0x474, 'M', u'ѵ'),
- (0x475, 'V'),
- (0x476, 'M', u'ѷ'),
- (0x477, 'V'),
- (0x478, 'M', u'ѹ'),
- (0x479, 'V'),
- (0x47A, 'M', u'ѻ'),
- (0x47B, 'V'),
- (0x47C, 'M', u'ѽ'),
- (0x47D, 'V'),
- (0x47E, 'M', u'ѿ'),
- (0x47F, 'V'),
- (0x480, 'M', u'ҁ'),
- (0x481, 'V'),
- (0x48A, 'M', u'ҋ'),
- (0x48B, 'V'),
- (0x48C, 'M', u'ҍ'),
- (0x48D, 'V'),
- (0x48E, 'M', u'ҏ'),
- (0x48F, 'V'),
- (0x490, 'M', u'ґ'),
- (0x491, 'V'),
- (0x492, 'M', u'ғ'),
- (0x493, 'V'),
- (0x494, 'M', u'ҕ'),
- (0x495, 'V'),
- (0x496, 'M', u'җ'),
- (0x497, 'V'),
- (0x498, 'M', u'ҙ'),
- (0x499, 'V'),
- (0x49A, 'M', u'қ'),
- (0x49B, 'V'),
- (0x49C, 'M', u'ҝ'),
- (0x49D, 'V'),
- ]
-
-def _seg_8():
- return [
- (0x49E, 'M', u'ҟ'),
- (0x49F, 'V'),
- (0x4A0, 'M', u'ҡ'),
- (0x4A1, 'V'),
- (0x4A2, 'M', u'ң'),
- (0x4A3, 'V'),
- (0x4A4, 'M', u'ҥ'),
- (0x4A5, 'V'),
- (0x4A6, 'M', u'ҧ'),
- (0x4A7, 'V'),
- (0x4A8, 'M', u'ҩ'),
- (0x4A9, 'V'),
- (0x4AA, 'M', u'ҫ'),
- (0x4AB, 'V'),
- (0x4AC, 'M', u'ҭ'),
- (0x4AD, 'V'),
- (0x4AE, 'M', u'ү'),
- (0x4AF, 'V'),
- (0x4B0, 'M', u'ұ'),
- (0x4B1, 'V'),
- (0x4B2, 'M', u'ҳ'),
- (0x4B3, 'V'),
- (0x4B4, 'M', u'ҵ'),
- (0x4B5, 'V'),
- (0x4B6, 'M', u'ҷ'),
- (0x4B7, 'V'),
- (0x4B8, 'M', u'ҹ'),
- (0x4B9, 'V'),
- (0x4BA, 'M', u'һ'),
- (0x4BB, 'V'),
- (0x4BC, 'M', u'ҽ'),
- (0x4BD, 'V'),
- (0x4BE, 'M', u'ҿ'),
- (0x4BF, 'V'),
- (0x4C0, 'X'),
- (0x4C1, 'M', u'ӂ'),
- (0x4C2, 'V'),
- (0x4C3, 'M', u'ӄ'),
- (0x4C4, 'V'),
- (0x4C5, 'M', u'ӆ'),
- (0x4C6, 'V'),
- (0x4C7, 'M', u'ӈ'),
- (0x4C8, 'V'),
- (0x4C9, 'M', u'ӊ'),
- (0x4CA, 'V'),
- (0x4CB, 'M', u'ӌ'),
- (0x4CC, 'V'),
- (0x4CD, 'M', u'ӎ'),
- (0x4CE, 'V'),
- (0x4D0, 'M', u'ӑ'),
- (0x4D1, 'V'),
- (0x4D2, 'M', u'ӓ'),
- (0x4D3, 'V'),
- (0x4D4, 'M', u'ӕ'),
- (0x4D5, 'V'),
- (0x4D6, 'M', u'ӗ'),
- (0x4D7, 'V'),
- (0x4D8, 'M', u'ә'),
- (0x4D9, 'V'),
- (0x4DA, 'M', u'ӛ'),
- (0x4DB, 'V'),
- (0x4DC, 'M', u'ӝ'),
- (0x4DD, 'V'),
- (0x4DE, 'M', u'ӟ'),
- (0x4DF, 'V'),
- (0x4E0, 'M', u'ӡ'),
- (0x4E1, 'V'),
- (0x4E2, 'M', u'ӣ'),
- (0x4E3, 'V'),
- (0x4E4, 'M', u'ӥ'),
- (0x4E5, 'V'),
- (0x4E6, 'M', u'ӧ'),
- (0x4E7, 'V'),
- (0x4E8, 'M', u'ө'),
- (0x4E9, 'V'),
- (0x4EA, 'M', u'ӫ'),
- (0x4EB, 'V'),
- (0x4EC, 'M', u'ӭ'),
- (0x4ED, 'V'),
- (0x4EE, 'M', u'ӯ'),
- (0x4EF, 'V'),
- (0x4F0, 'M', u'ӱ'),
- (0x4F1, 'V'),
- (0x4F2, 'M', u'ӳ'),
- (0x4F3, 'V'),
- (0x4F4, 'M', u'ӵ'),
- (0x4F5, 'V'),
- (0x4F6, 'M', u'ӷ'),
- (0x4F7, 'V'),
- (0x4F8, 'M', u'ӹ'),
- (0x4F9, 'V'),
- (0x4FA, 'M', u'ӻ'),
- (0x4FB, 'V'),
- (0x4FC, 'M', u'ӽ'),
- (0x4FD, 'V'),
- (0x4FE, 'M', u'ӿ'),
- (0x4FF, 'V'),
- (0x500, 'M', u'ԁ'),
- (0x501, 'V'),
- (0x502, 'M', u'ԃ'),
- ]
-
-def _seg_9():
- return [
- (0x503, 'V'),
- (0x504, 'M', u'ԅ'),
- (0x505, 'V'),
- (0x506, 'M', u'ԇ'),
- (0x507, 'V'),
- (0x508, 'M', u'ԉ'),
- (0x509, 'V'),
- (0x50A, 'M', u'ԋ'),
- (0x50B, 'V'),
- (0x50C, 'M', u'ԍ'),
- (0x50D, 'V'),
- (0x50E, 'M', u'ԏ'),
- (0x50F, 'V'),
- (0x510, 'M', u'ԑ'),
- (0x511, 'V'),
- (0x512, 'M', u'ԓ'),
- (0x513, 'V'),
- (0x514, 'M', u'ԕ'),
- (0x515, 'V'),
- (0x516, 'M', u'ԗ'),
- (0x517, 'V'),
- (0x518, 'M', u'ԙ'),
- (0x519, 'V'),
- (0x51A, 'M', u'ԛ'),
- (0x51B, 'V'),
- (0x51C, 'M', u'ԝ'),
- (0x51D, 'V'),
- (0x51E, 'M', u'ԟ'),
- (0x51F, 'V'),
- (0x520, 'M', u'ԡ'),
- (0x521, 'V'),
- (0x522, 'M', u'ԣ'),
- (0x523, 'V'),
- (0x524, 'M', u'ԥ'),
- (0x525, 'V'),
- (0x526, 'M', u'ԧ'),
- (0x527, 'V'),
- (0x528, 'M', u'ԩ'),
- (0x529, 'V'),
- (0x52A, 'M', u'ԫ'),
- (0x52B, 'V'),
- (0x52C, 'M', u'ԭ'),
- (0x52D, 'V'),
- (0x52E, 'M', u'ԯ'),
- (0x52F, 'V'),
- (0x530, 'X'),
- (0x531, 'M', u'ա'),
- (0x532, 'M', u'բ'),
- (0x533, 'M', u'գ'),
- (0x534, 'M', u'դ'),
- (0x535, 'M', u'ե'),
- (0x536, 'M', u'զ'),
- (0x537, 'M', u'է'),
- (0x538, 'M', u'ը'),
- (0x539, 'M', u'թ'),
- (0x53A, 'M', u'ժ'),
- (0x53B, 'M', u'ի'),
- (0x53C, 'M', u'լ'),
- (0x53D, 'M', u'խ'),
- (0x53E, 'M', u'ծ'),
- (0x53F, 'M', u'կ'),
- (0x540, 'M', u'հ'),
- (0x541, 'M', u'ձ'),
- (0x542, 'M', u'ղ'),
- (0x543, 'M', u'ճ'),
- (0x544, 'M', u'մ'),
- (0x545, 'M', u'յ'),
- (0x546, 'M', u'ն'),
- (0x547, 'M', u'շ'),
- (0x548, 'M', u'ո'),
- (0x549, 'M', u'չ'),
- (0x54A, 'M', u'պ'),
- (0x54B, 'M', u'ջ'),
- (0x54C, 'M', u'ռ'),
- (0x54D, 'M', u'ս'),
- (0x54E, 'M', u'վ'),
- (0x54F, 'M', u'տ'),
- (0x550, 'M', u'ր'),
- (0x551, 'M', u'ց'),
- (0x552, 'M', u'ւ'),
- (0x553, 'M', u'փ'),
- (0x554, 'M', u'ք'),
- (0x555, 'M', u'օ'),
- (0x556, 'M', u'ֆ'),
- (0x557, 'X'),
- (0x559, 'V'),
- (0x587, 'M', u'եւ'),
- (0x588, 'V'),
- (0x58B, 'X'),
- (0x58D, 'V'),
- (0x590, 'X'),
- (0x591, 'V'),
- (0x5C8, 'X'),
- (0x5D0, 'V'),
- (0x5EB, 'X'),
- (0x5EF, 'V'),
- (0x5F5, 'X'),
- (0x606, 'V'),
- (0x61C, 'X'),
- (0x61E, 'V'),
- ]
-
-def _seg_10():
- return [
- (0x675, 'M', u'اٴ'),
- (0x676, 'M', u'وٴ'),
- (0x677, 'M', u'ۇٴ'),
- (0x678, 'M', u'يٴ'),
- (0x679, 'V'),
- (0x6DD, 'X'),
- (0x6DE, 'V'),
- (0x70E, 'X'),
- (0x710, 'V'),
- (0x74B, 'X'),
- (0x74D, 'V'),
- (0x7B2, 'X'),
- (0x7C0, 'V'),
- (0x7FB, 'X'),
- (0x7FD, 'V'),
- (0x82E, 'X'),
- (0x830, 'V'),
- (0x83F, 'X'),
- (0x840, 'V'),
- (0x85C, 'X'),
- (0x85E, 'V'),
- (0x85F, 'X'),
- (0x860, 'V'),
- (0x86B, 'X'),
- (0x8A0, 'V'),
- (0x8B5, 'X'),
- (0x8B6, 'V'),
- (0x8C8, 'X'),
- (0x8D3, 'V'),
- (0x8E2, 'X'),
- (0x8E3, 'V'),
- (0x958, 'M', u'क़'),
- (0x959, 'M', u'ख़'),
- (0x95A, 'M', u'ग़'),
- (0x95B, 'M', u'ज़'),
- (0x95C, 'M', u'ड़'),
- (0x95D, 'M', u'ढ़'),
- (0x95E, 'M', u'फ़'),
- (0x95F, 'M', u'य़'),
- (0x960, 'V'),
- (0x984, 'X'),
- (0x985, 'V'),
- (0x98D, 'X'),
- (0x98F, 'V'),
- (0x991, 'X'),
- (0x993, 'V'),
- (0x9A9, 'X'),
- (0x9AA, 'V'),
- (0x9B1, 'X'),
- (0x9B2, 'V'),
- (0x9B3, 'X'),
- (0x9B6, 'V'),
- (0x9BA, 'X'),
- (0x9BC, 'V'),
- (0x9C5, 'X'),
- (0x9C7, 'V'),
- (0x9C9, 'X'),
- (0x9CB, 'V'),
- (0x9CF, 'X'),
- (0x9D7, 'V'),
- (0x9D8, 'X'),
- (0x9DC, 'M', u'ড়'),
- (0x9DD, 'M', u'ঢ়'),
- (0x9DE, 'X'),
- (0x9DF, 'M', u'য়'),
- (0x9E0, 'V'),
- (0x9E4, 'X'),
- (0x9E6, 'V'),
- (0x9FF, 'X'),
- (0xA01, 'V'),
- (0xA04, 'X'),
- (0xA05, 'V'),
- (0xA0B, 'X'),
- (0xA0F, 'V'),
- (0xA11, 'X'),
- (0xA13, 'V'),
- (0xA29, 'X'),
- (0xA2A, 'V'),
- (0xA31, 'X'),
- (0xA32, 'V'),
- (0xA33, 'M', u'ਲ਼'),
- (0xA34, 'X'),
- (0xA35, 'V'),
- (0xA36, 'M', u'ਸ਼'),
- (0xA37, 'X'),
- (0xA38, 'V'),
- (0xA3A, 'X'),
- (0xA3C, 'V'),
- (0xA3D, 'X'),
- (0xA3E, 'V'),
- (0xA43, 'X'),
- (0xA47, 'V'),
- (0xA49, 'X'),
- (0xA4B, 'V'),
- (0xA4E, 'X'),
- (0xA51, 'V'),
- (0xA52, 'X'),
- (0xA59, 'M', u'ਖ਼'),
- (0xA5A, 'M', u'ਗ਼'),
- (0xA5B, 'M', u'ਜ਼'),
- ]
-
-def _seg_11():
- return [
- (0xA5C, 'V'),
- (0xA5D, 'X'),
- (0xA5E, 'M', u'ਫ਼'),
- (0xA5F, 'X'),
- (0xA66, 'V'),
- (0xA77, 'X'),
- (0xA81, 'V'),
- (0xA84, 'X'),
- (0xA85, 'V'),
- (0xA8E, 'X'),
- (0xA8F, 'V'),
- (0xA92, 'X'),
- (0xA93, 'V'),
- (0xAA9, 'X'),
- (0xAAA, 'V'),
- (0xAB1, 'X'),
- (0xAB2, 'V'),
- (0xAB4, 'X'),
- (0xAB5, 'V'),
- (0xABA, 'X'),
- (0xABC, 'V'),
- (0xAC6, 'X'),
- (0xAC7, 'V'),
- (0xACA, 'X'),
- (0xACB, 'V'),
- (0xACE, 'X'),
- (0xAD0, 'V'),
- (0xAD1, 'X'),
- (0xAE0, 'V'),
- (0xAE4, 'X'),
- (0xAE6, 'V'),
- (0xAF2, 'X'),
- (0xAF9, 'V'),
- (0xB00, 'X'),
- (0xB01, 'V'),
- (0xB04, 'X'),
- (0xB05, 'V'),
- (0xB0D, 'X'),
- (0xB0F, 'V'),
- (0xB11, 'X'),
- (0xB13, 'V'),
- (0xB29, 'X'),
- (0xB2A, 'V'),
- (0xB31, 'X'),
- (0xB32, 'V'),
- (0xB34, 'X'),
- (0xB35, 'V'),
- (0xB3A, 'X'),
- (0xB3C, 'V'),
- (0xB45, 'X'),
- (0xB47, 'V'),
- (0xB49, 'X'),
- (0xB4B, 'V'),
- (0xB4E, 'X'),
- (0xB55, 'V'),
- (0xB58, 'X'),
- (0xB5C, 'M', u'ଡ଼'),
- (0xB5D, 'M', u'ଢ଼'),
- (0xB5E, 'X'),
- (0xB5F, 'V'),
- (0xB64, 'X'),
- (0xB66, 'V'),
- (0xB78, 'X'),
- (0xB82, 'V'),
- (0xB84, 'X'),
- (0xB85, 'V'),
- (0xB8B, 'X'),
- (0xB8E, 'V'),
- (0xB91, 'X'),
- (0xB92, 'V'),
- (0xB96, 'X'),
- (0xB99, 'V'),
- (0xB9B, 'X'),
- (0xB9C, 'V'),
- (0xB9D, 'X'),
- (0xB9E, 'V'),
- (0xBA0, 'X'),
- (0xBA3, 'V'),
- (0xBA5, 'X'),
- (0xBA8, 'V'),
- (0xBAB, 'X'),
- (0xBAE, 'V'),
- (0xBBA, 'X'),
- (0xBBE, 'V'),
- (0xBC3, 'X'),
- (0xBC6, 'V'),
- (0xBC9, 'X'),
- (0xBCA, 'V'),
- (0xBCE, 'X'),
- (0xBD0, 'V'),
- (0xBD1, 'X'),
- (0xBD7, 'V'),
- (0xBD8, 'X'),
- (0xBE6, 'V'),
- (0xBFB, 'X'),
- (0xC00, 'V'),
- (0xC0D, 'X'),
- (0xC0E, 'V'),
- (0xC11, 'X'),
- (0xC12, 'V'),
- ]
-
-def _seg_12():
- return [
- (0xC29, 'X'),
- (0xC2A, 'V'),
- (0xC3A, 'X'),
- (0xC3D, 'V'),
- (0xC45, 'X'),
- (0xC46, 'V'),
- (0xC49, 'X'),
- (0xC4A, 'V'),
- (0xC4E, 'X'),
- (0xC55, 'V'),
- (0xC57, 'X'),
- (0xC58, 'V'),
- (0xC5B, 'X'),
- (0xC60, 'V'),
- (0xC64, 'X'),
- (0xC66, 'V'),
- (0xC70, 'X'),
- (0xC77, 'V'),
- (0xC8D, 'X'),
- (0xC8E, 'V'),
- (0xC91, 'X'),
- (0xC92, 'V'),
- (0xCA9, 'X'),
- (0xCAA, 'V'),
- (0xCB4, 'X'),
- (0xCB5, 'V'),
- (0xCBA, 'X'),
- (0xCBC, 'V'),
- (0xCC5, 'X'),
- (0xCC6, 'V'),
- (0xCC9, 'X'),
- (0xCCA, 'V'),
- (0xCCE, 'X'),
- (0xCD5, 'V'),
- (0xCD7, 'X'),
- (0xCDE, 'V'),
- (0xCDF, 'X'),
- (0xCE0, 'V'),
- (0xCE4, 'X'),
- (0xCE6, 'V'),
- (0xCF0, 'X'),
- (0xCF1, 'V'),
- (0xCF3, 'X'),
- (0xD00, 'V'),
- (0xD0D, 'X'),
- (0xD0E, 'V'),
- (0xD11, 'X'),
- (0xD12, 'V'),
- (0xD45, 'X'),
- (0xD46, 'V'),
- (0xD49, 'X'),
- (0xD4A, 'V'),
- (0xD50, 'X'),
- (0xD54, 'V'),
- (0xD64, 'X'),
- (0xD66, 'V'),
- (0xD80, 'X'),
- (0xD81, 'V'),
- (0xD84, 'X'),
- (0xD85, 'V'),
- (0xD97, 'X'),
- (0xD9A, 'V'),
- (0xDB2, 'X'),
- (0xDB3, 'V'),
- (0xDBC, 'X'),
- (0xDBD, 'V'),
- (0xDBE, 'X'),
- (0xDC0, 'V'),
- (0xDC7, 'X'),
- (0xDCA, 'V'),
- (0xDCB, 'X'),
- (0xDCF, 'V'),
- (0xDD5, 'X'),
- (0xDD6, 'V'),
- (0xDD7, 'X'),
- (0xDD8, 'V'),
- (0xDE0, 'X'),
- (0xDE6, 'V'),
- (0xDF0, 'X'),
- (0xDF2, 'V'),
- (0xDF5, 'X'),
- (0xE01, 'V'),
- (0xE33, 'M', u'ํา'),
- (0xE34, 'V'),
- (0xE3B, 'X'),
- (0xE3F, 'V'),
- (0xE5C, 'X'),
- (0xE81, 'V'),
- (0xE83, 'X'),
- (0xE84, 'V'),
- (0xE85, 'X'),
- (0xE86, 'V'),
- (0xE8B, 'X'),
- (0xE8C, 'V'),
- (0xEA4, 'X'),
- (0xEA5, 'V'),
- (0xEA6, 'X'),
- (0xEA7, 'V'),
- (0xEB3, 'M', u'ໍາ'),
- (0xEB4, 'V'),
- ]
-
-def _seg_13():
- return [
- (0xEBE, 'X'),
- (0xEC0, 'V'),
- (0xEC5, 'X'),
- (0xEC6, 'V'),
- (0xEC7, 'X'),
- (0xEC8, 'V'),
- (0xECE, 'X'),
- (0xED0, 'V'),
- (0xEDA, 'X'),
- (0xEDC, 'M', u'ຫນ'),
- (0xEDD, 'M', u'ຫມ'),
- (0xEDE, 'V'),
- (0xEE0, 'X'),
- (0xF00, 'V'),
- (0xF0C, 'M', u'་'),
- (0xF0D, 'V'),
- (0xF43, 'M', u'གྷ'),
- (0xF44, 'V'),
- (0xF48, 'X'),
- (0xF49, 'V'),
- (0xF4D, 'M', u'ཌྷ'),
- (0xF4E, 'V'),
- (0xF52, 'M', u'དྷ'),
- (0xF53, 'V'),
- (0xF57, 'M', u'བྷ'),
- (0xF58, 'V'),
- (0xF5C, 'M', u'ཛྷ'),
- (0xF5D, 'V'),
- (0xF69, 'M', u'ཀྵ'),
- (0xF6A, 'V'),
- (0xF6D, 'X'),
- (0xF71, 'V'),
- (0xF73, 'M', u'ཱི'),
- (0xF74, 'V'),
- (0xF75, 'M', u'ཱུ'),
- (0xF76, 'M', u'ྲྀ'),
- (0xF77, 'M', u'ྲཱྀ'),
- (0xF78, 'M', u'ླྀ'),
- (0xF79, 'M', u'ླཱྀ'),
- (0xF7A, 'V'),
- (0xF81, 'M', u'ཱྀ'),
- (0xF82, 'V'),
- (0xF93, 'M', u'ྒྷ'),
- (0xF94, 'V'),
- (0xF98, 'X'),
- (0xF99, 'V'),
- (0xF9D, 'M', u'ྜྷ'),
- (0xF9E, 'V'),
- (0xFA2, 'M', u'ྡྷ'),
- (0xFA3, 'V'),
- (0xFA7, 'M', u'ྦྷ'),
- (0xFA8, 'V'),
- (0xFAC, 'M', u'ྫྷ'),
- (0xFAD, 'V'),
- (0xFB9, 'M', u'ྐྵ'),
- (0xFBA, 'V'),
- (0xFBD, 'X'),
- (0xFBE, 'V'),
- (0xFCD, 'X'),
- (0xFCE, 'V'),
- (0xFDB, 'X'),
- (0x1000, 'V'),
- (0x10A0, 'X'),
- (0x10C7, 'M', u'ⴧ'),
- (0x10C8, 'X'),
- (0x10CD, 'M', u'ⴭ'),
- (0x10CE, 'X'),
- (0x10D0, 'V'),
- (0x10FC, 'M', u'ნ'),
- (0x10FD, 'V'),
- (0x115F, 'X'),
- (0x1161, 'V'),
- (0x1249, 'X'),
- (0x124A, 'V'),
- (0x124E, 'X'),
- (0x1250, 'V'),
- (0x1257, 'X'),
- (0x1258, 'V'),
- (0x1259, 'X'),
- (0x125A, 'V'),
- (0x125E, 'X'),
- (0x1260, 'V'),
- (0x1289, 'X'),
- (0x128A, 'V'),
- (0x128E, 'X'),
- (0x1290, 'V'),
- (0x12B1, 'X'),
- (0x12B2, 'V'),
- (0x12B6, 'X'),
- (0x12B8, 'V'),
- (0x12BF, 'X'),
- (0x12C0, 'V'),
- (0x12C1, 'X'),
- (0x12C2, 'V'),
- (0x12C6, 'X'),
- (0x12C8, 'V'),
- (0x12D7, 'X'),
- (0x12D8, 'V'),
- (0x1311, 'X'),
- (0x1312, 'V'),
- ]
-
-def _seg_14():
- return [
- (0x1316, 'X'),
- (0x1318, 'V'),
- (0x135B, 'X'),
- (0x135D, 'V'),
- (0x137D, 'X'),
- (0x1380, 'V'),
- (0x139A, 'X'),
- (0x13A0, 'V'),
- (0x13F6, 'X'),
- (0x13F8, 'M', u'Ᏸ'),
- (0x13F9, 'M', u'Ᏹ'),
- (0x13FA, 'M', u'Ᏺ'),
- (0x13FB, 'M', u'Ᏻ'),
- (0x13FC, 'M', u'Ᏼ'),
- (0x13FD, 'M', u'Ᏽ'),
- (0x13FE, 'X'),
- (0x1400, 'V'),
- (0x1680, 'X'),
- (0x1681, 'V'),
- (0x169D, 'X'),
- (0x16A0, 'V'),
- (0x16F9, 'X'),
- (0x1700, 'V'),
- (0x170D, 'X'),
- (0x170E, 'V'),
- (0x1715, 'X'),
- (0x1720, 'V'),
- (0x1737, 'X'),
- (0x1740, 'V'),
- (0x1754, 'X'),
- (0x1760, 'V'),
- (0x176D, 'X'),
- (0x176E, 'V'),
- (0x1771, 'X'),
- (0x1772, 'V'),
- (0x1774, 'X'),
- (0x1780, 'V'),
- (0x17B4, 'X'),
- (0x17B6, 'V'),
- (0x17DE, 'X'),
- (0x17E0, 'V'),
- (0x17EA, 'X'),
- (0x17F0, 'V'),
- (0x17FA, 'X'),
- (0x1800, 'V'),
- (0x1806, 'X'),
- (0x1807, 'V'),
- (0x180B, 'I'),
- (0x180E, 'X'),
- (0x1810, 'V'),
- (0x181A, 'X'),
- (0x1820, 'V'),
- (0x1879, 'X'),
- (0x1880, 'V'),
- (0x18AB, 'X'),
- (0x18B0, 'V'),
- (0x18F6, 'X'),
- (0x1900, 'V'),
- (0x191F, 'X'),
- (0x1920, 'V'),
- (0x192C, 'X'),
- (0x1930, 'V'),
- (0x193C, 'X'),
- (0x1940, 'V'),
- (0x1941, 'X'),
- (0x1944, 'V'),
- (0x196E, 'X'),
- (0x1970, 'V'),
- (0x1975, 'X'),
- (0x1980, 'V'),
- (0x19AC, 'X'),
- (0x19B0, 'V'),
- (0x19CA, 'X'),
- (0x19D0, 'V'),
- (0x19DB, 'X'),
- (0x19DE, 'V'),
- (0x1A1C, 'X'),
- (0x1A1E, 'V'),
- (0x1A5F, 'X'),
- (0x1A60, 'V'),
- (0x1A7D, 'X'),
- (0x1A7F, 'V'),
- (0x1A8A, 'X'),
- (0x1A90, 'V'),
- (0x1A9A, 'X'),
- (0x1AA0, 'V'),
- (0x1AAE, 'X'),
- (0x1AB0, 'V'),
- (0x1AC1, 'X'),
- (0x1B00, 'V'),
- (0x1B4C, 'X'),
- (0x1B50, 'V'),
- (0x1B7D, 'X'),
- (0x1B80, 'V'),
- (0x1BF4, 'X'),
- (0x1BFC, 'V'),
- (0x1C38, 'X'),
- (0x1C3B, 'V'),
- (0x1C4A, 'X'),
- (0x1C4D, 'V'),
- ]
-
-def _seg_15():
- return [
- (0x1C80, 'M', u'в'),
- (0x1C81, 'M', u'д'),
- (0x1C82, 'M', u'о'),
- (0x1C83, 'M', u'с'),
- (0x1C84, 'M', u'т'),
- (0x1C86, 'M', u'ъ'),
- (0x1C87, 'M', u'ѣ'),
- (0x1C88, 'M', u'ꙋ'),
- (0x1C89, 'X'),
- (0x1C90, 'M', u'ა'),
- (0x1C91, 'M', u'ბ'),
- (0x1C92, 'M', u'გ'),
- (0x1C93, 'M', u'დ'),
- (0x1C94, 'M', u'ე'),
- (0x1C95, 'M', u'ვ'),
- (0x1C96, 'M', u'ზ'),
- (0x1C97, 'M', u'თ'),
- (0x1C98, 'M', u'ი'),
- (0x1C99, 'M', u'კ'),
- (0x1C9A, 'M', u'ლ'),
- (0x1C9B, 'M', u'მ'),
- (0x1C9C, 'M', u'ნ'),
- (0x1C9D, 'M', u'ო'),
- (0x1C9E, 'M', u'პ'),
- (0x1C9F, 'M', u'ჟ'),
- (0x1CA0, 'M', u'რ'),
- (0x1CA1, 'M', u'ს'),
- (0x1CA2, 'M', u'ტ'),
- (0x1CA3, 'M', u'უ'),
- (0x1CA4, 'M', u'ფ'),
- (0x1CA5, 'M', u'ქ'),
- (0x1CA6, 'M', u'ღ'),
- (0x1CA7, 'M', u'ყ'),
- (0x1CA8, 'M', u'შ'),
- (0x1CA9, 'M', u'ჩ'),
- (0x1CAA, 'M', u'ც'),
- (0x1CAB, 'M', u'ძ'),
- (0x1CAC, 'M', u'წ'),
- (0x1CAD, 'M', u'ჭ'),
- (0x1CAE, 'M', u'ხ'),
- (0x1CAF, 'M', u'ჯ'),
- (0x1CB0, 'M', u'ჰ'),
- (0x1CB1, 'M', u'ჱ'),
- (0x1CB2, 'M', u'ჲ'),
- (0x1CB3, 'M', u'ჳ'),
- (0x1CB4, 'M', u'ჴ'),
- (0x1CB5, 'M', u'ჵ'),
- (0x1CB6, 'M', u'ჶ'),
- (0x1CB7, 'M', u'ჷ'),
- (0x1CB8, 'M', u'ჸ'),
- (0x1CB9, 'M', u'ჹ'),
- (0x1CBA, 'M', u'ჺ'),
- (0x1CBB, 'X'),
- (0x1CBD, 'M', u'ჽ'),
- (0x1CBE, 'M', u'ჾ'),
- (0x1CBF, 'M', u'ჿ'),
- (0x1CC0, 'V'),
- (0x1CC8, 'X'),
- (0x1CD0, 'V'),
- (0x1CFB, 'X'),
- (0x1D00, 'V'),
- (0x1D2C, 'M', u'a'),
- (0x1D2D, 'M', u'æ'),
- (0x1D2E, 'M', u'b'),
- (0x1D2F, 'V'),
- (0x1D30, 'M', u'd'),
- (0x1D31, 'M', u'e'),
- (0x1D32, 'M', u'ǝ'),
- (0x1D33, 'M', u'g'),
- (0x1D34, 'M', u'h'),
- (0x1D35, 'M', u'i'),
- (0x1D36, 'M', u'j'),
- (0x1D37, 'M', u'k'),
- (0x1D38, 'M', u'l'),
- (0x1D39, 'M', u'm'),
- (0x1D3A, 'M', u'n'),
- (0x1D3B, 'V'),
- (0x1D3C, 'M', u'o'),
- (0x1D3D, 'M', u'ȣ'),
- (0x1D3E, 'M', u'p'),
- (0x1D3F, 'M', u'r'),
- (0x1D40, 'M', u't'),
- (0x1D41, 'M', u'u'),
- (0x1D42, 'M', u'w'),
- (0x1D43, 'M', u'a'),
- (0x1D44, 'M', u'ɐ'),
- (0x1D45, 'M', u'ɑ'),
- (0x1D46, 'M', u'ᴂ'),
- (0x1D47, 'M', u'b'),
- (0x1D48, 'M', u'd'),
- (0x1D49, 'M', u'e'),
- (0x1D4A, 'M', u'ə'),
- (0x1D4B, 'M', u'ɛ'),
- (0x1D4C, 'M', u'ɜ'),
- (0x1D4D, 'M', u'g'),
- (0x1D4E, 'V'),
- (0x1D4F, 'M', u'k'),
- (0x1D50, 'M', u'm'),
- (0x1D51, 'M', u'ŋ'),
- (0x1D52, 'M', u'o'),
- ]
-
-def _seg_16():
- return [
- (0x1D53, 'M', u'ɔ'),
- (0x1D54, 'M', u'ᴖ'),
- (0x1D55, 'M', u'ᴗ'),
- (0x1D56, 'M', u'p'),
- (0x1D57, 'M', u't'),
- (0x1D58, 'M', u'u'),
- (0x1D59, 'M', u'ᴝ'),
- (0x1D5A, 'M', u'ɯ'),
- (0x1D5B, 'M', u'v'),
- (0x1D5C, 'M', u'ᴥ'),
- (0x1D5D, 'M', u'β'),
- (0x1D5E, 'M', u'γ'),
- (0x1D5F, 'M', u'δ'),
- (0x1D60, 'M', u'φ'),
- (0x1D61, 'M', u'χ'),
- (0x1D62, 'M', u'i'),
- (0x1D63, 'M', u'r'),
- (0x1D64, 'M', u'u'),
- (0x1D65, 'M', u'v'),
- (0x1D66, 'M', u'β'),
- (0x1D67, 'M', u'γ'),
- (0x1D68, 'M', u'ρ'),
- (0x1D69, 'M', u'φ'),
- (0x1D6A, 'M', u'χ'),
- (0x1D6B, 'V'),
- (0x1D78, 'M', u'н'),
- (0x1D79, 'V'),
- (0x1D9B, 'M', u'ɒ'),
- (0x1D9C, 'M', u'c'),
- (0x1D9D, 'M', u'ɕ'),
- (0x1D9E, 'M', u'ð'),
- (0x1D9F, 'M', u'ɜ'),
- (0x1DA0, 'M', u'f'),
- (0x1DA1, 'M', u'ɟ'),
- (0x1DA2, 'M', u'ɡ'),
- (0x1DA3, 'M', u'ɥ'),
- (0x1DA4, 'M', u'ɨ'),
- (0x1DA5, 'M', u'ɩ'),
- (0x1DA6, 'M', u'ɪ'),
- (0x1DA7, 'M', u'ᵻ'),
- (0x1DA8, 'M', u'ʝ'),
- (0x1DA9, 'M', u'ɭ'),
- (0x1DAA, 'M', u'ᶅ'),
- (0x1DAB, 'M', u'ʟ'),
- (0x1DAC, 'M', u'ɱ'),
- (0x1DAD, 'M', u'ɰ'),
- (0x1DAE, 'M', u'ɲ'),
- (0x1DAF, 'M', u'ɳ'),
- (0x1DB0, 'M', u'ɴ'),
- (0x1DB1, 'M', u'ɵ'),
- (0x1DB2, 'M', u'ɸ'),
- (0x1DB3, 'M', u'ʂ'),
- (0x1DB4, 'M', u'ʃ'),
- (0x1DB5, 'M', u'ƫ'),
- (0x1DB6, 'M', u'ʉ'),
- (0x1DB7, 'M', u'ʊ'),
- (0x1DB8, 'M', u'ᴜ'),
- (0x1DB9, 'M', u'ʋ'),
- (0x1DBA, 'M', u'ʌ'),
- (0x1DBB, 'M', u'z'),
- (0x1DBC, 'M', u'ʐ'),
- (0x1DBD, 'M', u'ʑ'),
- (0x1DBE, 'M', u'ʒ'),
- (0x1DBF, 'M', u'θ'),
- (0x1DC0, 'V'),
- (0x1DFA, 'X'),
- (0x1DFB, 'V'),
- (0x1E00, 'M', u'ḁ'),
- (0x1E01, 'V'),
- (0x1E02, 'M', u'ḃ'),
- (0x1E03, 'V'),
- (0x1E04, 'M', u'ḅ'),
- (0x1E05, 'V'),
- (0x1E06, 'M', u'ḇ'),
- (0x1E07, 'V'),
- (0x1E08, 'M', u'ḉ'),
- (0x1E09, 'V'),
- (0x1E0A, 'M', u'ḋ'),
- (0x1E0B, 'V'),
- (0x1E0C, 'M', u'ḍ'),
- (0x1E0D, 'V'),
- (0x1E0E, 'M', u'ḏ'),
- (0x1E0F, 'V'),
- (0x1E10, 'M', u'ḑ'),
- (0x1E11, 'V'),
- (0x1E12, 'M', u'ḓ'),
- (0x1E13, 'V'),
- (0x1E14, 'M', u'ḕ'),
- (0x1E15, 'V'),
- (0x1E16, 'M', u'ḗ'),
- (0x1E17, 'V'),
- (0x1E18, 'M', u'ḙ'),
- (0x1E19, 'V'),
- (0x1E1A, 'M', u'ḛ'),
- (0x1E1B, 'V'),
- (0x1E1C, 'M', u'ḝ'),
- (0x1E1D, 'V'),
- (0x1E1E, 'M', u'ḟ'),
- (0x1E1F, 'V'),
- (0x1E20, 'M', u'ḡ'),
- ]
-
-def _seg_17():
- return [
- (0x1E21, 'V'),
- (0x1E22, 'M', u'ḣ'),
- (0x1E23, 'V'),
- (0x1E24, 'M', u'ḥ'),
- (0x1E25, 'V'),
- (0x1E26, 'M', u'ḧ'),
- (0x1E27, 'V'),
- (0x1E28, 'M', u'ḩ'),
- (0x1E29, 'V'),
- (0x1E2A, 'M', u'ḫ'),
- (0x1E2B, 'V'),
- (0x1E2C, 'M', u'ḭ'),
- (0x1E2D, 'V'),
- (0x1E2E, 'M', u'ḯ'),
- (0x1E2F, 'V'),
- (0x1E30, 'M', u'ḱ'),
- (0x1E31, 'V'),
- (0x1E32, 'M', u'ḳ'),
- (0x1E33, 'V'),
- (0x1E34, 'M', u'ḵ'),
- (0x1E35, 'V'),
- (0x1E36, 'M', u'ḷ'),
- (0x1E37, 'V'),
- (0x1E38, 'M', u'ḹ'),
- (0x1E39, 'V'),
- (0x1E3A, 'M', u'ḻ'),
- (0x1E3B, 'V'),
- (0x1E3C, 'M', u'ḽ'),
- (0x1E3D, 'V'),
- (0x1E3E, 'M', u'ḿ'),
- (0x1E3F, 'V'),
- (0x1E40, 'M', u'ṁ'),
- (0x1E41, 'V'),
- (0x1E42, 'M', u'ṃ'),
- (0x1E43, 'V'),
- (0x1E44, 'M', u'ṅ'),
- (0x1E45, 'V'),
- (0x1E46, 'M', u'ṇ'),
- (0x1E47, 'V'),
- (0x1E48, 'M', u'ṉ'),
- (0x1E49, 'V'),
- (0x1E4A, 'M', u'ṋ'),
- (0x1E4B, 'V'),
- (0x1E4C, 'M', u'ṍ'),
- (0x1E4D, 'V'),
- (0x1E4E, 'M', u'ṏ'),
- (0x1E4F, 'V'),
- (0x1E50, 'M', u'ṑ'),
- (0x1E51, 'V'),
- (0x1E52, 'M', u'ṓ'),
- (0x1E53, 'V'),
- (0x1E54, 'M', u'ṕ'),
- (0x1E55, 'V'),
- (0x1E56, 'M', u'ṗ'),
- (0x1E57, 'V'),
- (0x1E58, 'M', u'ṙ'),
- (0x1E59, 'V'),
- (0x1E5A, 'M', u'ṛ'),
- (0x1E5B, 'V'),
- (0x1E5C, 'M', u'ṝ'),
- (0x1E5D, 'V'),
- (0x1E5E, 'M', u'ṟ'),
- (0x1E5F, 'V'),
- (0x1E60, 'M', u'ṡ'),
- (0x1E61, 'V'),
- (0x1E62, 'M', u'ṣ'),
- (0x1E63, 'V'),
- (0x1E64, 'M', u'ṥ'),
- (0x1E65, 'V'),
- (0x1E66, 'M', u'ṧ'),
- (0x1E67, 'V'),
- (0x1E68, 'M', u'ṩ'),
- (0x1E69, 'V'),
- (0x1E6A, 'M', u'ṫ'),
- (0x1E6B, 'V'),
- (0x1E6C, 'M', u'ṭ'),
- (0x1E6D, 'V'),
- (0x1E6E, 'M', u'ṯ'),
- (0x1E6F, 'V'),
- (0x1E70, 'M', u'ṱ'),
- (0x1E71, 'V'),
- (0x1E72, 'M', u'ṳ'),
- (0x1E73, 'V'),
- (0x1E74, 'M', u'ṵ'),
- (0x1E75, 'V'),
- (0x1E76, 'M', u'ṷ'),
- (0x1E77, 'V'),
- (0x1E78, 'M', u'ṹ'),
- (0x1E79, 'V'),
- (0x1E7A, 'M', u'ṻ'),
- (0x1E7B, 'V'),
- (0x1E7C, 'M', u'ṽ'),
- (0x1E7D, 'V'),
- (0x1E7E, 'M', u'ṿ'),
- (0x1E7F, 'V'),
- (0x1E80, 'M', u'ẁ'),
- (0x1E81, 'V'),
- (0x1E82, 'M', u'ẃ'),
- (0x1E83, 'V'),
- (0x1E84, 'M', u'ẅ'),
- ]
-
-def _seg_18():
- return [
- (0x1E85, 'V'),
- (0x1E86, 'M', u'ẇ'),
- (0x1E87, 'V'),
- (0x1E88, 'M', u'ẉ'),
- (0x1E89, 'V'),
- (0x1E8A, 'M', u'ẋ'),
- (0x1E8B, 'V'),
- (0x1E8C, 'M', u'ẍ'),
- (0x1E8D, 'V'),
- (0x1E8E, 'M', u'ẏ'),
- (0x1E8F, 'V'),
- (0x1E90, 'M', u'ẑ'),
- (0x1E91, 'V'),
- (0x1E92, 'M', u'ẓ'),
- (0x1E93, 'V'),
- (0x1E94, 'M', u'ẕ'),
- (0x1E95, 'V'),
- (0x1E9A, 'M', u'aʾ'),
- (0x1E9B, 'M', u'ṡ'),
- (0x1E9C, 'V'),
- (0x1E9E, 'M', u'ss'),
- (0x1E9F, 'V'),
- (0x1EA0, 'M', u'ạ'),
- (0x1EA1, 'V'),
- (0x1EA2, 'M', u'ả'),
- (0x1EA3, 'V'),
- (0x1EA4, 'M', u'ấ'),
- (0x1EA5, 'V'),
- (0x1EA6, 'M', u'ầ'),
- (0x1EA7, 'V'),
- (0x1EA8, 'M', u'ẩ'),
- (0x1EA9, 'V'),
- (0x1EAA, 'M', u'ẫ'),
- (0x1EAB, 'V'),
- (0x1EAC, 'M', u'ậ'),
- (0x1EAD, 'V'),
- (0x1EAE, 'M', u'ắ'),
- (0x1EAF, 'V'),
- (0x1EB0, 'M', u'ằ'),
- (0x1EB1, 'V'),
- (0x1EB2, 'M', u'ẳ'),
- (0x1EB3, 'V'),
- (0x1EB4, 'M', u'ẵ'),
- (0x1EB5, 'V'),
- (0x1EB6, 'M', u'ặ'),
- (0x1EB7, 'V'),
- (0x1EB8, 'M', u'ẹ'),
- (0x1EB9, 'V'),
- (0x1EBA, 'M', u'ẻ'),
- (0x1EBB, 'V'),
- (0x1EBC, 'M', u'ẽ'),
- (0x1EBD, 'V'),
- (0x1EBE, 'M', u'ế'),
- (0x1EBF, 'V'),
- (0x1EC0, 'M', u'ề'),
- (0x1EC1, 'V'),
- (0x1EC2, 'M', u'ể'),
- (0x1EC3, 'V'),
- (0x1EC4, 'M', u'ễ'),
- (0x1EC5, 'V'),
- (0x1EC6, 'M', u'ệ'),
- (0x1EC7, 'V'),
- (0x1EC8, 'M', u'ỉ'),
- (0x1EC9, 'V'),
- (0x1ECA, 'M', u'ị'),
- (0x1ECB, 'V'),
- (0x1ECC, 'M', u'ọ'),
- (0x1ECD, 'V'),
- (0x1ECE, 'M', u'ỏ'),
- (0x1ECF, 'V'),
- (0x1ED0, 'M', u'ố'),
- (0x1ED1, 'V'),
- (0x1ED2, 'M', u'ồ'),
- (0x1ED3, 'V'),
- (0x1ED4, 'M', u'ổ'),
- (0x1ED5, 'V'),
- (0x1ED6, 'M', u'ỗ'),
- (0x1ED7, 'V'),
- (0x1ED8, 'M', u'ộ'),
- (0x1ED9, 'V'),
- (0x1EDA, 'M', u'ớ'),
- (0x1EDB, 'V'),
- (0x1EDC, 'M', u'ờ'),
- (0x1EDD, 'V'),
- (0x1EDE, 'M', u'ở'),
- (0x1EDF, 'V'),
- (0x1EE0, 'M', u'ỡ'),
- (0x1EE1, 'V'),
- (0x1EE2, 'M', u'ợ'),
- (0x1EE3, 'V'),
- (0x1EE4, 'M', u'ụ'),
- (0x1EE5, 'V'),
- (0x1EE6, 'M', u'ủ'),
- (0x1EE7, 'V'),
- (0x1EE8, 'M', u'ứ'),
- (0x1EE9, 'V'),
- (0x1EEA, 'M', u'ừ'),
- (0x1EEB, 'V'),
- (0x1EEC, 'M', u'ử'),
- (0x1EED, 'V'),
- ]
-
-def _seg_19():
- return [
- (0x1EEE, 'M', u'ữ'),
- (0x1EEF, 'V'),
- (0x1EF0, 'M', u'ự'),
- (0x1EF1, 'V'),
- (0x1EF2, 'M', u'ỳ'),
- (0x1EF3, 'V'),
- (0x1EF4, 'M', u'ỵ'),
- (0x1EF5, 'V'),
- (0x1EF6, 'M', u'ỷ'),
- (0x1EF7, 'V'),
- (0x1EF8, 'M', u'ỹ'),
- (0x1EF9, 'V'),
- (0x1EFA, 'M', u'ỻ'),
- (0x1EFB, 'V'),
- (0x1EFC, 'M', u'ỽ'),
- (0x1EFD, 'V'),
- (0x1EFE, 'M', u'ỿ'),
- (0x1EFF, 'V'),
- (0x1F08, 'M', u'ἀ'),
- (0x1F09, 'M', u'ἁ'),
- (0x1F0A, 'M', u'ἂ'),
- (0x1F0B, 'M', u'ἃ'),
- (0x1F0C, 'M', u'ἄ'),
- (0x1F0D, 'M', u'ἅ'),
- (0x1F0E, 'M', u'ἆ'),
- (0x1F0F, 'M', u'ἇ'),
- (0x1F10, 'V'),
- (0x1F16, 'X'),
- (0x1F18, 'M', u'ἐ'),
- (0x1F19, 'M', u'ἑ'),
- (0x1F1A, 'M', u'ἒ'),
- (0x1F1B, 'M', u'ἓ'),
- (0x1F1C, 'M', u'ἔ'),
- (0x1F1D, 'M', u'ἕ'),
- (0x1F1E, 'X'),
- (0x1F20, 'V'),
- (0x1F28, 'M', u'ἠ'),
- (0x1F29, 'M', u'ἡ'),
- (0x1F2A, 'M', u'ἢ'),
- (0x1F2B, 'M', u'ἣ'),
- (0x1F2C, 'M', u'ἤ'),
- (0x1F2D, 'M', u'ἥ'),
- (0x1F2E, 'M', u'ἦ'),
- (0x1F2F, 'M', u'ἧ'),
- (0x1F30, 'V'),
- (0x1F38, 'M', u'ἰ'),
- (0x1F39, 'M', u'ἱ'),
- (0x1F3A, 'M', u'ἲ'),
- (0x1F3B, 'M', u'ἳ'),
- (0x1F3C, 'M', u'ἴ'),
- (0x1F3D, 'M', u'ἵ'),
- (0x1F3E, 'M', u'ἶ'),
- (0x1F3F, 'M', u'ἷ'),
- (0x1F40, 'V'),
- (0x1F46, 'X'),
- (0x1F48, 'M', u'ὀ'),
- (0x1F49, 'M', u'ὁ'),
- (0x1F4A, 'M', u'ὂ'),
- (0x1F4B, 'M', u'ὃ'),
- (0x1F4C, 'M', u'ὄ'),
- (0x1F4D, 'M', u'ὅ'),
- (0x1F4E, 'X'),
- (0x1F50, 'V'),
- (0x1F58, 'X'),
- (0x1F59, 'M', u'ὑ'),
- (0x1F5A, 'X'),
- (0x1F5B, 'M', u'ὓ'),
- (0x1F5C, 'X'),
- (0x1F5D, 'M', u'ὕ'),
- (0x1F5E, 'X'),
- (0x1F5F, 'M', u'ὗ'),
- (0x1F60, 'V'),
- (0x1F68, 'M', u'ὠ'),
- (0x1F69, 'M', u'ὡ'),
- (0x1F6A, 'M', u'ὢ'),
- (0x1F6B, 'M', u'ὣ'),
- (0x1F6C, 'M', u'ὤ'),
- (0x1F6D, 'M', u'ὥ'),
- (0x1F6E, 'M', u'ὦ'),
- (0x1F6F, 'M', u'ὧ'),
- (0x1F70, 'V'),
- (0x1F71, 'M', u'ά'),
- (0x1F72, 'V'),
- (0x1F73, 'M', u'έ'),
- (0x1F74, 'V'),
- (0x1F75, 'M', u'ή'),
- (0x1F76, 'V'),
- (0x1F77, 'M', u'ί'),
- (0x1F78, 'V'),
- (0x1F79, 'M', u'ό'),
- (0x1F7A, 'V'),
- (0x1F7B, 'M', u'ύ'),
- (0x1F7C, 'V'),
- (0x1F7D, 'M', u'ώ'),
- (0x1F7E, 'X'),
- (0x1F80, 'M', u'ἀι'),
- (0x1F81, 'M', u'ἁι'),
- (0x1F82, 'M', u'ἂι'),
- (0x1F83, 'M', u'ἃι'),
- (0x1F84, 'M', u'ἄι'),
- ]
-
-def _seg_20():
- return [
- (0x1F85, 'M', u'ἅι'),
- (0x1F86, 'M', u'ἆι'),
- (0x1F87, 'M', u'ἇι'),
- (0x1F88, 'M', u'ἀι'),
- (0x1F89, 'M', u'ἁι'),
- (0x1F8A, 'M', u'ἂι'),
- (0x1F8B, 'M', u'ἃι'),
- (0x1F8C, 'M', u'ἄι'),
- (0x1F8D, 'M', u'ἅι'),
- (0x1F8E, 'M', u'ἆι'),
- (0x1F8F, 'M', u'ἇι'),
- (0x1F90, 'M', u'ἠι'),
- (0x1F91, 'M', u'ἡι'),
- (0x1F92, 'M', u'ἢι'),
- (0x1F93, 'M', u'ἣι'),
- (0x1F94, 'M', u'ἤι'),
- (0x1F95, 'M', u'ἥι'),
- (0x1F96, 'M', u'ἦι'),
- (0x1F97, 'M', u'ἧι'),
- (0x1F98, 'M', u'ἠι'),
- (0x1F99, 'M', u'ἡι'),
- (0x1F9A, 'M', u'ἢι'),
- (0x1F9B, 'M', u'ἣι'),
- (0x1F9C, 'M', u'ἤι'),
- (0x1F9D, 'M', u'ἥι'),
- (0x1F9E, 'M', u'ἦι'),
- (0x1F9F, 'M', u'ἧι'),
- (0x1FA0, 'M', u'ὠι'),
- (0x1FA1, 'M', u'ὡι'),
- (0x1FA2, 'M', u'ὢι'),
- (0x1FA3, 'M', u'ὣι'),
- (0x1FA4, 'M', u'ὤι'),
- (0x1FA5, 'M', u'ὥι'),
- (0x1FA6, 'M', u'ὦι'),
- (0x1FA7, 'M', u'ὧι'),
- (0x1FA8, 'M', u'ὠι'),
- (0x1FA9, 'M', u'ὡι'),
- (0x1FAA, 'M', u'ὢι'),
- (0x1FAB, 'M', u'ὣι'),
- (0x1FAC, 'M', u'ὤι'),
- (0x1FAD, 'M', u'ὥι'),
- (0x1FAE, 'M', u'ὦι'),
- (0x1FAF, 'M', u'ὧι'),
- (0x1FB0, 'V'),
- (0x1FB2, 'M', u'ὰι'),
- (0x1FB3, 'M', u'αι'),
- (0x1FB4, 'M', u'άι'),
- (0x1FB5, 'X'),
- (0x1FB6, 'V'),
- (0x1FB7, 'M', u'ᾶι'),
- (0x1FB8, 'M', u'ᾰ'),
- (0x1FB9, 'M', u'ᾱ'),
- (0x1FBA, 'M', u'ὰ'),
- (0x1FBB, 'M', u'ά'),
- (0x1FBC, 'M', u'αι'),
- (0x1FBD, '3', u' ̓'),
- (0x1FBE, 'M', u'ι'),
- (0x1FBF, '3', u' ̓'),
- (0x1FC0, '3', u' ͂'),
- (0x1FC1, '3', u' ̈͂'),
- (0x1FC2, 'M', u'ὴι'),
- (0x1FC3, 'M', u'ηι'),
- (0x1FC4, 'M', u'ήι'),
- (0x1FC5, 'X'),
- (0x1FC6, 'V'),
- (0x1FC7, 'M', u'ῆι'),
- (0x1FC8, 'M', u'ὲ'),
- (0x1FC9, 'M', u'έ'),
- (0x1FCA, 'M', u'ὴ'),
- (0x1FCB, 'M', u'ή'),
- (0x1FCC, 'M', u'ηι'),
- (0x1FCD, '3', u' ̓̀'),
- (0x1FCE, '3', u' ̓́'),
- (0x1FCF, '3', u' ̓͂'),
- (0x1FD0, 'V'),
- (0x1FD3, 'M', u'ΐ'),
- (0x1FD4, 'X'),
- (0x1FD6, 'V'),
- (0x1FD8, 'M', u'ῐ'),
- (0x1FD9, 'M', u'ῑ'),
- (0x1FDA, 'M', u'ὶ'),
- (0x1FDB, 'M', u'ί'),
- (0x1FDC, 'X'),
- (0x1FDD, '3', u' ̔̀'),
- (0x1FDE, '3', u' ̔́'),
- (0x1FDF, '3', u' ̔͂'),
- (0x1FE0, 'V'),
- (0x1FE3, 'M', u'ΰ'),
- (0x1FE4, 'V'),
- (0x1FE8, 'M', u'ῠ'),
- (0x1FE9, 'M', u'ῡ'),
- (0x1FEA, 'M', u'ὺ'),
- (0x1FEB, 'M', u'ύ'),
- (0x1FEC, 'M', u'ῥ'),
- (0x1FED, '3', u' ̈̀'),
- (0x1FEE, '3', u' ̈́'),
- (0x1FEF, '3', u'`'),
- (0x1FF0, 'X'),
- (0x1FF2, 'M', u'ὼι'),
- (0x1FF3, 'M', u'ωι'),
- ]
-
-def _seg_21():
- return [
- (0x1FF4, 'M', u'ώι'),
- (0x1FF5, 'X'),
- (0x1FF6, 'V'),
- (0x1FF7, 'M', u'ῶι'),
- (0x1FF8, 'M', u'ὸ'),
- (0x1FF9, 'M', u'ό'),
- (0x1FFA, 'M', u'ὼ'),
- (0x1FFB, 'M', u'ώ'),
- (0x1FFC, 'M', u'ωι'),
- (0x1FFD, '3', u' ́'),
- (0x1FFE, '3', u' ̔'),
- (0x1FFF, 'X'),
- (0x2000, '3', u' '),
- (0x200B, 'I'),
- (0x200C, 'D', u''),
- (0x200E, 'X'),
- (0x2010, 'V'),
- (0x2011, 'M', u'‐'),
- (0x2012, 'V'),
- (0x2017, '3', u' ̳'),
- (0x2018, 'V'),
- (0x2024, 'X'),
- (0x2027, 'V'),
- (0x2028, 'X'),
- (0x202F, '3', u' '),
- (0x2030, 'V'),
- (0x2033, 'M', u'′′'),
- (0x2034, 'M', u'′′′'),
- (0x2035, 'V'),
- (0x2036, 'M', u'‵‵'),
- (0x2037, 'M', u'‵‵‵'),
- (0x2038, 'V'),
- (0x203C, '3', u'!!'),
- (0x203D, 'V'),
- (0x203E, '3', u' ̅'),
- (0x203F, 'V'),
- (0x2047, '3', u'??'),
- (0x2048, '3', u'?!'),
- (0x2049, '3', u'!?'),
- (0x204A, 'V'),
- (0x2057, 'M', u'′′′′'),
- (0x2058, 'V'),
- (0x205F, '3', u' '),
- (0x2060, 'I'),
- (0x2061, 'X'),
- (0x2064, 'I'),
- (0x2065, 'X'),
- (0x2070, 'M', u'0'),
- (0x2071, 'M', u'i'),
- (0x2072, 'X'),
- (0x2074, 'M', u'4'),
- (0x2075, 'M', u'5'),
- (0x2076, 'M', u'6'),
- (0x2077, 'M', u'7'),
- (0x2078, 'M', u'8'),
- (0x2079, 'M', u'9'),
- (0x207A, '3', u'+'),
- (0x207B, 'M', u'−'),
- (0x207C, '3', u'='),
- (0x207D, '3', u'('),
- (0x207E, '3', u')'),
- (0x207F, 'M', u'n'),
- (0x2080, 'M', u'0'),
- (0x2081, 'M', u'1'),
- (0x2082, 'M', u'2'),
- (0x2083, 'M', u'3'),
- (0x2084, 'M', u'4'),
- (0x2085, 'M', u'5'),
- (0x2086, 'M', u'6'),
- (0x2087, 'M', u'7'),
- (0x2088, 'M', u'8'),
- (0x2089, 'M', u'9'),
- (0x208A, '3', u'+'),
- (0x208B, 'M', u'−'),
- (0x208C, '3', u'='),
- (0x208D, '3', u'('),
- (0x208E, '3', u')'),
- (0x208F, 'X'),
- (0x2090, 'M', u'a'),
- (0x2091, 'M', u'e'),
- (0x2092, 'M', u'o'),
- (0x2093, 'M', u'x'),
- (0x2094, 'M', u'ə'),
- (0x2095, 'M', u'h'),
- (0x2096, 'M', u'k'),
- (0x2097, 'M', u'l'),
- (0x2098, 'M', u'm'),
- (0x2099, 'M', u'n'),
- (0x209A, 'M', u'p'),
- (0x209B, 'M', u's'),
- (0x209C, 'M', u't'),
- (0x209D, 'X'),
- (0x20A0, 'V'),
- (0x20A8, 'M', u'rs'),
- (0x20A9, 'V'),
- (0x20C0, 'X'),
- (0x20D0, 'V'),
- (0x20F1, 'X'),
- (0x2100, '3', u'a/c'),
- (0x2101, '3', u'a/s'),
- ]
-
-def _seg_22():
- return [
- (0x2102, 'M', u'c'),
- (0x2103, 'M', u'°c'),
- (0x2104, 'V'),
- (0x2105, '3', u'c/o'),
- (0x2106, '3', u'c/u'),
- (0x2107, 'M', u'ɛ'),
- (0x2108, 'V'),
- (0x2109, 'M', u'°f'),
- (0x210A, 'M', u'g'),
- (0x210B, 'M', u'h'),
- (0x210F, 'M', u'ħ'),
- (0x2110, 'M', u'i'),
- (0x2112, 'M', u'l'),
- (0x2114, 'V'),
- (0x2115, 'M', u'n'),
- (0x2116, 'M', u'no'),
- (0x2117, 'V'),
- (0x2119, 'M', u'p'),
- (0x211A, 'M', u'q'),
- (0x211B, 'M', u'r'),
- (0x211E, 'V'),
- (0x2120, 'M', u'sm'),
- (0x2121, 'M', u'tel'),
- (0x2122, 'M', u'tm'),
- (0x2123, 'V'),
- (0x2124, 'M', u'z'),
- (0x2125, 'V'),
- (0x2126, 'M', u'ω'),
- (0x2127, 'V'),
- (0x2128, 'M', u'z'),
- (0x2129, 'V'),
- (0x212A, 'M', u'k'),
- (0x212B, 'M', u'å'),
- (0x212C, 'M', u'b'),
- (0x212D, 'M', u'c'),
- (0x212E, 'V'),
- (0x212F, 'M', u'e'),
- (0x2131, 'M', u'f'),
- (0x2132, 'X'),
- (0x2133, 'M', u'm'),
- (0x2134, 'M', u'o'),
- (0x2135, 'M', u'א'),
- (0x2136, 'M', u'ב'),
- (0x2137, 'M', u'ג'),
- (0x2138, 'M', u'ד'),
- (0x2139, 'M', u'i'),
- (0x213A, 'V'),
- (0x213B, 'M', u'fax'),
- (0x213C, 'M', u'π'),
- (0x213D, 'M', u'γ'),
- (0x213F, 'M', u'π'),
- (0x2140, 'M', u'∑'),
- (0x2141, 'V'),
- (0x2145, 'M', u'd'),
- (0x2147, 'M', u'e'),
- (0x2148, 'M', u'i'),
- (0x2149, 'M', u'j'),
- (0x214A, 'V'),
- (0x2150, 'M', u'1⁄7'),
- (0x2151, 'M', u'1⁄9'),
- (0x2152, 'M', u'1⁄10'),
- (0x2153, 'M', u'1⁄3'),
- (0x2154, 'M', u'2⁄3'),
- (0x2155, 'M', u'1⁄5'),
- (0x2156, 'M', u'2⁄5'),
- (0x2157, 'M', u'3⁄5'),
- (0x2158, 'M', u'4⁄5'),
- (0x2159, 'M', u'1⁄6'),
- (0x215A, 'M', u'5⁄6'),
- (0x215B, 'M', u'1⁄8'),
- (0x215C, 'M', u'3⁄8'),
- (0x215D, 'M', u'5⁄8'),
- (0x215E, 'M', u'7⁄8'),
- (0x215F, 'M', u'1⁄'),
- (0x2160, 'M', u'i'),
- (0x2161, 'M', u'ii'),
- (0x2162, 'M', u'iii'),
- (0x2163, 'M', u'iv'),
- (0x2164, 'M', u'v'),
- (0x2165, 'M', u'vi'),
- (0x2166, 'M', u'vii'),
- (0x2167, 'M', u'viii'),
- (0x2168, 'M', u'ix'),
- (0x2169, 'M', u'x'),
- (0x216A, 'M', u'xi'),
- (0x216B, 'M', u'xii'),
- (0x216C, 'M', u'l'),
- (0x216D, 'M', u'c'),
- (0x216E, 'M', u'd'),
- (0x216F, 'M', u'm'),
- (0x2170, 'M', u'i'),
- (0x2171, 'M', u'ii'),
- (0x2172, 'M', u'iii'),
- (0x2173, 'M', u'iv'),
- (0x2174, 'M', u'v'),
- (0x2175, 'M', u'vi'),
- (0x2176, 'M', u'vii'),
- (0x2177, 'M', u'viii'),
- (0x2178, 'M', u'ix'),
- (0x2179, 'M', u'x'),
- ]
-
-def _seg_23():
- return [
- (0x217A, 'M', u'xi'),
- (0x217B, 'M', u'xii'),
- (0x217C, 'M', u'l'),
- (0x217D, 'M', u'c'),
- (0x217E, 'M', u'd'),
- (0x217F, 'M', u'm'),
- (0x2180, 'V'),
- (0x2183, 'X'),
- (0x2184, 'V'),
- (0x2189, 'M', u'0⁄3'),
- (0x218A, 'V'),
- (0x218C, 'X'),
- (0x2190, 'V'),
- (0x222C, 'M', u'∫∫'),
- (0x222D, 'M', u'∫∫∫'),
- (0x222E, 'V'),
- (0x222F, 'M', u'∮∮'),
- (0x2230, 'M', u'∮∮∮'),
- (0x2231, 'V'),
- (0x2260, '3'),
- (0x2261, 'V'),
- (0x226E, '3'),
- (0x2270, 'V'),
- (0x2329, 'M', u'〈'),
- (0x232A, 'M', u'〉'),
- (0x232B, 'V'),
- (0x2427, 'X'),
- (0x2440, 'V'),
- (0x244B, 'X'),
- (0x2460, 'M', u'1'),
- (0x2461, 'M', u'2'),
- (0x2462, 'M', u'3'),
- (0x2463, 'M', u'4'),
- (0x2464, 'M', u'5'),
- (0x2465, 'M', u'6'),
- (0x2466, 'M', u'7'),
- (0x2467, 'M', u'8'),
- (0x2468, 'M', u'9'),
- (0x2469, 'M', u'10'),
- (0x246A, 'M', u'11'),
- (0x246B, 'M', u'12'),
- (0x246C, 'M', u'13'),
- (0x246D, 'M', u'14'),
- (0x246E, 'M', u'15'),
- (0x246F, 'M', u'16'),
- (0x2470, 'M', u'17'),
- (0x2471, 'M', u'18'),
- (0x2472, 'M', u'19'),
- (0x2473, 'M', u'20'),
- (0x2474, '3', u'(1)'),
- (0x2475, '3', u'(2)'),
- (0x2476, '3', u'(3)'),
- (0x2477, '3', u'(4)'),
- (0x2478, '3', u'(5)'),
- (0x2479, '3', u'(6)'),
- (0x247A, '3', u'(7)'),
- (0x247B, '3', u'(8)'),
- (0x247C, '3', u'(9)'),
- (0x247D, '3', u'(10)'),
- (0x247E, '3', u'(11)'),
- (0x247F, '3', u'(12)'),
- (0x2480, '3', u'(13)'),
- (0x2481, '3', u'(14)'),
- (0x2482, '3', u'(15)'),
- (0x2483, '3', u'(16)'),
- (0x2484, '3', u'(17)'),
- (0x2485, '3', u'(18)'),
- (0x2486, '3', u'(19)'),
- (0x2487, '3', u'(20)'),
- (0x2488, 'X'),
- (0x249C, '3', u'(a)'),
- (0x249D, '3', u'(b)'),
- (0x249E, '3', u'(c)'),
- (0x249F, '3', u'(d)'),
- (0x24A0, '3', u'(e)'),
- (0x24A1, '3', u'(f)'),
- (0x24A2, '3', u'(g)'),
- (0x24A3, '3', u'(h)'),
- (0x24A4, '3', u'(i)'),
- (0x24A5, '3', u'(j)'),
- (0x24A6, '3', u'(k)'),
- (0x24A7, '3', u'(l)'),
- (0x24A8, '3', u'(m)'),
- (0x24A9, '3', u'(n)'),
- (0x24AA, '3', u'(o)'),
- (0x24AB, '3', u'(p)'),
- (0x24AC, '3', u'(q)'),
- (0x24AD, '3', u'(r)'),
- (0x24AE, '3', u'(s)'),
- (0x24AF, '3', u'(t)'),
- (0x24B0, '3', u'(u)'),
- (0x24B1, '3', u'(v)'),
- (0x24B2, '3', u'(w)'),
- (0x24B3, '3', u'(x)'),
- (0x24B4, '3', u'(y)'),
- (0x24B5, '3', u'(z)'),
- (0x24B6, 'M', u'a'),
- (0x24B7, 'M', u'b'),
- (0x24B8, 'M', u'c'),
- (0x24B9, 'M', u'd'),
- ]
-
-def _seg_24():
- return [
- (0x24BA, 'M', u'e'),
- (0x24BB, 'M', u'f'),
- (0x24BC, 'M', u'g'),
- (0x24BD, 'M', u'h'),
- (0x24BE, 'M', u'i'),
- (0x24BF, 'M', u'j'),
- (0x24C0, 'M', u'k'),
- (0x24C1, 'M', u'l'),
- (0x24C2, 'M', u'm'),
- (0x24C3, 'M', u'n'),
- (0x24C4, 'M', u'o'),
- (0x24C5, 'M', u'p'),
- (0x24C6, 'M', u'q'),
- (0x24C7, 'M', u'r'),
- (0x24C8, 'M', u's'),
- (0x24C9, 'M', u't'),
- (0x24CA, 'M', u'u'),
- (0x24CB, 'M', u'v'),
- (0x24CC, 'M', u'w'),
- (0x24CD, 'M', u'x'),
- (0x24CE, 'M', u'y'),
- (0x24CF, 'M', u'z'),
- (0x24D0, 'M', u'a'),
- (0x24D1, 'M', u'b'),
- (0x24D2, 'M', u'c'),
- (0x24D3, 'M', u'd'),
- (0x24D4, 'M', u'e'),
- (0x24D5, 'M', u'f'),
- (0x24D6, 'M', u'g'),
- (0x24D7, 'M', u'h'),
- (0x24D8, 'M', u'i'),
- (0x24D9, 'M', u'j'),
- (0x24DA, 'M', u'k'),
- (0x24DB, 'M', u'l'),
- (0x24DC, 'M', u'm'),
- (0x24DD, 'M', u'n'),
- (0x24DE, 'M', u'o'),
- (0x24DF, 'M', u'p'),
- (0x24E0, 'M', u'q'),
- (0x24E1, 'M', u'r'),
- (0x24E2, 'M', u's'),
- (0x24E3, 'M', u't'),
- (0x24E4, 'M', u'u'),
- (0x24E5, 'M', u'v'),
- (0x24E6, 'M', u'w'),
- (0x24E7, 'M', u'x'),
- (0x24E8, 'M', u'y'),
- (0x24E9, 'M', u'z'),
- (0x24EA, 'M', u'0'),
- (0x24EB, 'V'),
- (0x2A0C, 'M', u'∫∫∫∫'),
- (0x2A0D, 'V'),
- (0x2A74, '3', u'::='),
- (0x2A75, '3', u'=='),
- (0x2A76, '3', u'==='),
- (0x2A77, 'V'),
- (0x2ADC, 'M', u'⫝̸'),
- (0x2ADD, 'V'),
- (0x2B74, 'X'),
- (0x2B76, 'V'),
- (0x2B96, 'X'),
- (0x2B97, 'V'),
- (0x2C00, 'M', u'ⰰ'),
- (0x2C01, 'M', u'ⰱ'),
- (0x2C02, 'M', u'ⰲ'),
- (0x2C03, 'M', u'ⰳ'),
- (0x2C04, 'M', u'ⰴ'),
- (0x2C05, 'M', u'ⰵ'),
- (0x2C06, 'M', u'ⰶ'),
- (0x2C07, 'M', u'ⰷ'),
- (0x2C08, 'M', u'ⰸ'),
- (0x2C09, 'M', u'ⰹ'),
- (0x2C0A, 'M', u'ⰺ'),
- (0x2C0B, 'M', u'ⰻ'),
- (0x2C0C, 'M', u'ⰼ'),
- (0x2C0D, 'M', u'ⰽ'),
- (0x2C0E, 'M', u'ⰾ'),
- (0x2C0F, 'M', u'ⰿ'),
- (0x2C10, 'M', u'ⱀ'),
- (0x2C11, 'M', u'ⱁ'),
- (0x2C12, 'M', u'ⱂ'),
- (0x2C13, 'M', u'ⱃ'),
- (0x2C14, 'M', u'ⱄ'),
- (0x2C15, 'M', u'ⱅ'),
- (0x2C16, 'M', u'ⱆ'),
- (0x2C17, 'M', u'ⱇ'),
- (0x2C18, 'M', u'ⱈ'),
- (0x2C19, 'M', u'ⱉ'),
- (0x2C1A, 'M', u'ⱊ'),
- (0x2C1B, 'M', u'ⱋ'),
- (0x2C1C, 'M', u'ⱌ'),
- (0x2C1D, 'M', u'ⱍ'),
- (0x2C1E, 'M', u'ⱎ'),
- (0x2C1F, 'M', u'ⱏ'),
- (0x2C20, 'M', u'ⱐ'),
- (0x2C21, 'M', u'ⱑ'),
- (0x2C22, 'M', u'ⱒ'),
- (0x2C23, 'M', u'ⱓ'),
- (0x2C24, 'M', u'ⱔ'),
- (0x2C25, 'M', u'ⱕ'),
- ]
-
-def _seg_25():
- return [
- (0x2C26, 'M', u'ⱖ'),
- (0x2C27, 'M', u'ⱗ'),
- (0x2C28, 'M', u'ⱘ'),
- (0x2C29, 'M', u'ⱙ'),
- (0x2C2A, 'M', u'ⱚ'),
- (0x2C2B, 'M', u'ⱛ'),
- (0x2C2C, 'M', u'ⱜ'),
- (0x2C2D, 'M', u'ⱝ'),
- (0x2C2E, 'M', u'ⱞ'),
- (0x2C2F, 'X'),
- (0x2C30, 'V'),
- (0x2C5F, 'X'),
- (0x2C60, 'M', u'ⱡ'),
- (0x2C61, 'V'),
- (0x2C62, 'M', u'ɫ'),
- (0x2C63, 'M', u'ᵽ'),
- (0x2C64, 'M', u'ɽ'),
- (0x2C65, 'V'),
- (0x2C67, 'M', u'ⱨ'),
- (0x2C68, 'V'),
- (0x2C69, 'M', u'ⱪ'),
- (0x2C6A, 'V'),
- (0x2C6B, 'M', u'ⱬ'),
- (0x2C6C, 'V'),
- (0x2C6D, 'M', u'ɑ'),
- (0x2C6E, 'M', u'ɱ'),
- (0x2C6F, 'M', u'ɐ'),
- (0x2C70, 'M', u'ɒ'),
- (0x2C71, 'V'),
- (0x2C72, 'M', u'ⱳ'),
- (0x2C73, 'V'),
- (0x2C75, 'M', u'ⱶ'),
- (0x2C76, 'V'),
- (0x2C7C, 'M', u'j'),
- (0x2C7D, 'M', u'v'),
- (0x2C7E, 'M', u'ȿ'),
- (0x2C7F, 'M', u'ɀ'),
- (0x2C80, 'M', u'ⲁ'),
- (0x2C81, 'V'),
- (0x2C82, 'M', u'ⲃ'),
- (0x2C83, 'V'),
- (0x2C84, 'M', u'ⲅ'),
- (0x2C85, 'V'),
- (0x2C86, 'M', u'ⲇ'),
- (0x2C87, 'V'),
- (0x2C88, 'M', u'ⲉ'),
- (0x2C89, 'V'),
- (0x2C8A, 'M', u'ⲋ'),
- (0x2C8B, 'V'),
- (0x2C8C, 'M', u'ⲍ'),
- (0x2C8D, 'V'),
- (0x2C8E, 'M', u'ⲏ'),
- (0x2C8F, 'V'),
- (0x2C90, 'M', u'ⲑ'),
- (0x2C91, 'V'),
- (0x2C92, 'M', u'ⲓ'),
- (0x2C93, 'V'),
- (0x2C94, 'M', u'ⲕ'),
- (0x2C95, 'V'),
- (0x2C96, 'M', u'ⲗ'),
- (0x2C97, 'V'),
- (0x2C98, 'M', u'ⲙ'),
- (0x2C99, 'V'),
- (0x2C9A, 'M', u'ⲛ'),
- (0x2C9B, 'V'),
- (0x2C9C, 'M', u'ⲝ'),
- (0x2C9D, 'V'),
- (0x2C9E, 'M', u'ⲟ'),
- (0x2C9F, 'V'),
- (0x2CA0, 'M', u'ⲡ'),
- (0x2CA1, 'V'),
- (0x2CA2, 'M', u'ⲣ'),
- (0x2CA3, 'V'),
- (0x2CA4, 'M', u'ⲥ'),
- (0x2CA5, 'V'),
- (0x2CA6, 'M', u'ⲧ'),
- (0x2CA7, 'V'),
- (0x2CA8, 'M', u'ⲩ'),
- (0x2CA9, 'V'),
- (0x2CAA, 'M', u'ⲫ'),
- (0x2CAB, 'V'),
- (0x2CAC, 'M', u'ⲭ'),
- (0x2CAD, 'V'),
- (0x2CAE, 'M', u'ⲯ'),
- (0x2CAF, 'V'),
- (0x2CB0, 'M', u'ⲱ'),
- (0x2CB1, 'V'),
- (0x2CB2, 'M', u'ⲳ'),
- (0x2CB3, 'V'),
- (0x2CB4, 'M', u'ⲵ'),
- (0x2CB5, 'V'),
- (0x2CB6, 'M', u'ⲷ'),
- (0x2CB7, 'V'),
- (0x2CB8, 'M', u'ⲹ'),
- (0x2CB9, 'V'),
- (0x2CBA, 'M', u'ⲻ'),
- (0x2CBB, 'V'),
- (0x2CBC, 'M', u'ⲽ'),
- (0x2CBD, 'V'),
- (0x2CBE, 'M', u'ⲿ'),
- ]
-
-def _seg_26():
- return [
- (0x2CBF, 'V'),
- (0x2CC0, 'M', u'ⳁ'),
- (0x2CC1, 'V'),
- (0x2CC2, 'M', u'ⳃ'),
- (0x2CC3, 'V'),
- (0x2CC4, 'M', u'ⳅ'),
- (0x2CC5, 'V'),
- (0x2CC6, 'M', u'ⳇ'),
- (0x2CC7, 'V'),
- (0x2CC8, 'M', u'ⳉ'),
- (0x2CC9, 'V'),
- (0x2CCA, 'M', u'ⳋ'),
- (0x2CCB, 'V'),
- (0x2CCC, 'M', u'ⳍ'),
- (0x2CCD, 'V'),
- (0x2CCE, 'M', u'ⳏ'),
- (0x2CCF, 'V'),
- (0x2CD0, 'M', u'ⳑ'),
- (0x2CD1, 'V'),
- (0x2CD2, 'M', u'ⳓ'),
- (0x2CD3, 'V'),
- (0x2CD4, 'M', u'ⳕ'),
- (0x2CD5, 'V'),
- (0x2CD6, 'M', u'ⳗ'),
- (0x2CD7, 'V'),
- (0x2CD8, 'M', u'ⳙ'),
- (0x2CD9, 'V'),
- (0x2CDA, 'M', u'ⳛ'),
- (0x2CDB, 'V'),
- (0x2CDC, 'M', u'ⳝ'),
- (0x2CDD, 'V'),
- (0x2CDE, 'M', u'ⳟ'),
- (0x2CDF, 'V'),
- (0x2CE0, 'M', u'ⳡ'),
- (0x2CE1, 'V'),
- (0x2CE2, 'M', u'ⳣ'),
- (0x2CE3, 'V'),
- (0x2CEB, 'M', u'ⳬ'),
- (0x2CEC, 'V'),
- (0x2CED, 'M', u'ⳮ'),
- (0x2CEE, 'V'),
- (0x2CF2, 'M', u'ⳳ'),
- (0x2CF3, 'V'),
- (0x2CF4, 'X'),
- (0x2CF9, 'V'),
- (0x2D26, 'X'),
- (0x2D27, 'V'),
- (0x2D28, 'X'),
- (0x2D2D, 'V'),
- (0x2D2E, 'X'),
- (0x2D30, 'V'),
- (0x2D68, 'X'),
- (0x2D6F, 'M', u'ⵡ'),
- (0x2D70, 'V'),
- (0x2D71, 'X'),
- (0x2D7F, 'V'),
- (0x2D97, 'X'),
- (0x2DA0, 'V'),
- (0x2DA7, 'X'),
- (0x2DA8, 'V'),
- (0x2DAF, 'X'),
- (0x2DB0, 'V'),
- (0x2DB7, 'X'),
- (0x2DB8, 'V'),
- (0x2DBF, 'X'),
- (0x2DC0, 'V'),
- (0x2DC7, 'X'),
- (0x2DC8, 'V'),
- (0x2DCF, 'X'),
- (0x2DD0, 'V'),
- (0x2DD7, 'X'),
- (0x2DD8, 'V'),
- (0x2DDF, 'X'),
- (0x2DE0, 'V'),
- (0x2E53, 'X'),
- (0x2E80, 'V'),
- (0x2E9A, 'X'),
- (0x2E9B, 'V'),
- (0x2E9F, 'M', u'母'),
- (0x2EA0, 'V'),
- (0x2EF3, 'M', u'龟'),
- (0x2EF4, 'X'),
- (0x2F00, 'M', u'一'),
- (0x2F01, 'M', u'丨'),
- (0x2F02, 'M', u'丶'),
- (0x2F03, 'M', u'丿'),
- (0x2F04, 'M', u'乙'),
- (0x2F05, 'M', u'亅'),
- (0x2F06, 'M', u'二'),
- (0x2F07, 'M', u'亠'),
- (0x2F08, 'M', u'人'),
- (0x2F09, 'M', u'儿'),
- (0x2F0A, 'M', u'入'),
- (0x2F0B, 'M', u'八'),
- (0x2F0C, 'M', u'冂'),
- (0x2F0D, 'M', u'冖'),
- (0x2F0E, 'M', u'冫'),
- (0x2F0F, 'M', u'几'),
- (0x2F10, 'M', u'凵'),
- (0x2F11, 'M', u'刀'),
- ]
-
-def _seg_27():
- return [
- (0x2F12, 'M', u'力'),
- (0x2F13, 'M', u'勹'),
- (0x2F14, 'M', u'匕'),
- (0x2F15, 'M', u'匚'),
- (0x2F16, 'M', u'匸'),
- (0x2F17, 'M', u'十'),
- (0x2F18, 'M', u'卜'),
- (0x2F19, 'M', u'卩'),
- (0x2F1A, 'M', u'厂'),
- (0x2F1B, 'M', u'厶'),
- (0x2F1C, 'M', u'又'),
- (0x2F1D, 'M', u'口'),
- (0x2F1E, 'M', u'囗'),
- (0x2F1F, 'M', u'土'),
- (0x2F20, 'M', u'士'),
- (0x2F21, 'M', u'夂'),
- (0x2F22, 'M', u'夊'),
- (0x2F23, 'M', u'夕'),
- (0x2F24, 'M', u'大'),
- (0x2F25, 'M', u'女'),
- (0x2F26, 'M', u'子'),
- (0x2F27, 'M', u'宀'),
- (0x2F28, 'M', u'寸'),
- (0x2F29, 'M', u'小'),
- (0x2F2A, 'M', u'尢'),
- (0x2F2B, 'M', u'尸'),
- (0x2F2C, 'M', u'屮'),
- (0x2F2D, 'M', u'山'),
- (0x2F2E, 'M', u'巛'),
- (0x2F2F, 'M', u'工'),
- (0x2F30, 'M', u'己'),
- (0x2F31, 'M', u'巾'),
- (0x2F32, 'M', u'干'),
- (0x2F33, 'M', u'幺'),
- (0x2F34, 'M', u'广'),
- (0x2F35, 'M', u'廴'),
- (0x2F36, 'M', u'廾'),
- (0x2F37, 'M', u'弋'),
- (0x2F38, 'M', u'弓'),
- (0x2F39, 'M', u'彐'),
- (0x2F3A, 'M', u'彡'),
- (0x2F3B, 'M', u'彳'),
- (0x2F3C, 'M', u'心'),
- (0x2F3D, 'M', u'戈'),
- (0x2F3E, 'M', u'戶'),
- (0x2F3F, 'M', u'手'),
- (0x2F40, 'M', u'支'),
- (0x2F41, 'M', u'攴'),
- (0x2F42, 'M', u'文'),
- (0x2F43, 'M', u'斗'),
- (0x2F44, 'M', u'斤'),
- (0x2F45, 'M', u'方'),
- (0x2F46, 'M', u'无'),
- (0x2F47, 'M', u'日'),
- (0x2F48, 'M', u'曰'),
- (0x2F49, 'M', u'月'),
- (0x2F4A, 'M', u'木'),
- (0x2F4B, 'M', u'欠'),
- (0x2F4C, 'M', u'止'),
- (0x2F4D, 'M', u'歹'),
- (0x2F4E, 'M', u'殳'),
- (0x2F4F, 'M', u'毋'),
- (0x2F50, 'M', u'比'),
- (0x2F51, 'M', u'毛'),
- (0x2F52, 'M', u'氏'),
- (0x2F53, 'M', u'气'),
- (0x2F54, 'M', u'水'),
- (0x2F55, 'M', u'火'),
- (0x2F56, 'M', u'爪'),
- (0x2F57, 'M', u'父'),
- (0x2F58, 'M', u'爻'),
- (0x2F59, 'M', u'爿'),
- (0x2F5A, 'M', u'片'),
- (0x2F5B, 'M', u'牙'),
- (0x2F5C, 'M', u'牛'),
- (0x2F5D, 'M', u'犬'),
- (0x2F5E, 'M', u'玄'),
- (0x2F5F, 'M', u'玉'),
- (0x2F60, 'M', u'瓜'),
- (0x2F61, 'M', u'瓦'),
- (0x2F62, 'M', u'甘'),
- (0x2F63, 'M', u'生'),
- (0x2F64, 'M', u'用'),
- (0x2F65, 'M', u'田'),
- (0x2F66, 'M', u'疋'),
- (0x2F67, 'M', u'疒'),
- (0x2F68, 'M', u'癶'),
- (0x2F69, 'M', u'白'),
- (0x2F6A, 'M', u'皮'),
- (0x2F6B, 'M', u'皿'),
- (0x2F6C, 'M', u'目'),
- (0x2F6D, 'M', u'矛'),
- (0x2F6E, 'M', u'矢'),
- (0x2F6F, 'M', u'石'),
- (0x2F70, 'M', u'示'),
- (0x2F71, 'M', u'禸'),
- (0x2F72, 'M', u'禾'),
- (0x2F73, 'M', u'穴'),
- (0x2F74, 'M', u'立'),
- (0x2F75, 'M', u'竹'),
- ]
-
-def _seg_28():
- return [
- (0x2F76, 'M', u'米'),
- (0x2F77, 'M', u'糸'),
- (0x2F78, 'M', u'缶'),
- (0x2F79, 'M', u'网'),
- (0x2F7A, 'M', u'羊'),
- (0x2F7B, 'M', u'羽'),
- (0x2F7C, 'M', u'老'),
- (0x2F7D, 'M', u'而'),
- (0x2F7E, 'M', u'耒'),
- (0x2F7F, 'M', u'耳'),
- (0x2F80, 'M', u'聿'),
- (0x2F81, 'M', u'肉'),
- (0x2F82, 'M', u'臣'),
- (0x2F83, 'M', u'自'),
- (0x2F84, 'M', u'至'),
- (0x2F85, 'M', u'臼'),
- (0x2F86, 'M', u'舌'),
- (0x2F87, 'M', u'舛'),
- (0x2F88, 'M', u'舟'),
- (0x2F89, 'M', u'艮'),
- (0x2F8A, 'M', u'色'),
- (0x2F8B, 'M', u'艸'),
- (0x2F8C, 'M', u'虍'),
- (0x2F8D, 'M', u'虫'),
- (0x2F8E, 'M', u'血'),
- (0x2F8F, 'M', u'行'),
- (0x2F90, 'M', u'衣'),
- (0x2F91, 'M', u'襾'),
- (0x2F92, 'M', u'見'),
- (0x2F93, 'M', u'角'),
- (0x2F94, 'M', u'言'),
- (0x2F95, 'M', u'谷'),
- (0x2F96, 'M', u'豆'),
- (0x2F97, 'M', u'豕'),
- (0x2F98, 'M', u'豸'),
- (0x2F99, 'M', u'貝'),
- (0x2F9A, 'M', u'赤'),
- (0x2F9B, 'M', u'走'),
- (0x2F9C, 'M', u'足'),
- (0x2F9D, 'M', u'身'),
- (0x2F9E, 'M', u'車'),
- (0x2F9F, 'M', u'辛'),
- (0x2FA0, 'M', u'辰'),
- (0x2FA1, 'M', u'辵'),
- (0x2FA2, 'M', u'邑'),
- (0x2FA3, 'M', u'酉'),
- (0x2FA4, 'M', u'釆'),
- (0x2FA5, 'M', u'里'),
- (0x2FA6, 'M', u'金'),
- (0x2FA7, 'M', u'長'),
- (0x2FA8, 'M', u'門'),
- (0x2FA9, 'M', u'阜'),
- (0x2FAA, 'M', u'隶'),
- (0x2FAB, 'M', u'隹'),
- (0x2FAC, 'M', u'雨'),
- (0x2FAD, 'M', u'靑'),
- (0x2FAE, 'M', u'非'),
- (0x2FAF, 'M', u'面'),
- (0x2FB0, 'M', u'革'),
- (0x2FB1, 'M', u'韋'),
- (0x2FB2, 'M', u'韭'),
- (0x2FB3, 'M', u'音'),
- (0x2FB4, 'M', u'頁'),
- (0x2FB5, 'M', u'風'),
- (0x2FB6, 'M', u'飛'),
- (0x2FB7, 'M', u'食'),
- (0x2FB8, 'M', u'首'),
- (0x2FB9, 'M', u'香'),
- (0x2FBA, 'M', u'馬'),
- (0x2FBB, 'M', u'骨'),
- (0x2FBC, 'M', u'高'),
- (0x2FBD, 'M', u'髟'),
- (0x2FBE, 'M', u'鬥'),
- (0x2FBF, 'M', u'鬯'),
- (0x2FC0, 'M', u'鬲'),
- (0x2FC1, 'M', u'鬼'),
- (0x2FC2, 'M', u'魚'),
- (0x2FC3, 'M', u'鳥'),
- (0x2FC4, 'M', u'鹵'),
- (0x2FC5, 'M', u'鹿'),
- (0x2FC6, 'M', u'麥'),
- (0x2FC7, 'M', u'麻'),
- (0x2FC8, 'M', u'黃'),
- (0x2FC9, 'M', u'黍'),
- (0x2FCA, 'M', u'黑'),
- (0x2FCB, 'M', u'黹'),
- (0x2FCC, 'M', u'黽'),
- (0x2FCD, 'M', u'鼎'),
- (0x2FCE, 'M', u'鼓'),
- (0x2FCF, 'M', u'鼠'),
- (0x2FD0, 'M', u'鼻'),
- (0x2FD1, 'M', u'齊'),
- (0x2FD2, 'M', u'齒'),
- (0x2FD3, 'M', u'龍'),
- (0x2FD4, 'M', u'龜'),
- (0x2FD5, 'M', u'龠'),
- (0x2FD6, 'X'),
- (0x3000, '3', u' '),
- (0x3001, 'V'),
- (0x3002, 'M', u'.'),
- ]
-
-def _seg_29():
- return [
- (0x3003, 'V'),
- (0x3036, 'M', u'〒'),
- (0x3037, 'V'),
- (0x3038, 'M', u'十'),
- (0x3039, 'M', u'卄'),
- (0x303A, 'M', u'卅'),
- (0x303B, 'V'),
- (0x3040, 'X'),
- (0x3041, 'V'),
- (0x3097, 'X'),
- (0x3099, 'V'),
- (0x309B, '3', u' ゙'),
- (0x309C, '3', u' ゚'),
- (0x309D, 'V'),
- (0x309F, 'M', u'より'),
- (0x30A0, 'V'),
- (0x30FF, 'M', u'コト'),
- (0x3100, 'X'),
- (0x3105, 'V'),
- (0x3130, 'X'),
- (0x3131, 'M', u'ᄀ'),
- (0x3132, 'M', u'ᄁ'),
- (0x3133, 'M', u'ᆪ'),
- (0x3134, 'M', u'ᄂ'),
- (0x3135, 'M', u'ᆬ'),
- (0x3136, 'M', u'ᆭ'),
- (0x3137, 'M', u'ᄃ'),
- (0x3138, 'M', u'ᄄ'),
- (0x3139, 'M', u'ᄅ'),
- (0x313A, 'M', u'ᆰ'),
- (0x313B, 'M', u'ᆱ'),
- (0x313C, 'M', u'ᆲ'),
- (0x313D, 'M', u'ᆳ'),
- (0x313E, 'M', u'ᆴ'),
- (0x313F, 'M', u'ᆵ'),
- (0x3140, 'M', u'ᄚ'),
- (0x3141, 'M', u'ᄆ'),
- (0x3142, 'M', u'ᄇ'),
- (0x3143, 'M', u'ᄈ'),
- (0x3144, 'M', u'ᄡ'),
- (0x3145, 'M', u'ᄉ'),
- (0x3146, 'M', u'ᄊ'),
- (0x3147, 'M', u'ᄋ'),
- (0x3148, 'M', u'ᄌ'),
- (0x3149, 'M', u'ᄍ'),
- (0x314A, 'M', u'ᄎ'),
- (0x314B, 'M', u'ᄏ'),
- (0x314C, 'M', u'ᄐ'),
- (0x314D, 'M', u'ᄑ'),
- (0x314E, 'M', u'ᄒ'),
- (0x314F, 'M', u'ᅡ'),
- (0x3150, 'M', u'ᅢ'),
- (0x3151, 'M', u'ᅣ'),
- (0x3152, 'M', u'ᅤ'),
- (0x3153, 'M', u'ᅥ'),
- (0x3154, 'M', u'ᅦ'),
- (0x3155, 'M', u'ᅧ'),
- (0x3156, 'M', u'ᅨ'),
- (0x3157, 'M', u'ᅩ'),
- (0x3158, 'M', u'ᅪ'),
- (0x3159, 'M', u'ᅫ'),
- (0x315A, 'M', u'ᅬ'),
- (0x315B, 'M', u'ᅭ'),
- (0x315C, 'M', u'ᅮ'),
- (0x315D, 'M', u'ᅯ'),
- (0x315E, 'M', u'ᅰ'),
- (0x315F, 'M', u'ᅱ'),
- (0x3160, 'M', u'ᅲ'),
- (0x3161, 'M', u'ᅳ'),
- (0x3162, 'M', u'ᅴ'),
- (0x3163, 'M', u'ᅵ'),
- (0x3164, 'X'),
- (0x3165, 'M', u'ᄔ'),
- (0x3166, 'M', u'ᄕ'),
- (0x3167, 'M', u'ᇇ'),
- (0x3168, 'M', u'ᇈ'),
- (0x3169, 'M', u'ᇌ'),
- (0x316A, 'M', u'ᇎ'),
- (0x316B, 'M', u'ᇓ'),
- (0x316C, 'M', u'ᇗ'),
- (0x316D, 'M', u'ᇙ'),
- (0x316E, 'M', u'ᄜ'),
- (0x316F, 'M', u'ᇝ'),
- (0x3170, 'M', u'ᇟ'),
- (0x3171, 'M', u'ᄝ'),
- (0x3172, 'M', u'ᄞ'),
- (0x3173, 'M', u'ᄠ'),
- (0x3174, 'M', u'ᄢ'),
- (0x3175, 'M', u'ᄣ'),
- (0x3176, 'M', u'ᄧ'),
- (0x3177, 'M', u'ᄩ'),
- (0x3178, 'M', u'ᄫ'),
- (0x3179, 'M', u'ᄬ'),
- (0x317A, 'M', u'ᄭ'),
- (0x317B, 'M', u'ᄮ'),
- (0x317C, 'M', u'ᄯ'),
- (0x317D, 'M', u'ᄲ'),
- (0x317E, 'M', u'ᄶ'),
- (0x317F, 'M', u'ᅀ'),
- (0x3180, 'M', u'ᅇ'),
- ]
-
-def _seg_30():
- return [
- (0x3181, 'M', u'ᅌ'),
- (0x3182, 'M', u'ᇱ'),
- (0x3183, 'M', u'ᇲ'),
- (0x3184, 'M', u'ᅗ'),
- (0x3185, 'M', u'ᅘ'),
- (0x3186, 'M', u'ᅙ'),
- (0x3187, 'M', u'ᆄ'),
- (0x3188, 'M', u'ᆅ'),
- (0x3189, 'M', u'ᆈ'),
- (0x318A, 'M', u'ᆑ'),
- (0x318B, 'M', u'ᆒ'),
- (0x318C, 'M', u'ᆔ'),
- (0x318D, 'M', u'ᆞ'),
- (0x318E, 'M', u'ᆡ'),
- (0x318F, 'X'),
- (0x3190, 'V'),
- (0x3192, 'M', u'一'),
- (0x3193, 'M', u'二'),
- (0x3194, 'M', u'三'),
- (0x3195, 'M', u'四'),
- (0x3196, 'M', u'上'),
- (0x3197, 'M', u'中'),
- (0x3198, 'M', u'下'),
- (0x3199, 'M', u'甲'),
- (0x319A, 'M', u'乙'),
- (0x319B, 'M', u'丙'),
- (0x319C, 'M', u'丁'),
- (0x319D, 'M', u'天'),
- (0x319E, 'M', u'地'),
- (0x319F, 'M', u'人'),
- (0x31A0, 'V'),
- (0x31E4, 'X'),
- (0x31F0, 'V'),
- (0x3200, '3', u'(ᄀ)'),
- (0x3201, '3', u'(ᄂ)'),
- (0x3202, '3', u'(ᄃ)'),
- (0x3203, '3', u'(ᄅ)'),
- (0x3204, '3', u'(ᄆ)'),
- (0x3205, '3', u'(ᄇ)'),
- (0x3206, '3', u'(ᄉ)'),
- (0x3207, '3', u'(ᄋ)'),
- (0x3208, '3', u'(ᄌ)'),
- (0x3209, '3', u'(ᄎ)'),
- (0x320A, '3', u'(ᄏ)'),
- (0x320B, '3', u'(ᄐ)'),
- (0x320C, '3', u'(ᄑ)'),
- (0x320D, '3', u'(ᄒ)'),
- (0x320E, '3', u'(가)'),
- (0x320F, '3', u'(나)'),
- (0x3210, '3', u'(다)'),
- (0x3211, '3', u'(라)'),
- (0x3212, '3', u'(마)'),
- (0x3213, '3', u'(바)'),
- (0x3214, '3', u'(사)'),
- (0x3215, '3', u'(아)'),
- (0x3216, '3', u'(자)'),
- (0x3217, '3', u'(차)'),
- (0x3218, '3', u'(카)'),
- (0x3219, '3', u'(타)'),
- (0x321A, '3', u'(파)'),
- (0x321B, '3', u'(하)'),
- (0x321C, '3', u'(주)'),
- (0x321D, '3', u'(오전)'),
- (0x321E, '3', u'(오후)'),
- (0x321F, 'X'),
- (0x3220, '3', u'(一)'),
- (0x3221, '3', u'(二)'),
- (0x3222, '3', u'(三)'),
- (0x3223, '3', u'(四)'),
- (0x3224, '3', u'(五)'),
- (0x3225, '3', u'(六)'),
- (0x3226, '3', u'(七)'),
- (0x3227, '3', u'(八)'),
- (0x3228, '3', u'(九)'),
- (0x3229, '3', u'(十)'),
- (0x322A, '3', u'(月)'),
- (0x322B, '3', u'(火)'),
- (0x322C, '3', u'(水)'),
- (0x322D, '3', u'(木)'),
- (0x322E, '3', u'(金)'),
- (0x322F, '3', u'(土)'),
- (0x3230, '3', u'(日)'),
- (0x3231, '3', u'(株)'),
- (0x3232, '3', u'(有)'),
- (0x3233, '3', u'(社)'),
- (0x3234, '3', u'(名)'),
- (0x3235, '3', u'(特)'),
- (0x3236, '3', u'(財)'),
- (0x3237, '3', u'(祝)'),
- (0x3238, '3', u'(労)'),
- (0x3239, '3', u'(代)'),
- (0x323A, '3', u'(呼)'),
- (0x323B, '3', u'(学)'),
- (0x323C, '3', u'(監)'),
- (0x323D, '3', u'(企)'),
- (0x323E, '3', u'(資)'),
- (0x323F, '3', u'(協)'),
- (0x3240, '3', u'(祭)'),
- (0x3241, '3', u'(休)'),
- (0x3242, '3', u'(自)'),
- ]
-
-def _seg_31():
- return [
- (0x3243, '3', u'(至)'),
- (0x3244, 'M', u'問'),
- (0x3245, 'M', u'幼'),
- (0x3246, 'M', u'文'),
- (0x3247, 'M', u'箏'),
- (0x3248, 'V'),
- (0x3250, 'M', u'pte'),
- (0x3251, 'M', u'21'),
- (0x3252, 'M', u'22'),
- (0x3253, 'M', u'23'),
- (0x3254, 'M', u'24'),
- (0x3255, 'M', u'25'),
- (0x3256, 'M', u'26'),
- (0x3257, 'M', u'27'),
- (0x3258, 'M', u'28'),
- (0x3259, 'M', u'29'),
- (0x325A, 'M', u'30'),
- (0x325B, 'M', u'31'),
- (0x325C, 'M', u'32'),
- (0x325D, 'M', u'33'),
- (0x325E, 'M', u'34'),
- (0x325F, 'M', u'35'),
- (0x3260, 'M', u'ᄀ'),
- (0x3261, 'M', u'ᄂ'),
- (0x3262, 'M', u'ᄃ'),
- (0x3263, 'M', u'ᄅ'),
- (0x3264, 'M', u'ᄆ'),
- (0x3265, 'M', u'ᄇ'),
- (0x3266, 'M', u'ᄉ'),
- (0x3267, 'M', u'ᄋ'),
- (0x3268, 'M', u'ᄌ'),
- (0x3269, 'M', u'ᄎ'),
- (0x326A, 'M', u'ᄏ'),
- (0x326B, 'M', u'ᄐ'),
- (0x326C, 'M', u'ᄑ'),
- (0x326D, 'M', u'ᄒ'),
- (0x326E, 'M', u'가'),
- (0x326F, 'M', u'나'),
- (0x3270, 'M', u'다'),
- (0x3271, 'M', u'라'),
- (0x3272, 'M', u'마'),
- (0x3273, 'M', u'바'),
- (0x3274, 'M', u'사'),
- (0x3275, 'M', u'아'),
- (0x3276, 'M', u'자'),
- (0x3277, 'M', u'차'),
- (0x3278, 'M', u'카'),
- (0x3279, 'M', u'타'),
- (0x327A, 'M', u'파'),
- (0x327B, 'M', u'하'),
- (0x327C, 'M', u'참고'),
- (0x327D, 'M', u'주의'),
- (0x327E, 'M', u'우'),
- (0x327F, 'V'),
- (0x3280, 'M', u'一'),
- (0x3281, 'M', u'二'),
- (0x3282, 'M', u'三'),
- (0x3283, 'M', u'四'),
- (0x3284, 'M', u'五'),
- (0x3285, 'M', u'六'),
- (0x3286, 'M', u'七'),
- (0x3287, 'M', u'八'),
- (0x3288, 'M', u'九'),
- (0x3289, 'M', u'十'),
- (0x328A, 'M', u'月'),
- (0x328B, 'M', u'火'),
- (0x328C, 'M', u'水'),
- (0x328D, 'M', u'木'),
- (0x328E, 'M', u'金'),
- (0x328F, 'M', u'土'),
- (0x3290, 'M', u'日'),
- (0x3291, 'M', u'株'),
- (0x3292, 'M', u'有'),
- (0x3293, 'M', u'社'),
- (0x3294, 'M', u'名'),
- (0x3295, 'M', u'特'),
- (0x3296, 'M', u'財'),
- (0x3297, 'M', u'祝'),
- (0x3298, 'M', u'労'),
- (0x3299, 'M', u'秘'),
- (0x329A, 'M', u'男'),
- (0x329B, 'M', u'女'),
- (0x329C, 'M', u'適'),
- (0x329D, 'M', u'優'),
- (0x329E, 'M', u'印'),
- (0x329F, 'M', u'注'),
- (0x32A0, 'M', u'項'),
- (0x32A1, 'M', u'休'),
- (0x32A2, 'M', u'写'),
- (0x32A3, 'M', u'正'),
- (0x32A4, 'M', u'上'),
- (0x32A5, 'M', u'中'),
- (0x32A6, 'M', u'下'),
- (0x32A7, 'M', u'左'),
- (0x32A8, 'M', u'右'),
- (0x32A9, 'M', u'医'),
- (0x32AA, 'M', u'宗'),
- (0x32AB, 'M', u'学'),
- (0x32AC, 'M', u'監'),
- (0x32AD, 'M', u'企'),
- ]
-
-def _seg_32():
- return [
- (0x32AE, 'M', u'資'),
- (0x32AF, 'M', u'協'),
- (0x32B0, 'M', u'夜'),
- (0x32B1, 'M', u'36'),
- (0x32B2, 'M', u'37'),
- (0x32B3, 'M', u'38'),
- (0x32B4, 'M', u'39'),
- (0x32B5, 'M', u'40'),
- (0x32B6, 'M', u'41'),
- (0x32B7, 'M', u'42'),
- (0x32B8, 'M', u'43'),
- (0x32B9, 'M', u'44'),
- (0x32BA, 'M', u'45'),
- (0x32BB, 'M', u'46'),
- (0x32BC, 'M', u'47'),
- (0x32BD, 'M', u'48'),
- (0x32BE, 'M', u'49'),
- (0x32BF, 'M', u'50'),
- (0x32C0, 'M', u'1月'),
- (0x32C1, 'M', u'2月'),
- (0x32C2, 'M', u'3月'),
- (0x32C3, 'M', u'4月'),
- (0x32C4, 'M', u'5月'),
- (0x32C5, 'M', u'6月'),
- (0x32C6, 'M', u'7月'),
- (0x32C7, 'M', u'8月'),
- (0x32C8, 'M', u'9月'),
- (0x32C9, 'M', u'10月'),
- (0x32CA, 'M', u'11月'),
- (0x32CB, 'M', u'12月'),
- (0x32CC, 'M', u'hg'),
- (0x32CD, 'M', u'erg'),
- (0x32CE, 'M', u'ev'),
- (0x32CF, 'M', u'ltd'),
- (0x32D0, 'M', u'ア'),
- (0x32D1, 'M', u'イ'),
- (0x32D2, 'M', u'ウ'),
- (0x32D3, 'M', u'エ'),
- (0x32D4, 'M', u'オ'),
- (0x32D5, 'M', u'カ'),
- (0x32D6, 'M', u'キ'),
- (0x32D7, 'M', u'ク'),
- (0x32D8, 'M', u'ケ'),
- (0x32D9, 'M', u'コ'),
- (0x32DA, 'M', u'サ'),
- (0x32DB, 'M', u'シ'),
- (0x32DC, 'M', u'ス'),
- (0x32DD, 'M', u'セ'),
- (0x32DE, 'M', u'ソ'),
- (0x32DF, 'M', u'タ'),
- (0x32E0, 'M', u'チ'),
- (0x32E1, 'M', u'ツ'),
- (0x32E2, 'M', u'テ'),
- (0x32E3, 'M', u'ト'),
- (0x32E4, 'M', u'ナ'),
- (0x32E5, 'M', u'ニ'),
- (0x32E6, 'M', u'ヌ'),
- (0x32E7, 'M', u'ネ'),
- (0x32E8, 'M', u'ノ'),
- (0x32E9, 'M', u'ハ'),
- (0x32EA, 'M', u'ヒ'),
- (0x32EB, 'M', u'フ'),
- (0x32EC, 'M', u'ヘ'),
- (0x32ED, 'M', u'ホ'),
- (0x32EE, 'M', u'マ'),
- (0x32EF, 'M', u'ミ'),
- (0x32F0, 'M', u'ム'),
- (0x32F1, 'M', u'メ'),
- (0x32F2, 'M', u'モ'),
- (0x32F3, 'M', u'ヤ'),
- (0x32F4, 'M', u'ユ'),
- (0x32F5, 'M', u'ヨ'),
- (0x32F6, 'M', u'ラ'),
- (0x32F7, 'M', u'リ'),
- (0x32F8, 'M', u'ル'),
- (0x32F9, 'M', u'レ'),
- (0x32FA, 'M', u'ロ'),
- (0x32FB, 'M', u'ワ'),
- (0x32FC, 'M', u'ヰ'),
- (0x32FD, 'M', u'ヱ'),
- (0x32FE, 'M', u'ヲ'),
- (0x32FF, 'M', u'令和'),
- (0x3300, 'M', u'アパート'),
- (0x3301, 'M', u'アルファ'),
- (0x3302, 'M', u'アンペア'),
- (0x3303, 'M', u'アール'),
- (0x3304, 'M', u'イニング'),
- (0x3305, 'M', u'インチ'),
- (0x3306, 'M', u'ウォン'),
- (0x3307, 'M', u'エスクード'),
- (0x3308, 'M', u'エーカー'),
- (0x3309, 'M', u'オンス'),
- (0x330A, 'M', u'オーム'),
- (0x330B, 'M', u'カイリ'),
- (0x330C, 'M', u'カラット'),
- (0x330D, 'M', u'カロリー'),
- (0x330E, 'M', u'ガロン'),
- (0x330F, 'M', u'ガンマ'),
- (0x3310, 'M', u'ギガ'),
- (0x3311, 'M', u'ギニー'),
- ]
-
-def _seg_33():
- return [
- (0x3312, 'M', u'キュリー'),
- (0x3313, 'M', u'ギルダー'),
- (0x3314, 'M', u'キロ'),
- (0x3315, 'M', u'キログラム'),
- (0x3316, 'M', u'キロメートル'),
- (0x3317, 'M', u'キロワット'),
- (0x3318, 'M', u'グラム'),
- (0x3319, 'M', u'グラムトン'),
- (0x331A, 'M', u'クルゼイロ'),
- (0x331B, 'M', u'クローネ'),
- (0x331C, 'M', u'ケース'),
- (0x331D, 'M', u'コルナ'),
- (0x331E, 'M', u'コーポ'),
- (0x331F, 'M', u'サイクル'),
- (0x3320, 'M', u'サンチーム'),
- (0x3321, 'M', u'シリング'),
- (0x3322, 'M', u'センチ'),
- (0x3323, 'M', u'セント'),
- (0x3324, 'M', u'ダース'),
- (0x3325, 'M', u'デシ'),
- (0x3326, 'M', u'ドル'),
- (0x3327, 'M', u'トン'),
- (0x3328, 'M', u'ナノ'),
- (0x3329, 'M', u'ノット'),
- (0x332A, 'M', u'ハイツ'),
- (0x332B, 'M', u'パーセント'),
- (0x332C, 'M', u'パーツ'),
- (0x332D, 'M', u'バーレル'),
- (0x332E, 'M', u'ピアストル'),
- (0x332F, 'M', u'ピクル'),
- (0x3330, 'M', u'ピコ'),
- (0x3331, 'M', u'ビル'),
- (0x3332, 'M', u'ファラッド'),
- (0x3333, 'M', u'フィート'),
- (0x3334, 'M', u'ブッシェル'),
- (0x3335, 'M', u'フラン'),
- (0x3336, 'M', u'ヘクタール'),
- (0x3337, 'M', u'ペソ'),
- (0x3338, 'M', u'ペニヒ'),
- (0x3339, 'M', u'ヘルツ'),
- (0x333A, 'M', u'ペンス'),
- (0x333B, 'M', u'ページ'),
- (0x333C, 'M', u'ベータ'),
- (0x333D, 'M', u'ポイント'),
- (0x333E, 'M', u'ボルト'),
- (0x333F, 'M', u'ホン'),
- (0x3340, 'M', u'ポンド'),
- (0x3341, 'M', u'ホール'),
- (0x3342, 'M', u'ホーン'),
- (0x3343, 'M', u'マイクロ'),
- (0x3344, 'M', u'マイル'),
- (0x3345, 'M', u'マッハ'),
- (0x3346, 'M', u'マルク'),
- (0x3347, 'M', u'マンション'),
- (0x3348, 'M', u'ミクロン'),
- (0x3349, 'M', u'ミリ'),
- (0x334A, 'M', u'ミリバール'),
- (0x334B, 'M', u'メガ'),
- (0x334C, 'M', u'メガトン'),
- (0x334D, 'M', u'メートル'),
- (0x334E, 'M', u'ヤード'),
- (0x334F, 'M', u'ヤール'),
- (0x3350, 'M', u'ユアン'),
- (0x3351, 'M', u'リットル'),
- (0x3352, 'M', u'リラ'),
- (0x3353, 'M', u'ルピー'),
- (0x3354, 'M', u'ルーブル'),
- (0x3355, 'M', u'レム'),
- (0x3356, 'M', u'レントゲン'),
- (0x3357, 'M', u'ワット'),
- (0x3358, 'M', u'0点'),
- (0x3359, 'M', u'1点'),
- (0x335A, 'M', u'2点'),
- (0x335B, 'M', u'3点'),
- (0x335C, 'M', u'4点'),
- (0x335D, 'M', u'5点'),
- (0x335E, 'M', u'6点'),
- (0x335F, 'M', u'7点'),
- (0x3360, 'M', u'8点'),
- (0x3361, 'M', u'9点'),
- (0x3362, 'M', u'10点'),
- (0x3363, 'M', u'11点'),
- (0x3364, 'M', u'12点'),
- (0x3365, 'M', u'13点'),
- (0x3366, 'M', u'14点'),
- (0x3367, 'M', u'15点'),
- (0x3368, 'M', u'16点'),
- (0x3369, 'M', u'17点'),
- (0x336A, 'M', u'18点'),
- (0x336B, 'M', u'19点'),
- (0x336C, 'M', u'20点'),
- (0x336D, 'M', u'21点'),
- (0x336E, 'M', u'22点'),
- (0x336F, 'M', u'23点'),
- (0x3370, 'M', u'24点'),
- (0x3371, 'M', u'hpa'),
- (0x3372, 'M', u'da'),
- (0x3373, 'M', u'au'),
- (0x3374, 'M', u'bar'),
- (0x3375, 'M', u'ov'),
- ]
-
-def _seg_34():
- return [
- (0x3376, 'M', u'pc'),
- (0x3377, 'M', u'dm'),
- (0x3378, 'M', u'dm2'),
- (0x3379, 'M', u'dm3'),
- (0x337A, 'M', u'iu'),
- (0x337B, 'M', u'平成'),
- (0x337C, 'M', u'昭和'),
- (0x337D, 'M', u'大正'),
- (0x337E, 'M', u'明治'),
- (0x337F, 'M', u'株式会社'),
- (0x3380, 'M', u'pa'),
- (0x3381, 'M', u'na'),
- (0x3382, 'M', u'μa'),
- (0x3383, 'M', u'ma'),
- (0x3384, 'M', u'ka'),
- (0x3385, 'M', u'kb'),
- (0x3386, 'M', u'mb'),
- (0x3387, 'M', u'gb'),
- (0x3388, 'M', u'cal'),
- (0x3389, 'M', u'kcal'),
- (0x338A, 'M', u'pf'),
- (0x338B, 'M', u'nf'),
- (0x338C, 'M', u'μf'),
- (0x338D, 'M', u'μg'),
- (0x338E, 'M', u'mg'),
- (0x338F, 'M', u'kg'),
- (0x3390, 'M', u'hz'),
- (0x3391, 'M', u'khz'),
- (0x3392, 'M', u'mhz'),
- (0x3393, 'M', u'ghz'),
- (0x3394, 'M', u'thz'),
- (0x3395, 'M', u'μl'),
- (0x3396, 'M', u'ml'),
- (0x3397, 'M', u'dl'),
- (0x3398, 'M', u'kl'),
- (0x3399, 'M', u'fm'),
- (0x339A, 'M', u'nm'),
- (0x339B, 'M', u'μm'),
- (0x339C, 'M', u'mm'),
- (0x339D, 'M', u'cm'),
- (0x339E, 'M', u'km'),
- (0x339F, 'M', u'mm2'),
- (0x33A0, 'M', u'cm2'),
- (0x33A1, 'M', u'm2'),
- (0x33A2, 'M', u'km2'),
- (0x33A3, 'M', u'mm3'),
- (0x33A4, 'M', u'cm3'),
- (0x33A5, 'M', u'm3'),
- (0x33A6, 'M', u'km3'),
- (0x33A7, 'M', u'm∕s'),
- (0x33A8, 'M', u'm∕s2'),
- (0x33A9, 'M', u'pa'),
- (0x33AA, 'M', u'kpa'),
- (0x33AB, 'M', u'mpa'),
- (0x33AC, 'M', u'gpa'),
- (0x33AD, 'M', u'rad'),
- (0x33AE, 'M', u'rad∕s'),
- (0x33AF, 'M', u'rad∕s2'),
- (0x33B0, 'M', u'ps'),
- (0x33B1, 'M', u'ns'),
- (0x33B2, 'M', u'μs'),
- (0x33B3, 'M', u'ms'),
- (0x33B4, 'M', u'pv'),
- (0x33B5, 'M', u'nv'),
- (0x33B6, 'M', u'μv'),
- (0x33B7, 'M', u'mv'),
- (0x33B8, 'M', u'kv'),
- (0x33B9, 'M', u'mv'),
- (0x33BA, 'M', u'pw'),
- (0x33BB, 'M', u'nw'),
- (0x33BC, 'M', u'μw'),
- (0x33BD, 'M', u'mw'),
- (0x33BE, 'M', u'kw'),
- (0x33BF, 'M', u'mw'),
- (0x33C0, 'M', u'kω'),
- (0x33C1, 'M', u'mω'),
- (0x33C2, 'X'),
- (0x33C3, 'M', u'bq'),
- (0x33C4, 'M', u'cc'),
- (0x33C5, 'M', u'cd'),
- (0x33C6, 'M', u'c∕kg'),
- (0x33C7, 'X'),
- (0x33C8, 'M', u'db'),
- (0x33C9, 'M', u'gy'),
- (0x33CA, 'M', u'ha'),
- (0x33CB, 'M', u'hp'),
- (0x33CC, 'M', u'in'),
- (0x33CD, 'M', u'kk'),
- (0x33CE, 'M', u'km'),
- (0x33CF, 'M', u'kt'),
- (0x33D0, 'M', u'lm'),
- (0x33D1, 'M', u'ln'),
- (0x33D2, 'M', u'log'),
- (0x33D3, 'M', u'lx'),
- (0x33D4, 'M', u'mb'),
- (0x33D5, 'M', u'mil'),
- (0x33D6, 'M', u'mol'),
- (0x33D7, 'M', u'ph'),
- (0x33D8, 'X'),
- (0x33D9, 'M', u'ppm'),
- ]
-
-def _seg_35():
- return [
- (0x33DA, 'M', u'pr'),
- (0x33DB, 'M', u'sr'),
- (0x33DC, 'M', u'sv'),
- (0x33DD, 'M', u'wb'),
- (0x33DE, 'M', u'v∕m'),
- (0x33DF, 'M', u'a∕m'),
- (0x33E0, 'M', u'1日'),
- (0x33E1, 'M', u'2日'),
- (0x33E2, 'M', u'3日'),
- (0x33E3, 'M', u'4日'),
- (0x33E4, 'M', u'5日'),
- (0x33E5, 'M', u'6日'),
- (0x33E6, 'M', u'7日'),
- (0x33E7, 'M', u'8日'),
- (0x33E8, 'M', u'9日'),
- (0x33E9, 'M', u'10日'),
- (0x33EA, 'M', u'11日'),
- (0x33EB, 'M', u'12日'),
- (0x33EC, 'M', u'13日'),
- (0x33ED, 'M', u'14日'),
- (0x33EE, 'M', u'15日'),
- (0x33EF, 'M', u'16日'),
- (0x33F0, 'M', u'17日'),
- (0x33F1, 'M', u'18日'),
- (0x33F2, 'M', u'19日'),
- (0x33F3, 'M', u'20日'),
- (0x33F4, 'M', u'21日'),
- (0x33F5, 'M', u'22日'),
- (0x33F6, 'M', u'23日'),
- (0x33F7, 'M', u'24日'),
- (0x33F8, 'M', u'25日'),
- (0x33F9, 'M', u'26日'),
- (0x33FA, 'M', u'27日'),
- (0x33FB, 'M', u'28日'),
- (0x33FC, 'M', u'29日'),
- (0x33FD, 'M', u'30日'),
- (0x33FE, 'M', u'31日'),
- (0x33FF, 'M', u'gal'),
- (0x3400, 'V'),
- (0x9FFD, 'X'),
- (0xA000, 'V'),
- (0xA48D, 'X'),
- (0xA490, 'V'),
- (0xA4C7, 'X'),
- (0xA4D0, 'V'),
- (0xA62C, 'X'),
- (0xA640, 'M', u'ꙁ'),
- (0xA641, 'V'),
- (0xA642, 'M', u'ꙃ'),
- (0xA643, 'V'),
- (0xA644, 'M', u'ꙅ'),
- (0xA645, 'V'),
- (0xA646, 'M', u'ꙇ'),
- (0xA647, 'V'),
- (0xA648, 'M', u'ꙉ'),
- (0xA649, 'V'),
- (0xA64A, 'M', u'ꙋ'),
- (0xA64B, 'V'),
- (0xA64C, 'M', u'ꙍ'),
- (0xA64D, 'V'),
- (0xA64E, 'M', u'ꙏ'),
- (0xA64F, 'V'),
- (0xA650, 'M', u'ꙑ'),
- (0xA651, 'V'),
- (0xA652, 'M', u'ꙓ'),
- (0xA653, 'V'),
- (0xA654, 'M', u'ꙕ'),
- (0xA655, 'V'),
- (0xA656, 'M', u'ꙗ'),
- (0xA657, 'V'),
- (0xA658, 'M', u'ꙙ'),
- (0xA659, 'V'),
- (0xA65A, 'M', u'ꙛ'),
- (0xA65B, 'V'),
- (0xA65C, 'M', u'ꙝ'),
- (0xA65D, 'V'),
- (0xA65E, 'M', u'ꙟ'),
- (0xA65F, 'V'),
- (0xA660, 'M', u'ꙡ'),
- (0xA661, 'V'),
- (0xA662, 'M', u'ꙣ'),
- (0xA663, 'V'),
- (0xA664, 'M', u'ꙥ'),
- (0xA665, 'V'),
- (0xA666, 'M', u'ꙧ'),
- (0xA667, 'V'),
- (0xA668, 'M', u'ꙩ'),
- (0xA669, 'V'),
- (0xA66A, 'M', u'ꙫ'),
- (0xA66B, 'V'),
- (0xA66C, 'M', u'ꙭ'),
- (0xA66D, 'V'),
- (0xA680, 'M', u'ꚁ'),
- (0xA681, 'V'),
- (0xA682, 'M', u'ꚃ'),
- (0xA683, 'V'),
- (0xA684, 'M', u'ꚅ'),
- (0xA685, 'V'),
- (0xA686, 'M', u'ꚇ'),
- (0xA687, 'V'),
- ]
-
-def _seg_36():
- return [
- (0xA688, 'M', u'ꚉ'),
- (0xA689, 'V'),
- (0xA68A, 'M', u'ꚋ'),
- (0xA68B, 'V'),
- (0xA68C, 'M', u'ꚍ'),
- (0xA68D, 'V'),
- (0xA68E, 'M', u'ꚏ'),
- (0xA68F, 'V'),
- (0xA690, 'M', u'ꚑ'),
- (0xA691, 'V'),
- (0xA692, 'M', u'ꚓ'),
- (0xA693, 'V'),
- (0xA694, 'M', u'ꚕ'),
- (0xA695, 'V'),
- (0xA696, 'M', u'ꚗ'),
- (0xA697, 'V'),
- (0xA698, 'M', u'ꚙ'),
- (0xA699, 'V'),
- (0xA69A, 'M', u'ꚛ'),
- (0xA69B, 'V'),
- (0xA69C, 'M', u'ъ'),
- (0xA69D, 'M', u'ь'),
- (0xA69E, 'V'),
- (0xA6F8, 'X'),
- (0xA700, 'V'),
- (0xA722, 'M', u'ꜣ'),
- (0xA723, 'V'),
- (0xA724, 'M', u'ꜥ'),
- (0xA725, 'V'),
- (0xA726, 'M', u'ꜧ'),
- (0xA727, 'V'),
- (0xA728, 'M', u'ꜩ'),
- (0xA729, 'V'),
- (0xA72A, 'M', u'ꜫ'),
- (0xA72B, 'V'),
- (0xA72C, 'M', u'ꜭ'),
- (0xA72D, 'V'),
- (0xA72E, 'M', u'ꜯ'),
- (0xA72F, 'V'),
- (0xA732, 'M', u'ꜳ'),
- (0xA733, 'V'),
- (0xA734, 'M', u'ꜵ'),
- (0xA735, 'V'),
- (0xA736, 'M', u'ꜷ'),
- (0xA737, 'V'),
- (0xA738, 'M', u'ꜹ'),
- (0xA739, 'V'),
- (0xA73A, 'M', u'ꜻ'),
- (0xA73B, 'V'),
- (0xA73C, 'M', u'ꜽ'),
- (0xA73D, 'V'),
- (0xA73E, 'M', u'ꜿ'),
- (0xA73F, 'V'),
- (0xA740, 'M', u'ꝁ'),
- (0xA741, 'V'),
- (0xA742, 'M', u'ꝃ'),
- (0xA743, 'V'),
- (0xA744, 'M', u'ꝅ'),
- (0xA745, 'V'),
- (0xA746, 'M', u'ꝇ'),
- (0xA747, 'V'),
- (0xA748, 'M', u'ꝉ'),
- (0xA749, 'V'),
- (0xA74A, 'M', u'ꝋ'),
- (0xA74B, 'V'),
- (0xA74C, 'M', u'ꝍ'),
- (0xA74D, 'V'),
- (0xA74E, 'M', u'ꝏ'),
- (0xA74F, 'V'),
- (0xA750, 'M', u'ꝑ'),
- (0xA751, 'V'),
- (0xA752, 'M', u'ꝓ'),
- (0xA753, 'V'),
- (0xA754, 'M', u'ꝕ'),
- (0xA755, 'V'),
- (0xA756, 'M', u'ꝗ'),
- (0xA757, 'V'),
- (0xA758, 'M', u'ꝙ'),
- (0xA759, 'V'),
- (0xA75A, 'M', u'ꝛ'),
- (0xA75B, 'V'),
- (0xA75C, 'M', u'ꝝ'),
- (0xA75D, 'V'),
- (0xA75E, 'M', u'ꝟ'),
- (0xA75F, 'V'),
- (0xA760, 'M', u'ꝡ'),
- (0xA761, 'V'),
- (0xA762, 'M', u'ꝣ'),
- (0xA763, 'V'),
- (0xA764, 'M', u'ꝥ'),
- (0xA765, 'V'),
- (0xA766, 'M', u'ꝧ'),
- (0xA767, 'V'),
- (0xA768, 'M', u'ꝩ'),
- (0xA769, 'V'),
- (0xA76A, 'M', u'ꝫ'),
- (0xA76B, 'V'),
- (0xA76C, 'M', u'ꝭ'),
- (0xA76D, 'V'),
- (0xA76E, 'M', u'ꝯ'),
- ]
-
-def _seg_37():
- return [
- (0xA76F, 'V'),
- (0xA770, 'M', u'ꝯ'),
- (0xA771, 'V'),
- (0xA779, 'M', u'ꝺ'),
- (0xA77A, 'V'),
- (0xA77B, 'M', u'ꝼ'),
- (0xA77C, 'V'),
- (0xA77D, 'M', u'ᵹ'),
- (0xA77E, 'M', u'ꝿ'),
- (0xA77F, 'V'),
- (0xA780, 'M', u'ꞁ'),
- (0xA781, 'V'),
- (0xA782, 'M', u'ꞃ'),
- (0xA783, 'V'),
- (0xA784, 'M', u'ꞅ'),
- (0xA785, 'V'),
- (0xA786, 'M', u'ꞇ'),
- (0xA787, 'V'),
- (0xA78B, 'M', u'ꞌ'),
- (0xA78C, 'V'),
- (0xA78D, 'M', u'ɥ'),
- (0xA78E, 'V'),
- (0xA790, 'M', u'ꞑ'),
- (0xA791, 'V'),
- (0xA792, 'M', u'ꞓ'),
- (0xA793, 'V'),
- (0xA796, 'M', u'ꞗ'),
- (0xA797, 'V'),
- (0xA798, 'M', u'ꞙ'),
- (0xA799, 'V'),
- (0xA79A, 'M', u'ꞛ'),
- (0xA79B, 'V'),
- (0xA79C, 'M', u'ꞝ'),
- (0xA79D, 'V'),
- (0xA79E, 'M', u'ꞟ'),
- (0xA79F, 'V'),
- (0xA7A0, 'M', u'ꞡ'),
- (0xA7A1, 'V'),
- (0xA7A2, 'M', u'ꞣ'),
- (0xA7A3, 'V'),
- (0xA7A4, 'M', u'ꞥ'),
- (0xA7A5, 'V'),
- (0xA7A6, 'M', u'ꞧ'),
- (0xA7A7, 'V'),
- (0xA7A8, 'M', u'ꞩ'),
- (0xA7A9, 'V'),
- (0xA7AA, 'M', u'ɦ'),
- (0xA7AB, 'M', u'ɜ'),
- (0xA7AC, 'M', u'ɡ'),
- (0xA7AD, 'M', u'ɬ'),
- (0xA7AE, 'M', u'ɪ'),
- (0xA7AF, 'V'),
- (0xA7B0, 'M', u'ʞ'),
- (0xA7B1, 'M', u'ʇ'),
- (0xA7B2, 'M', u'ʝ'),
- (0xA7B3, 'M', u'ꭓ'),
- (0xA7B4, 'M', u'ꞵ'),
- (0xA7B5, 'V'),
- (0xA7B6, 'M', u'ꞷ'),
- (0xA7B7, 'V'),
- (0xA7B8, 'M', u'ꞹ'),
- (0xA7B9, 'V'),
- (0xA7BA, 'M', u'ꞻ'),
- (0xA7BB, 'V'),
- (0xA7BC, 'M', u'ꞽ'),
- (0xA7BD, 'V'),
- (0xA7BE, 'M', u'ꞿ'),
- (0xA7BF, 'V'),
- (0xA7C0, 'X'),
- (0xA7C2, 'M', u'ꟃ'),
- (0xA7C3, 'V'),
- (0xA7C4, 'M', u'ꞔ'),
- (0xA7C5, 'M', u'ʂ'),
- (0xA7C6, 'M', u'ᶎ'),
- (0xA7C7, 'M', u'ꟈ'),
- (0xA7C8, 'V'),
- (0xA7C9, 'M', u'ꟊ'),
- (0xA7CA, 'V'),
- (0xA7CB, 'X'),
- (0xA7F5, 'M', u'ꟶ'),
- (0xA7F6, 'V'),
- (0xA7F8, 'M', u'ħ'),
- (0xA7F9, 'M', u'œ'),
- (0xA7FA, 'V'),
- (0xA82D, 'X'),
- (0xA830, 'V'),
- (0xA83A, 'X'),
- (0xA840, 'V'),
- (0xA878, 'X'),
- (0xA880, 'V'),
- (0xA8C6, 'X'),
- (0xA8CE, 'V'),
- (0xA8DA, 'X'),
- (0xA8E0, 'V'),
- (0xA954, 'X'),
- (0xA95F, 'V'),
- (0xA97D, 'X'),
- (0xA980, 'V'),
- (0xA9CE, 'X'),
- (0xA9CF, 'V'),
- ]
-
-def _seg_38():
- return [
- (0xA9DA, 'X'),
- (0xA9DE, 'V'),
- (0xA9FF, 'X'),
- (0xAA00, 'V'),
- (0xAA37, 'X'),
- (0xAA40, 'V'),
- (0xAA4E, 'X'),
- (0xAA50, 'V'),
- (0xAA5A, 'X'),
- (0xAA5C, 'V'),
- (0xAAC3, 'X'),
- (0xAADB, 'V'),
- (0xAAF7, 'X'),
- (0xAB01, 'V'),
- (0xAB07, 'X'),
- (0xAB09, 'V'),
- (0xAB0F, 'X'),
- (0xAB11, 'V'),
- (0xAB17, 'X'),
- (0xAB20, 'V'),
- (0xAB27, 'X'),
- (0xAB28, 'V'),
- (0xAB2F, 'X'),
- (0xAB30, 'V'),
- (0xAB5C, 'M', u'ꜧ'),
- (0xAB5D, 'M', u'ꬷ'),
- (0xAB5E, 'M', u'ɫ'),
- (0xAB5F, 'M', u'ꭒ'),
- (0xAB60, 'V'),
- (0xAB69, 'M', u'ʍ'),
- (0xAB6A, 'V'),
- (0xAB6C, 'X'),
- (0xAB70, 'M', u'Ꭰ'),
- (0xAB71, 'M', u'Ꭱ'),
- (0xAB72, 'M', u'Ꭲ'),
- (0xAB73, 'M', u'Ꭳ'),
- (0xAB74, 'M', u'Ꭴ'),
- (0xAB75, 'M', u'Ꭵ'),
- (0xAB76, 'M', u'Ꭶ'),
- (0xAB77, 'M', u'Ꭷ'),
- (0xAB78, 'M', u'Ꭸ'),
- (0xAB79, 'M', u'Ꭹ'),
- (0xAB7A, 'M', u'Ꭺ'),
- (0xAB7B, 'M', u'Ꭻ'),
- (0xAB7C, 'M', u'Ꭼ'),
- (0xAB7D, 'M', u'Ꭽ'),
- (0xAB7E, 'M', u'Ꭾ'),
- (0xAB7F, 'M', u'Ꭿ'),
- (0xAB80, 'M', u'Ꮀ'),
- (0xAB81, 'M', u'Ꮁ'),
- (0xAB82, 'M', u'Ꮂ'),
- (0xAB83, 'M', u'Ꮃ'),
- (0xAB84, 'M', u'Ꮄ'),
- (0xAB85, 'M', u'Ꮅ'),
- (0xAB86, 'M', u'Ꮆ'),
- (0xAB87, 'M', u'Ꮇ'),
- (0xAB88, 'M', u'Ꮈ'),
- (0xAB89, 'M', u'Ꮉ'),
- (0xAB8A, 'M', u'Ꮊ'),
- (0xAB8B, 'M', u'Ꮋ'),
- (0xAB8C, 'M', u'Ꮌ'),
- (0xAB8D, 'M', u'Ꮍ'),
- (0xAB8E, 'M', u'Ꮎ'),
- (0xAB8F, 'M', u'Ꮏ'),
- (0xAB90, 'M', u'Ꮐ'),
- (0xAB91, 'M', u'Ꮑ'),
- (0xAB92, 'M', u'Ꮒ'),
- (0xAB93, 'M', u'Ꮓ'),
- (0xAB94, 'M', u'Ꮔ'),
- (0xAB95, 'M', u'Ꮕ'),
- (0xAB96, 'M', u'Ꮖ'),
- (0xAB97, 'M', u'Ꮗ'),
- (0xAB98, 'M', u'Ꮘ'),
- (0xAB99, 'M', u'Ꮙ'),
- (0xAB9A, 'M', u'Ꮚ'),
- (0xAB9B, 'M', u'Ꮛ'),
- (0xAB9C, 'M', u'Ꮜ'),
- (0xAB9D, 'M', u'Ꮝ'),
- (0xAB9E, 'M', u'Ꮞ'),
- (0xAB9F, 'M', u'Ꮟ'),
- (0xABA0, 'M', u'Ꮠ'),
- (0xABA1, 'M', u'Ꮡ'),
- (0xABA2, 'M', u'Ꮢ'),
- (0xABA3, 'M', u'Ꮣ'),
- (0xABA4, 'M', u'Ꮤ'),
- (0xABA5, 'M', u'Ꮥ'),
- (0xABA6, 'M', u'Ꮦ'),
- (0xABA7, 'M', u'Ꮧ'),
- (0xABA8, 'M', u'Ꮨ'),
- (0xABA9, 'M', u'Ꮩ'),
- (0xABAA, 'M', u'Ꮪ'),
- (0xABAB, 'M', u'Ꮫ'),
- (0xABAC, 'M', u'Ꮬ'),
- (0xABAD, 'M', u'Ꮭ'),
- (0xABAE, 'M', u'Ꮮ'),
- (0xABAF, 'M', u'Ꮯ'),
- (0xABB0, 'M', u'Ꮰ'),
- (0xABB1, 'M', u'Ꮱ'),
- (0xABB2, 'M', u'Ꮲ'),
- (0xABB3, 'M', u'Ꮳ'),
- ]
-
-def _seg_39():
- return [
- (0xABB4, 'M', u'Ꮴ'),
- (0xABB5, 'M', u'Ꮵ'),
- (0xABB6, 'M', u'Ꮶ'),
- (0xABB7, 'M', u'Ꮷ'),
- (0xABB8, 'M', u'Ꮸ'),
- (0xABB9, 'M', u'Ꮹ'),
- (0xABBA, 'M', u'Ꮺ'),
- (0xABBB, 'M', u'Ꮻ'),
- (0xABBC, 'M', u'Ꮼ'),
- (0xABBD, 'M', u'Ꮽ'),
- (0xABBE, 'M', u'Ꮾ'),
- (0xABBF, 'M', u'Ꮿ'),
- (0xABC0, 'V'),
- (0xABEE, 'X'),
- (0xABF0, 'V'),
- (0xABFA, 'X'),
- (0xAC00, 'V'),
- (0xD7A4, 'X'),
- (0xD7B0, 'V'),
- (0xD7C7, 'X'),
- (0xD7CB, 'V'),
- (0xD7FC, 'X'),
- (0xF900, 'M', u'豈'),
- (0xF901, 'M', u'更'),
- (0xF902, 'M', u'車'),
- (0xF903, 'M', u'賈'),
- (0xF904, 'M', u'滑'),
- (0xF905, 'M', u'串'),
- (0xF906, 'M', u'句'),
- (0xF907, 'M', u'龜'),
- (0xF909, 'M', u'契'),
- (0xF90A, 'M', u'金'),
- (0xF90B, 'M', u'喇'),
- (0xF90C, 'M', u'奈'),
- (0xF90D, 'M', u'懶'),
- (0xF90E, 'M', u'癩'),
- (0xF90F, 'M', u'羅'),
- (0xF910, 'M', u'蘿'),
- (0xF911, 'M', u'螺'),
- (0xF912, 'M', u'裸'),
- (0xF913, 'M', u'邏'),
- (0xF914, 'M', u'樂'),
- (0xF915, 'M', u'洛'),
- (0xF916, 'M', u'烙'),
- (0xF917, 'M', u'珞'),
- (0xF918, 'M', u'落'),
- (0xF919, 'M', u'酪'),
- (0xF91A, 'M', u'駱'),
- (0xF91B, 'M', u'亂'),
- (0xF91C, 'M', u'卵'),
- (0xF91D, 'M', u'欄'),
- (0xF91E, 'M', u'爛'),
- (0xF91F, 'M', u'蘭'),
- (0xF920, 'M', u'鸞'),
- (0xF921, 'M', u'嵐'),
- (0xF922, 'M', u'濫'),
- (0xF923, 'M', u'藍'),
- (0xF924, 'M', u'襤'),
- (0xF925, 'M', u'拉'),
- (0xF926, 'M', u'臘'),
- (0xF927, 'M', u'蠟'),
- (0xF928, 'M', u'廊'),
- (0xF929, 'M', u'朗'),
- (0xF92A, 'M', u'浪'),
- (0xF92B, 'M', u'狼'),
- (0xF92C, 'M', u'郎'),
- (0xF92D, 'M', u'來'),
- (0xF92E, 'M', u'冷'),
- (0xF92F, 'M', u'勞'),
- (0xF930, 'M', u'擄'),
- (0xF931, 'M', u'櫓'),
- (0xF932, 'M', u'爐'),
- (0xF933, 'M', u'盧'),
- (0xF934, 'M', u'老'),
- (0xF935, 'M', u'蘆'),
- (0xF936, 'M', u'虜'),
- (0xF937, 'M', u'路'),
- (0xF938, 'M', u'露'),
- (0xF939, 'M', u'魯'),
- (0xF93A, 'M', u'鷺'),
- (0xF93B, 'M', u'碌'),
- (0xF93C, 'M', u'祿'),
- (0xF93D, 'M', u'綠'),
- (0xF93E, 'M', u'菉'),
- (0xF93F, 'M', u'錄'),
- (0xF940, 'M', u'鹿'),
- (0xF941, 'M', u'論'),
- (0xF942, 'M', u'壟'),
- (0xF943, 'M', u'弄'),
- (0xF944, 'M', u'籠'),
- (0xF945, 'M', u'聾'),
- (0xF946, 'M', u'牢'),
- (0xF947, 'M', u'磊'),
- (0xF948, 'M', u'賂'),
- (0xF949, 'M', u'雷'),
- (0xF94A, 'M', u'壘'),
- (0xF94B, 'M', u'屢'),
- (0xF94C, 'M', u'樓'),
- (0xF94D, 'M', u'淚'),
- (0xF94E, 'M', u'漏'),
- ]
-
-def _seg_40():
- return [
- (0xF94F, 'M', u'累'),
- (0xF950, 'M', u'縷'),
- (0xF951, 'M', u'陋'),
- (0xF952, 'M', u'勒'),
- (0xF953, 'M', u'肋'),
- (0xF954, 'M', u'凜'),
- (0xF955, 'M', u'凌'),
- (0xF956, 'M', u'稜'),
- (0xF957, 'M', u'綾'),
- (0xF958, 'M', u'菱'),
- (0xF959, 'M', u'陵'),
- (0xF95A, 'M', u'讀'),
- (0xF95B, 'M', u'拏'),
- (0xF95C, 'M', u'樂'),
- (0xF95D, 'M', u'諾'),
- (0xF95E, 'M', u'丹'),
- (0xF95F, 'M', u'寧'),
- (0xF960, 'M', u'怒'),
- (0xF961, 'M', u'率'),
- (0xF962, 'M', u'異'),
- (0xF963, 'M', u'北'),
- (0xF964, 'M', u'磻'),
- (0xF965, 'M', u'便'),
- (0xF966, 'M', u'復'),
- (0xF967, 'M', u'不'),
- (0xF968, 'M', u'泌'),
- (0xF969, 'M', u'數'),
- (0xF96A, 'M', u'索'),
- (0xF96B, 'M', u'參'),
- (0xF96C, 'M', u'塞'),
- (0xF96D, 'M', u'省'),
- (0xF96E, 'M', u'葉'),
- (0xF96F, 'M', u'說'),
- (0xF970, 'M', u'殺'),
- (0xF971, 'M', u'辰'),
- (0xF972, 'M', u'沈'),
- (0xF973, 'M', u'拾'),
- (0xF974, 'M', u'若'),
- (0xF975, 'M', u'掠'),
- (0xF976, 'M', u'略'),
- (0xF977, 'M', u'亮'),
- (0xF978, 'M', u'兩'),
- (0xF979, 'M', u'凉'),
- (0xF97A, 'M', u'梁'),
- (0xF97B, 'M', u'糧'),
- (0xF97C, 'M', u'良'),
- (0xF97D, 'M', u'諒'),
- (0xF97E, 'M', u'量'),
- (0xF97F, 'M', u'勵'),
- (0xF980, 'M', u'呂'),
- (0xF981, 'M', u'女'),
- (0xF982, 'M', u'廬'),
- (0xF983, 'M', u'旅'),
- (0xF984, 'M', u'濾'),
- (0xF985, 'M', u'礪'),
- (0xF986, 'M', u'閭'),
- (0xF987, 'M', u'驪'),
- (0xF988, 'M', u'麗'),
- (0xF989, 'M', u'黎'),
- (0xF98A, 'M', u'力'),
- (0xF98B, 'M', u'曆'),
- (0xF98C, 'M', u'歷'),
- (0xF98D, 'M', u'轢'),
- (0xF98E, 'M', u'年'),
- (0xF98F, 'M', u'憐'),
- (0xF990, 'M', u'戀'),
- (0xF991, 'M', u'撚'),
- (0xF992, 'M', u'漣'),
- (0xF993, 'M', u'煉'),
- (0xF994, 'M', u'璉'),
- (0xF995, 'M', u'秊'),
- (0xF996, 'M', u'練'),
- (0xF997, 'M', u'聯'),
- (0xF998, 'M', u'輦'),
- (0xF999, 'M', u'蓮'),
- (0xF99A, 'M', u'連'),
- (0xF99B, 'M', u'鍊'),
- (0xF99C, 'M', u'列'),
- (0xF99D, 'M', u'劣'),
- (0xF99E, 'M', u'咽'),
- (0xF99F, 'M', u'烈'),
- (0xF9A0, 'M', u'裂'),
- (0xF9A1, 'M', u'說'),
- (0xF9A2, 'M', u'廉'),
- (0xF9A3, 'M', u'念'),
- (0xF9A4, 'M', u'捻'),
- (0xF9A5, 'M', u'殮'),
- (0xF9A6, 'M', u'簾'),
- (0xF9A7, 'M', u'獵'),
- (0xF9A8, 'M', u'令'),
- (0xF9A9, 'M', u'囹'),
- (0xF9AA, 'M', u'寧'),
- (0xF9AB, 'M', u'嶺'),
- (0xF9AC, 'M', u'怜'),
- (0xF9AD, 'M', u'玲'),
- (0xF9AE, 'M', u'瑩'),
- (0xF9AF, 'M', u'羚'),
- (0xF9B0, 'M', u'聆'),
- (0xF9B1, 'M', u'鈴'),
- (0xF9B2, 'M', u'零'),
- ]
-
-def _seg_41():
- return [
- (0xF9B3, 'M', u'靈'),
- (0xF9B4, 'M', u'領'),
- (0xF9B5, 'M', u'例'),
- (0xF9B6, 'M', u'禮'),
- (0xF9B7, 'M', u'醴'),
- (0xF9B8, 'M', u'隸'),
- (0xF9B9, 'M', u'惡'),
- (0xF9BA, 'M', u'了'),
- (0xF9BB, 'M', u'僚'),
- (0xF9BC, 'M', u'寮'),
- (0xF9BD, 'M', u'尿'),
- (0xF9BE, 'M', u'料'),
- (0xF9BF, 'M', u'樂'),
- (0xF9C0, 'M', u'燎'),
- (0xF9C1, 'M', u'療'),
- (0xF9C2, 'M', u'蓼'),
- (0xF9C3, 'M', u'遼'),
- (0xF9C4, 'M', u'龍'),
- (0xF9C5, 'M', u'暈'),
- (0xF9C6, 'M', u'阮'),
- (0xF9C7, 'M', u'劉'),
- (0xF9C8, 'M', u'杻'),
- (0xF9C9, 'M', u'柳'),
- (0xF9CA, 'M', u'流'),
- (0xF9CB, 'M', u'溜'),
- (0xF9CC, 'M', u'琉'),
- (0xF9CD, 'M', u'留'),
- (0xF9CE, 'M', u'硫'),
- (0xF9CF, 'M', u'紐'),
- (0xF9D0, 'M', u'類'),
- (0xF9D1, 'M', u'六'),
- (0xF9D2, 'M', u'戮'),
- (0xF9D3, 'M', u'陸'),
- (0xF9D4, 'M', u'倫'),
- (0xF9D5, 'M', u'崙'),
- (0xF9D6, 'M', u'淪'),
- (0xF9D7, 'M', u'輪'),
- (0xF9D8, 'M', u'律'),
- (0xF9D9, 'M', u'慄'),
- (0xF9DA, 'M', u'栗'),
- (0xF9DB, 'M', u'率'),
- (0xF9DC, 'M', u'隆'),
- (0xF9DD, 'M', u'利'),
- (0xF9DE, 'M', u'吏'),
- (0xF9DF, 'M', u'履'),
- (0xF9E0, 'M', u'易'),
- (0xF9E1, 'M', u'李'),
- (0xF9E2, 'M', u'梨'),
- (0xF9E3, 'M', u'泥'),
- (0xF9E4, 'M', u'理'),
- (0xF9E5, 'M', u'痢'),
- (0xF9E6, 'M', u'罹'),
- (0xF9E7, 'M', u'裏'),
- (0xF9E8, 'M', u'裡'),
- (0xF9E9, 'M', u'里'),
- (0xF9EA, 'M', u'離'),
- (0xF9EB, 'M', u'匿'),
- (0xF9EC, 'M', u'溺'),
- (0xF9ED, 'M', u'吝'),
- (0xF9EE, 'M', u'燐'),
- (0xF9EF, 'M', u'璘'),
- (0xF9F0, 'M', u'藺'),
- (0xF9F1, 'M', u'隣'),
- (0xF9F2, 'M', u'鱗'),
- (0xF9F3, 'M', u'麟'),
- (0xF9F4, 'M', u'林'),
- (0xF9F5, 'M', u'淋'),
- (0xF9F6, 'M', u'臨'),
- (0xF9F7, 'M', u'立'),
- (0xF9F8, 'M', u'笠'),
- (0xF9F9, 'M', u'粒'),
- (0xF9FA, 'M', u'狀'),
- (0xF9FB, 'M', u'炙'),
- (0xF9FC, 'M', u'識'),
- (0xF9FD, 'M', u'什'),
- (0xF9FE, 'M', u'茶'),
- (0xF9FF, 'M', u'刺'),
- (0xFA00, 'M', u'切'),
- (0xFA01, 'M', u'度'),
- (0xFA02, 'M', u'拓'),
- (0xFA03, 'M', u'糖'),
- (0xFA04, 'M', u'宅'),
- (0xFA05, 'M', u'洞'),
- (0xFA06, 'M', u'暴'),
- (0xFA07, 'M', u'輻'),
- (0xFA08, 'M', u'行'),
- (0xFA09, 'M', u'降'),
- (0xFA0A, 'M', u'見'),
- (0xFA0B, 'M', u'廓'),
- (0xFA0C, 'M', u'兀'),
- (0xFA0D, 'M', u'嗀'),
- (0xFA0E, 'V'),
- (0xFA10, 'M', u'塚'),
- (0xFA11, 'V'),
- (0xFA12, 'M', u'晴'),
- (0xFA13, 'V'),
- (0xFA15, 'M', u'凞'),
- (0xFA16, 'M', u'猪'),
- (0xFA17, 'M', u'益'),
- (0xFA18, 'M', u'礼'),
- ]
-
-def _seg_42():
- return [
- (0xFA19, 'M', u'神'),
- (0xFA1A, 'M', u'祥'),
- (0xFA1B, 'M', u'福'),
- (0xFA1C, 'M', u'靖'),
- (0xFA1D, 'M', u'精'),
- (0xFA1E, 'M', u'羽'),
- (0xFA1F, 'V'),
- (0xFA20, 'M', u'蘒'),
- (0xFA21, 'V'),
- (0xFA22, 'M', u'諸'),
- (0xFA23, 'V'),
- (0xFA25, 'M', u'逸'),
- (0xFA26, 'M', u'都'),
- (0xFA27, 'V'),
- (0xFA2A, 'M', u'飯'),
- (0xFA2B, 'M', u'飼'),
- (0xFA2C, 'M', u'館'),
- (0xFA2D, 'M', u'鶴'),
- (0xFA2E, 'M', u'郞'),
- (0xFA2F, 'M', u'隷'),
- (0xFA30, 'M', u'侮'),
- (0xFA31, 'M', u'僧'),
- (0xFA32, 'M', u'免'),
- (0xFA33, 'M', u'勉'),
- (0xFA34, 'M', u'勤'),
- (0xFA35, 'M', u'卑'),
- (0xFA36, 'M', u'喝'),
- (0xFA37, 'M', u'嘆'),
- (0xFA38, 'M', u'器'),
- (0xFA39, 'M', u'塀'),
- (0xFA3A, 'M', u'墨'),
- (0xFA3B, 'M', u'層'),
- (0xFA3C, 'M', u'屮'),
- (0xFA3D, 'M', u'悔'),
- (0xFA3E, 'M', u'慨'),
- (0xFA3F, 'M', u'憎'),
- (0xFA40, 'M', u'懲'),
- (0xFA41, 'M', u'敏'),
- (0xFA42, 'M', u'既'),
- (0xFA43, 'M', u'暑'),
- (0xFA44, 'M', u'梅'),
- (0xFA45, 'M', u'海'),
- (0xFA46, 'M', u'渚'),
- (0xFA47, 'M', u'漢'),
- (0xFA48, 'M', u'煮'),
- (0xFA49, 'M', u'爫'),
- (0xFA4A, 'M', u'琢'),
- (0xFA4B, 'M', u'碑'),
- (0xFA4C, 'M', u'社'),
- (0xFA4D, 'M', u'祉'),
- (0xFA4E, 'M', u'祈'),
- (0xFA4F, 'M', u'祐'),
- (0xFA50, 'M', u'祖'),
- (0xFA51, 'M', u'祝'),
- (0xFA52, 'M', u'禍'),
- (0xFA53, 'M', u'禎'),
- (0xFA54, 'M', u'穀'),
- (0xFA55, 'M', u'突'),
- (0xFA56, 'M', u'節'),
- (0xFA57, 'M', u'練'),
- (0xFA58, 'M', u'縉'),
- (0xFA59, 'M', u'繁'),
- (0xFA5A, 'M', u'署'),
- (0xFA5B, 'M', u'者'),
- (0xFA5C, 'M', u'臭'),
- (0xFA5D, 'M', u'艹'),
- (0xFA5F, 'M', u'著'),
- (0xFA60, 'M', u'褐'),
- (0xFA61, 'M', u'視'),
- (0xFA62, 'M', u'謁'),
- (0xFA63, 'M', u'謹'),
- (0xFA64, 'M', u'賓'),
- (0xFA65, 'M', u'贈'),
- (0xFA66, 'M', u'辶'),
- (0xFA67, 'M', u'逸'),
- (0xFA68, 'M', u'難'),
- (0xFA69, 'M', u'響'),
- (0xFA6A, 'M', u'頻'),
- (0xFA6B, 'M', u'恵'),
- (0xFA6C, 'M', u'𤋮'),
- (0xFA6D, 'M', u'舘'),
- (0xFA6E, 'X'),
- (0xFA70, 'M', u'並'),
- (0xFA71, 'M', u'况'),
- (0xFA72, 'M', u'全'),
- (0xFA73, 'M', u'侀'),
- (0xFA74, 'M', u'充'),
- (0xFA75, 'M', u'冀'),
- (0xFA76, 'M', u'勇'),
- (0xFA77, 'M', u'勺'),
- (0xFA78, 'M', u'喝'),
- (0xFA79, 'M', u'啕'),
- (0xFA7A, 'M', u'喙'),
- (0xFA7B, 'M', u'嗢'),
- (0xFA7C, 'M', u'塚'),
- (0xFA7D, 'M', u'墳'),
- (0xFA7E, 'M', u'奄'),
- (0xFA7F, 'M', u'奔'),
- (0xFA80, 'M', u'婢'),
- (0xFA81, 'M', u'嬨'),
- ]
-
-def _seg_43():
- return [
- (0xFA82, 'M', u'廒'),
- (0xFA83, 'M', u'廙'),
- (0xFA84, 'M', u'彩'),
- (0xFA85, 'M', u'徭'),
- (0xFA86, 'M', u'惘'),
- (0xFA87, 'M', u'慎'),
- (0xFA88, 'M', u'愈'),
- (0xFA89, 'M', u'憎'),
- (0xFA8A, 'M', u'慠'),
- (0xFA8B, 'M', u'懲'),
- (0xFA8C, 'M', u'戴'),
- (0xFA8D, 'M', u'揄'),
- (0xFA8E, 'M', u'搜'),
- (0xFA8F, 'M', u'摒'),
- (0xFA90, 'M', u'敖'),
- (0xFA91, 'M', u'晴'),
- (0xFA92, 'M', u'朗'),
- (0xFA93, 'M', u'望'),
- (0xFA94, 'M', u'杖'),
- (0xFA95, 'M', u'歹'),
- (0xFA96, 'M', u'殺'),
- (0xFA97, 'M', u'流'),
- (0xFA98, 'M', u'滛'),
- (0xFA99, 'M', u'滋'),
- (0xFA9A, 'M', u'漢'),
- (0xFA9B, 'M', u'瀞'),
- (0xFA9C, 'M', u'煮'),
- (0xFA9D, 'M', u'瞧'),
- (0xFA9E, 'M', u'爵'),
- (0xFA9F, 'M', u'犯'),
- (0xFAA0, 'M', u'猪'),
- (0xFAA1, 'M', u'瑱'),
- (0xFAA2, 'M', u'甆'),
- (0xFAA3, 'M', u'画'),
- (0xFAA4, 'M', u'瘝'),
- (0xFAA5, 'M', u'瘟'),
- (0xFAA6, 'M', u'益'),
- (0xFAA7, 'M', u'盛'),
- (0xFAA8, 'M', u'直'),
- (0xFAA9, 'M', u'睊'),
- (0xFAAA, 'M', u'着'),
- (0xFAAB, 'M', u'磌'),
- (0xFAAC, 'M', u'窱'),
- (0xFAAD, 'M', u'節'),
- (0xFAAE, 'M', u'类'),
- (0xFAAF, 'M', u'絛'),
- (0xFAB0, 'M', u'練'),
- (0xFAB1, 'M', u'缾'),
- (0xFAB2, 'M', u'者'),
- (0xFAB3, 'M', u'荒'),
- (0xFAB4, 'M', u'華'),
- (0xFAB5, 'M', u'蝹'),
- (0xFAB6, 'M', u'襁'),
- (0xFAB7, 'M', u'覆'),
- (0xFAB8, 'M', u'視'),
- (0xFAB9, 'M', u'調'),
- (0xFABA, 'M', u'諸'),
- (0xFABB, 'M', u'請'),
- (0xFABC, 'M', u'謁'),
- (0xFABD, 'M', u'諾'),
- (0xFABE, 'M', u'諭'),
- (0xFABF, 'M', u'謹'),
- (0xFAC0, 'M', u'變'),
- (0xFAC1, 'M', u'贈'),
- (0xFAC2, 'M', u'輸'),
- (0xFAC3, 'M', u'遲'),
- (0xFAC4, 'M', u'醙'),
- (0xFAC5, 'M', u'鉶'),
- (0xFAC6, 'M', u'陼'),
- (0xFAC7, 'M', u'難'),
- (0xFAC8, 'M', u'靖'),
- (0xFAC9, 'M', u'韛'),
- (0xFACA, 'M', u'響'),
- (0xFACB, 'M', u'頋'),
- (0xFACC, 'M', u'頻'),
- (0xFACD, 'M', u'鬒'),
- (0xFACE, 'M', u'龜'),
- (0xFACF, 'M', u'𢡊'),
- (0xFAD0, 'M', u'𢡄'),
- (0xFAD1, 'M', u'𣏕'),
- (0xFAD2, 'M', u'㮝'),
- (0xFAD3, 'M', u'䀘'),
- (0xFAD4, 'M', u'䀹'),
- (0xFAD5, 'M', u'𥉉'),
- (0xFAD6, 'M', u'𥳐'),
- (0xFAD7, 'M', u'𧻓'),
- (0xFAD8, 'M', u'齃'),
- (0xFAD9, 'M', u'龎'),
- (0xFADA, 'X'),
- (0xFB00, 'M', u'ff'),
- (0xFB01, 'M', u'fi'),
- (0xFB02, 'M', u'fl'),
- (0xFB03, 'M', u'ffi'),
- (0xFB04, 'M', u'ffl'),
- (0xFB05, 'M', u'st'),
- (0xFB07, 'X'),
- (0xFB13, 'M', u'մն'),
- (0xFB14, 'M', u'մե'),
- (0xFB15, 'M', u'մի'),
- (0xFB16, 'M', u'վն'),
- ]
-
-def _seg_44():
- return [
- (0xFB17, 'M', u'մխ'),
- (0xFB18, 'X'),
- (0xFB1D, 'M', u'יִ'),
- (0xFB1E, 'V'),
- (0xFB1F, 'M', u'ײַ'),
- (0xFB20, 'M', u'ע'),
- (0xFB21, 'M', u'א'),
- (0xFB22, 'M', u'ד'),
- (0xFB23, 'M', u'ה'),
- (0xFB24, 'M', u'כ'),
- (0xFB25, 'M', u'ל'),
- (0xFB26, 'M', u'ם'),
- (0xFB27, 'M', u'ר'),
- (0xFB28, 'M', u'ת'),
- (0xFB29, '3', u'+'),
- (0xFB2A, 'M', u'שׁ'),
- (0xFB2B, 'M', u'שׂ'),
- (0xFB2C, 'M', u'שּׁ'),
- (0xFB2D, 'M', u'שּׂ'),
- (0xFB2E, 'M', u'אַ'),
- (0xFB2F, 'M', u'אָ'),
- (0xFB30, 'M', u'אּ'),
- (0xFB31, 'M', u'בּ'),
- (0xFB32, 'M', u'גּ'),
- (0xFB33, 'M', u'דּ'),
- (0xFB34, 'M', u'הּ'),
- (0xFB35, 'M', u'וּ'),
- (0xFB36, 'M', u'זּ'),
- (0xFB37, 'X'),
- (0xFB38, 'M', u'טּ'),
- (0xFB39, 'M', u'יּ'),
- (0xFB3A, 'M', u'ךּ'),
- (0xFB3B, 'M', u'כּ'),
- (0xFB3C, 'M', u'לּ'),
- (0xFB3D, 'X'),
- (0xFB3E, 'M', u'מּ'),
- (0xFB3F, 'X'),
- (0xFB40, 'M', u'נּ'),
- (0xFB41, 'M', u'סּ'),
- (0xFB42, 'X'),
- (0xFB43, 'M', u'ףּ'),
- (0xFB44, 'M', u'פּ'),
- (0xFB45, 'X'),
- (0xFB46, 'M', u'צּ'),
- (0xFB47, 'M', u'קּ'),
- (0xFB48, 'M', u'רּ'),
- (0xFB49, 'M', u'שּ'),
- (0xFB4A, 'M', u'תּ'),
- (0xFB4B, 'M', u'וֹ'),
- (0xFB4C, 'M', u'בֿ'),
- (0xFB4D, 'M', u'כֿ'),
- (0xFB4E, 'M', u'פֿ'),
- (0xFB4F, 'M', u'אל'),
- (0xFB50, 'M', u'ٱ'),
- (0xFB52, 'M', u'ٻ'),
- (0xFB56, 'M', u'پ'),
- (0xFB5A, 'M', u'ڀ'),
- (0xFB5E, 'M', u'ٺ'),
- (0xFB62, 'M', u'ٿ'),
- (0xFB66, 'M', u'ٹ'),
- (0xFB6A, 'M', u'ڤ'),
- (0xFB6E, 'M', u'ڦ'),
- (0xFB72, 'M', u'ڄ'),
- (0xFB76, 'M', u'ڃ'),
- (0xFB7A, 'M', u'چ'),
- (0xFB7E, 'M', u'ڇ'),
- (0xFB82, 'M', u'ڍ'),
- (0xFB84, 'M', u'ڌ'),
- (0xFB86, 'M', u'ڎ'),
- (0xFB88, 'M', u'ڈ'),
- (0xFB8A, 'M', u'ژ'),
- (0xFB8C, 'M', u'ڑ'),
- (0xFB8E, 'M', u'ک'),
- (0xFB92, 'M', u'گ'),
- (0xFB96, 'M', u'ڳ'),
- (0xFB9A, 'M', u'ڱ'),
- (0xFB9E, 'M', u'ں'),
- (0xFBA0, 'M', u'ڻ'),
- (0xFBA4, 'M', u'ۀ'),
- (0xFBA6, 'M', u'ہ'),
- (0xFBAA, 'M', u'ھ'),
- (0xFBAE, 'M', u'ے'),
- (0xFBB0, 'M', u'ۓ'),
- (0xFBB2, 'V'),
- (0xFBC2, 'X'),
- (0xFBD3, 'M', u'ڭ'),
- (0xFBD7, 'M', u'ۇ'),
- (0xFBD9, 'M', u'ۆ'),
- (0xFBDB, 'M', u'ۈ'),
- (0xFBDD, 'M', u'ۇٴ'),
- (0xFBDE, 'M', u'ۋ'),
- (0xFBE0, 'M', u'ۅ'),
- (0xFBE2, 'M', u'ۉ'),
- (0xFBE4, 'M', u'ې'),
- (0xFBE8, 'M', u'ى'),
- (0xFBEA, 'M', u'ئا'),
- (0xFBEC, 'M', u'ئە'),
- (0xFBEE, 'M', u'ئو'),
- (0xFBF0, 'M', u'ئۇ'),
- (0xFBF2, 'M', u'ئۆ'),
- ]
-
-def _seg_45():
- return [
- (0xFBF4, 'M', u'ئۈ'),
- (0xFBF6, 'M', u'ئې'),
- (0xFBF9, 'M', u'ئى'),
- (0xFBFC, 'M', u'ی'),
- (0xFC00, 'M', u'ئج'),
- (0xFC01, 'M', u'ئح'),
- (0xFC02, 'M', u'ئم'),
- (0xFC03, 'M', u'ئى'),
- (0xFC04, 'M', u'ئي'),
- (0xFC05, 'M', u'بج'),
- (0xFC06, 'M', u'بح'),
- (0xFC07, 'M', u'بخ'),
- (0xFC08, 'M', u'بم'),
- (0xFC09, 'M', u'بى'),
- (0xFC0A, 'M', u'بي'),
- (0xFC0B, 'M', u'تج'),
- (0xFC0C, 'M', u'تح'),
- (0xFC0D, 'M', u'تخ'),
- (0xFC0E, 'M', u'تم'),
- (0xFC0F, 'M', u'تى'),
- (0xFC10, 'M', u'تي'),
- (0xFC11, 'M', u'ثج'),
- (0xFC12, 'M', u'ثم'),
- (0xFC13, 'M', u'ثى'),
- (0xFC14, 'M', u'ثي'),
- (0xFC15, 'M', u'جح'),
- (0xFC16, 'M', u'جم'),
- (0xFC17, 'M', u'حج'),
- (0xFC18, 'M', u'حم'),
- (0xFC19, 'M', u'خج'),
- (0xFC1A, 'M', u'خح'),
- (0xFC1B, 'M', u'خم'),
- (0xFC1C, 'M', u'سج'),
- (0xFC1D, 'M', u'سح'),
- (0xFC1E, 'M', u'سخ'),
- (0xFC1F, 'M', u'سم'),
- (0xFC20, 'M', u'صح'),
- (0xFC21, 'M', u'صم'),
- (0xFC22, 'M', u'ضج'),
- (0xFC23, 'M', u'ضح'),
- (0xFC24, 'M', u'ضخ'),
- (0xFC25, 'M', u'ضم'),
- (0xFC26, 'M', u'طح'),
- (0xFC27, 'M', u'طم'),
- (0xFC28, 'M', u'ظم'),
- (0xFC29, 'M', u'عج'),
- (0xFC2A, 'M', u'عم'),
- (0xFC2B, 'M', u'غج'),
- (0xFC2C, 'M', u'غم'),
- (0xFC2D, 'M', u'فج'),
- (0xFC2E, 'M', u'فح'),
- (0xFC2F, 'M', u'فخ'),
- (0xFC30, 'M', u'فم'),
- (0xFC31, 'M', u'فى'),
- (0xFC32, 'M', u'في'),
- (0xFC33, 'M', u'قح'),
- (0xFC34, 'M', u'قم'),
- (0xFC35, 'M', u'قى'),
- (0xFC36, 'M', u'قي'),
- (0xFC37, 'M', u'كا'),
- (0xFC38, 'M', u'كج'),
- (0xFC39, 'M', u'كح'),
- (0xFC3A, 'M', u'كخ'),
- (0xFC3B, 'M', u'كل'),
- (0xFC3C, 'M', u'كم'),
- (0xFC3D, 'M', u'كى'),
- (0xFC3E, 'M', u'كي'),
- (0xFC3F, 'M', u'لج'),
- (0xFC40, 'M', u'لح'),
- (0xFC41, 'M', u'لخ'),
- (0xFC42, 'M', u'لم'),
- (0xFC43, 'M', u'لى'),
- (0xFC44, 'M', u'لي'),
- (0xFC45, 'M', u'مج'),
- (0xFC46, 'M', u'مح'),
- (0xFC47, 'M', u'مخ'),
- (0xFC48, 'M', u'مم'),
- (0xFC49, 'M', u'مى'),
- (0xFC4A, 'M', u'مي'),
- (0xFC4B, 'M', u'نج'),
- (0xFC4C, 'M', u'نح'),
- (0xFC4D, 'M', u'نخ'),
- (0xFC4E, 'M', u'نم'),
- (0xFC4F, 'M', u'نى'),
- (0xFC50, 'M', u'ني'),
- (0xFC51, 'M', u'هج'),
- (0xFC52, 'M', u'هم'),
- (0xFC53, 'M', u'هى'),
- (0xFC54, 'M', u'هي'),
- (0xFC55, 'M', u'يج'),
- (0xFC56, 'M', u'يح'),
- (0xFC57, 'M', u'يخ'),
- (0xFC58, 'M', u'يم'),
- (0xFC59, 'M', u'يى'),
- (0xFC5A, 'M', u'يي'),
- (0xFC5B, 'M', u'ذٰ'),
- (0xFC5C, 'M', u'رٰ'),
- (0xFC5D, 'M', u'ىٰ'),
- (0xFC5E, '3', u' ٌّ'),
- (0xFC5F, '3', u' ٍّ'),
- ]
-
-def _seg_46():
- return [
- (0xFC60, '3', u' َّ'),
- (0xFC61, '3', u' ُّ'),
- (0xFC62, '3', u' ِّ'),
- (0xFC63, '3', u' ّٰ'),
- (0xFC64, 'M', u'ئر'),
- (0xFC65, 'M', u'ئز'),
- (0xFC66, 'M', u'ئم'),
- (0xFC67, 'M', u'ئن'),
- (0xFC68, 'M', u'ئى'),
- (0xFC69, 'M', u'ئي'),
- (0xFC6A, 'M', u'بر'),
- (0xFC6B, 'M', u'بز'),
- (0xFC6C, 'M', u'بم'),
- (0xFC6D, 'M', u'بن'),
- (0xFC6E, 'M', u'بى'),
- (0xFC6F, 'M', u'بي'),
- (0xFC70, 'M', u'تر'),
- (0xFC71, 'M', u'تز'),
- (0xFC72, 'M', u'تم'),
- (0xFC73, 'M', u'تن'),
- (0xFC74, 'M', u'تى'),
- (0xFC75, 'M', u'تي'),
- (0xFC76, 'M', u'ثر'),
- (0xFC77, 'M', u'ثز'),
- (0xFC78, 'M', u'ثم'),
- (0xFC79, 'M', u'ثن'),
- (0xFC7A, 'M', u'ثى'),
- (0xFC7B, 'M', u'ثي'),
- (0xFC7C, 'M', u'فى'),
- (0xFC7D, 'M', u'في'),
- (0xFC7E, 'M', u'قى'),
- (0xFC7F, 'M', u'قي'),
- (0xFC80, 'M', u'كا'),
- (0xFC81, 'M', u'كل'),
- (0xFC82, 'M', u'كم'),
- (0xFC83, 'M', u'كى'),
- (0xFC84, 'M', u'كي'),
- (0xFC85, 'M', u'لم'),
- (0xFC86, 'M', u'لى'),
- (0xFC87, 'M', u'لي'),
- (0xFC88, 'M', u'ما'),
- (0xFC89, 'M', u'مم'),
- (0xFC8A, 'M', u'نر'),
- (0xFC8B, 'M', u'نز'),
- (0xFC8C, 'M', u'نم'),
- (0xFC8D, 'M', u'نن'),
- (0xFC8E, 'M', u'نى'),
- (0xFC8F, 'M', u'ني'),
- (0xFC90, 'M', u'ىٰ'),
- (0xFC91, 'M', u'ير'),
- (0xFC92, 'M', u'يز'),
- (0xFC93, 'M', u'يم'),
- (0xFC94, 'M', u'ين'),
- (0xFC95, 'M', u'يى'),
- (0xFC96, 'M', u'يي'),
- (0xFC97, 'M', u'ئج'),
- (0xFC98, 'M', u'ئح'),
- (0xFC99, 'M', u'ئخ'),
- (0xFC9A, 'M', u'ئم'),
- (0xFC9B, 'M', u'ئه'),
- (0xFC9C, 'M', u'بج'),
- (0xFC9D, 'M', u'بح'),
- (0xFC9E, 'M', u'بخ'),
- (0xFC9F, 'M', u'بم'),
- (0xFCA0, 'M', u'به'),
- (0xFCA1, 'M', u'تج'),
- (0xFCA2, 'M', u'تح'),
- (0xFCA3, 'M', u'تخ'),
- (0xFCA4, 'M', u'تم'),
- (0xFCA5, 'M', u'ته'),
- (0xFCA6, 'M', u'ثم'),
- (0xFCA7, 'M', u'جح'),
- (0xFCA8, 'M', u'جم'),
- (0xFCA9, 'M', u'حج'),
- (0xFCAA, 'M', u'حم'),
- (0xFCAB, 'M', u'خج'),
- (0xFCAC, 'M', u'خم'),
- (0xFCAD, 'M', u'سج'),
- (0xFCAE, 'M', u'سح'),
- (0xFCAF, 'M', u'سخ'),
- (0xFCB0, 'M', u'سم'),
- (0xFCB1, 'M', u'صح'),
- (0xFCB2, 'M', u'صخ'),
- (0xFCB3, 'M', u'صم'),
- (0xFCB4, 'M', u'ضج'),
- (0xFCB5, 'M', u'ضح'),
- (0xFCB6, 'M', u'ضخ'),
- (0xFCB7, 'M', u'ضم'),
- (0xFCB8, 'M', u'طح'),
- (0xFCB9, 'M', u'ظم'),
- (0xFCBA, 'M', u'عج'),
- (0xFCBB, 'M', u'عم'),
- (0xFCBC, 'M', u'غج'),
- (0xFCBD, 'M', u'غم'),
- (0xFCBE, 'M', u'فج'),
- (0xFCBF, 'M', u'فح'),
- (0xFCC0, 'M', u'فخ'),
- (0xFCC1, 'M', u'فم'),
- (0xFCC2, 'M', u'قح'),
- (0xFCC3, 'M', u'قم'),
- ]
-
-def _seg_47():
- return [
- (0xFCC4, 'M', u'كج'),
- (0xFCC5, 'M', u'كح'),
- (0xFCC6, 'M', u'كخ'),
- (0xFCC7, 'M', u'كل'),
- (0xFCC8, 'M', u'كم'),
- (0xFCC9, 'M', u'لج'),
- (0xFCCA, 'M', u'لح'),
- (0xFCCB, 'M', u'لخ'),
- (0xFCCC, 'M', u'لم'),
- (0xFCCD, 'M', u'له'),
- (0xFCCE, 'M', u'مج'),
- (0xFCCF, 'M', u'مح'),
- (0xFCD0, 'M', u'مخ'),
- (0xFCD1, 'M', u'مم'),
- (0xFCD2, 'M', u'نج'),
- (0xFCD3, 'M', u'نح'),
- (0xFCD4, 'M', u'نخ'),
- (0xFCD5, 'M', u'نم'),
- (0xFCD6, 'M', u'نه'),
- (0xFCD7, 'M', u'هج'),
- (0xFCD8, 'M', u'هم'),
- (0xFCD9, 'M', u'هٰ'),
- (0xFCDA, 'M', u'يج'),
- (0xFCDB, 'M', u'يح'),
- (0xFCDC, 'M', u'يخ'),
- (0xFCDD, 'M', u'يم'),
- (0xFCDE, 'M', u'يه'),
- (0xFCDF, 'M', u'ئم'),
- (0xFCE0, 'M', u'ئه'),
- (0xFCE1, 'M', u'بم'),
- (0xFCE2, 'M', u'به'),
- (0xFCE3, 'M', u'تم'),
- (0xFCE4, 'M', u'ته'),
- (0xFCE5, 'M', u'ثم'),
- (0xFCE6, 'M', u'ثه'),
- (0xFCE7, 'M', u'سم'),
- (0xFCE8, 'M', u'سه'),
- (0xFCE9, 'M', u'شم'),
- (0xFCEA, 'M', u'شه'),
- (0xFCEB, 'M', u'كل'),
- (0xFCEC, 'M', u'كم'),
- (0xFCED, 'M', u'لم'),
- (0xFCEE, 'M', u'نم'),
- (0xFCEF, 'M', u'نه'),
- (0xFCF0, 'M', u'يم'),
- (0xFCF1, 'M', u'يه'),
- (0xFCF2, 'M', u'ـَّ'),
- (0xFCF3, 'M', u'ـُّ'),
- (0xFCF4, 'M', u'ـِّ'),
- (0xFCF5, 'M', u'طى'),
- (0xFCF6, 'M', u'طي'),
- (0xFCF7, 'M', u'عى'),
- (0xFCF8, 'M', u'عي'),
- (0xFCF9, 'M', u'غى'),
- (0xFCFA, 'M', u'غي'),
- (0xFCFB, 'M', u'سى'),
- (0xFCFC, 'M', u'سي'),
- (0xFCFD, 'M', u'شى'),
- (0xFCFE, 'M', u'شي'),
- (0xFCFF, 'M', u'حى'),
- (0xFD00, 'M', u'حي'),
- (0xFD01, 'M', u'جى'),
- (0xFD02, 'M', u'جي'),
- (0xFD03, 'M', u'خى'),
- (0xFD04, 'M', u'خي'),
- (0xFD05, 'M', u'صى'),
- (0xFD06, 'M', u'صي'),
- (0xFD07, 'M', u'ضى'),
- (0xFD08, 'M', u'ضي'),
- (0xFD09, 'M', u'شج'),
- (0xFD0A, 'M', u'شح'),
- (0xFD0B, 'M', u'شخ'),
- (0xFD0C, 'M', u'شم'),
- (0xFD0D, 'M', u'شر'),
- (0xFD0E, 'M', u'سر'),
- (0xFD0F, 'M', u'صر'),
- (0xFD10, 'M', u'ضر'),
- (0xFD11, 'M', u'طى'),
- (0xFD12, 'M', u'طي'),
- (0xFD13, 'M', u'عى'),
- (0xFD14, 'M', u'عي'),
- (0xFD15, 'M', u'غى'),
- (0xFD16, 'M', u'غي'),
- (0xFD17, 'M', u'سى'),
- (0xFD18, 'M', u'سي'),
- (0xFD19, 'M', u'شى'),
- (0xFD1A, 'M', u'شي'),
- (0xFD1B, 'M', u'حى'),
- (0xFD1C, 'M', u'حي'),
- (0xFD1D, 'M', u'جى'),
- (0xFD1E, 'M', u'جي'),
- (0xFD1F, 'M', u'خى'),
- (0xFD20, 'M', u'خي'),
- (0xFD21, 'M', u'صى'),
- (0xFD22, 'M', u'صي'),
- (0xFD23, 'M', u'ضى'),
- (0xFD24, 'M', u'ضي'),
- (0xFD25, 'M', u'شج'),
- (0xFD26, 'M', u'شح'),
- (0xFD27, 'M', u'شخ'),
- ]
-
-def _seg_48():
- return [
- (0xFD28, 'M', u'شم'),
- (0xFD29, 'M', u'شر'),
- (0xFD2A, 'M', u'سر'),
- (0xFD2B, 'M', u'صر'),
- (0xFD2C, 'M', u'ضر'),
- (0xFD2D, 'M', u'شج'),
- (0xFD2E, 'M', u'شح'),
- (0xFD2F, 'M', u'شخ'),
- (0xFD30, 'M', u'شم'),
- (0xFD31, 'M', u'سه'),
- (0xFD32, 'M', u'شه'),
- (0xFD33, 'M', u'طم'),
- (0xFD34, 'M', u'سج'),
- (0xFD35, 'M', u'سح'),
- (0xFD36, 'M', u'سخ'),
- (0xFD37, 'M', u'شج'),
- (0xFD38, 'M', u'شح'),
- (0xFD39, 'M', u'شخ'),
- (0xFD3A, 'M', u'طم'),
- (0xFD3B, 'M', u'ظم'),
- (0xFD3C, 'M', u'اً'),
- (0xFD3E, 'V'),
- (0xFD40, 'X'),
- (0xFD50, 'M', u'تجم'),
- (0xFD51, 'M', u'تحج'),
- (0xFD53, 'M', u'تحم'),
- (0xFD54, 'M', u'تخم'),
- (0xFD55, 'M', u'تمج'),
- (0xFD56, 'M', u'تمح'),
- (0xFD57, 'M', u'تمخ'),
- (0xFD58, 'M', u'جمح'),
- (0xFD5A, 'M', u'حمي'),
- (0xFD5B, 'M', u'حمى'),
- (0xFD5C, 'M', u'سحج'),
- (0xFD5D, 'M', u'سجح'),
- (0xFD5E, 'M', u'سجى'),
- (0xFD5F, 'M', u'سمح'),
- (0xFD61, 'M', u'سمج'),
- (0xFD62, 'M', u'سمم'),
- (0xFD64, 'M', u'صحح'),
- (0xFD66, 'M', u'صمم'),
- (0xFD67, 'M', u'شحم'),
- (0xFD69, 'M', u'شجي'),
- (0xFD6A, 'M', u'شمخ'),
- (0xFD6C, 'M', u'شمم'),
- (0xFD6E, 'M', u'ضحى'),
- (0xFD6F, 'M', u'ضخم'),
- (0xFD71, 'M', u'طمح'),
- (0xFD73, 'M', u'طمم'),
- (0xFD74, 'M', u'طمي'),
- (0xFD75, 'M', u'عجم'),
- (0xFD76, 'M', u'عمم'),
- (0xFD78, 'M', u'عمى'),
- (0xFD79, 'M', u'غمم'),
- (0xFD7A, 'M', u'غمي'),
- (0xFD7B, 'M', u'غمى'),
- (0xFD7C, 'M', u'فخم'),
- (0xFD7E, 'M', u'قمح'),
- (0xFD7F, 'M', u'قمم'),
- (0xFD80, 'M', u'لحم'),
- (0xFD81, 'M', u'لحي'),
- (0xFD82, 'M', u'لحى'),
- (0xFD83, 'M', u'لجج'),
- (0xFD85, 'M', u'لخم'),
- (0xFD87, 'M', u'لمح'),
- (0xFD89, 'M', u'محج'),
- (0xFD8A, 'M', u'محم'),
- (0xFD8B, 'M', u'محي'),
- (0xFD8C, 'M', u'مجح'),
- (0xFD8D, 'M', u'مجم'),
- (0xFD8E, 'M', u'مخج'),
- (0xFD8F, 'M', u'مخم'),
- (0xFD90, 'X'),
- (0xFD92, 'M', u'مجخ'),
- (0xFD93, 'M', u'همج'),
- (0xFD94, 'M', u'همم'),
- (0xFD95, 'M', u'نحم'),
- (0xFD96, 'M', u'نحى'),
- (0xFD97, 'M', u'نجم'),
- (0xFD99, 'M', u'نجى'),
- (0xFD9A, 'M', u'نمي'),
- (0xFD9B, 'M', u'نمى'),
- (0xFD9C, 'M', u'يمم'),
- (0xFD9E, 'M', u'بخي'),
- (0xFD9F, 'M', u'تجي'),
- (0xFDA0, 'M', u'تجى'),
- (0xFDA1, 'M', u'تخي'),
- (0xFDA2, 'M', u'تخى'),
- (0xFDA3, 'M', u'تمي'),
- (0xFDA4, 'M', u'تمى'),
- (0xFDA5, 'M', u'جمي'),
- (0xFDA6, 'M', u'جحى'),
- (0xFDA7, 'M', u'جمى'),
- (0xFDA8, 'M', u'سخى'),
- (0xFDA9, 'M', u'صحي'),
- (0xFDAA, 'M', u'شحي'),
- (0xFDAB, 'M', u'ضحي'),
- (0xFDAC, 'M', u'لجي'),
- (0xFDAD, 'M', u'لمي'),
- (0xFDAE, 'M', u'يحي'),
- ]
-
-def _seg_49():
- return [
- (0xFDAF, 'M', u'يجي'),
- (0xFDB0, 'M', u'يمي'),
- (0xFDB1, 'M', u'ممي'),
- (0xFDB2, 'M', u'قمي'),
- (0xFDB3, 'M', u'نحي'),
- (0xFDB4, 'M', u'قمح'),
- (0xFDB5, 'M', u'لحم'),
- (0xFDB6, 'M', u'عمي'),
- (0xFDB7, 'M', u'كمي'),
- (0xFDB8, 'M', u'نجح'),
- (0xFDB9, 'M', u'مخي'),
- (0xFDBA, 'M', u'لجم'),
- (0xFDBB, 'M', u'كمم'),
- (0xFDBC, 'M', u'لجم'),
- (0xFDBD, 'M', u'نجح'),
- (0xFDBE, 'M', u'جحي'),
- (0xFDBF, 'M', u'حجي'),
- (0xFDC0, 'M', u'مجي'),
- (0xFDC1, 'M', u'فمي'),
- (0xFDC2, 'M', u'بحي'),
- (0xFDC3, 'M', u'كمم'),
- (0xFDC4, 'M', u'عجم'),
- (0xFDC5, 'M', u'صمم'),
- (0xFDC6, 'M', u'سخي'),
- (0xFDC7, 'M', u'نجي'),
- (0xFDC8, 'X'),
- (0xFDF0, 'M', u'صلے'),
- (0xFDF1, 'M', u'قلے'),
- (0xFDF2, 'M', u'الله'),
- (0xFDF3, 'M', u'اكبر'),
- (0xFDF4, 'M', u'محمد'),
- (0xFDF5, 'M', u'صلعم'),
- (0xFDF6, 'M', u'رسول'),
- (0xFDF7, 'M', u'عليه'),
- (0xFDF8, 'M', u'وسلم'),
- (0xFDF9, 'M', u'صلى'),
- (0xFDFA, '3', u'صلى الله عليه وسلم'),
- (0xFDFB, '3', u'جل جلاله'),
- (0xFDFC, 'M', u'ریال'),
- (0xFDFD, 'V'),
- (0xFDFE, 'X'),
- (0xFE00, 'I'),
- (0xFE10, '3', u','),
- (0xFE11, 'M', u'、'),
- (0xFE12, 'X'),
- (0xFE13, '3', u':'),
- (0xFE14, '3', u';'),
- (0xFE15, '3', u'!'),
- (0xFE16, '3', u'?'),
- (0xFE17, 'M', u'〖'),
- (0xFE18, 'M', u'〗'),
- (0xFE19, 'X'),
- (0xFE20, 'V'),
- (0xFE30, 'X'),
- (0xFE31, 'M', u'—'),
- (0xFE32, 'M', u'–'),
- (0xFE33, '3', u'_'),
- (0xFE35, '3', u'('),
- (0xFE36, '3', u')'),
- (0xFE37, '3', u'{'),
- (0xFE38, '3', u'}'),
- (0xFE39, 'M', u'〔'),
- (0xFE3A, 'M', u'〕'),
- (0xFE3B, 'M', u'【'),
- (0xFE3C, 'M', u'】'),
- (0xFE3D, 'M', u'《'),
- (0xFE3E, 'M', u'》'),
- (0xFE3F, 'M', u'〈'),
- (0xFE40, 'M', u'〉'),
- (0xFE41, 'M', u'「'),
- (0xFE42, 'M', u'」'),
- (0xFE43, 'M', u'『'),
- (0xFE44, 'M', u'』'),
- (0xFE45, 'V'),
- (0xFE47, '3', u'['),
- (0xFE48, '3', u']'),
- (0xFE49, '3', u' ̅'),
- (0xFE4D, '3', u'_'),
- (0xFE50, '3', u','),
- (0xFE51, 'M', u'、'),
- (0xFE52, 'X'),
- (0xFE54, '3', u';'),
- (0xFE55, '3', u':'),
- (0xFE56, '3', u'?'),
- (0xFE57, '3', u'!'),
- (0xFE58, 'M', u'—'),
- (0xFE59, '3', u'('),
- (0xFE5A, '3', u')'),
- (0xFE5B, '3', u'{'),
- (0xFE5C, '3', u'}'),
- (0xFE5D, 'M', u'〔'),
- (0xFE5E, 'M', u'〕'),
- (0xFE5F, '3', u'#'),
- (0xFE60, '3', u'&'),
- (0xFE61, '3', u'*'),
- (0xFE62, '3', u'+'),
- (0xFE63, 'M', u'-'),
- (0xFE64, '3', u'<'),
- (0xFE65, '3', u'>'),
- (0xFE66, '3', u'='),
- ]
-
-def _seg_50():
- return [
- (0xFE67, 'X'),
- (0xFE68, '3', u'\\'),
- (0xFE69, '3', u'$'),
- (0xFE6A, '3', u'%'),
- (0xFE6B, '3', u'@'),
- (0xFE6C, 'X'),
- (0xFE70, '3', u' ً'),
- (0xFE71, 'M', u'ـً'),
- (0xFE72, '3', u' ٌ'),
- (0xFE73, 'V'),
- (0xFE74, '3', u' ٍ'),
- (0xFE75, 'X'),
- (0xFE76, '3', u' َ'),
- (0xFE77, 'M', u'ـَ'),
- (0xFE78, '3', u' ُ'),
- (0xFE79, 'M', u'ـُ'),
- (0xFE7A, '3', u' ِ'),
- (0xFE7B, 'M', u'ـِ'),
- (0xFE7C, '3', u' ّ'),
- (0xFE7D, 'M', u'ـّ'),
- (0xFE7E, '3', u' ْ'),
- (0xFE7F, 'M', u'ـْ'),
- (0xFE80, 'M', u'ء'),
- (0xFE81, 'M', u'آ'),
- (0xFE83, 'M', u'أ'),
- (0xFE85, 'M', u'ؤ'),
- (0xFE87, 'M', u'إ'),
- (0xFE89, 'M', u'ئ'),
- (0xFE8D, 'M', u'ا'),
- (0xFE8F, 'M', u'ب'),
- (0xFE93, 'M', u'ة'),
- (0xFE95, 'M', u'ت'),
- (0xFE99, 'M', u'ث'),
- (0xFE9D, 'M', u'ج'),
- (0xFEA1, 'M', u'ح'),
- (0xFEA5, 'M', u'خ'),
- (0xFEA9, 'M', u'د'),
- (0xFEAB, 'M', u'ذ'),
- (0xFEAD, 'M', u'ر'),
- (0xFEAF, 'M', u'ز'),
- (0xFEB1, 'M', u'س'),
- (0xFEB5, 'M', u'ش'),
- (0xFEB9, 'M', u'ص'),
- (0xFEBD, 'M', u'ض'),
- (0xFEC1, 'M', u'ط'),
- (0xFEC5, 'M', u'ظ'),
- (0xFEC9, 'M', u'ع'),
- (0xFECD, 'M', u'غ'),
- (0xFED1, 'M', u'ف'),
- (0xFED5, 'M', u'ق'),
- (0xFED9, 'M', u'ك'),
- (0xFEDD, 'M', u'ل'),
- (0xFEE1, 'M', u'م'),
- (0xFEE5, 'M', u'ن'),
- (0xFEE9, 'M', u'ه'),
- (0xFEED, 'M', u'و'),
- (0xFEEF, 'M', u'ى'),
- (0xFEF1, 'M', u'ي'),
- (0xFEF5, 'M', u'لآ'),
- (0xFEF7, 'M', u'لأ'),
- (0xFEF9, 'M', u'لإ'),
- (0xFEFB, 'M', u'لا'),
- (0xFEFD, 'X'),
- (0xFEFF, 'I'),
- (0xFF00, 'X'),
- (0xFF01, '3', u'!'),
- (0xFF02, '3', u'"'),
- (0xFF03, '3', u'#'),
- (0xFF04, '3', u'$'),
- (0xFF05, '3', u'%'),
- (0xFF06, '3', u'&'),
- (0xFF07, '3', u'\''),
- (0xFF08, '3', u'('),
- (0xFF09, '3', u')'),
- (0xFF0A, '3', u'*'),
- (0xFF0B, '3', u'+'),
- (0xFF0C, '3', u','),
- (0xFF0D, 'M', u'-'),
- (0xFF0E, 'M', u'.'),
- (0xFF0F, '3', u'/'),
- (0xFF10, 'M', u'0'),
- (0xFF11, 'M', u'1'),
- (0xFF12, 'M', u'2'),
- (0xFF13, 'M', u'3'),
- (0xFF14, 'M', u'4'),
- (0xFF15, 'M', u'5'),
- (0xFF16, 'M', u'6'),
- (0xFF17, 'M', u'7'),
- (0xFF18, 'M', u'8'),
- (0xFF19, 'M', u'9'),
- (0xFF1A, '3', u':'),
- (0xFF1B, '3', u';'),
- (0xFF1C, '3', u'<'),
- (0xFF1D, '3', u'='),
- (0xFF1E, '3', u'>'),
- (0xFF1F, '3', u'?'),
- (0xFF20, '3', u'@'),
- (0xFF21, 'M', u'a'),
- (0xFF22, 'M', u'b'),
- (0xFF23, 'M', u'c'),
- ]
-
-def _seg_51():
- return [
- (0xFF24, 'M', u'd'),
- (0xFF25, 'M', u'e'),
- (0xFF26, 'M', u'f'),
- (0xFF27, 'M', u'g'),
- (0xFF28, 'M', u'h'),
- (0xFF29, 'M', u'i'),
- (0xFF2A, 'M', u'j'),
- (0xFF2B, 'M', u'k'),
- (0xFF2C, 'M', u'l'),
- (0xFF2D, 'M', u'm'),
- (0xFF2E, 'M', u'n'),
- (0xFF2F, 'M', u'o'),
- (0xFF30, 'M', u'p'),
- (0xFF31, 'M', u'q'),
- (0xFF32, 'M', u'r'),
- (0xFF33, 'M', u's'),
- (0xFF34, 'M', u't'),
- (0xFF35, 'M', u'u'),
- (0xFF36, 'M', u'v'),
- (0xFF37, 'M', u'w'),
- (0xFF38, 'M', u'x'),
- (0xFF39, 'M', u'y'),
- (0xFF3A, 'M', u'z'),
- (0xFF3B, '3', u'['),
- (0xFF3C, '3', u'\\'),
- (0xFF3D, '3', u']'),
- (0xFF3E, '3', u'^'),
- (0xFF3F, '3', u'_'),
- (0xFF40, '3', u'`'),
- (0xFF41, 'M', u'a'),
- (0xFF42, 'M', u'b'),
- (0xFF43, 'M', u'c'),
- (0xFF44, 'M', u'd'),
- (0xFF45, 'M', u'e'),
- (0xFF46, 'M', u'f'),
- (0xFF47, 'M', u'g'),
- (0xFF48, 'M', u'h'),
- (0xFF49, 'M', u'i'),
- (0xFF4A, 'M', u'j'),
- (0xFF4B, 'M', u'k'),
- (0xFF4C, 'M', u'l'),
- (0xFF4D, 'M', u'm'),
- (0xFF4E, 'M', u'n'),
- (0xFF4F, 'M', u'o'),
- (0xFF50, 'M', u'p'),
- (0xFF51, 'M', u'q'),
- (0xFF52, 'M', u'r'),
- (0xFF53, 'M', u's'),
- (0xFF54, 'M', u't'),
- (0xFF55, 'M', u'u'),
- (0xFF56, 'M', u'v'),
- (0xFF57, 'M', u'w'),
- (0xFF58, 'M', u'x'),
- (0xFF59, 'M', u'y'),
- (0xFF5A, 'M', u'z'),
- (0xFF5B, '3', u'{'),
- (0xFF5C, '3', u'|'),
- (0xFF5D, '3', u'}'),
- (0xFF5E, '3', u'~'),
- (0xFF5F, 'M', u'⦅'),
- (0xFF60, 'M', u'⦆'),
- (0xFF61, 'M', u'.'),
- (0xFF62, 'M', u'「'),
- (0xFF63, 'M', u'」'),
- (0xFF64, 'M', u'、'),
- (0xFF65, 'M', u'・'),
- (0xFF66, 'M', u'ヲ'),
- (0xFF67, 'M', u'ァ'),
- (0xFF68, 'M', u'ィ'),
- (0xFF69, 'M', u'ゥ'),
- (0xFF6A, 'M', u'ェ'),
- (0xFF6B, 'M', u'ォ'),
- (0xFF6C, 'M', u'ャ'),
- (0xFF6D, 'M', u'ュ'),
- (0xFF6E, 'M', u'ョ'),
- (0xFF6F, 'M', u'ッ'),
- (0xFF70, 'M', u'ー'),
- (0xFF71, 'M', u'ア'),
- (0xFF72, 'M', u'イ'),
- (0xFF73, 'M', u'ウ'),
- (0xFF74, 'M', u'エ'),
- (0xFF75, 'M', u'オ'),
- (0xFF76, 'M', u'カ'),
- (0xFF77, 'M', u'キ'),
- (0xFF78, 'M', u'ク'),
- (0xFF79, 'M', u'ケ'),
- (0xFF7A, 'M', u'コ'),
- (0xFF7B, 'M', u'サ'),
- (0xFF7C, 'M', u'シ'),
- (0xFF7D, 'M', u'ス'),
- (0xFF7E, 'M', u'セ'),
- (0xFF7F, 'M', u'ソ'),
- (0xFF80, 'M', u'タ'),
- (0xFF81, 'M', u'チ'),
- (0xFF82, 'M', u'ツ'),
- (0xFF83, 'M', u'テ'),
- (0xFF84, 'M', u'ト'),
- (0xFF85, 'M', u'ナ'),
- (0xFF86, 'M', u'ニ'),
- (0xFF87, 'M', u'ヌ'),
- ]
-
-def _seg_52():
- return [
- (0xFF88, 'M', u'ネ'),
- (0xFF89, 'M', u'ノ'),
- (0xFF8A, 'M', u'ハ'),
- (0xFF8B, 'M', u'ヒ'),
- (0xFF8C, 'M', u'フ'),
- (0xFF8D, 'M', u'ヘ'),
- (0xFF8E, 'M', u'ホ'),
- (0xFF8F, 'M', u'マ'),
- (0xFF90, 'M', u'ミ'),
- (0xFF91, 'M', u'ム'),
- (0xFF92, 'M', u'メ'),
- (0xFF93, 'M', u'モ'),
- (0xFF94, 'M', u'ヤ'),
- (0xFF95, 'M', u'ユ'),
- (0xFF96, 'M', u'ヨ'),
- (0xFF97, 'M', u'ラ'),
- (0xFF98, 'M', u'リ'),
- (0xFF99, 'M', u'ル'),
- (0xFF9A, 'M', u'レ'),
- (0xFF9B, 'M', u'ロ'),
- (0xFF9C, 'M', u'ワ'),
- (0xFF9D, 'M', u'ン'),
- (0xFF9E, 'M', u'゙'),
- (0xFF9F, 'M', u'゚'),
- (0xFFA0, 'X'),
- (0xFFA1, 'M', u'ᄀ'),
- (0xFFA2, 'M', u'ᄁ'),
- (0xFFA3, 'M', u'ᆪ'),
- (0xFFA4, 'M', u'ᄂ'),
- (0xFFA5, 'M', u'ᆬ'),
- (0xFFA6, 'M', u'ᆭ'),
- (0xFFA7, 'M', u'ᄃ'),
- (0xFFA8, 'M', u'ᄄ'),
- (0xFFA9, 'M', u'ᄅ'),
- (0xFFAA, 'M', u'ᆰ'),
- (0xFFAB, 'M', u'ᆱ'),
- (0xFFAC, 'M', u'ᆲ'),
- (0xFFAD, 'M', u'ᆳ'),
- (0xFFAE, 'M', u'ᆴ'),
- (0xFFAF, 'M', u'ᆵ'),
- (0xFFB0, 'M', u'ᄚ'),
- (0xFFB1, 'M', u'ᄆ'),
- (0xFFB2, 'M', u'ᄇ'),
- (0xFFB3, 'M', u'ᄈ'),
- (0xFFB4, 'M', u'ᄡ'),
- (0xFFB5, 'M', u'ᄉ'),
- (0xFFB6, 'M', u'ᄊ'),
- (0xFFB7, 'M', u'ᄋ'),
- (0xFFB8, 'M', u'ᄌ'),
- (0xFFB9, 'M', u'ᄍ'),
- (0xFFBA, 'M', u'ᄎ'),
- (0xFFBB, 'M', u'ᄏ'),
- (0xFFBC, 'M', u'ᄐ'),
- (0xFFBD, 'M', u'ᄑ'),
- (0xFFBE, 'M', u'ᄒ'),
- (0xFFBF, 'X'),
- (0xFFC2, 'M', u'ᅡ'),
- (0xFFC3, 'M', u'ᅢ'),
- (0xFFC4, 'M', u'ᅣ'),
- (0xFFC5, 'M', u'ᅤ'),
- (0xFFC6, 'M', u'ᅥ'),
- (0xFFC7, 'M', u'ᅦ'),
- (0xFFC8, 'X'),
- (0xFFCA, 'M', u'ᅧ'),
- (0xFFCB, 'M', u'ᅨ'),
- (0xFFCC, 'M', u'ᅩ'),
- (0xFFCD, 'M', u'ᅪ'),
- (0xFFCE, 'M', u'ᅫ'),
- (0xFFCF, 'M', u'ᅬ'),
- (0xFFD0, 'X'),
- (0xFFD2, 'M', u'ᅭ'),
- (0xFFD3, 'M', u'ᅮ'),
- (0xFFD4, 'M', u'ᅯ'),
- (0xFFD5, 'M', u'ᅰ'),
- (0xFFD6, 'M', u'ᅱ'),
- (0xFFD7, 'M', u'ᅲ'),
- (0xFFD8, 'X'),
- (0xFFDA, 'M', u'ᅳ'),
- (0xFFDB, 'M', u'ᅴ'),
- (0xFFDC, 'M', u'ᅵ'),
- (0xFFDD, 'X'),
- (0xFFE0, 'M', u'¢'),
- (0xFFE1, 'M', u'£'),
- (0xFFE2, 'M', u'¬'),
- (0xFFE3, '3', u' ̄'),
- (0xFFE4, 'M', u'¦'),
- (0xFFE5, 'M', u'¥'),
- (0xFFE6, 'M', u'₩'),
- (0xFFE7, 'X'),
- (0xFFE8, 'M', u'│'),
- (0xFFE9, 'M', u'←'),
- (0xFFEA, 'M', u'↑'),
- (0xFFEB, 'M', u'→'),
- (0xFFEC, 'M', u'↓'),
- (0xFFED, 'M', u'■'),
- (0xFFEE, 'M', u'○'),
- (0xFFEF, 'X'),
- (0x10000, 'V'),
- (0x1000C, 'X'),
- (0x1000D, 'V'),
- ]
-
-def _seg_53():
- return [
- (0x10027, 'X'),
- (0x10028, 'V'),
- (0x1003B, 'X'),
- (0x1003C, 'V'),
- (0x1003E, 'X'),
- (0x1003F, 'V'),
- (0x1004E, 'X'),
- (0x10050, 'V'),
- (0x1005E, 'X'),
- (0x10080, 'V'),
- (0x100FB, 'X'),
- (0x10100, 'V'),
- (0x10103, 'X'),
- (0x10107, 'V'),
- (0x10134, 'X'),
- (0x10137, 'V'),
- (0x1018F, 'X'),
- (0x10190, 'V'),
- (0x1019D, 'X'),
- (0x101A0, 'V'),
- (0x101A1, 'X'),
- (0x101D0, 'V'),
- (0x101FE, 'X'),
- (0x10280, 'V'),
- (0x1029D, 'X'),
- (0x102A0, 'V'),
- (0x102D1, 'X'),
- (0x102E0, 'V'),
- (0x102FC, 'X'),
- (0x10300, 'V'),
- (0x10324, 'X'),
- (0x1032D, 'V'),
- (0x1034B, 'X'),
- (0x10350, 'V'),
- (0x1037B, 'X'),
- (0x10380, 'V'),
- (0x1039E, 'X'),
- (0x1039F, 'V'),
- (0x103C4, 'X'),
- (0x103C8, 'V'),
- (0x103D6, 'X'),
- (0x10400, 'M', u'𐐨'),
- (0x10401, 'M', u'𐐩'),
- (0x10402, 'M', u'𐐪'),
- (0x10403, 'M', u'𐐫'),
- (0x10404, 'M', u'𐐬'),
- (0x10405, 'M', u'𐐭'),
- (0x10406, 'M', u'𐐮'),
- (0x10407, 'M', u'𐐯'),
- (0x10408, 'M', u'𐐰'),
- (0x10409, 'M', u'𐐱'),
- (0x1040A, 'M', u'𐐲'),
- (0x1040B, 'M', u'𐐳'),
- (0x1040C, 'M', u'𐐴'),
- (0x1040D, 'M', u'𐐵'),
- (0x1040E, 'M', u'𐐶'),
- (0x1040F, 'M', u'𐐷'),
- (0x10410, 'M', u'𐐸'),
- (0x10411, 'M', u'𐐹'),
- (0x10412, 'M', u'𐐺'),
- (0x10413, 'M', u'𐐻'),
- (0x10414, 'M', u'𐐼'),
- (0x10415, 'M', u'𐐽'),
- (0x10416, 'M', u'𐐾'),
- (0x10417, 'M', u'𐐿'),
- (0x10418, 'M', u'𐑀'),
- (0x10419, 'M', u'𐑁'),
- (0x1041A, 'M', u'𐑂'),
- (0x1041B, 'M', u'𐑃'),
- (0x1041C, 'M', u'𐑄'),
- (0x1041D, 'M', u'𐑅'),
- (0x1041E, 'M', u'𐑆'),
- (0x1041F, 'M', u'𐑇'),
- (0x10420, 'M', u'𐑈'),
- (0x10421, 'M', u'𐑉'),
- (0x10422, 'M', u'𐑊'),
- (0x10423, 'M', u'𐑋'),
- (0x10424, 'M', u'𐑌'),
- (0x10425, 'M', u'𐑍'),
- (0x10426, 'M', u'𐑎'),
- (0x10427, 'M', u'𐑏'),
- (0x10428, 'V'),
- (0x1049E, 'X'),
- (0x104A0, 'V'),
- (0x104AA, 'X'),
- (0x104B0, 'M', u'𐓘'),
- (0x104B1, 'M', u'𐓙'),
- (0x104B2, 'M', u'𐓚'),
- (0x104B3, 'M', u'𐓛'),
- (0x104B4, 'M', u'𐓜'),
- (0x104B5, 'M', u'𐓝'),
- (0x104B6, 'M', u'𐓞'),
- (0x104B7, 'M', u'𐓟'),
- (0x104B8, 'M', u'𐓠'),
- (0x104B9, 'M', u'𐓡'),
- (0x104BA, 'M', u'𐓢'),
- (0x104BB, 'M', u'𐓣'),
- (0x104BC, 'M', u'𐓤'),
- (0x104BD, 'M', u'𐓥'),
- (0x104BE, 'M', u'𐓦'),
- ]
-
-def _seg_54():
- return [
- (0x104BF, 'M', u'𐓧'),
- (0x104C0, 'M', u'𐓨'),
- (0x104C1, 'M', u'𐓩'),
- (0x104C2, 'M', u'𐓪'),
- (0x104C3, 'M', u'𐓫'),
- (0x104C4, 'M', u'𐓬'),
- (0x104C5, 'M', u'𐓭'),
- (0x104C6, 'M', u'𐓮'),
- (0x104C7, 'M', u'𐓯'),
- (0x104C8, 'M', u'𐓰'),
- (0x104C9, 'M', u'𐓱'),
- (0x104CA, 'M', u'𐓲'),
- (0x104CB, 'M', u'𐓳'),
- (0x104CC, 'M', u'𐓴'),
- (0x104CD, 'M', u'𐓵'),
- (0x104CE, 'M', u'𐓶'),
- (0x104CF, 'M', u'𐓷'),
- (0x104D0, 'M', u'𐓸'),
- (0x104D1, 'M', u'𐓹'),
- (0x104D2, 'M', u'𐓺'),
- (0x104D3, 'M', u'𐓻'),
- (0x104D4, 'X'),
- (0x104D8, 'V'),
- (0x104FC, 'X'),
- (0x10500, 'V'),
- (0x10528, 'X'),
- (0x10530, 'V'),
- (0x10564, 'X'),
- (0x1056F, 'V'),
- (0x10570, 'X'),
- (0x10600, 'V'),
- (0x10737, 'X'),
- (0x10740, 'V'),
- (0x10756, 'X'),
- (0x10760, 'V'),
- (0x10768, 'X'),
- (0x10800, 'V'),
- (0x10806, 'X'),
- (0x10808, 'V'),
- (0x10809, 'X'),
- (0x1080A, 'V'),
- (0x10836, 'X'),
- (0x10837, 'V'),
- (0x10839, 'X'),
- (0x1083C, 'V'),
- (0x1083D, 'X'),
- (0x1083F, 'V'),
- (0x10856, 'X'),
- (0x10857, 'V'),
- (0x1089F, 'X'),
- (0x108A7, 'V'),
- (0x108B0, 'X'),
- (0x108E0, 'V'),
- (0x108F3, 'X'),
- (0x108F4, 'V'),
- (0x108F6, 'X'),
- (0x108FB, 'V'),
- (0x1091C, 'X'),
- (0x1091F, 'V'),
- (0x1093A, 'X'),
- (0x1093F, 'V'),
- (0x10940, 'X'),
- (0x10980, 'V'),
- (0x109B8, 'X'),
- (0x109BC, 'V'),
- (0x109D0, 'X'),
- (0x109D2, 'V'),
- (0x10A04, 'X'),
- (0x10A05, 'V'),
- (0x10A07, 'X'),
- (0x10A0C, 'V'),
- (0x10A14, 'X'),
- (0x10A15, 'V'),
- (0x10A18, 'X'),
- (0x10A19, 'V'),
- (0x10A36, 'X'),
- (0x10A38, 'V'),
- (0x10A3B, 'X'),
- (0x10A3F, 'V'),
- (0x10A49, 'X'),
- (0x10A50, 'V'),
- (0x10A59, 'X'),
- (0x10A60, 'V'),
- (0x10AA0, 'X'),
- (0x10AC0, 'V'),
- (0x10AE7, 'X'),
- (0x10AEB, 'V'),
- (0x10AF7, 'X'),
- (0x10B00, 'V'),
- (0x10B36, 'X'),
- (0x10B39, 'V'),
- (0x10B56, 'X'),
- (0x10B58, 'V'),
- (0x10B73, 'X'),
- (0x10B78, 'V'),
- (0x10B92, 'X'),
- (0x10B99, 'V'),
- (0x10B9D, 'X'),
- (0x10BA9, 'V'),
- (0x10BB0, 'X'),
- ]
-
-def _seg_55():
- return [
- (0x10C00, 'V'),
- (0x10C49, 'X'),
- (0x10C80, 'M', u'𐳀'),
- (0x10C81, 'M', u'𐳁'),
- (0x10C82, 'M', u'𐳂'),
- (0x10C83, 'M', u'𐳃'),
- (0x10C84, 'M', u'𐳄'),
- (0x10C85, 'M', u'𐳅'),
- (0x10C86, 'M', u'𐳆'),
- (0x10C87, 'M', u'𐳇'),
- (0x10C88, 'M', u'𐳈'),
- (0x10C89, 'M', u'𐳉'),
- (0x10C8A, 'M', u'𐳊'),
- (0x10C8B, 'M', u'𐳋'),
- (0x10C8C, 'M', u'𐳌'),
- (0x10C8D, 'M', u'𐳍'),
- (0x10C8E, 'M', u'𐳎'),
- (0x10C8F, 'M', u'𐳏'),
- (0x10C90, 'M', u'𐳐'),
- (0x10C91, 'M', u'𐳑'),
- (0x10C92, 'M', u'𐳒'),
- (0x10C93, 'M', u'𐳓'),
- (0x10C94, 'M', u'𐳔'),
- (0x10C95, 'M', u'𐳕'),
- (0x10C96, 'M', u'𐳖'),
- (0x10C97, 'M', u'𐳗'),
- (0x10C98, 'M', u'𐳘'),
- (0x10C99, 'M', u'𐳙'),
- (0x10C9A, 'M', u'𐳚'),
- (0x10C9B, 'M', u'𐳛'),
- (0x10C9C, 'M', u'𐳜'),
- (0x10C9D, 'M', u'𐳝'),
- (0x10C9E, 'M', u'𐳞'),
- (0x10C9F, 'M', u'𐳟'),
- (0x10CA0, 'M', u'𐳠'),
- (0x10CA1, 'M', u'𐳡'),
- (0x10CA2, 'M', u'𐳢'),
- (0x10CA3, 'M', u'𐳣'),
- (0x10CA4, 'M', u'𐳤'),
- (0x10CA5, 'M', u'𐳥'),
- (0x10CA6, 'M', u'𐳦'),
- (0x10CA7, 'M', u'𐳧'),
- (0x10CA8, 'M', u'𐳨'),
- (0x10CA9, 'M', u'𐳩'),
- (0x10CAA, 'M', u'𐳪'),
- (0x10CAB, 'M', u'𐳫'),
- (0x10CAC, 'M', u'𐳬'),
- (0x10CAD, 'M', u'𐳭'),
- (0x10CAE, 'M', u'𐳮'),
- (0x10CAF, 'M', u'𐳯'),
- (0x10CB0, 'M', u'𐳰'),
- (0x10CB1, 'M', u'𐳱'),
- (0x10CB2, 'M', u'𐳲'),
- (0x10CB3, 'X'),
- (0x10CC0, 'V'),
- (0x10CF3, 'X'),
- (0x10CFA, 'V'),
- (0x10D28, 'X'),
- (0x10D30, 'V'),
- (0x10D3A, 'X'),
- (0x10E60, 'V'),
- (0x10E7F, 'X'),
- (0x10E80, 'V'),
- (0x10EAA, 'X'),
- (0x10EAB, 'V'),
- (0x10EAE, 'X'),
- (0x10EB0, 'V'),
- (0x10EB2, 'X'),
- (0x10F00, 'V'),
- (0x10F28, 'X'),
- (0x10F30, 'V'),
- (0x10F5A, 'X'),
- (0x10FB0, 'V'),
- (0x10FCC, 'X'),
- (0x10FE0, 'V'),
- (0x10FF7, 'X'),
- (0x11000, 'V'),
- (0x1104E, 'X'),
- (0x11052, 'V'),
- (0x11070, 'X'),
- (0x1107F, 'V'),
- (0x110BD, 'X'),
- (0x110BE, 'V'),
- (0x110C2, 'X'),
- (0x110D0, 'V'),
- (0x110E9, 'X'),
- (0x110F0, 'V'),
- (0x110FA, 'X'),
- (0x11100, 'V'),
- (0x11135, 'X'),
- (0x11136, 'V'),
- (0x11148, 'X'),
- (0x11150, 'V'),
- (0x11177, 'X'),
- (0x11180, 'V'),
- (0x111E0, 'X'),
- (0x111E1, 'V'),
- (0x111F5, 'X'),
- (0x11200, 'V'),
- (0x11212, 'X'),
- ]
-
-def _seg_56():
- return [
- (0x11213, 'V'),
- (0x1123F, 'X'),
- (0x11280, 'V'),
- (0x11287, 'X'),
- (0x11288, 'V'),
- (0x11289, 'X'),
- (0x1128A, 'V'),
- (0x1128E, 'X'),
- (0x1128F, 'V'),
- (0x1129E, 'X'),
- (0x1129F, 'V'),
- (0x112AA, 'X'),
- (0x112B0, 'V'),
- (0x112EB, 'X'),
- (0x112F0, 'V'),
- (0x112FA, 'X'),
- (0x11300, 'V'),
- (0x11304, 'X'),
- (0x11305, 'V'),
- (0x1130D, 'X'),
- (0x1130F, 'V'),
- (0x11311, 'X'),
- (0x11313, 'V'),
- (0x11329, 'X'),
- (0x1132A, 'V'),
- (0x11331, 'X'),
- (0x11332, 'V'),
- (0x11334, 'X'),
- (0x11335, 'V'),
- (0x1133A, 'X'),
- (0x1133B, 'V'),
- (0x11345, 'X'),
- (0x11347, 'V'),
- (0x11349, 'X'),
- (0x1134B, 'V'),
- (0x1134E, 'X'),
- (0x11350, 'V'),
- (0x11351, 'X'),
- (0x11357, 'V'),
- (0x11358, 'X'),
- (0x1135D, 'V'),
- (0x11364, 'X'),
- (0x11366, 'V'),
- (0x1136D, 'X'),
- (0x11370, 'V'),
- (0x11375, 'X'),
- (0x11400, 'V'),
- (0x1145C, 'X'),
- (0x1145D, 'V'),
- (0x11462, 'X'),
- (0x11480, 'V'),
- (0x114C8, 'X'),
- (0x114D0, 'V'),
- (0x114DA, 'X'),
- (0x11580, 'V'),
- (0x115B6, 'X'),
- (0x115B8, 'V'),
- (0x115DE, 'X'),
- (0x11600, 'V'),
- (0x11645, 'X'),
- (0x11650, 'V'),
- (0x1165A, 'X'),
- (0x11660, 'V'),
- (0x1166D, 'X'),
- (0x11680, 'V'),
- (0x116B9, 'X'),
- (0x116C0, 'V'),
- (0x116CA, 'X'),
- (0x11700, 'V'),
- (0x1171B, 'X'),
- (0x1171D, 'V'),
- (0x1172C, 'X'),
- (0x11730, 'V'),
- (0x11740, 'X'),
- (0x11800, 'V'),
- (0x1183C, 'X'),
- (0x118A0, 'M', u'𑣀'),
- (0x118A1, 'M', u'𑣁'),
- (0x118A2, 'M', u'𑣂'),
- (0x118A3, 'M', u'𑣃'),
- (0x118A4, 'M', u'𑣄'),
- (0x118A5, 'M', u'𑣅'),
- (0x118A6, 'M', u'𑣆'),
- (0x118A7, 'M', u'𑣇'),
- (0x118A8, 'M', u'𑣈'),
- (0x118A9, 'M', u'𑣉'),
- (0x118AA, 'M', u'𑣊'),
- (0x118AB, 'M', u'𑣋'),
- (0x118AC, 'M', u'𑣌'),
- (0x118AD, 'M', u'𑣍'),
- (0x118AE, 'M', u'𑣎'),
- (0x118AF, 'M', u'𑣏'),
- (0x118B0, 'M', u'𑣐'),
- (0x118B1, 'M', u'𑣑'),
- (0x118B2, 'M', u'𑣒'),
- (0x118B3, 'M', u'𑣓'),
- (0x118B4, 'M', u'𑣔'),
- (0x118B5, 'M', u'𑣕'),
- (0x118B6, 'M', u'𑣖'),
- (0x118B7, 'M', u'𑣗'),
- ]
-
-def _seg_57():
- return [
- (0x118B8, 'M', u'𑣘'),
- (0x118B9, 'M', u'𑣙'),
- (0x118BA, 'M', u'𑣚'),
- (0x118BB, 'M', u'𑣛'),
- (0x118BC, 'M', u'𑣜'),
- (0x118BD, 'M', u'𑣝'),
- (0x118BE, 'M', u'𑣞'),
- (0x118BF, 'M', u'𑣟'),
- (0x118C0, 'V'),
- (0x118F3, 'X'),
- (0x118FF, 'V'),
- (0x11907, 'X'),
- (0x11909, 'V'),
- (0x1190A, 'X'),
- (0x1190C, 'V'),
- (0x11914, 'X'),
- (0x11915, 'V'),
- (0x11917, 'X'),
- (0x11918, 'V'),
- (0x11936, 'X'),
- (0x11937, 'V'),
- (0x11939, 'X'),
- (0x1193B, 'V'),
- (0x11947, 'X'),
- (0x11950, 'V'),
- (0x1195A, 'X'),
- (0x119A0, 'V'),
- (0x119A8, 'X'),
- (0x119AA, 'V'),
- (0x119D8, 'X'),
- (0x119DA, 'V'),
- (0x119E5, 'X'),
- (0x11A00, 'V'),
- (0x11A48, 'X'),
- (0x11A50, 'V'),
- (0x11AA3, 'X'),
- (0x11AC0, 'V'),
- (0x11AF9, 'X'),
- (0x11C00, 'V'),
- (0x11C09, 'X'),
- (0x11C0A, 'V'),
- (0x11C37, 'X'),
- (0x11C38, 'V'),
- (0x11C46, 'X'),
- (0x11C50, 'V'),
- (0x11C6D, 'X'),
- (0x11C70, 'V'),
- (0x11C90, 'X'),
- (0x11C92, 'V'),
- (0x11CA8, 'X'),
- (0x11CA9, 'V'),
- (0x11CB7, 'X'),
- (0x11D00, 'V'),
- (0x11D07, 'X'),
- (0x11D08, 'V'),
- (0x11D0A, 'X'),
- (0x11D0B, 'V'),
- (0x11D37, 'X'),
- (0x11D3A, 'V'),
- (0x11D3B, 'X'),
- (0x11D3C, 'V'),
- (0x11D3E, 'X'),
- (0x11D3F, 'V'),
- (0x11D48, 'X'),
- (0x11D50, 'V'),
- (0x11D5A, 'X'),
- (0x11D60, 'V'),
- (0x11D66, 'X'),
- (0x11D67, 'V'),
- (0x11D69, 'X'),
- (0x11D6A, 'V'),
- (0x11D8F, 'X'),
- (0x11D90, 'V'),
- (0x11D92, 'X'),
- (0x11D93, 'V'),
- (0x11D99, 'X'),
- (0x11DA0, 'V'),
- (0x11DAA, 'X'),
- (0x11EE0, 'V'),
- (0x11EF9, 'X'),
- (0x11FB0, 'V'),
- (0x11FB1, 'X'),
- (0x11FC0, 'V'),
- (0x11FF2, 'X'),
- (0x11FFF, 'V'),
- (0x1239A, 'X'),
- (0x12400, 'V'),
- (0x1246F, 'X'),
- (0x12470, 'V'),
- (0x12475, 'X'),
- (0x12480, 'V'),
- (0x12544, 'X'),
- (0x13000, 'V'),
- (0x1342F, 'X'),
- (0x14400, 'V'),
- (0x14647, 'X'),
- (0x16800, 'V'),
- (0x16A39, 'X'),
- (0x16A40, 'V'),
- (0x16A5F, 'X'),
- ]
-
-def _seg_58():
- return [
- (0x16A60, 'V'),
- (0x16A6A, 'X'),
- (0x16A6E, 'V'),
- (0x16A70, 'X'),
- (0x16AD0, 'V'),
- (0x16AEE, 'X'),
- (0x16AF0, 'V'),
- (0x16AF6, 'X'),
- (0x16B00, 'V'),
- (0x16B46, 'X'),
- (0x16B50, 'V'),
- (0x16B5A, 'X'),
- (0x16B5B, 'V'),
- (0x16B62, 'X'),
- (0x16B63, 'V'),
- (0x16B78, 'X'),
- (0x16B7D, 'V'),
- (0x16B90, 'X'),
- (0x16E40, 'M', u'𖹠'),
- (0x16E41, 'M', u'𖹡'),
- (0x16E42, 'M', u'𖹢'),
- (0x16E43, 'M', u'𖹣'),
- (0x16E44, 'M', u'𖹤'),
- (0x16E45, 'M', u'𖹥'),
- (0x16E46, 'M', u'𖹦'),
- (0x16E47, 'M', u'𖹧'),
- (0x16E48, 'M', u'𖹨'),
- (0x16E49, 'M', u'𖹩'),
- (0x16E4A, 'M', u'𖹪'),
- (0x16E4B, 'M', u'𖹫'),
- (0x16E4C, 'M', u'𖹬'),
- (0x16E4D, 'M', u'𖹭'),
- (0x16E4E, 'M', u'𖹮'),
- (0x16E4F, 'M', u'𖹯'),
- (0x16E50, 'M', u'𖹰'),
- (0x16E51, 'M', u'𖹱'),
- (0x16E52, 'M', u'𖹲'),
- (0x16E53, 'M', u'𖹳'),
- (0x16E54, 'M', u'𖹴'),
- (0x16E55, 'M', u'𖹵'),
- (0x16E56, 'M', u'𖹶'),
- (0x16E57, 'M', u'𖹷'),
- (0x16E58, 'M', u'𖹸'),
- (0x16E59, 'M', u'𖹹'),
- (0x16E5A, 'M', u'𖹺'),
- (0x16E5B, 'M', u'𖹻'),
- (0x16E5C, 'M', u'𖹼'),
- (0x16E5D, 'M', u'𖹽'),
- (0x16E5E, 'M', u'𖹾'),
- (0x16E5F, 'M', u'𖹿'),
- (0x16E60, 'V'),
- (0x16E9B, 'X'),
- (0x16F00, 'V'),
- (0x16F4B, 'X'),
- (0x16F4F, 'V'),
- (0x16F88, 'X'),
- (0x16F8F, 'V'),
- (0x16FA0, 'X'),
- (0x16FE0, 'V'),
- (0x16FE5, 'X'),
- (0x16FF0, 'V'),
- (0x16FF2, 'X'),
- (0x17000, 'V'),
- (0x187F8, 'X'),
- (0x18800, 'V'),
- (0x18CD6, 'X'),
- (0x18D00, 'V'),
- (0x18D09, 'X'),
- (0x1B000, 'V'),
- (0x1B11F, 'X'),
- (0x1B150, 'V'),
- (0x1B153, 'X'),
- (0x1B164, 'V'),
- (0x1B168, 'X'),
- (0x1B170, 'V'),
- (0x1B2FC, 'X'),
- (0x1BC00, 'V'),
- (0x1BC6B, 'X'),
- (0x1BC70, 'V'),
- (0x1BC7D, 'X'),
- (0x1BC80, 'V'),
- (0x1BC89, 'X'),
- (0x1BC90, 'V'),
- (0x1BC9A, 'X'),
- (0x1BC9C, 'V'),
- (0x1BCA0, 'I'),
- (0x1BCA4, 'X'),
- (0x1D000, 'V'),
- (0x1D0F6, 'X'),
- (0x1D100, 'V'),
- (0x1D127, 'X'),
- (0x1D129, 'V'),
- (0x1D15E, 'M', u'𝅗𝅥'),
- (0x1D15F, 'M', u'𝅘𝅥'),
- (0x1D160, 'M', u'𝅘𝅥𝅮'),
- (0x1D161, 'M', u'𝅘𝅥𝅯'),
- (0x1D162, 'M', u'𝅘𝅥𝅰'),
- (0x1D163, 'M', u'𝅘𝅥𝅱'),
- (0x1D164, 'M', u'𝅘𝅥𝅲'),
- (0x1D165, 'V'),
- ]
-
-def _seg_59():
- return [
- (0x1D173, 'X'),
- (0x1D17B, 'V'),
- (0x1D1BB, 'M', u'𝆹𝅥'),
- (0x1D1BC, 'M', u'𝆺𝅥'),
- (0x1D1BD, 'M', u'𝆹𝅥𝅮'),
- (0x1D1BE, 'M', u'𝆺𝅥𝅮'),
- (0x1D1BF, 'M', u'𝆹𝅥𝅯'),
- (0x1D1C0, 'M', u'𝆺𝅥𝅯'),
- (0x1D1C1, 'V'),
- (0x1D1E9, 'X'),
- (0x1D200, 'V'),
- (0x1D246, 'X'),
- (0x1D2E0, 'V'),
- (0x1D2F4, 'X'),
- (0x1D300, 'V'),
- (0x1D357, 'X'),
- (0x1D360, 'V'),
- (0x1D379, 'X'),
- (0x1D400, 'M', u'a'),
- (0x1D401, 'M', u'b'),
- (0x1D402, 'M', u'c'),
- (0x1D403, 'M', u'd'),
- (0x1D404, 'M', u'e'),
- (0x1D405, 'M', u'f'),
- (0x1D406, 'M', u'g'),
- (0x1D407, 'M', u'h'),
- (0x1D408, 'M', u'i'),
- (0x1D409, 'M', u'j'),
- (0x1D40A, 'M', u'k'),
- (0x1D40B, 'M', u'l'),
- (0x1D40C, 'M', u'm'),
- (0x1D40D, 'M', u'n'),
- (0x1D40E, 'M', u'o'),
- (0x1D40F, 'M', u'p'),
- (0x1D410, 'M', u'q'),
- (0x1D411, 'M', u'r'),
- (0x1D412, 'M', u's'),
- (0x1D413, 'M', u't'),
- (0x1D414, 'M', u'u'),
- (0x1D415, 'M', u'v'),
- (0x1D416, 'M', u'w'),
- (0x1D417, 'M', u'x'),
- (0x1D418, 'M', u'y'),
- (0x1D419, 'M', u'z'),
- (0x1D41A, 'M', u'a'),
- (0x1D41B, 'M', u'b'),
- (0x1D41C, 'M', u'c'),
- (0x1D41D, 'M', u'd'),
- (0x1D41E, 'M', u'e'),
- (0x1D41F, 'M', u'f'),
- (0x1D420, 'M', u'g'),
- (0x1D421, 'M', u'h'),
- (0x1D422, 'M', u'i'),
- (0x1D423, 'M', u'j'),
- (0x1D424, 'M', u'k'),
- (0x1D425, 'M', u'l'),
- (0x1D426, 'M', u'm'),
- (0x1D427, 'M', u'n'),
- (0x1D428, 'M', u'o'),
- (0x1D429, 'M', u'p'),
- (0x1D42A, 'M', u'q'),
- (0x1D42B, 'M', u'r'),
- (0x1D42C, 'M', u's'),
- (0x1D42D, 'M', u't'),
- (0x1D42E, 'M', u'u'),
- (0x1D42F, 'M', u'v'),
- (0x1D430, 'M', u'w'),
- (0x1D431, 'M', u'x'),
- (0x1D432, 'M', u'y'),
- (0x1D433, 'M', u'z'),
- (0x1D434, 'M', u'a'),
- (0x1D435, 'M', u'b'),
- (0x1D436, 'M', u'c'),
- (0x1D437, 'M', u'd'),
- (0x1D438, 'M', u'e'),
- (0x1D439, 'M', u'f'),
- (0x1D43A, 'M', u'g'),
- (0x1D43B, 'M', u'h'),
- (0x1D43C, 'M', u'i'),
- (0x1D43D, 'M', u'j'),
- (0x1D43E, 'M', u'k'),
- (0x1D43F, 'M', u'l'),
- (0x1D440, 'M', u'm'),
- (0x1D441, 'M', u'n'),
- (0x1D442, 'M', u'o'),
- (0x1D443, 'M', u'p'),
- (0x1D444, 'M', u'q'),
- (0x1D445, 'M', u'r'),
- (0x1D446, 'M', u's'),
- (0x1D447, 'M', u't'),
- (0x1D448, 'M', u'u'),
- (0x1D449, 'M', u'v'),
- (0x1D44A, 'M', u'w'),
- (0x1D44B, 'M', u'x'),
- (0x1D44C, 'M', u'y'),
- (0x1D44D, 'M', u'z'),
- (0x1D44E, 'M', u'a'),
- (0x1D44F, 'M', u'b'),
- (0x1D450, 'M', u'c'),
- (0x1D451, 'M', u'd'),
- ]
-
-def _seg_60():
- return [
- (0x1D452, 'M', u'e'),
- (0x1D453, 'M', u'f'),
- (0x1D454, 'M', u'g'),
- (0x1D455, 'X'),
- (0x1D456, 'M', u'i'),
- (0x1D457, 'M', u'j'),
- (0x1D458, 'M', u'k'),
- (0x1D459, 'M', u'l'),
- (0x1D45A, 'M', u'm'),
- (0x1D45B, 'M', u'n'),
- (0x1D45C, 'M', u'o'),
- (0x1D45D, 'M', u'p'),
- (0x1D45E, 'M', u'q'),
- (0x1D45F, 'M', u'r'),
- (0x1D460, 'M', u's'),
- (0x1D461, 'M', u't'),
- (0x1D462, 'M', u'u'),
- (0x1D463, 'M', u'v'),
- (0x1D464, 'M', u'w'),
- (0x1D465, 'M', u'x'),
- (0x1D466, 'M', u'y'),
- (0x1D467, 'M', u'z'),
- (0x1D468, 'M', u'a'),
- (0x1D469, 'M', u'b'),
- (0x1D46A, 'M', u'c'),
- (0x1D46B, 'M', u'd'),
- (0x1D46C, 'M', u'e'),
- (0x1D46D, 'M', u'f'),
- (0x1D46E, 'M', u'g'),
- (0x1D46F, 'M', u'h'),
- (0x1D470, 'M', u'i'),
- (0x1D471, 'M', u'j'),
- (0x1D472, 'M', u'k'),
- (0x1D473, 'M', u'l'),
- (0x1D474, 'M', u'm'),
- (0x1D475, 'M', u'n'),
- (0x1D476, 'M', u'o'),
- (0x1D477, 'M', u'p'),
- (0x1D478, 'M', u'q'),
- (0x1D479, 'M', u'r'),
- (0x1D47A, 'M', u's'),
- (0x1D47B, 'M', u't'),
- (0x1D47C, 'M', u'u'),
- (0x1D47D, 'M', u'v'),
- (0x1D47E, 'M', u'w'),
- (0x1D47F, 'M', u'x'),
- (0x1D480, 'M', u'y'),
- (0x1D481, 'M', u'z'),
- (0x1D482, 'M', u'a'),
- (0x1D483, 'M', u'b'),
- (0x1D484, 'M', u'c'),
- (0x1D485, 'M', u'd'),
- (0x1D486, 'M', u'e'),
- (0x1D487, 'M', u'f'),
- (0x1D488, 'M', u'g'),
- (0x1D489, 'M', u'h'),
- (0x1D48A, 'M', u'i'),
- (0x1D48B, 'M', u'j'),
- (0x1D48C, 'M', u'k'),
- (0x1D48D, 'M', u'l'),
- (0x1D48E, 'M', u'm'),
- (0x1D48F, 'M', u'n'),
- (0x1D490, 'M', u'o'),
- (0x1D491, 'M', u'p'),
- (0x1D492, 'M', u'q'),
- (0x1D493, 'M', u'r'),
- (0x1D494, 'M', u's'),
- (0x1D495, 'M', u't'),
- (0x1D496, 'M', u'u'),
- (0x1D497, 'M', u'v'),
- (0x1D498, 'M', u'w'),
- (0x1D499, 'M', u'x'),
- (0x1D49A, 'M', u'y'),
- (0x1D49B, 'M', u'z'),
- (0x1D49C, 'M', u'a'),
- (0x1D49D, 'X'),
- (0x1D49E, 'M', u'c'),
- (0x1D49F, 'M', u'd'),
- (0x1D4A0, 'X'),
- (0x1D4A2, 'M', u'g'),
- (0x1D4A3, 'X'),
- (0x1D4A5, 'M', u'j'),
- (0x1D4A6, 'M', u'k'),
- (0x1D4A7, 'X'),
- (0x1D4A9, 'M', u'n'),
- (0x1D4AA, 'M', u'o'),
- (0x1D4AB, 'M', u'p'),
- (0x1D4AC, 'M', u'q'),
- (0x1D4AD, 'X'),
- (0x1D4AE, 'M', u's'),
- (0x1D4AF, 'M', u't'),
- (0x1D4B0, 'M', u'u'),
- (0x1D4B1, 'M', u'v'),
- (0x1D4B2, 'M', u'w'),
- (0x1D4B3, 'M', u'x'),
- (0x1D4B4, 'M', u'y'),
- (0x1D4B5, 'M', u'z'),
- (0x1D4B6, 'M', u'a'),
- (0x1D4B7, 'M', u'b'),
- (0x1D4B8, 'M', u'c'),
- ]
-
-def _seg_61():
- return [
- (0x1D4B9, 'M', u'd'),
- (0x1D4BA, 'X'),
- (0x1D4BB, 'M', u'f'),
- (0x1D4BC, 'X'),
- (0x1D4BD, 'M', u'h'),
- (0x1D4BE, 'M', u'i'),
- (0x1D4BF, 'M', u'j'),
- (0x1D4C0, 'M', u'k'),
- (0x1D4C1, 'M', u'l'),
- (0x1D4C2, 'M', u'm'),
- (0x1D4C3, 'M', u'n'),
- (0x1D4C4, 'X'),
- (0x1D4C5, 'M', u'p'),
- (0x1D4C6, 'M', u'q'),
- (0x1D4C7, 'M', u'r'),
- (0x1D4C8, 'M', u's'),
- (0x1D4C9, 'M', u't'),
- (0x1D4CA, 'M', u'u'),
- (0x1D4CB, 'M', u'v'),
- (0x1D4CC, 'M', u'w'),
- (0x1D4CD, 'M', u'x'),
- (0x1D4CE, 'M', u'y'),
- (0x1D4CF, 'M', u'z'),
- (0x1D4D0, 'M', u'a'),
- (0x1D4D1, 'M', u'b'),
- (0x1D4D2, 'M', u'c'),
- (0x1D4D3, 'M', u'd'),
- (0x1D4D4, 'M', u'e'),
- (0x1D4D5, 'M', u'f'),
- (0x1D4D6, 'M', u'g'),
- (0x1D4D7, 'M', u'h'),
- (0x1D4D8, 'M', u'i'),
- (0x1D4D9, 'M', u'j'),
- (0x1D4DA, 'M', u'k'),
- (0x1D4DB, 'M', u'l'),
- (0x1D4DC, 'M', u'm'),
- (0x1D4DD, 'M', u'n'),
- (0x1D4DE, 'M', u'o'),
- (0x1D4DF, 'M', u'p'),
- (0x1D4E0, 'M', u'q'),
- (0x1D4E1, 'M', u'r'),
- (0x1D4E2, 'M', u's'),
- (0x1D4E3, 'M', u't'),
- (0x1D4E4, 'M', u'u'),
- (0x1D4E5, 'M', u'v'),
- (0x1D4E6, 'M', u'w'),
- (0x1D4E7, 'M', u'x'),
- (0x1D4E8, 'M', u'y'),
- (0x1D4E9, 'M', u'z'),
- (0x1D4EA, 'M', u'a'),
- (0x1D4EB, 'M', u'b'),
- (0x1D4EC, 'M', u'c'),
- (0x1D4ED, 'M', u'd'),
- (0x1D4EE, 'M', u'e'),
- (0x1D4EF, 'M', u'f'),
- (0x1D4F0, 'M', u'g'),
- (0x1D4F1, 'M', u'h'),
- (0x1D4F2, 'M', u'i'),
- (0x1D4F3, 'M', u'j'),
- (0x1D4F4, 'M', u'k'),
- (0x1D4F5, 'M', u'l'),
- (0x1D4F6, 'M', u'm'),
- (0x1D4F7, 'M', u'n'),
- (0x1D4F8, 'M', u'o'),
- (0x1D4F9, 'M', u'p'),
- (0x1D4FA, 'M', u'q'),
- (0x1D4FB, 'M', u'r'),
- (0x1D4FC, 'M', u's'),
- (0x1D4FD, 'M', u't'),
- (0x1D4FE, 'M', u'u'),
- (0x1D4FF, 'M', u'v'),
- (0x1D500, 'M', u'w'),
- (0x1D501, 'M', u'x'),
- (0x1D502, 'M', u'y'),
- (0x1D503, 'M', u'z'),
- (0x1D504, 'M', u'a'),
- (0x1D505, 'M', u'b'),
- (0x1D506, 'X'),
- (0x1D507, 'M', u'd'),
- (0x1D508, 'M', u'e'),
- (0x1D509, 'M', u'f'),
- (0x1D50A, 'M', u'g'),
- (0x1D50B, 'X'),
- (0x1D50D, 'M', u'j'),
- (0x1D50E, 'M', u'k'),
- (0x1D50F, 'M', u'l'),
- (0x1D510, 'M', u'm'),
- (0x1D511, 'M', u'n'),
- (0x1D512, 'M', u'o'),
- (0x1D513, 'M', u'p'),
- (0x1D514, 'M', u'q'),
- (0x1D515, 'X'),
- (0x1D516, 'M', u's'),
- (0x1D517, 'M', u't'),
- (0x1D518, 'M', u'u'),
- (0x1D519, 'M', u'v'),
- (0x1D51A, 'M', u'w'),
- (0x1D51B, 'M', u'x'),
- (0x1D51C, 'M', u'y'),
- (0x1D51D, 'X'),
- ]
-
-def _seg_62():
- return [
- (0x1D51E, 'M', u'a'),
- (0x1D51F, 'M', u'b'),
- (0x1D520, 'M', u'c'),
- (0x1D521, 'M', u'd'),
- (0x1D522, 'M', u'e'),
- (0x1D523, 'M', u'f'),
- (0x1D524, 'M', u'g'),
- (0x1D525, 'M', u'h'),
- (0x1D526, 'M', u'i'),
- (0x1D527, 'M', u'j'),
- (0x1D528, 'M', u'k'),
- (0x1D529, 'M', u'l'),
- (0x1D52A, 'M', u'm'),
- (0x1D52B, 'M', u'n'),
- (0x1D52C, 'M', u'o'),
- (0x1D52D, 'M', u'p'),
- (0x1D52E, 'M', u'q'),
- (0x1D52F, 'M', u'r'),
- (0x1D530, 'M', u's'),
- (0x1D531, 'M', u't'),
- (0x1D532, 'M', u'u'),
- (0x1D533, 'M', u'v'),
- (0x1D534, 'M', u'w'),
- (0x1D535, 'M', u'x'),
- (0x1D536, 'M', u'y'),
- (0x1D537, 'M', u'z'),
- (0x1D538, 'M', u'a'),
- (0x1D539, 'M', u'b'),
- (0x1D53A, 'X'),
- (0x1D53B, 'M', u'd'),
- (0x1D53C, 'M', u'e'),
- (0x1D53D, 'M', u'f'),
- (0x1D53E, 'M', u'g'),
- (0x1D53F, 'X'),
- (0x1D540, 'M', u'i'),
- (0x1D541, 'M', u'j'),
- (0x1D542, 'M', u'k'),
- (0x1D543, 'M', u'l'),
- (0x1D544, 'M', u'm'),
- (0x1D545, 'X'),
- (0x1D546, 'M', u'o'),
- (0x1D547, 'X'),
- (0x1D54A, 'M', u's'),
- (0x1D54B, 'M', u't'),
- (0x1D54C, 'M', u'u'),
- (0x1D54D, 'M', u'v'),
- (0x1D54E, 'M', u'w'),
- (0x1D54F, 'M', u'x'),
- (0x1D550, 'M', u'y'),
- (0x1D551, 'X'),
- (0x1D552, 'M', u'a'),
- (0x1D553, 'M', u'b'),
- (0x1D554, 'M', u'c'),
- (0x1D555, 'M', u'd'),
- (0x1D556, 'M', u'e'),
- (0x1D557, 'M', u'f'),
- (0x1D558, 'M', u'g'),
- (0x1D559, 'M', u'h'),
- (0x1D55A, 'M', u'i'),
- (0x1D55B, 'M', u'j'),
- (0x1D55C, 'M', u'k'),
- (0x1D55D, 'M', u'l'),
- (0x1D55E, 'M', u'm'),
- (0x1D55F, 'M', u'n'),
- (0x1D560, 'M', u'o'),
- (0x1D561, 'M', u'p'),
- (0x1D562, 'M', u'q'),
- (0x1D563, 'M', u'r'),
- (0x1D564, 'M', u's'),
- (0x1D565, 'M', u't'),
- (0x1D566, 'M', u'u'),
- (0x1D567, 'M', u'v'),
- (0x1D568, 'M', u'w'),
- (0x1D569, 'M', u'x'),
- (0x1D56A, 'M', u'y'),
- (0x1D56B, 'M', u'z'),
- (0x1D56C, 'M', u'a'),
- (0x1D56D, 'M', u'b'),
- (0x1D56E, 'M', u'c'),
- (0x1D56F, 'M', u'd'),
- (0x1D570, 'M', u'e'),
- (0x1D571, 'M', u'f'),
- (0x1D572, 'M', u'g'),
- (0x1D573, 'M', u'h'),
- (0x1D574, 'M', u'i'),
- (0x1D575, 'M', u'j'),
- (0x1D576, 'M', u'k'),
- (0x1D577, 'M', u'l'),
- (0x1D578, 'M', u'm'),
- (0x1D579, 'M', u'n'),
- (0x1D57A, 'M', u'o'),
- (0x1D57B, 'M', u'p'),
- (0x1D57C, 'M', u'q'),
- (0x1D57D, 'M', u'r'),
- (0x1D57E, 'M', u's'),
- (0x1D57F, 'M', u't'),
- (0x1D580, 'M', u'u'),
- (0x1D581, 'M', u'v'),
- (0x1D582, 'M', u'w'),
- (0x1D583, 'M', u'x'),
- ]
-
-def _seg_63():
- return [
- (0x1D584, 'M', u'y'),
- (0x1D585, 'M', u'z'),
- (0x1D586, 'M', u'a'),
- (0x1D587, 'M', u'b'),
- (0x1D588, 'M', u'c'),
- (0x1D589, 'M', u'd'),
- (0x1D58A, 'M', u'e'),
- (0x1D58B, 'M', u'f'),
- (0x1D58C, 'M', u'g'),
- (0x1D58D, 'M', u'h'),
- (0x1D58E, 'M', u'i'),
- (0x1D58F, 'M', u'j'),
- (0x1D590, 'M', u'k'),
- (0x1D591, 'M', u'l'),
- (0x1D592, 'M', u'm'),
- (0x1D593, 'M', u'n'),
- (0x1D594, 'M', u'o'),
- (0x1D595, 'M', u'p'),
- (0x1D596, 'M', u'q'),
- (0x1D597, 'M', u'r'),
- (0x1D598, 'M', u's'),
- (0x1D599, 'M', u't'),
- (0x1D59A, 'M', u'u'),
- (0x1D59B, 'M', u'v'),
- (0x1D59C, 'M', u'w'),
- (0x1D59D, 'M', u'x'),
- (0x1D59E, 'M', u'y'),
- (0x1D59F, 'M', u'z'),
- (0x1D5A0, 'M', u'a'),
- (0x1D5A1, 'M', u'b'),
- (0x1D5A2, 'M', u'c'),
- (0x1D5A3, 'M', u'd'),
- (0x1D5A4, 'M', u'e'),
- (0x1D5A5, 'M', u'f'),
- (0x1D5A6, 'M', u'g'),
- (0x1D5A7, 'M', u'h'),
- (0x1D5A8, 'M', u'i'),
- (0x1D5A9, 'M', u'j'),
- (0x1D5AA, 'M', u'k'),
- (0x1D5AB, 'M', u'l'),
- (0x1D5AC, 'M', u'm'),
- (0x1D5AD, 'M', u'n'),
- (0x1D5AE, 'M', u'o'),
- (0x1D5AF, 'M', u'p'),
- (0x1D5B0, 'M', u'q'),
- (0x1D5B1, 'M', u'r'),
- (0x1D5B2, 'M', u's'),
- (0x1D5B3, 'M', u't'),
- (0x1D5B4, 'M', u'u'),
- (0x1D5B5, 'M', u'v'),
- (0x1D5B6, 'M', u'w'),
- (0x1D5B7, 'M', u'x'),
- (0x1D5B8, 'M', u'y'),
- (0x1D5B9, 'M', u'z'),
- (0x1D5BA, 'M', u'a'),
- (0x1D5BB, 'M', u'b'),
- (0x1D5BC, 'M', u'c'),
- (0x1D5BD, 'M', u'd'),
- (0x1D5BE, 'M', u'e'),
- (0x1D5BF, 'M', u'f'),
- (0x1D5C0, 'M', u'g'),
- (0x1D5C1, 'M', u'h'),
- (0x1D5C2, 'M', u'i'),
- (0x1D5C3, 'M', u'j'),
- (0x1D5C4, 'M', u'k'),
- (0x1D5C5, 'M', u'l'),
- (0x1D5C6, 'M', u'm'),
- (0x1D5C7, 'M', u'n'),
- (0x1D5C8, 'M', u'o'),
- (0x1D5C9, 'M', u'p'),
- (0x1D5CA, 'M', u'q'),
- (0x1D5CB, 'M', u'r'),
- (0x1D5CC, 'M', u's'),
- (0x1D5CD, 'M', u't'),
- (0x1D5CE, 'M', u'u'),
- (0x1D5CF, 'M', u'v'),
- (0x1D5D0, 'M', u'w'),
- (0x1D5D1, 'M', u'x'),
- (0x1D5D2, 'M', u'y'),
- (0x1D5D3, 'M', u'z'),
- (0x1D5D4, 'M', u'a'),
- (0x1D5D5, 'M', u'b'),
- (0x1D5D6, 'M', u'c'),
- (0x1D5D7, 'M', u'd'),
- (0x1D5D8, 'M', u'e'),
- (0x1D5D9, 'M', u'f'),
- (0x1D5DA, 'M', u'g'),
- (0x1D5DB, 'M', u'h'),
- (0x1D5DC, 'M', u'i'),
- (0x1D5DD, 'M', u'j'),
- (0x1D5DE, 'M', u'k'),
- (0x1D5DF, 'M', u'l'),
- (0x1D5E0, 'M', u'm'),
- (0x1D5E1, 'M', u'n'),
- (0x1D5E2, 'M', u'o'),
- (0x1D5E3, 'M', u'p'),
- (0x1D5E4, 'M', u'q'),
- (0x1D5E5, 'M', u'r'),
- (0x1D5E6, 'M', u's'),
- (0x1D5E7, 'M', u't'),
- ]
-
-def _seg_64():
- return [
- (0x1D5E8, 'M', u'u'),
- (0x1D5E9, 'M', u'v'),
- (0x1D5EA, 'M', u'w'),
- (0x1D5EB, 'M', u'x'),
- (0x1D5EC, 'M', u'y'),
- (0x1D5ED, 'M', u'z'),
- (0x1D5EE, 'M', u'a'),
- (0x1D5EF, 'M', u'b'),
- (0x1D5F0, 'M', u'c'),
- (0x1D5F1, 'M', u'd'),
- (0x1D5F2, 'M', u'e'),
- (0x1D5F3, 'M', u'f'),
- (0x1D5F4, 'M', u'g'),
- (0x1D5F5, 'M', u'h'),
- (0x1D5F6, 'M', u'i'),
- (0x1D5F7, 'M', u'j'),
- (0x1D5F8, 'M', u'k'),
- (0x1D5F9, 'M', u'l'),
- (0x1D5FA, 'M', u'm'),
- (0x1D5FB, 'M', u'n'),
- (0x1D5FC, 'M', u'o'),
- (0x1D5FD, 'M', u'p'),
- (0x1D5FE, 'M', u'q'),
- (0x1D5FF, 'M', u'r'),
- (0x1D600, 'M', u's'),
- (0x1D601, 'M', u't'),
- (0x1D602, 'M', u'u'),
- (0x1D603, 'M', u'v'),
- (0x1D604, 'M', u'w'),
- (0x1D605, 'M', u'x'),
- (0x1D606, 'M', u'y'),
- (0x1D607, 'M', u'z'),
- (0x1D608, 'M', u'a'),
- (0x1D609, 'M', u'b'),
- (0x1D60A, 'M', u'c'),
- (0x1D60B, 'M', u'd'),
- (0x1D60C, 'M', u'e'),
- (0x1D60D, 'M', u'f'),
- (0x1D60E, 'M', u'g'),
- (0x1D60F, 'M', u'h'),
- (0x1D610, 'M', u'i'),
- (0x1D611, 'M', u'j'),
- (0x1D612, 'M', u'k'),
- (0x1D613, 'M', u'l'),
- (0x1D614, 'M', u'm'),
- (0x1D615, 'M', u'n'),
- (0x1D616, 'M', u'o'),
- (0x1D617, 'M', u'p'),
- (0x1D618, 'M', u'q'),
- (0x1D619, 'M', u'r'),
- (0x1D61A, 'M', u's'),
- (0x1D61B, 'M', u't'),
- (0x1D61C, 'M', u'u'),
- (0x1D61D, 'M', u'v'),
- (0x1D61E, 'M', u'w'),
- (0x1D61F, 'M', u'x'),
- (0x1D620, 'M', u'y'),
- (0x1D621, 'M', u'z'),
- (0x1D622, 'M', u'a'),
- (0x1D623, 'M', u'b'),
- (0x1D624, 'M', u'c'),
- (0x1D625, 'M', u'd'),
- (0x1D626, 'M', u'e'),
- (0x1D627, 'M', u'f'),
- (0x1D628, 'M', u'g'),
- (0x1D629, 'M', u'h'),
- (0x1D62A, 'M', u'i'),
- (0x1D62B, 'M', u'j'),
- (0x1D62C, 'M', u'k'),
- (0x1D62D, 'M', u'l'),
- (0x1D62E, 'M', u'm'),
- (0x1D62F, 'M', u'n'),
- (0x1D630, 'M', u'o'),
- (0x1D631, 'M', u'p'),
- (0x1D632, 'M', u'q'),
- (0x1D633, 'M', u'r'),
- (0x1D634, 'M', u's'),
- (0x1D635, 'M', u't'),
- (0x1D636, 'M', u'u'),
- (0x1D637, 'M', u'v'),
- (0x1D638, 'M', u'w'),
- (0x1D639, 'M', u'x'),
- (0x1D63A, 'M', u'y'),
- (0x1D63B, 'M', u'z'),
- (0x1D63C, 'M', u'a'),
- (0x1D63D, 'M', u'b'),
- (0x1D63E, 'M', u'c'),
- (0x1D63F, 'M', u'd'),
- (0x1D640, 'M', u'e'),
- (0x1D641, 'M', u'f'),
- (0x1D642, 'M', u'g'),
- (0x1D643, 'M', u'h'),
- (0x1D644, 'M', u'i'),
- (0x1D645, 'M', u'j'),
- (0x1D646, 'M', u'k'),
- (0x1D647, 'M', u'l'),
- (0x1D648, 'M', u'm'),
- (0x1D649, 'M', u'n'),
- (0x1D64A, 'M', u'o'),
- (0x1D64B, 'M', u'p'),
- ]
-
-def _seg_65():
- return [
- (0x1D64C, 'M', u'q'),
- (0x1D64D, 'M', u'r'),
- (0x1D64E, 'M', u's'),
- (0x1D64F, 'M', u't'),
- (0x1D650, 'M', u'u'),
- (0x1D651, 'M', u'v'),
- (0x1D652, 'M', u'w'),
- (0x1D653, 'M', u'x'),
- (0x1D654, 'M', u'y'),
- (0x1D655, 'M', u'z'),
- (0x1D656, 'M', u'a'),
- (0x1D657, 'M', u'b'),
- (0x1D658, 'M', u'c'),
- (0x1D659, 'M', u'd'),
- (0x1D65A, 'M', u'e'),
- (0x1D65B, 'M', u'f'),
- (0x1D65C, 'M', u'g'),
- (0x1D65D, 'M', u'h'),
- (0x1D65E, 'M', u'i'),
- (0x1D65F, 'M', u'j'),
- (0x1D660, 'M', u'k'),
- (0x1D661, 'M', u'l'),
- (0x1D662, 'M', u'm'),
- (0x1D663, 'M', u'n'),
- (0x1D664, 'M', u'o'),
- (0x1D665, 'M', u'p'),
- (0x1D666, 'M', u'q'),
- (0x1D667, 'M', u'r'),
- (0x1D668, 'M', u's'),
- (0x1D669, 'M', u't'),
- (0x1D66A, 'M', u'u'),
- (0x1D66B, 'M', u'v'),
- (0x1D66C, 'M', u'w'),
- (0x1D66D, 'M', u'x'),
- (0x1D66E, 'M', u'y'),
- (0x1D66F, 'M', u'z'),
- (0x1D670, 'M', u'a'),
- (0x1D671, 'M', u'b'),
- (0x1D672, 'M', u'c'),
- (0x1D673, 'M', u'd'),
- (0x1D674, 'M', u'e'),
- (0x1D675, 'M', u'f'),
- (0x1D676, 'M', u'g'),
- (0x1D677, 'M', u'h'),
- (0x1D678, 'M', u'i'),
- (0x1D679, 'M', u'j'),
- (0x1D67A, 'M', u'k'),
- (0x1D67B, 'M', u'l'),
- (0x1D67C, 'M', u'm'),
- (0x1D67D, 'M', u'n'),
- (0x1D67E, 'M', u'o'),
- (0x1D67F, 'M', u'p'),
- (0x1D680, 'M', u'q'),
- (0x1D681, 'M', u'r'),
- (0x1D682, 'M', u's'),
- (0x1D683, 'M', u't'),
- (0x1D684, 'M', u'u'),
- (0x1D685, 'M', u'v'),
- (0x1D686, 'M', u'w'),
- (0x1D687, 'M', u'x'),
- (0x1D688, 'M', u'y'),
- (0x1D689, 'M', u'z'),
- (0x1D68A, 'M', u'a'),
- (0x1D68B, 'M', u'b'),
- (0x1D68C, 'M', u'c'),
- (0x1D68D, 'M', u'd'),
- (0x1D68E, 'M', u'e'),
- (0x1D68F, 'M', u'f'),
- (0x1D690, 'M', u'g'),
- (0x1D691, 'M', u'h'),
- (0x1D692, 'M', u'i'),
- (0x1D693, 'M', u'j'),
- (0x1D694, 'M', u'k'),
- (0x1D695, 'M', u'l'),
- (0x1D696, 'M', u'm'),
- (0x1D697, 'M', u'n'),
- (0x1D698, 'M', u'o'),
- (0x1D699, 'M', u'p'),
- (0x1D69A, 'M', u'q'),
- (0x1D69B, 'M', u'r'),
- (0x1D69C, 'M', u's'),
- (0x1D69D, 'M', u't'),
- (0x1D69E, 'M', u'u'),
- (0x1D69F, 'M', u'v'),
- (0x1D6A0, 'M', u'w'),
- (0x1D6A1, 'M', u'x'),
- (0x1D6A2, 'M', u'y'),
- (0x1D6A3, 'M', u'z'),
- (0x1D6A4, 'M', u'ı'),
- (0x1D6A5, 'M', u'ȷ'),
- (0x1D6A6, 'X'),
- (0x1D6A8, 'M', u'α'),
- (0x1D6A9, 'M', u'β'),
- (0x1D6AA, 'M', u'γ'),
- (0x1D6AB, 'M', u'δ'),
- (0x1D6AC, 'M', u'ε'),
- (0x1D6AD, 'M', u'ζ'),
- (0x1D6AE, 'M', u'η'),
- (0x1D6AF, 'M', u'θ'),
- (0x1D6B0, 'M', u'ι'),
- ]
-
-def _seg_66():
- return [
- (0x1D6B1, 'M', u'κ'),
- (0x1D6B2, 'M', u'λ'),
- (0x1D6B3, 'M', u'μ'),
- (0x1D6B4, 'M', u'ν'),
- (0x1D6B5, 'M', u'ξ'),
- (0x1D6B6, 'M', u'ο'),
- (0x1D6B7, 'M', u'π'),
- (0x1D6B8, 'M', u'ρ'),
- (0x1D6B9, 'M', u'θ'),
- (0x1D6BA, 'M', u'σ'),
- (0x1D6BB, 'M', u'τ'),
- (0x1D6BC, 'M', u'υ'),
- (0x1D6BD, 'M', u'φ'),
- (0x1D6BE, 'M', u'χ'),
- (0x1D6BF, 'M', u'ψ'),
- (0x1D6C0, 'M', u'ω'),
- (0x1D6C1, 'M', u'∇'),
- (0x1D6C2, 'M', u'α'),
- (0x1D6C3, 'M', u'β'),
- (0x1D6C4, 'M', u'γ'),
- (0x1D6C5, 'M', u'δ'),
- (0x1D6C6, 'M', u'ε'),
- (0x1D6C7, 'M', u'ζ'),
- (0x1D6C8, 'M', u'η'),
- (0x1D6C9, 'M', u'θ'),
- (0x1D6CA, 'M', u'ι'),
- (0x1D6CB, 'M', u'κ'),
- (0x1D6CC, 'M', u'λ'),
- (0x1D6CD, 'M', u'μ'),
- (0x1D6CE, 'M', u'ν'),
- (0x1D6CF, 'M', u'ξ'),
- (0x1D6D0, 'M', u'ο'),
- (0x1D6D1, 'M', u'π'),
- (0x1D6D2, 'M', u'ρ'),
- (0x1D6D3, 'M', u'σ'),
- (0x1D6D5, 'M', u'τ'),
- (0x1D6D6, 'M', u'υ'),
- (0x1D6D7, 'M', u'φ'),
- (0x1D6D8, 'M', u'χ'),
- (0x1D6D9, 'M', u'ψ'),
- (0x1D6DA, 'M', u'ω'),
- (0x1D6DB, 'M', u'∂'),
- (0x1D6DC, 'M', u'ε'),
- (0x1D6DD, 'M', u'θ'),
- (0x1D6DE, 'M', u'κ'),
- (0x1D6DF, 'M', u'φ'),
- (0x1D6E0, 'M', u'ρ'),
- (0x1D6E1, 'M', u'π'),
- (0x1D6E2, 'M', u'α'),
- (0x1D6E3, 'M', u'β'),
- (0x1D6E4, 'M', u'γ'),
- (0x1D6E5, 'M', u'δ'),
- (0x1D6E6, 'M', u'ε'),
- (0x1D6E7, 'M', u'ζ'),
- (0x1D6E8, 'M', u'η'),
- (0x1D6E9, 'M', u'θ'),
- (0x1D6EA, 'M', u'ι'),
- (0x1D6EB, 'M', u'κ'),
- (0x1D6EC, 'M', u'λ'),
- (0x1D6ED, 'M', u'μ'),
- (0x1D6EE, 'M', u'ν'),
- (0x1D6EF, 'M', u'ξ'),
- (0x1D6F0, 'M', u'ο'),
- (0x1D6F1, 'M', u'π'),
- (0x1D6F2, 'M', u'ρ'),
- (0x1D6F3, 'M', u'θ'),
- (0x1D6F4, 'M', u'σ'),
- (0x1D6F5, 'M', u'τ'),
- (0x1D6F6, 'M', u'υ'),
- (0x1D6F7, 'M', u'φ'),
- (0x1D6F8, 'M', u'χ'),
- (0x1D6F9, 'M', u'ψ'),
- (0x1D6FA, 'M', u'ω'),
- (0x1D6FB, 'M', u'∇'),
- (0x1D6FC, 'M', u'α'),
- (0x1D6FD, 'M', u'β'),
- (0x1D6FE, 'M', u'γ'),
- (0x1D6FF, 'M', u'δ'),
- (0x1D700, 'M', u'ε'),
- (0x1D701, 'M', u'ζ'),
- (0x1D702, 'M', u'η'),
- (0x1D703, 'M', u'θ'),
- (0x1D704, 'M', u'ι'),
- (0x1D705, 'M', u'κ'),
- (0x1D706, 'M', u'λ'),
- (0x1D707, 'M', u'μ'),
- (0x1D708, 'M', u'ν'),
- (0x1D709, 'M', u'ξ'),
- (0x1D70A, 'M', u'ο'),
- (0x1D70B, 'M', u'π'),
- (0x1D70C, 'M', u'ρ'),
- (0x1D70D, 'M', u'σ'),
- (0x1D70F, 'M', u'τ'),
- (0x1D710, 'M', u'υ'),
- (0x1D711, 'M', u'φ'),
- (0x1D712, 'M', u'χ'),
- (0x1D713, 'M', u'ψ'),
- (0x1D714, 'M', u'ω'),
- (0x1D715, 'M', u'∂'),
- (0x1D716, 'M', u'ε'),
- ]
-
-def _seg_67():
- return [
- (0x1D717, 'M', u'θ'),
- (0x1D718, 'M', u'κ'),
- (0x1D719, 'M', u'φ'),
- (0x1D71A, 'M', u'ρ'),
- (0x1D71B, 'M', u'π'),
- (0x1D71C, 'M', u'α'),
- (0x1D71D, 'M', u'β'),
- (0x1D71E, 'M', u'γ'),
- (0x1D71F, 'M', u'δ'),
- (0x1D720, 'M', u'ε'),
- (0x1D721, 'M', u'ζ'),
- (0x1D722, 'M', u'η'),
- (0x1D723, 'M', u'θ'),
- (0x1D724, 'M', u'ι'),
- (0x1D725, 'M', u'κ'),
- (0x1D726, 'M', u'λ'),
- (0x1D727, 'M', u'μ'),
- (0x1D728, 'M', u'ν'),
- (0x1D729, 'M', u'ξ'),
- (0x1D72A, 'M', u'ο'),
- (0x1D72B, 'M', u'π'),
- (0x1D72C, 'M', u'ρ'),
- (0x1D72D, 'M', u'θ'),
- (0x1D72E, 'M', u'σ'),
- (0x1D72F, 'M', u'τ'),
- (0x1D730, 'M', u'υ'),
- (0x1D731, 'M', u'φ'),
- (0x1D732, 'M', u'χ'),
- (0x1D733, 'M', u'ψ'),
- (0x1D734, 'M', u'ω'),
- (0x1D735, 'M', u'∇'),
- (0x1D736, 'M', u'α'),
- (0x1D737, 'M', u'β'),
- (0x1D738, 'M', u'γ'),
- (0x1D739, 'M', u'δ'),
- (0x1D73A, 'M', u'ε'),
- (0x1D73B, 'M', u'ζ'),
- (0x1D73C, 'M', u'η'),
- (0x1D73D, 'M', u'θ'),
- (0x1D73E, 'M', u'ι'),
- (0x1D73F, 'M', u'κ'),
- (0x1D740, 'M', u'λ'),
- (0x1D741, 'M', u'μ'),
- (0x1D742, 'M', u'ν'),
- (0x1D743, 'M', u'ξ'),
- (0x1D744, 'M', u'ο'),
- (0x1D745, 'M', u'π'),
- (0x1D746, 'M', u'ρ'),
- (0x1D747, 'M', u'σ'),
- (0x1D749, 'M', u'τ'),
- (0x1D74A, 'M', u'υ'),
- (0x1D74B, 'M', u'φ'),
- (0x1D74C, 'M', u'χ'),
- (0x1D74D, 'M', u'ψ'),
- (0x1D74E, 'M', u'ω'),
- (0x1D74F, 'M', u'∂'),
- (0x1D750, 'M', u'ε'),
- (0x1D751, 'M', u'θ'),
- (0x1D752, 'M', u'κ'),
- (0x1D753, 'M', u'φ'),
- (0x1D754, 'M', u'ρ'),
- (0x1D755, 'M', u'π'),
- (0x1D756, 'M', u'α'),
- (0x1D757, 'M', u'β'),
- (0x1D758, 'M', u'γ'),
- (0x1D759, 'M', u'δ'),
- (0x1D75A, 'M', u'ε'),
- (0x1D75B, 'M', u'ζ'),
- (0x1D75C, 'M', u'η'),
- (0x1D75D, 'M', u'θ'),
- (0x1D75E, 'M', u'ι'),
- (0x1D75F, 'M', u'κ'),
- (0x1D760, 'M', u'λ'),
- (0x1D761, 'M', u'μ'),
- (0x1D762, 'M', u'ν'),
- (0x1D763, 'M', u'ξ'),
- (0x1D764, 'M', u'ο'),
- (0x1D765, 'M', u'π'),
- (0x1D766, 'M', u'ρ'),
- (0x1D767, 'M', u'θ'),
- (0x1D768, 'M', u'σ'),
- (0x1D769, 'M', u'τ'),
- (0x1D76A, 'M', u'υ'),
- (0x1D76B, 'M', u'φ'),
- (0x1D76C, 'M', u'χ'),
- (0x1D76D, 'M', u'ψ'),
- (0x1D76E, 'M', u'ω'),
- (0x1D76F, 'M', u'∇'),
- (0x1D770, 'M', u'α'),
- (0x1D771, 'M', u'β'),
- (0x1D772, 'M', u'γ'),
- (0x1D773, 'M', u'δ'),
- (0x1D774, 'M', u'ε'),
- (0x1D775, 'M', u'ζ'),
- (0x1D776, 'M', u'η'),
- (0x1D777, 'M', u'θ'),
- (0x1D778, 'M', u'ι'),
- (0x1D779, 'M', u'κ'),
- (0x1D77A, 'M', u'λ'),
- (0x1D77B, 'M', u'μ'),
- ]
-
-def _seg_68():
- return [
- (0x1D77C, 'M', u'ν'),
- (0x1D77D, 'M', u'ξ'),
- (0x1D77E, 'M', u'ο'),
- (0x1D77F, 'M', u'π'),
- (0x1D780, 'M', u'ρ'),
- (0x1D781, 'M', u'σ'),
- (0x1D783, 'M', u'τ'),
- (0x1D784, 'M', u'υ'),
- (0x1D785, 'M', u'φ'),
- (0x1D786, 'M', u'χ'),
- (0x1D787, 'M', u'ψ'),
- (0x1D788, 'M', u'ω'),
- (0x1D789, 'M', u'∂'),
- (0x1D78A, 'M', u'ε'),
- (0x1D78B, 'M', u'θ'),
- (0x1D78C, 'M', u'κ'),
- (0x1D78D, 'M', u'φ'),
- (0x1D78E, 'M', u'ρ'),
- (0x1D78F, 'M', u'π'),
- (0x1D790, 'M', u'α'),
- (0x1D791, 'M', u'β'),
- (0x1D792, 'M', u'γ'),
- (0x1D793, 'M', u'δ'),
- (0x1D794, 'M', u'ε'),
- (0x1D795, 'M', u'ζ'),
- (0x1D796, 'M', u'η'),
- (0x1D797, 'M', u'θ'),
- (0x1D798, 'M', u'ι'),
- (0x1D799, 'M', u'κ'),
- (0x1D79A, 'M', u'λ'),
- (0x1D79B, 'M', u'μ'),
- (0x1D79C, 'M', u'ν'),
- (0x1D79D, 'M', u'ξ'),
- (0x1D79E, 'M', u'ο'),
- (0x1D79F, 'M', u'π'),
- (0x1D7A0, 'M', u'ρ'),
- (0x1D7A1, 'M', u'θ'),
- (0x1D7A2, 'M', u'σ'),
- (0x1D7A3, 'M', u'τ'),
- (0x1D7A4, 'M', u'υ'),
- (0x1D7A5, 'M', u'φ'),
- (0x1D7A6, 'M', u'χ'),
- (0x1D7A7, 'M', u'ψ'),
- (0x1D7A8, 'M', u'ω'),
- (0x1D7A9, 'M', u'∇'),
- (0x1D7AA, 'M', u'α'),
- (0x1D7AB, 'M', u'β'),
- (0x1D7AC, 'M', u'γ'),
- (0x1D7AD, 'M', u'δ'),
- (0x1D7AE, 'M', u'ε'),
- (0x1D7AF, 'M', u'ζ'),
- (0x1D7B0, 'M', u'η'),
- (0x1D7B1, 'M', u'θ'),
- (0x1D7B2, 'M', u'ι'),
- (0x1D7B3, 'M', u'κ'),
- (0x1D7B4, 'M', u'λ'),
- (0x1D7B5, 'M', u'μ'),
- (0x1D7B6, 'M', u'ν'),
- (0x1D7B7, 'M', u'ξ'),
- (0x1D7B8, 'M', u'ο'),
- (0x1D7B9, 'M', u'π'),
- (0x1D7BA, 'M', u'ρ'),
- (0x1D7BB, 'M', u'σ'),
- (0x1D7BD, 'M', u'τ'),
- (0x1D7BE, 'M', u'υ'),
- (0x1D7BF, 'M', u'φ'),
- (0x1D7C0, 'M', u'χ'),
- (0x1D7C1, 'M', u'ψ'),
- (0x1D7C2, 'M', u'ω'),
- (0x1D7C3, 'M', u'∂'),
- (0x1D7C4, 'M', u'ε'),
- (0x1D7C5, 'M', u'θ'),
- (0x1D7C6, 'M', u'κ'),
- (0x1D7C7, 'M', u'φ'),
- (0x1D7C8, 'M', u'ρ'),
- (0x1D7C9, 'M', u'π'),
- (0x1D7CA, 'M', u'ϝ'),
- (0x1D7CC, 'X'),
- (0x1D7CE, 'M', u'0'),
- (0x1D7CF, 'M', u'1'),
- (0x1D7D0, 'M', u'2'),
- (0x1D7D1, 'M', u'3'),
- (0x1D7D2, 'M', u'4'),
- (0x1D7D3, 'M', u'5'),
- (0x1D7D4, 'M', u'6'),
- (0x1D7D5, 'M', u'7'),
- (0x1D7D6, 'M', u'8'),
- (0x1D7D7, 'M', u'9'),
- (0x1D7D8, 'M', u'0'),
- (0x1D7D9, 'M', u'1'),
- (0x1D7DA, 'M', u'2'),
- (0x1D7DB, 'M', u'3'),
- (0x1D7DC, 'M', u'4'),
- (0x1D7DD, 'M', u'5'),
- (0x1D7DE, 'M', u'6'),
- (0x1D7DF, 'M', u'7'),
- (0x1D7E0, 'M', u'8'),
- (0x1D7E1, 'M', u'9'),
- (0x1D7E2, 'M', u'0'),
- (0x1D7E3, 'M', u'1'),
- ]
-
-def _seg_69():
- return [
- (0x1D7E4, 'M', u'2'),
- (0x1D7E5, 'M', u'3'),
- (0x1D7E6, 'M', u'4'),
- (0x1D7E7, 'M', u'5'),
- (0x1D7E8, 'M', u'6'),
- (0x1D7E9, 'M', u'7'),
- (0x1D7EA, 'M', u'8'),
- (0x1D7EB, 'M', u'9'),
- (0x1D7EC, 'M', u'0'),
- (0x1D7ED, 'M', u'1'),
- (0x1D7EE, 'M', u'2'),
- (0x1D7EF, 'M', u'3'),
- (0x1D7F0, 'M', u'4'),
- (0x1D7F1, 'M', u'5'),
- (0x1D7F2, 'M', u'6'),
- (0x1D7F3, 'M', u'7'),
- (0x1D7F4, 'M', u'8'),
- (0x1D7F5, 'M', u'9'),
- (0x1D7F6, 'M', u'0'),
- (0x1D7F7, 'M', u'1'),
- (0x1D7F8, 'M', u'2'),
- (0x1D7F9, 'M', u'3'),
- (0x1D7FA, 'M', u'4'),
- (0x1D7FB, 'M', u'5'),
- (0x1D7FC, 'M', u'6'),
- (0x1D7FD, 'M', u'7'),
- (0x1D7FE, 'M', u'8'),
- (0x1D7FF, 'M', u'9'),
- (0x1D800, 'V'),
- (0x1DA8C, 'X'),
- (0x1DA9B, 'V'),
- (0x1DAA0, 'X'),
- (0x1DAA1, 'V'),
- (0x1DAB0, 'X'),
- (0x1E000, 'V'),
- (0x1E007, 'X'),
- (0x1E008, 'V'),
- (0x1E019, 'X'),
- (0x1E01B, 'V'),
- (0x1E022, 'X'),
- (0x1E023, 'V'),
- (0x1E025, 'X'),
- (0x1E026, 'V'),
- (0x1E02B, 'X'),
- (0x1E100, 'V'),
- (0x1E12D, 'X'),
- (0x1E130, 'V'),
- (0x1E13E, 'X'),
- (0x1E140, 'V'),
- (0x1E14A, 'X'),
- (0x1E14E, 'V'),
- (0x1E150, 'X'),
- (0x1E2C0, 'V'),
- (0x1E2FA, 'X'),
- (0x1E2FF, 'V'),
- (0x1E300, 'X'),
- (0x1E800, 'V'),
- (0x1E8C5, 'X'),
- (0x1E8C7, 'V'),
- (0x1E8D7, 'X'),
- (0x1E900, 'M', u'𞤢'),
- (0x1E901, 'M', u'𞤣'),
- (0x1E902, 'M', u'𞤤'),
- (0x1E903, 'M', u'𞤥'),
- (0x1E904, 'M', u'𞤦'),
- (0x1E905, 'M', u'𞤧'),
- (0x1E906, 'M', u'𞤨'),
- (0x1E907, 'M', u'𞤩'),
- (0x1E908, 'M', u'𞤪'),
- (0x1E909, 'M', u'𞤫'),
- (0x1E90A, 'M', u'𞤬'),
- (0x1E90B, 'M', u'𞤭'),
- (0x1E90C, 'M', u'𞤮'),
- (0x1E90D, 'M', u'𞤯'),
- (0x1E90E, 'M', u'𞤰'),
- (0x1E90F, 'M', u'𞤱'),
- (0x1E910, 'M', u'𞤲'),
- (0x1E911, 'M', u'𞤳'),
- (0x1E912, 'M', u'𞤴'),
- (0x1E913, 'M', u'𞤵'),
- (0x1E914, 'M', u'𞤶'),
- (0x1E915, 'M', u'𞤷'),
- (0x1E916, 'M', u'𞤸'),
- (0x1E917, 'M', u'𞤹'),
- (0x1E918, 'M', u'𞤺'),
- (0x1E919, 'M', u'𞤻'),
- (0x1E91A, 'M', u'𞤼'),
- (0x1E91B, 'M', u'𞤽'),
- (0x1E91C, 'M', u'𞤾'),
- (0x1E91D, 'M', u'𞤿'),
- (0x1E91E, 'M', u'𞥀'),
- (0x1E91F, 'M', u'𞥁'),
- (0x1E920, 'M', u'𞥂'),
- (0x1E921, 'M', u'𞥃'),
- (0x1E922, 'V'),
- (0x1E94C, 'X'),
- (0x1E950, 'V'),
- (0x1E95A, 'X'),
- (0x1E95E, 'V'),
- (0x1E960, 'X'),
- ]
-
-def _seg_70():
- return [
- (0x1EC71, 'V'),
- (0x1ECB5, 'X'),
- (0x1ED01, 'V'),
- (0x1ED3E, 'X'),
- (0x1EE00, 'M', u'ا'),
- (0x1EE01, 'M', u'ب'),
- (0x1EE02, 'M', u'ج'),
- (0x1EE03, 'M', u'د'),
- (0x1EE04, 'X'),
- (0x1EE05, 'M', u'و'),
- (0x1EE06, 'M', u'ز'),
- (0x1EE07, 'M', u'ح'),
- (0x1EE08, 'M', u'ط'),
- (0x1EE09, 'M', u'ي'),
- (0x1EE0A, 'M', u'ك'),
- (0x1EE0B, 'M', u'ل'),
- (0x1EE0C, 'M', u'م'),
- (0x1EE0D, 'M', u'ن'),
- (0x1EE0E, 'M', u'س'),
- (0x1EE0F, 'M', u'ع'),
- (0x1EE10, 'M', u'ف'),
- (0x1EE11, 'M', u'ص'),
- (0x1EE12, 'M', u'ق'),
- (0x1EE13, 'M', u'ر'),
- (0x1EE14, 'M', u'ش'),
- (0x1EE15, 'M', u'ت'),
- (0x1EE16, 'M', u'ث'),
- (0x1EE17, 'M', u'خ'),
- (0x1EE18, 'M', u'ذ'),
- (0x1EE19, 'M', u'ض'),
- (0x1EE1A, 'M', u'ظ'),
- (0x1EE1B, 'M', u'غ'),
- (0x1EE1C, 'M', u'ٮ'),
- (0x1EE1D, 'M', u'ں'),
- (0x1EE1E, 'M', u'ڡ'),
- (0x1EE1F, 'M', u'ٯ'),
- (0x1EE20, 'X'),
- (0x1EE21, 'M', u'ب'),
- (0x1EE22, 'M', u'ج'),
- (0x1EE23, 'X'),
- (0x1EE24, 'M', u'ه'),
- (0x1EE25, 'X'),
- (0x1EE27, 'M', u'ح'),
- (0x1EE28, 'X'),
- (0x1EE29, 'M', u'ي'),
- (0x1EE2A, 'M', u'ك'),
- (0x1EE2B, 'M', u'ل'),
- (0x1EE2C, 'M', u'م'),
- (0x1EE2D, 'M', u'ن'),
- (0x1EE2E, 'M', u'س'),
- (0x1EE2F, 'M', u'ع'),
- (0x1EE30, 'M', u'ف'),
- (0x1EE31, 'M', u'ص'),
- (0x1EE32, 'M', u'ق'),
- (0x1EE33, 'X'),
- (0x1EE34, 'M', u'ش'),
- (0x1EE35, 'M', u'ت'),
- (0x1EE36, 'M', u'ث'),
- (0x1EE37, 'M', u'خ'),
- (0x1EE38, 'X'),
- (0x1EE39, 'M', u'ض'),
- (0x1EE3A, 'X'),
- (0x1EE3B, 'M', u'غ'),
- (0x1EE3C, 'X'),
- (0x1EE42, 'M', u'ج'),
- (0x1EE43, 'X'),
- (0x1EE47, 'M', u'ح'),
- (0x1EE48, 'X'),
- (0x1EE49, 'M', u'ي'),
- (0x1EE4A, 'X'),
- (0x1EE4B, 'M', u'ل'),
- (0x1EE4C, 'X'),
- (0x1EE4D, 'M', u'ن'),
- (0x1EE4E, 'M', u'س'),
- (0x1EE4F, 'M', u'ع'),
- (0x1EE50, 'X'),
- (0x1EE51, 'M', u'ص'),
- (0x1EE52, 'M', u'ق'),
- (0x1EE53, 'X'),
- (0x1EE54, 'M', u'ش'),
- (0x1EE55, 'X'),
- (0x1EE57, 'M', u'خ'),
- (0x1EE58, 'X'),
- (0x1EE59, 'M', u'ض'),
- (0x1EE5A, 'X'),
- (0x1EE5B, 'M', u'غ'),
- (0x1EE5C, 'X'),
- (0x1EE5D, 'M', u'ں'),
- (0x1EE5E, 'X'),
- (0x1EE5F, 'M', u'ٯ'),
- (0x1EE60, 'X'),
- (0x1EE61, 'M', u'ب'),
- (0x1EE62, 'M', u'ج'),
- (0x1EE63, 'X'),
- (0x1EE64, 'M', u'ه'),
- (0x1EE65, 'X'),
- (0x1EE67, 'M', u'ح'),
- (0x1EE68, 'M', u'ط'),
- (0x1EE69, 'M', u'ي'),
- (0x1EE6A, 'M', u'ك'),
- ]
-
-def _seg_71():
- return [
- (0x1EE6B, 'X'),
- (0x1EE6C, 'M', u'م'),
- (0x1EE6D, 'M', u'ن'),
- (0x1EE6E, 'M', u'س'),
- (0x1EE6F, 'M', u'ع'),
- (0x1EE70, 'M', u'ف'),
- (0x1EE71, 'M', u'ص'),
- (0x1EE72, 'M', u'ق'),
- (0x1EE73, 'X'),
- (0x1EE74, 'M', u'ش'),
- (0x1EE75, 'M', u'ت'),
- (0x1EE76, 'M', u'ث'),
- (0x1EE77, 'M', u'خ'),
- (0x1EE78, 'X'),
- (0x1EE79, 'M', u'ض'),
- (0x1EE7A, 'M', u'ظ'),
- (0x1EE7B, 'M', u'غ'),
- (0x1EE7C, 'M', u'ٮ'),
- (0x1EE7D, 'X'),
- (0x1EE7E, 'M', u'ڡ'),
- (0x1EE7F, 'X'),
- (0x1EE80, 'M', u'ا'),
- (0x1EE81, 'M', u'ب'),
- (0x1EE82, 'M', u'ج'),
- (0x1EE83, 'M', u'د'),
- (0x1EE84, 'M', u'ه'),
- (0x1EE85, 'M', u'و'),
- (0x1EE86, 'M', u'ز'),
- (0x1EE87, 'M', u'ح'),
- (0x1EE88, 'M', u'ط'),
- (0x1EE89, 'M', u'ي'),
- (0x1EE8A, 'X'),
- (0x1EE8B, 'M', u'ل'),
- (0x1EE8C, 'M', u'م'),
- (0x1EE8D, 'M', u'ن'),
- (0x1EE8E, 'M', u'س'),
- (0x1EE8F, 'M', u'ع'),
- (0x1EE90, 'M', u'ف'),
- (0x1EE91, 'M', u'ص'),
- (0x1EE92, 'M', u'ق'),
- (0x1EE93, 'M', u'ر'),
- (0x1EE94, 'M', u'ش'),
- (0x1EE95, 'M', u'ت'),
- (0x1EE96, 'M', u'ث'),
- (0x1EE97, 'M', u'خ'),
- (0x1EE98, 'M', u'ذ'),
- (0x1EE99, 'M', u'ض'),
- (0x1EE9A, 'M', u'ظ'),
- (0x1EE9B, 'M', u'غ'),
- (0x1EE9C, 'X'),
- (0x1EEA1, 'M', u'ب'),
- (0x1EEA2, 'M', u'ج'),
- (0x1EEA3, 'M', u'د'),
- (0x1EEA4, 'X'),
- (0x1EEA5, 'M', u'و'),
- (0x1EEA6, 'M', u'ز'),
- (0x1EEA7, 'M', u'ح'),
- (0x1EEA8, 'M', u'ط'),
- (0x1EEA9, 'M', u'ي'),
- (0x1EEAA, 'X'),
- (0x1EEAB, 'M', u'ل'),
- (0x1EEAC, 'M', u'م'),
- (0x1EEAD, 'M', u'ن'),
- (0x1EEAE, 'M', u'س'),
- (0x1EEAF, 'M', u'ع'),
- (0x1EEB0, 'M', u'ف'),
- (0x1EEB1, 'M', u'ص'),
- (0x1EEB2, 'M', u'ق'),
- (0x1EEB3, 'M', u'ر'),
- (0x1EEB4, 'M', u'ش'),
- (0x1EEB5, 'M', u'ت'),
- (0x1EEB6, 'M', u'ث'),
- (0x1EEB7, 'M', u'خ'),
- (0x1EEB8, 'M', u'ذ'),
- (0x1EEB9, 'M', u'ض'),
- (0x1EEBA, 'M', u'ظ'),
- (0x1EEBB, 'M', u'غ'),
- (0x1EEBC, 'X'),
- (0x1EEF0, 'V'),
- (0x1EEF2, 'X'),
- (0x1F000, 'V'),
- (0x1F02C, 'X'),
- (0x1F030, 'V'),
- (0x1F094, 'X'),
- (0x1F0A0, 'V'),
- (0x1F0AF, 'X'),
- (0x1F0B1, 'V'),
- (0x1F0C0, 'X'),
- (0x1F0C1, 'V'),
- (0x1F0D0, 'X'),
- (0x1F0D1, 'V'),
- (0x1F0F6, 'X'),
- (0x1F101, '3', u'0,'),
- (0x1F102, '3', u'1,'),
- (0x1F103, '3', u'2,'),
- (0x1F104, '3', u'3,'),
- (0x1F105, '3', u'4,'),
- (0x1F106, '3', u'5,'),
- (0x1F107, '3', u'6,'),
- (0x1F108, '3', u'7,'),
- ]
-
-def _seg_72():
- return [
- (0x1F109, '3', u'8,'),
- (0x1F10A, '3', u'9,'),
- (0x1F10B, 'V'),
- (0x1F110, '3', u'(a)'),
- (0x1F111, '3', u'(b)'),
- (0x1F112, '3', u'(c)'),
- (0x1F113, '3', u'(d)'),
- (0x1F114, '3', u'(e)'),
- (0x1F115, '3', u'(f)'),
- (0x1F116, '3', u'(g)'),
- (0x1F117, '3', u'(h)'),
- (0x1F118, '3', u'(i)'),
- (0x1F119, '3', u'(j)'),
- (0x1F11A, '3', u'(k)'),
- (0x1F11B, '3', u'(l)'),
- (0x1F11C, '3', u'(m)'),
- (0x1F11D, '3', u'(n)'),
- (0x1F11E, '3', u'(o)'),
- (0x1F11F, '3', u'(p)'),
- (0x1F120, '3', u'(q)'),
- (0x1F121, '3', u'(r)'),
- (0x1F122, '3', u'(s)'),
- (0x1F123, '3', u'(t)'),
- (0x1F124, '3', u'(u)'),
- (0x1F125, '3', u'(v)'),
- (0x1F126, '3', u'(w)'),
- (0x1F127, '3', u'(x)'),
- (0x1F128, '3', u'(y)'),
- (0x1F129, '3', u'(z)'),
- (0x1F12A, 'M', u'〔s〕'),
- (0x1F12B, 'M', u'c'),
- (0x1F12C, 'M', u'r'),
- (0x1F12D, 'M', u'cd'),
- (0x1F12E, 'M', u'wz'),
- (0x1F12F, 'V'),
- (0x1F130, 'M', u'a'),
- (0x1F131, 'M', u'b'),
- (0x1F132, 'M', u'c'),
- (0x1F133, 'M', u'd'),
- (0x1F134, 'M', u'e'),
- (0x1F135, 'M', u'f'),
- (0x1F136, 'M', u'g'),
- (0x1F137, 'M', u'h'),
- (0x1F138, 'M', u'i'),
- (0x1F139, 'M', u'j'),
- (0x1F13A, 'M', u'k'),
- (0x1F13B, 'M', u'l'),
- (0x1F13C, 'M', u'm'),
- (0x1F13D, 'M', u'n'),
- (0x1F13E, 'M', u'o'),
- (0x1F13F, 'M', u'p'),
- (0x1F140, 'M', u'q'),
- (0x1F141, 'M', u'r'),
- (0x1F142, 'M', u's'),
- (0x1F143, 'M', u't'),
- (0x1F144, 'M', u'u'),
- (0x1F145, 'M', u'v'),
- (0x1F146, 'M', u'w'),
- (0x1F147, 'M', u'x'),
- (0x1F148, 'M', u'y'),
- (0x1F149, 'M', u'z'),
- (0x1F14A, 'M', u'hv'),
- (0x1F14B, 'M', u'mv'),
- (0x1F14C, 'M', u'sd'),
- (0x1F14D, 'M', u'ss'),
- (0x1F14E, 'M', u'ppv'),
- (0x1F14F, 'M', u'wc'),
- (0x1F150, 'V'),
- (0x1F16A, 'M', u'mc'),
- (0x1F16B, 'M', u'md'),
- (0x1F16C, 'M', u'mr'),
- (0x1F16D, 'V'),
- (0x1F190, 'M', u'dj'),
- (0x1F191, 'V'),
- (0x1F1AE, 'X'),
- (0x1F1E6, 'V'),
- (0x1F200, 'M', u'ほか'),
- (0x1F201, 'M', u'ココ'),
- (0x1F202, 'M', u'サ'),
- (0x1F203, 'X'),
- (0x1F210, 'M', u'手'),
- (0x1F211, 'M', u'字'),
- (0x1F212, 'M', u'双'),
- (0x1F213, 'M', u'デ'),
- (0x1F214, 'M', u'二'),
- (0x1F215, 'M', u'多'),
- (0x1F216, 'M', u'解'),
- (0x1F217, 'M', u'天'),
- (0x1F218, 'M', u'交'),
- (0x1F219, 'M', u'映'),
- (0x1F21A, 'M', u'無'),
- (0x1F21B, 'M', u'料'),
- (0x1F21C, 'M', u'前'),
- (0x1F21D, 'M', u'後'),
- (0x1F21E, 'M', u'再'),
- (0x1F21F, 'M', u'新'),
- (0x1F220, 'M', u'初'),
- (0x1F221, 'M', u'終'),
- (0x1F222, 'M', u'生'),
- (0x1F223, 'M', u'販'),
- ]
-
-def _seg_73():
- return [
- (0x1F224, 'M', u'声'),
- (0x1F225, 'M', u'吹'),
- (0x1F226, 'M', u'演'),
- (0x1F227, 'M', u'投'),
- (0x1F228, 'M', u'捕'),
- (0x1F229, 'M', u'一'),
- (0x1F22A, 'M', u'三'),
- (0x1F22B, 'M', u'遊'),
- (0x1F22C, 'M', u'左'),
- (0x1F22D, 'M', u'中'),
- (0x1F22E, 'M', u'右'),
- (0x1F22F, 'M', u'指'),
- (0x1F230, 'M', u'走'),
- (0x1F231, 'M', u'打'),
- (0x1F232, 'M', u'禁'),
- (0x1F233, 'M', u'空'),
- (0x1F234, 'M', u'合'),
- (0x1F235, 'M', u'満'),
- (0x1F236, 'M', u'有'),
- (0x1F237, 'M', u'月'),
- (0x1F238, 'M', u'申'),
- (0x1F239, 'M', u'割'),
- (0x1F23A, 'M', u'営'),
- (0x1F23B, 'M', u'配'),
- (0x1F23C, 'X'),
- (0x1F240, 'M', u'〔本〕'),
- (0x1F241, 'M', u'〔三〕'),
- (0x1F242, 'M', u'〔二〕'),
- (0x1F243, 'M', u'〔安〕'),
- (0x1F244, 'M', u'〔点〕'),
- (0x1F245, 'M', u'〔打〕'),
- (0x1F246, 'M', u'〔盗〕'),
- (0x1F247, 'M', u'〔勝〕'),
- (0x1F248, 'M', u'〔敗〕'),
- (0x1F249, 'X'),
- (0x1F250, 'M', u'得'),
- (0x1F251, 'M', u'可'),
- (0x1F252, 'X'),
- (0x1F260, 'V'),
- (0x1F266, 'X'),
- (0x1F300, 'V'),
- (0x1F6D8, 'X'),
- (0x1F6E0, 'V'),
- (0x1F6ED, 'X'),
- (0x1F6F0, 'V'),
- (0x1F6FD, 'X'),
- (0x1F700, 'V'),
- (0x1F774, 'X'),
- (0x1F780, 'V'),
- (0x1F7D9, 'X'),
- (0x1F7E0, 'V'),
- (0x1F7EC, 'X'),
- (0x1F800, 'V'),
- (0x1F80C, 'X'),
- (0x1F810, 'V'),
- (0x1F848, 'X'),
- (0x1F850, 'V'),
- (0x1F85A, 'X'),
- (0x1F860, 'V'),
- (0x1F888, 'X'),
- (0x1F890, 'V'),
- (0x1F8AE, 'X'),
- (0x1F8B0, 'V'),
- (0x1F8B2, 'X'),
- (0x1F900, 'V'),
- (0x1F979, 'X'),
- (0x1F97A, 'V'),
- (0x1F9CC, 'X'),
- (0x1F9CD, 'V'),
- (0x1FA54, 'X'),
- (0x1FA60, 'V'),
- (0x1FA6E, 'X'),
- (0x1FA70, 'V'),
- (0x1FA75, 'X'),
- (0x1FA78, 'V'),
- (0x1FA7B, 'X'),
- (0x1FA80, 'V'),
- (0x1FA87, 'X'),
- (0x1FA90, 'V'),
- (0x1FAA9, 'X'),
- (0x1FAB0, 'V'),
- (0x1FAB7, 'X'),
- (0x1FAC0, 'V'),
- (0x1FAC3, 'X'),
- (0x1FAD0, 'V'),
- (0x1FAD7, 'X'),
- (0x1FB00, 'V'),
- (0x1FB93, 'X'),
- (0x1FB94, 'V'),
- (0x1FBCB, 'X'),
- (0x1FBF0, 'M', u'0'),
- (0x1FBF1, 'M', u'1'),
- (0x1FBF2, 'M', u'2'),
- (0x1FBF3, 'M', u'3'),
- (0x1FBF4, 'M', u'4'),
- (0x1FBF5, 'M', u'5'),
- (0x1FBF6, 'M', u'6'),
- (0x1FBF7, 'M', u'7'),
- (0x1FBF8, 'M', u'8'),
- (0x1FBF9, 'M', u'9'),
- ]
-
-def _seg_74():
- return [
- (0x1FBFA, 'X'),
- (0x20000, 'V'),
- (0x2A6DE, 'X'),
- (0x2A700, 'V'),
- (0x2B735, 'X'),
- (0x2B740, 'V'),
- (0x2B81E, 'X'),
- (0x2B820, 'V'),
- (0x2CEA2, 'X'),
- (0x2CEB0, 'V'),
- (0x2EBE1, 'X'),
- (0x2F800, 'M', u'丽'),
- (0x2F801, 'M', u'丸'),
- (0x2F802, 'M', u'乁'),
- (0x2F803, 'M', u'𠄢'),
- (0x2F804, 'M', u'你'),
- (0x2F805, 'M', u'侮'),
- (0x2F806, 'M', u'侻'),
- (0x2F807, 'M', u'倂'),
- (0x2F808, 'M', u'偺'),
- (0x2F809, 'M', u'備'),
- (0x2F80A, 'M', u'僧'),
- (0x2F80B, 'M', u'像'),
- (0x2F80C, 'M', u'㒞'),
- (0x2F80D, 'M', u'𠘺'),
- (0x2F80E, 'M', u'免'),
- (0x2F80F, 'M', u'兔'),
- (0x2F810, 'M', u'兤'),
- (0x2F811, 'M', u'具'),
- (0x2F812, 'M', u'𠔜'),
- (0x2F813, 'M', u'㒹'),
- (0x2F814, 'M', u'內'),
- (0x2F815, 'M', u'再'),
- (0x2F816, 'M', u'𠕋'),
- (0x2F817, 'M', u'冗'),
- (0x2F818, 'M', u'冤'),
- (0x2F819, 'M', u'仌'),
- (0x2F81A, 'M', u'冬'),
- (0x2F81B, 'M', u'况'),
- (0x2F81C, 'M', u'𩇟'),
- (0x2F81D, 'M', u'凵'),
- (0x2F81E, 'M', u'刃'),
- (0x2F81F, 'M', u'㓟'),
- (0x2F820, 'M', u'刻'),
- (0x2F821, 'M', u'剆'),
- (0x2F822, 'M', u'割'),
- (0x2F823, 'M', u'剷'),
- (0x2F824, 'M', u'㔕'),
- (0x2F825, 'M', u'勇'),
- (0x2F826, 'M', u'勉'),
- (0x2F827, 'M', u'勤'),
- (0x2F828, 'M', u'勺'),
- (0x2F829, 'M', u'包'),
- (0x2F82A, 'M', u'匆'),
- (0x2F82B, 'M', u'北'),
- (0x2F82C, 'M', u'卉'),
- (0x2F82D, 'M', u'卑'),
- (0x2F82E, 'M', u'博'),
- (0x2F82F, 'M', u'即'),
- (0x2F830, 'M', u'卽'),
- (0x2F831, 'M', u'卿'),
- (0x2F834, 'M', u'𠨬'),
- (0x2F835, 'M', u'灰'),
- (0x2F836, 'M', u'及'),
- (0x2F837, 'M', u'叟'),
- (0x2F838, 'M', u'𠭣'),
- (0x2F839, 'M', u'叫'),
- (0x2F83A, 'M', u'叱'),
- (0x2F83B, 'M', u'吆'),
- (0x2F83C, 'M', u'咞'),
- (0x2F83D, 'M', u'吸'),
- (0x2F83E, 'M', u'呈'),
- (0x2F83F, 'M', u'周'),
- (0x2F840, 'M', u'咢'),
- (0x2F841, 'M', u'哶'),
- (0x2F842, 'M', u'唐'),
- (0x2F843, 'M', u'啓'),
- (0x2F844, 'M', u'啣'),
- (0x2F845, 'M', u'善'),
- (0x2F847, 'M', u'喙'),
- (0x2F848, 'M', u'喫'),
- (0x2F849, 'M', u'喳'),
- (0x2F84A, 'M', u'嗂'),
- (0x2F84B, 'M', u'圖'),
- (0x2F84C, 'M', u'嘆'),
- (0x2F84D, 'M', u'圗'),
- (0x2F84E, 'M', u'噑'),
- (0x2F84F, 'M', u'噴'),
- (0x2F850, 'M', u'切'),
- (0x2F851, 'M', u'壮'),
- (0x2F852, 'M', u'城'),
- (0x2F853, 'M', u'埴'),
- (0x2F854, 'M', u'堍'),
- (0x2F855, 'M', u'型'),
- (0x2F856, 'M', u'堲'),
- (0x2F857, 'M', u'報'),
- (0x2F858, 'M', u'墬'),
- (0x2F859, 'M', u'𡓤'),
- (0x2F85A, 'M', u'売'),
- (0x2F85B, 'M', u'壷'),
- ]
-
-def _seg_75():
- return [
- (0x2F85C, 'M', u'夆'),
- (0x2F85D, 'M', u'多'),
- (0x2F85E, 'M', u'夢'),
- (0x2F85F, 'M', u'奢'),
- (0x2F860, 'M', u'𡚨'),
- (0x2F861, 'M', u'𡛪'),
- (0x2F862, 'M', u'姬'),
- (0x2F863, 'M', u'娛'),
- (0x2F864, 'M', u'娧'),
- (0x2F865, 'M', u'姘'),
- (0x2F866, 'M', u'婦'),
- (0x2F867, 'M', u'㛮'),
- (0x2F868, 'X'),
- (0x2F869, 'M', u'嬈'),
- (0x2F86A, 'M', u'嬾'),
- (0x2F86C, 'M', u'𡧈'),
- (0x2F86D, 'M', u'寃'),
- (0x2F86E, 'M', u'寘'),
- (0x2F86F, 'M', u'寧'),
- (0x2F870, 'M', u'寳'),
- (0x2F871, 'M', u'𡬘'),
- (0x2F872, 'M', u'寿'),
- (0x2F873, 'M', u'将'),
- (0x2F874, 'X'),
- (0x2F875, 'M', u'尢'),
- (0x2F876, 'M', u'㞁'),
- (0x2F877, 'M', u'屠'),
- (0x2F878, 'M', u'屮'),
- (0x2F879, 'M', u'峀'),
- (0x2F87A, 'M', u'岍'),
- (0x2F87B, 'M', u'𡷤'),
- (0x2F87C, 'M', u'嵃'),
- (0x2F87D, 'M', u'𡷦'),
- (0x2F87E, 'M', u'嵮'),
- (0x2F87F, 'M', u'嵫'),
- (0x2F880, 'M', u'嵼'),
- (0x2F881, 'M', u'巡'),
- (0x2F882, 'M', u'巢'),
- (0x2F883, 'M', u'㠯'),
- (0x2F884, 'M', u'巽'),
- (0x2F885, 'M', u'帨'),
- (0x2F886, 'M', u'帽'),
- (0x2F887, 'M', u'幩'),
- (0x2F888, 'M', u'㡢'),
- (0x2F889, 'M', u'𢆃'),
- (0x2F88A, 'M', u'㡼'),
- (0x2F88B, 'M', u'庰'),
- (0x2F88C, 'M', u'庳'),
- (0x2F88D, 'M', u'庶'),
- (0x2F88E, 'M', u'廊'),
- (0x2F88F, 'M', u'𪎒'),
- (0x2F890, 'M', u'廾'),
- (0x2F891, 'M', u'𢌱'),
- (0x2F893, 'M', u'舁'),
- (0x2F894, 'M', u'弢'),
- (0x2F896, 'M', u'㣇'),
- (0x2F897, 'M', u'𣊸'),
- (0x2F898, 'M', u'𦇚'),
- (0x2F899, 'M', u'形'),
- (0x2F89A, 'M', u'彫'),
- (0x2F89B, 'M', u'㣣'),
- (0x2F89C, 'M', u'徚'),
- (0x2F89D, 'M', u'忍'),
- (0x2F89E, 'M', u'志'),
- (0x2F89F, 'M', u'忹'),
- (0x2F8A0, 'M', u'悁'),
- (0x2F8A1, 'M', u'㤺'),
- (0x2F8A2, 'M', u'㤜'),
- (0x2F8A3, 'M', u'悔'),
- (0x2F8A4, 'M', u'𢛔'),
- (0x2F8A5, 'M', u'惇'),
- (0x2F8A6, 'M', u'慈'),
- (0x2F8A7, 'M', u'慌'),
- (0x2F8A8, 'M', u'慎'),
- (0x2F8A9, 'M', u'慌'),
- (0x2F8AA, 'M', u'慺'),
- (0x2F8AB, 'M', u'憎'),
- (0x2F8AC, 'M', u'憲'),
- (0x2F8AD, 'M', u'憤'),
- (0x2F8AE, 'M', u'憯'),
- (0x2F8AF, 'M', u'懞'),
- (0x2F8B0, 'M', u'懲'),
- (0x2F8B1, 'M', u'懶'),
- (0x2F8B2, 'M', u'成'),
- (0x2F8B3, 'M', u'戛'),
- (0x2F8B4, 'M', u'扝'),
- (0x2F8B5, 'M', u'抱'),
- (0x2F8B6, 'M', u'拔'),
- (0x2F8B7, 'M', u'捐'),
- (0x2F8B8, 'M', u'𢬌'),
- (0x2F8B9, 'M', u'挽'),
- (0x2F8BA, 'M', u'拼'),
- (0x2F8BB, 'M', u'捨'),
- (0x2F8BC, 'M', u'掃'),
- (0x2F8BD, 'M', u'揤'),
- (0x2F8BE, 'M', u'𢯱'),
- (0x2F8BF, 'M', u'搢'),
- (0x2F8C0, 'M', u'揅'),
- (0x2F8C1, 'M', u'掩'),
- (0x2F8C2, 'M', u'㨮'),
- ]
-
-def _seg_76():
- return [
- (0x2F8C3, 'M', u'摩'),
- (0x2F8C4, 'M', u'摾'),
- (0x2F8C5, 'M', u'撝'),
- (0x2F8C6, 'M', u'摷'),
- (0x2F8C7, 'M', u'㩬'),
- (0x2F8C8, 'M', u'敏'),
- (0x2F8C9, 'M', u'敬'),
- (0x2F8CA, 'M', u'𣀊'),
- (0x2F8CB, 'M', u'旣'),
- (0x2F8CC, 'M', u'書'),
- (0x2F8CD, 'M', u'晉'),
- (0x2F8CE, 'M', u'㬙'),
- (0x2F8CF, 'M', u'暑'),
- (0x2F8D0, 'M', u'㬈'),
- (0x2F8D1, 'M', u'㫤'),
- (0x2F8D2, 'M', u'冒'),
- (0x2F8D3, 'M', u'冕'),
- (0x2F8D4, 'M', u'最'),
- (0x2F8D5, 'M', u'暜'),
- (0x2F8D6, 'M', u'肭'),
- (0x2F8D7, 'M', u'䏙'),
- (0x2F8D8, 'M', u'朗'),
- (0x2F8D9, 'M', u'望'),
- (0x2F8DA, 'M', u'朡'),
- (0x2F8DB, 'M', u'杞'),
- (0x2F8DC, 'M', u'杓'),
- (0x2F8DD, 'M', u'𣏃'),
- (0x2F8DE, 'M', u'㭉'),
- (0x2F8DF, 'M', u'柺'),
- (0x2F8E0, 'M', u'枅'),
- (0x2F8E1, 'M', u'桒'),
- (0x2F8E2, 'M', u'梅'),
- (0x2F8E3, 'M', u'𣑭'),
- (0x2F8E4, 'M', u'梎'),
- (0x2F8E5, 'M', u'栟'),
- (0x2F8E6, 'M', u'椔'),
- (0x2F8E7, 'M', u'㮝'),
- (0x2F8E8, 'M', u'楂'),
- (0x2F8E9, 'M', u'榣'),
- (0x2F8EA, 'M', u'槪'),
- (0x2F8EB, 'M', u'檨'),
- (0x2F8EC, 'M', u'𣚣'),
- (0x2F8ED, 'M', u'櫛'),
- (0x2F8EE, 'M', u'㰘'),
- (0x2F8EF, 'M', u'次'),
- (0x2F8F0, 'M', u'𣢧'),
- (0x2F8F1, 'M', u'歔'),
- (0x2F8F2, 'M', u'㱎'),
- (0x2F8F3, 'M', u'歲'),
- (0x2F8F4, 'M', u'殟'),
- (0x2F8F5, 'M', u'殺'),
- (0x2F8F6, 'M', u'殻'),
- (0x2F8F7, 'M', u'𣪍'),
- (0x2F8F8, 'M', u'𡴋'),
- (0x2F8F9, 'M', u'𣫺'),
- (0x2F8FA, 'M', u'汎'),
- (0x2F8FB, 'M', u'𣲼'),
- (0x2F8FC, 'M', u'沿'),
- (0x2F8FD, 'M', u'泍'),
- (0x2F8FE, 'M', u'汧'),
- (0x2F8FF, 'M', u'洖'),
- (0x2F900, 'M', u'派'),
- (0x2F901, 'M', u'海'),
- (0x2F902, 'M', u'流'),
- (0x2F903, 'M', u'浩'),
- (0x2F904, 'M', u'浸'),
- (0x2F905, 'M', u'涅'),
- (0x2F906, 'M', u'𣴞'),
- (0x2F907, 'M', u'洴'),
- (0x2F908, 'M', u'港'),
- (0x2F909, 'M', u'湮'),
- (0x2F90A, 'M', u'㴳'),
- (0x2F90B, 'M', u'滋'),
- (0x2F90C, 'M', u'滇'),
- (0x2F90D, 'M', u'𣻑'),
- (0x2F90E, 'M', u'淹'),
- (0x2F90F, 'M', u'潮'),
- (0x2F910, 'M', u'𣽞'),
- (0x2F911, 'M', u'𣾎'),
- (0x2F912, 'M', u'濆'),
- (0x2F913, 'M', u'瀹'),
- (0x2F914, 'M', u'瀞'),
- (0x2F915, 'M', u'瀛'),
- (0x2F916, 'M', u'㶖'),
- (0x2F917, 'M', u'灊'),
- (0x2F918, 'M', u'災'),
- (0x2F919, 'M', u'灷'),
- (0x2F91A, 'M', u'炭'),
- (0x2F91B, 'M', u'𠔥'),
- (0x2F91C, 'M', u'煅'),
- (0x2F91D, 'M', u'𤉣'),
- (0x2F91E, 'M', u'熜'),
- (0x2F91F, 'X'),
- (0x2F920, 'M', u'爨'),
- (0x2F921, 'M', u'爵'),
- (0x2F922, 'M', u'牐'),
- (0x2F923, 'M', u'𤘈'),
- (0x2F924, 'M', u'犀'),
- (0x2F925, 'M', u'犕'),
- (0x2F926, 'M', u'𤜵'),
- ]
-
-def _seg_77():
- return [
- (0x2F927, 'M', u'𤠔'),
- (0x2F928, 'M', u'獺'),
- (0x2F929, 'M', u'王'),
- (0x2F92A, 'M', u'㺬'),
- (0x2F92B, 'M', u'玥'),
- (0x2F92C, 'M', u'㺸'),
- (0x2F92E, 'M', u'瑇'),
- (0x2F92F, 'M', u'瑜'),
- (0x2F930, 'M', u'瑱'),
- (0x2F931, 'M', u'璅'),
- (0x2F932, 'M', u'瓊'),
- (0x2F933, 'M', u'㼛'),
- (0x2F934, 'M', u'甤'),
- (0x2F935, 'M', u'𤰶'),
- (0x2F936, 'M', u'甾'),
- (0x2F937, 'M', u'𤲒'),
- (0x2F938, 'M', u'異'),
- (0x2F939, 'M', u'𢆟'),
- (0x2F93A, 'M', u'瘐'),
- (0x2F93B, 'M', u'𤾡'),
- (0x2F93C, 'M', u'𤾸'),
- (0x2F93D, 'M', u'𥁄'),
- (0x2F93E, 'M', u'㿼'),
- (0x2F93F, 'M', u'䀈'),
- (0x2F940, 'M', u'直'),
- (0x2F941, 'M', u'𥃳'),
- (0x2F942, 'M', u'𥃲'),
- (0x2F943, 'M', u'𥄙'),
- (0x2F944, 'M', u'𥄳'),
- (0x2F945, 'M', u'眞'),
- (0x2F946, 'M', u'真'),
- (0x2F948, 'M', u'睊'),
- (0x2F949, 'M', u'䀹'),
- (0x2F94A, 'M', u'瞋'),
- (0x2F94B, 'M', u'䁆'),
- (0x2F94C, 'M', u'䂖'),
- (0x2F94D, 'M', u'𥐝'),
- (0x2F94E, 'M', u'硎'),
- (0x2F94F, 'M', u'碌'),
- (0x2F950, 'M', u'磌'),
- (0x2F951, 'M', u'䃣'),
- (0x2F952, 'M', u'𥘦'),
- (0x2F953, 'M', u'祖'),
- (0x2F954, 'M', u'𥚚'),
- (0x2F955, 'M', u'𥛅'),
- (0x2F956, 'M', u'福'),
- (0x2F957, 'M', u'秫'),
- (0x2F958, 'M', u'䄯'),
- (0x2F959, 'M', u'穀'),
- (0x2F95A, 'M', u'穊'),
- (0x2F95B, 'M', u'穏'),
- (0x2F95C, 'M', u'𥥼'),
- (0x2F95D, 'M', u'𥪧'),
- (0x2F95F, 'X'),
- (0x2F960, 'M', u'䈂'),
- (0x2F961, 'M', u'𥮫'),
- (0x2F962, 'M', u'篆'),
- (0x2F963, 'M', u'築'),
- (0x2F964, 'M', u'䈧'),
- (0x2F965, 'M', u'𥲀'),
- (0x2F966, 'M', u'糒'),
- (0x2F967, 'M', u'䊠'),
- (0x2F968, 'M', u'糨'),
- (0x2F969, 'M', u'糣'),
- (0x2F96A, 'M', u'紀'),
- (0x2F96B, 'M', u'𥾆'),
- (0x2F96C, 'M', u'絣'),
- (0x2F96D, 'M', u'䌁'),
- (0x2F96E, 'M', u'緇'),
- (0x2F96F, 'M', u'縂'),
- (0x2F970, 'M', u'繅'),
- (0x2F971, 'M', u'䌴'),
- (0x2F972, 'M', u'𦈨'),
- (0x2F973, 'M', u'𦉇'),
- (0x2F974, 'M', u'䍙'),
- (0x2F975, 'M', u'𦋙'),
- (0x2F976, 'M', u'罺'),
- (0x2F977, 'M', u'𦌾'),
- (0x2F978, 'M', u'羕'),
- (0x2F979, 'M', u'翺'),
- (0x2F97A, 'M', u'者'),
- (0x2F97B, 'M', u'𦓚'),
- (0x2F97C, 'M', u'𦔣'),
- (0x2F97D, 'M', u'聠'),
- (0x2F97E, 'M', u'𦖨'),
- (0x2F97F, 'M', u'聰'),
- (0x2F980, 'M', u'𣍟'),
- (0x2F981, 'M', u'䏕'),
- (0x2F982, 'M', u'育'),
- (0x2F983, 'M', u'脃'),
- (0x2F984, 'M', u'䐋'),
- (0x2F985, 'M', u'脾'),
- (0x2F986, 'M', u'媵'),
- (0x2F987, 'M', u'𦞧'),
- (0x2F988, 'M', u'𦞵'),
- (0x2F989, 'M', u'𣎓'),
- (0x2F98A, 'M', u'𣎜'),
- (0x2F98B, 'M', u'舁'),
- (0x2F98C, 'M', u'舄'),
- (0x2F98D, 'M', u'辞'),
- ]
-
-def _seg_78():
- return [
- (0x2F98E, 'M', u'䑫'),
- (0x2F98F, 'M', u'芑'),
- (0x2F990, 'M', u'芋'),
- (0x2F991, 'M', u'芝'),
- (0x2F992, 'M', u'劳'),
- (0x2F993, 'M', u'花'),
- (0x2F994, 'M', u'芳'),
- (0x2F995, 'M', u'芽'),
- (0x2F996, 'M', u'苦'),
- (0x2F997, 'M', u'𦬼'),
- (0x2F998, 'M', u'若'),
- (0x2F999, 'M', u'茝'),
- (0x2F99A, 'M', u'荣'),
- (0x2F99B, 'M', u'莭'),
- (0x2F99C, 'M', u'茣'),
- (0x2F99D, 'M', u'莽'),
- (0x2F99E, 'M', u'菧'),
- (0x2F99F, 'M', u'著'),
- (0x2F9A0, 'M', u'荓'),
- (0x2F9A1, 'M', u'菊'),
- (0x2F9A2, 'M', u'菌'),
- (0x2F9A3, 'M', u'菜'),
- (0x2F9A4, 'M', u'𦰶'),
- (0x2F9A5, 'M', u'𦵫'),
- (0x2F9A6, 'M', u'𦳕'),
- (0x2F9A7, 'M', u'䔫'),
- (0x2F9A8, 'M', u'蓱'),
- (0x2F9A9, 'M', u'蓳'),
- (0x2F9AA, 'M', u'蔖'),
- (0x2F9AB, 'M', u'𧏊'),
- (0x2F9AC, 'M', u'蕤'),
- (0x2F9AD, 'M', u'𦼬'),
- (0x2F9AE, 'M', u'䕝'),
- (0x2F9AF, 'M', u'䕡'),
- (0x2F9B0, 'M', u'𦾱'),
- (0x2F9B1, 'M', u'𧃒'),
- (0x2F9B2, 'M', u'䕫'),
- (0x2F9B3, 'M', u'虐'),
- (0x2F9B4, 'M', u'虜'),
- (0x2F9B5, 'M', u'虧'),
- (0x2F9B6, 'M', u'虩'),
- (0x2F9B7, 'M', u'蚩'),
- (0x2F9B8, 'M', u'蚈'),
- (0x2F9B9, 'M', u'蜎'),
- (0x2F9BA, 'M', u'蛢'),
- (0x2F9BB, 'M', u'蝹'),
- (0x2F9BC, 'M', u'蜨'),
- (0x2F9BD, 'M', u'蝫'),
- (0x2F9BE, 'M', u'螆'),
- (0x2F9BF, 'X'),
- (0x2F9C0, 'M', u'蟡'),
- (0x2F9C1, 'M', u'蠁'),
- (0x2F9C2, 'M', u'䗹'),
- (0x2F9C3, 'M', u'衠'),
- (0x2F9C4, 'M', u'衣'),
- (0x2F9C5, 'M', u'𧙧'),
- (0x2F9C6, 'M', u'裗'),
- (0x2F9C7, 'M', u'裞'),
- (0x2F9C8, 'M', u'䘵'),
- (0x2F9C9, 'M', u'裺'),
- (0x2F9CA, 'M', u'㒻'),
- (0x2F9CB, 'M', u'𧢮'),
- (0x2F9CC, 'M', u'𧥦'),
- (0x2F9CD, 'M', u'䚾'),
- (0x2F9CE, 'M', u'䛇'),
- (0x2F9CF, 'M', u'誠'),
- (0x2F9D0, 'M', u'諭'),
- (0x2F9D1, 'M', u'變'),
- (0x2F9D2, 'M', u'豕'),
- (0x2F9D3, 'M', u'𧲨'),
- (0x2F9D4, 'M', u'貫'),
- (0x2F9D5, 'M', u'賁'),
- (0x2F9D6, 'M', u'贛'),
- (0x2F9D7, 'M', u'起'),
- (0x2F9D8, 'M', u'𧼯'),
- (0x2F9D9, 'M', u'𠠄'),
- (0x2F9DA, 'M', u'跋'),
- (0x2F9DB, 'M', u'趼'),
- (0x2F9DC, 'M', u'跰'),
- (0x2F9DD, 'M', u'𠣞'),
- (0x2F9DE, 'M', u'軔'),
- (0x2F9DF, 'M', u'輸'),
- (0x2F9E0, 'M', u'𨗒'),
- (0x2F9E1, 'M', u'𨗭'),
- (0x2F9E2, 'M', u'邔'),
- (0x2F9E3, 'M', u'郱'),
- (0x2F9E4, 'M', u'鄑'),
- (0x2F9E5, 'M', u'𨜮'),
- (0x2F9E6, 'M', u'鄛'),
- (0x2F9E7, 'M', u'鈸'),
- (0x2F9E8, 'M', u'鋗'),
- (0x2F9E9, 'M', u'鋘'),
- (0x2F9EA, 'M', u'鉼'),
- (0x2F9EB, 'M', u'鏹'),
- (0x2F9EC, 'M', u'鐕'),
- (0x2F9ED, 'M', u'𨯺'),
- (0x2F9EE, 'M', u'開'),
- (0x2F9EF, 'M', u'䦕'),
- (0x2F9F0, 'M', u'閷'),
- (0x2F9F1, 'M', u'𨵷'),
- ]
-
-def _seg_79():
- return [
- (0x2F9F2, 'M', u'䧦'),
- (0x2F9F3, 'M', u'雃'),
- (0x2F9F4, 'M', u'嶲'),
- (0x2F9F5, 'M', u'霣'),
- (0x2F9F6, 'M', u'𩅅'),
- (0x2F9F7, 'M', u'𩈚'),
- (0x2F9F8, 'M', u'䩮'),
- (0x2F9F9, 'M', u'䩶'),
- (0x2F9FA, 'M', u'韠'),
- (0x2F9FB, 'M', u'𩐊'),
- (0x2F9FC, 'M', u'䪲'),
- (0x2F9FD, 'M', u'𩒖'),
- (0x2F9FE, 'M', u'頋'),
- (0x2FA00, 'M', u'頩'),
- (0x2FA01, 'M', u'𩖶'),
- (0x2FA02, 'M', u'飢'),
- (0x2FA03, 'M', u'䬳'),
- (0x2FA04, 'M', u'餩'),
- (0x2FA05, 'M', u'馧'),
- (0x2FA06, 'M', u'駂'),
- (0x2FA07, 'M', u'駾'),
- (0x2FA08, 'M', u'䯎'),
- (0x2FA09, 'M', u'𩬰'),
- (0x2FA0A, 'M', u'鬒'),
- (0x2FA0B, 'M', u'鱀'),
- (0x2FA0C, 'M', u'鳽'),
- (0x2FA0D, 'M', u'䳎'),
- (0x2FA0E, 'M', u'䳭'),
- (0x2FA0F, 'M', u'鵧'),
- (0x2FA10, 'M', u'𪃎'),
- (0x2FA11, 'M', u'䳸'),
- (0x2FA12, 'M', u'𪄅'),
- (0x2FA13, 'M', u'𪈎'),
- (0x2FA14, 'M', u'𪊑'),
- (0x2FA15, 'M', u'麻'),
- (0x2FA16, 'M', u'䵖'),
- (0x2FA17, 'M', u'黹'),
- (0x2FA18, 'M', u'黾'),
- (0x2FA19, 'M', u'鼅'),
- (0x2FA1A, 'M', u'鼏'),
- (0x2FA1B, 'M', u'鼖'),
- (0x2FA1C, 'M', u'鼻'),
- (0x2FA1D, 'M', u'𪘀'),
- (0x2FA1E, 'X'),
- (0x30000, 'V'),
- (0x3134B, 'X'),
- (0xE0100, 'I'),
- (0xE01F0, 'X'),
- ]
-
-uts46data = tuple(
- _seg_0()
- + _seg_1()
- + _seg_2()
- + _seg_3()
- + _seg_4()
- + _seg_5()
- + _seg_6()
- + _seg_7()
- + _seg_8()
- + _seg_9()
- + _seg_10()
- + _seg_11()
- + _seg_12()
- + _seg_13()
- + _seg_14()
- + _seg_15()
- + _seg_16()
- + _seg_17()
- + _seg_18()
- + _seg_19()
- + _seg_20()
- + _seg_21()
- + _seg_22()
- + _seg_23()
- + _seg_24()
- + _seg_25()
- + _seg_26()
- + _seg_27()
- + _seg_28()
- + _seg_29()
- + _seg_30()
- + _seg_31()
- + _seg_32()
- + _seg_33()
- + _seg_34()
- + _seg_35()
- + _seg_36()
- + _seg_37()
- + _seg_38()
- + _seg_39()
- + _seg_40()
- + _seg_41()
- + _seg_42()
- + _seg_43()
- + _seg_44()
- + _seg_45()
- + _seg_46()
- + _seg_47()
- + _seg_48()
- + _seg_49()
- + _seg_50()
- + _seg_51()
- + _seg_52()
- + _seg_53()
- + _seg_54()
- + _seg_55()
- + _seg_56()
- + _seg_57()
- + _seg_58()
- + _seg_59()
- + _seg_60()
- + _seg_61()
- + _seg_62()
- + _seg_63()
- + _seg_64()
- + _seg_65()
- + _seg_66()
- + _seg_67()
- + _seg_68()
- + _seg_69()
- + _seg_70()
- + _seg_71()
- + _seg_72()
- + _seg_73()
- + _seg_74()
- + _seg_75()
- + _seg_76()
- + _seg_77()
- + _seg_78()
- + _seg_79()
-)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio/__init__.py
deleted file mode 100644
index a8b0a636ad..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/__init__.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""An editorial interchange format and library.
-
-see: http://opentimeline.io
-
-.. moduleauthor:: Pixar Animation Studios
-"""
-
-# flake8: noqa
-
-# in dependency hierarchy
-from . import (
- opentime,
- exceptions,
- core,
- schema,
- schemadef,
- plugins,
- media_linker,
- adapters,
- hooks,
- algorithms,
-)
-
-__version__ = "0.11.0"
-__author__ = "Pixar Animation Studios"
-__author_email__ = "opentimelineio@pixar.com"
-__license__ = "Modified Apache 2.0 License"
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/__init__.py
deleted file mode 100644
index afbe3f8e8a..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/__init__.py
+++ /dev/null
@@ -1,213 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Expose the adapter interface to developers.
-
-To read from an existing representation, use the read_from_string and
-read_from_file functions. To query the list of adapters, use the
-available_adapter_names function.
-
-The otio_json adapter is provided as a the canonical, lossless, serialization
-of the in-memory otio schema. Other adapters are to varying degrees lossy.
-For more information, consult the documentation in the individual adapter
-modules.
-"""
-
-import os
-import itertools
-
-from .. import (
- exceptions,
- plugins,
- media_linker
-)
-
-from .adapter import Adapter # noqa
-
-# OTIO Json adapter is always available
-from . import otio_json # noqa
-
-
-def suffixes_with_defined_adapters(read=False, write=False):
- """Return a set of all the suffixes that have adapters defined for them."""
-
- if not read and not write:
- read = True
- write = True
-
- positive_adapters = []
- for adp in plugins.ActiveManifest().adapters:
- if read and adp.has_feature("read"):
- positive_adapters.append(adp)
- continue
-
- if write and adp.has_feature("write"):
- positive_adapters.append(adp)
-
- return set(
- itertools.chain.from_iterable(
- adp.suffixes for adp in positive_adapters
- )
- )
-
-
-def available_adapter_names():
- """Return a string list of the available adapters."""
-
- return [str(adp.name) for adp in plugins.ActiveManifest().adapters]
-
-
-def _from_filepath_or_name(filepath, adapter_name):
- if adapter_name is not None:
- return plugins.ActiveManifest().from_name(adapter_name)
- else:
- return from_filepath(filepath)
-
-
-def from_filepath(filepath):
- """Guess the adapter object to use for a given filepath.
-
- example:
- "foo.otio" returns the "otio_json" adapter.
- """
-
- outext = os.path.splitext(filepath)[1][1:]
-
- try:
- return plugins.ActiveManifest().from_filepath(outext)
- except exceptions.NoKnownAdapterForExtensionError:
- raise exceptions.NoKnownAdapterForExtensionError(
- "No adapter for suffix '{}' on file '{}'".format(
- outext,
- filepath
- )
- )
-
-
-def from_name(name):
- """Fetch the adapter object by the name of the adapter directly."""
-
- try:
- return plugins.ActiveManifest().from_name(name)
- except exceptions.NotSupportedError:
- raise exceptions.NotSupportedError(
- "adapter not supported: {}, available: {}".format(
- name,
- available_adapter_names()
- )
- )
-
-
-def read_from_file(
- filepath,
- adapter_name=None,
- media_linker_name=media_linker.MediaLinkingPolicy.ForceDefaultLinker,
- media_linker_argument_map=None,
- **adapter_argument_map
-):
- """Read filepath using adapter_name.
-
- If adapter_name is None, try and infer the adapter name from the filepath.
-
- For example:
- timeline = read_from_file("example_trailer.otio")
- timeline = read_from_file("file_with_no_extension", "cmx_3600")
- """
-
- adapter = _from_filepath_or_name(filepath, adapter_name)
-
- return adapter.read_from_file(
- filepath=filepath,
- media_linker_name=media_linker_name,
- media_linker_argument_map=media_linker_argument_map,
- **adapter_argument_map
- )
-
-
-def read_from_string(
- input_str,
- adapter_name='otio_json',
- media_linker_name=media_linker.MediaLinkingPolicy.ForceDefaultLinker,
- media_linker_argument_map=None,
- **adapter_argument_map
-):
- """Read a timeline from input_str using adapter_name.
-
- This is useful if you obtain a timeline from someplace other than the
- filesystem.
-
- Example:
- raw_text = urlopen(my_url).read()
- timeline = read_from_string(raw_text, "otio_json")
- """
-
- adapter = plugins.ActiveManifest().from_name(adapter_name)
- return adapter.read_from_string(
- input_str=input_str,
- media_linker_name=media_linker_name,
- media_linker_argument_map=media_linker_argument_map,
- **adapter_argument_map
- )
-
-
-def write_to_file(
- input_otio,
- filepath,
- adapter_name=None,
- **adapter_argument_map
-):
- """Write input_otio to filepath using adapter_name.
-
- If adapter_name is None, infer the adapter_name to use based on the
- filepath.
-
- Example:
- otio.adapters.write_to_file(my_timeline, "output.otio")
- """
-
- adapter = _from_filepath_or_name(filepath, adapter_name)
-
- return adapter.write_to_file(
- input_otio=input_otio,
- filepath=filepath,
- **adapter_argument_map
- )
-
-
-def write_to_string(
- input_otio,
- adapter_name='otio_json',
- **adapter_argument_map
-):
- """Return input_otio written to a string using adapter_name.
-
- Example:
- raw_text = otio.adapters.write_to_string(my_timeline, "otio_json")
- """
-
- adapter = plugins.ActiveManifest().from_name(adapter_name)
- return adapter.write_to_string(
- input_otio=input_otio,
- **adapter_argument_map
- )
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/adapter.py b/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/adapter.py
deleted file mode 100644
index 82ac405065..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/adapter.py
+++ /dev/null
@@ -1,317 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Implementation of the OTIO internal `Adapter` system.
-
-For information on writing adapters, please consult:
- https://opentimelineio.readthedocs.io/en/latest/tutorials/write-an-adapter.html# # noqa
-"""
-
-from .. import (
- core,
- plugins,
- media_linker,
- hooks,
-)
-
-
-@core.register_type
-class Adapter(plugins.PythonPlugin):
- """Adapters convert between OTIO and other formats.
-
- Note that this class is not subclassed by adapters. Rather, an adapter is
- a python module that implements at least one of the following functions:
-
- write_to_string(input_otio)
- write_to_file(input_otio, filepath) (optionally inferred)
- read_from_string(input_str)
- read_from_file(filepath) (optionally inferred)
-
- ...as well as a small json file that advertises the features of the adapter
- to OTIO. This class serves as the wrapper around these modules internal
- to OTIO. You should not need to extend this class to create new adapters
- for OTIO.
-
- For more information:
- https://opentimelineio.readthedocs.io/en/latest/tutorials/write-an-adapter.html# # noqa
- """
- _serializable_label = "Adapter.1"
-
- def __init__(
- self,
- name=None,
- execution_scope=None,
- filepath=None,
- suffixes=None
- ):
- plugins.PythonPlugin.__init__(
- self,
- name,
- execution_scope,
- filepath
- )
-
- self.suffixes = suffixes or []
-
- suffixes = core.serializable_field(
- "suffixes",
- type([]),
- doc="File suffixes associated with this adapter."
- )
-
- def has_feature(self, feature_string):
- """
- return true if adapter supports feature_string, which must be a key
- of the _FEATURE_MAP dictionary.
-
- Will trigger a call to self.module(), which imports the plugin.
- """
-
- if feature_string.lower() not in _FEATURE_MAP:
- return False
-
- search_strs = _FEATURE_MAP[feature_string]
-
- try:
- return any(hasattr(self.module(), s) for s in search_strs)
- except ImportError:
- # @TODO: should issue a warning that the plugin was not importable?
- return False
-
- def read_from_file(
- self,
- filepath,
- media_linker_name=media_linker.MediaLinkingPolicy.ForceDefaultLinker,
- media_linker_argument_map=None,
- hook_function_argument_map={},
- **adapter_argument_map
- ):
- """Execute the read_from_file function on this adapter.
-
- If read_from_string exists, but not read_from_file, execute that with
- a trivial file object wrapper.
- """
-
- if media_linker_argument_map is None:
- media_linker_argument_map = {}
-
- result = None
-
- if (
- not self.has_feature("read_from_file") and
- self.has_feature("read_from_string")
- ):
- with open(filepath, 'r') as fo:
- contents = fo.read()
- result = self._execute_function(
- "read_from_string",
- input_str=contents,
- **adapter_argument_map
- )
- else:
- result = self._execute_function(
- "read_from_file",
- filepath=filepath,
- **adapter_argument_map
- )
-
- hook_function_argument_map['adapter_arguments'] = adapter_argument_map
- hook_function_argument_map['media_linker_argument_map'] = \
- media_linker_argument_map
- result = hooks.run("post_adapter_read", result,
- extra_args=hook_function_argument_map)
-
- if media_linker_name and (
- media_linker_name != media_linker.MediaLinkingPolicy.DoNotLinkMedia
- ):
- _with_linked_media_references(
- result,
- media_linker_name,
- media_linker_argument_map
- )
-
- result = hooks.run("post_media_linker", result,
- extra_args=media_linker_argument_map)
-
- return result
-
- def write_to_file(
- self,
- input_otio,
- filepath,
- hook_function_argument_map={},
- **adapter_argument_map
- ):
- """Execute the write_to_file function on this adapter.
-
- If write_to_string exists, but not write_to_file, execute that with
- a trivial file object wrapper.
- """
- hook_function_argument_map['adapter_arguments'] = adapter_argument_map
- input_otio = hooks.run("pre_adapter_write", input_otio,
- extra_args=hook_function_argument_map)
-
- if (
- not self.has_feature("write_to_file") and
- self.has_feature("write_to_string")
- ):
- result = self.write_to_string(input_otio, **adapter_argument_map)
- with open(filepath, 'w') as fo:
- fo.write(result)
- return filepath
-
- return self._execute_function(
- "write_to_file",
- input_otio=input_otio,
- filepath=filepath,
- **adapter_argument_map
- )
-
- def read_from_string(
- self,
- input_str,
- media_linker_name=media_linker.MediaLinkingPolicy.ForceDefaultLinker,
- media_linker_argument_map=None,
- hook_function_argument_map={},
- **adapter_argument_map
- ):
- """Call the read_from_string function on this adapter."""
-
- result = self._execute_function(
- "read_from_string",
- input_str=input_str,
- **adapter_argument_map
- )
- hook_function_argument_map['adapter_arguments'] = adapter_argument_map
- hook_function_argument_map['media_linker_argument_map'] = \
- media_linker_argument_map
-
- result = hooks.run("post_adapter_read", result,
- extra_args=hook_function_argument_map)
-
- if media_linker_name and (
- media_linker_name != media_linker.MediaLinkingPolicy.DoNotLinkMedia
- ):
- _with_linked_media_references(
- result,
- media_linker_name,
- media_linker_argument_map
- )
-
- # @TODO: Should this run *ONLY* if the media linker ran?
- result = hooks.run("post_media_linker", result,
- extra_args=hook_function_argument_map)
-
- return result
-
- def write_to_string(
- self,
- input_otio,
- hook_function_argument_map={},
- **adapter_argument_map
- ):
- """Call the write_to_string function on this adapter."""
-
- hook_function_argument_map['adapter_arguments'] = adapter_argument_map
- input_otio = hooks.run("pre_adapter_write", input_otio,
- extra_args=hook_function_argument_map)
-
- return self._execute_function(
- "write_to_string",
- input_otio=input_otio,
- **adapter_argument_map
- )
-
- def __str__(self):
- return (
- "Adapter("
- "{}, "
- "{}, "
- "{}, "
- "{}"
- ")".format(
- repr(self.name),
- repr(self.execution_scope),
- repr(self.filepath),
- repr(self.suffixes),
- )
- )
-
- def __repr__(self):
- return (
- "otio.adapter.Adapter("
- "name={}, "
- "execution_scope={}, "
- "filepath={}, "
- "suffixes={}"
- ")".format(
- repr(self.name),
- repr(self.execution_scope),
- repr(self.filepath),
- repr(self.suffixes),
- )
- )
-
-
-def _with_linked_media_references(
- read_otio,
- media_linker_name,
- media_linker_argument_map
-):
- """Link media references in the read_otio if possible.
-
- Makes changes in place and returns the read_otio structure back.
- """
-
- if not read_otio or not media_linker.from_name(media_linker_name):
- return read_otio
-
- # not every object the adapter reads has an "each_clip" method, so this
- # skips objects without one.
- clpfn = getattr(read_otio, "each_clip", None)
- if clpfn is None:
- return read_otio
-
- for cl in read_otio.each_clip():
- new_mr = media_linker.linked_media_reference(
- cl,
- media_linker_name,
- # @TODO: should any context get wired in at this point?
- media_linker_argument_map
- )
- if new_mr is not None:
- cl.media_reference = new_mr
-
- return read_otio
-
-
-# map of attr to look for vs feature name in the adapter plugin
-_FEATURE_MAP = {
- 'read_from_file': ['read_from_file'],
- 'read_from_string': ['read_from_string'],
- 'read': ['read_from_file', 'read_from_string'],
- 'write_to_file': ['write_to_file'],
- 'write_to_string': ['write_to_string'],
- 'write': ['write_to_file', 'write_to_string']
-}
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/builtin_adapters.plugin_manifest.json b/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/builtin_adapters.plugin_manifest.json
deleted file mode 100644
index 5e394a67d8..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/builtin_adapters.plugin_manifest.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "OTIO_SCHEMA" : "PluginManifest.1",
- "adapters": [
- {
- "OTIO_SCHEMA": "Adapter.1",
- "name": "fcp_xml",
- "execution_scope": "in process",
- "filepath": "fcp_xml.py",
- "suffixes": ["xml"]
- },
- {
- "OTIO_SCHEMA" : "Adapter.1",
- "name" : "otio_json",
- "execution_scope" : "in process",
- "filepath" : "otio_json.py",
- "suffixes" : ["otio"]
- },
- {
- "OTIO_SCHEMA" : "Adapter.1",
- "name" : "cmx_3600",
- "execution_scope" : "in process",
- "filepath" : "cmx_3600.py",
- "suffixes" : ["edl"]
- }
- ],
- "hooks": {
- "post_adapter_read" : [],
- "post_media_linker" : [],
- "pre_adapter_write" : []
- }
-}
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/cmx_3600.py b/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/cmx_3600.py
deleted file mode 100644
index f3275e3929..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/cmx_3600.py
+++ /dev/null
@@ -1,1306 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""OpenTimelineIO CMX 3600 EDL Adapter"""
-
-# Note: this adapter is not an ideal model for new adapters, but it works.
-# If you want to write your own adapter, please see:
-# https://opentimelineio.readthedocs.io/en/latest/tutorials/write-an-adapter.html#
-
-# TODO: Flesh out Attribute Handler
-# TODO: Add line numbers to errors and warnings
-# TODO: currently tracks with linked audio/video will lose their linkage when
-# read into OTIO.
-
-import os
-import re
-import math
-import collections
-
-from .. import (
- exceptions,
- schema,
- opentime,
-)
-
-
-class EDLParseError(exceptions.OTIOError):
- pass
-
-
-# regex for parsing the playback speed of an M2 event
-SPEED_EFFECT_RE = re.compile(
- r"(?P.*?)\s*(?P[0-9\.]*)\s*(?P[0-9:]{11})$"
-)
-
-
-# these are all CMX_3600 transition codes
-# the wipe is written in regex format because it is W### where the ### is
-# a 'wipe code'
-# @TODO: not currently read by the transition code
-transition_regex_map = {
- 'C': 'cut',
- 'D': 'dissolve',
- r'W\d{3}': 'wipe',
- 'KB': 'key_background',
- 'K': 'key_foreground',
- 'KO': 'key_overlay'
-}
-
-# CMX_3600 supports some shorthand for channel assignments
-# We name the actual tracks V and A1,A2,A3,etc.
-# This channel_map tells you which track to use for each channel shorthand.
-# Channels not listed here are used as track names verbatim.
-channel_map = {
- 'A': ['A1'],
- 'AA': ['A1', 'A2'],
- 'B': ['V', 'A1'],
- 'A2/V': ['V', 'A2'],
- 'AA/V': ['V', 'A1', 'A2']
-}
-
-
-# Currently, the 'style' argument determines
-# the comment string for the media reference:
-# 'avid': '* FROM CLIP:' (default)
-# 'nucoda': '* FROM FILE:'
-# When adding a new style, please be sure to add sufficient tests
-# to verify both the new and existing styles.
-VALID_EDL_STYLES = ['avid', 'nucoda']
-
-
-class EDLParser(object):
- def __init__(self, edl_string, rate=24, ignore_timecode_mismatch=False):
- self.timeline = schema.Timeline()
-
- # Start with no tracks. They will be added as we encounter them.
- # This dict maps a track name (e.g "A2" or "V") to an OTIO Track.
- self.tracks_by_name = {}
-
- self.ignore_timecode_mismatch = ignore_timecode_mismatch
-
- self.parse_edl(edl_string, rate=rate)
-
- # TODO: Sort the tracks V, then A1,A2,etc.
-
- def add_clip(self, line, comments, rate=24):
- comment_handler = CommentHandler(comments)
- clip_handler = ClipHandler(line, comment_handler.handled, rate=rate)
- clip = clip_handler.clip
- if comment_handler.unhandled:
- clip.metadata.setdefault("cmx_3600", {})
- clip.metadata['cmx_3600'].setdefault("comments", [])
- clip.metadata['cmx_3600']['comments'] += (
- comment_handler.unhandled
- )
-
- # Add reel name to metadata
- # A reel name of `AX` represents an unknown or auxilary source
- # We don't currently track these sources outside of this adapter
- # So lets skip adding AX reels as metadata for now,
- # as that would dirty json outputs with non-relevant information
- if clip_handler.reel and clip_handler.reel != 'AX':
- clip.metadata.setdefault("cmx_3600", {})
- clip.metadata['cmx_3600']['reel'] = clip_handler.reel
-
- # each edit point between two clips is a transition. the default is a
- # cut in the edl format the transition codes are for the transition
- # into the clip
- self.add_transition(
- clip_handler,
- clip_handler.transition_type,
- clip_handler.transition_data
- )
-
- tracks = self.tracks_for_channel(clip_handler.channel_code)
- for track in tracks:
-
- edl_rate = clip_handler.edl_rate
- record_in = opentime.from_timecode(
- clip_handler.record_tc_in,
- edl_rate
- )
- record_out = opentime.from_timecode(
- clip_handler.record_tc_out,
- edl_rate
- )
-
- src_duration = clip.duration()
- rec_duration = record_out - record_in
- if rec_duration != src_duration:
- motion = comment_handler.handled.get('motion_effect')
- freeze = comment_handler.handled.get('freeze_frame')
- if motion is not None or freeze is not None:
- # Adjust the clip to match the record duration
- clip.source_range = opentime.TimeRange(
- start_time=clip.source_range.start_time,
- duration=rec_duration
- )
-
- if freeze is not None:
- clip.effects.append(schema.FreezeFrame())
- # XXX remove 'FF' suffix (writing edl will add it back)
- if clip.name.endswith(' FF'):
- clip.name = clip.name[:-3]
- elif motion is not None:
- fps = float(
- SPEED_EFFECT_RE.match(motion).group("speed")
- )
- time_scalar = fps / rate
- clip.effects.append(
- schema.LinearTimeWarp(time_scalar=time_scalar)
- )
-
- elif self.ignore_timecode_mismatch:
- # Pretend there was no problem by adjusting the record_out.
- # Note that we don't actually use record_out after this
- # point in the code, since all of the subsequent math uses
- # the clip's source_range. Adjusting the record_out is
- # just to document what the implications of ignoring the
- # mismatch here entails.
- record_out = record_in + src_duration
-
- else:
- raise EDLParseError(
- "Source and record duration don't match: {} != {}"
- " for clip {}".format(
- src_duration,
- rec_duration,
- clip.name
- ))
-
- if track.source_range is None:
- zero = opentime.RationalTime(0, edl_rate)
- track.source_range = opentime.TimeRange(
- start_time=zero - record_in,
- duration=zero
- )
-
- track_end = track.duration() - track.source_range.start_time
- if record_in < track_end:
- if self.ignore_timecode_mismatch:
- # shift it over
- record_in = track_end
- record_out = record_in + rec_duration
- else:
- raise EDLParseError(
- "Overlapping record in value: {} for clip {}".format(
- clip_handler.record_tc_in,
- clip.name
- ))
-
- # If the next clip is supposed to start beyond the end of the
- # clips we've accumulated so far, then we need to add a Gap
- # to fill that space. This can happen when an EDL has record
- # timecodes that are sparse (e.g. from a single track of a
- # multi-track composition).
- if record_in > track_end and len(track) > 0:
- gap = schema.Gap()
- gap.source_range = opentime.TimeRange(
- start_time=opentime.RationalTime(0, edl_rate),
- duration=record_in - track_end
- )
- track.append(gap)
- track.source_range = opentime.TimeRange(
- start_time=track.source_range.start_time,
- duration=track.source_range.duration + gap.duration()
- )
-
- track.append(clip)
- track.source_range = opentime.TimeRange(
- start_time=track.source_range.start_time,
- duration=track.source_range.duration + clip.duration()
- )
-
- def guess_kind_for_track_name(self, name):
- if name.startswith("V"):
- return schema.TrackKind.Video
- if name.startswith("A"):
- return schema.TrackKind.Audio
- return schema.TrackKind.Video
-
- def tracks_for_channel(self, channel_code):
- # Expand channel shorthand into a list of track names.
- if channel_code in channel_map:
- track_names = channel_map[channel_code]
- else:
- track_names = [channel_code]
-
- # Create any channels we don't already have
- for track_name in track_names:
- if track_name not in self.tracks_by_name:
- track = schema.Track(
- name=track_name,
- kind=self.guess_kind_for_track_name(track_name)
- )
- self.tracks_by_name[track_name] = track
- self.timeline.tracks.append(track)
-
- # Return a list of actual tracks
- return [self.tracks_by_name[c] for c in track_names]
-
- def add_transition(self, clip_handler, transition, data):
- if transition not in ['C']:
- md = clip_handler.clip.metadata.setdefault("cmx_3600", {})
- md["transition"] = transition
-
- def parse_edl(self, edl_string, rate=24):
- # edl 'events' can be comprised of an indeterminate amount of lines
- # we are to translating 'events' to a single clip and transition
- # then we add the transition and the clip to all channels the 'event'
- # channel code is mapped to the transition given in the 'event'
- # precedes the clip
-
- # remove all blank lines from the edl
- edl_lines = [
- l for l in (l.strip() for l in edl_string.splitlines()) if l
- ]
-
- while edl_lines:
- # a basic for loop wont work cleanly since we need to look ahead at
- # array elements to determine what type of 'event' we are looking
- # at
- line = edl_lines.pop(0)
-
- if line.startswith('TITLE:'):
- # this is the first line of interest in an edl
- # it is required to be in the header
- self.timeline.name = line.replace('TITLE:', '').strip()
-
- elif line.startswith('FCM'):
- # this can occur either in the header or before any 'event'
- # in both cases we can ignore it since it is meant for tape
- # timecode
- pass
-
- elif line.startswith('SPLIT'):
- # this is the only comment preceding an 'event' that we care
- # about in our context it simply means the next two clips will
- # have the same comment data it is for reading purposes only
- audio_delay = None
- video_delay = None
-
- if 'AUDIO DELAY' in line:
- audio_delay = line.split()[-1].strip()
- if 'VIDEO DELAY' in line:
- video_delay = line.split()[-1].strip()
- if audio_delay and video_delay:
- raise EDLParseError(
- 'both audio and video delay declared after SPLIT.'
- )
- if not (audio_delay or video_delay):
- raise EDLParseError(
- 'either audio or video delay declared after SPLIT.'
- )
-
- line_1 = edl_lines.pop(0)
- line_2 = edl_lines.pop(0)
-
- comments = []
- while edl_lines:
- if re.match(r'^\D', edl_lines[0]):
- comments.append(edl_lines.pop(0))
- else:
- break
- self.add_clip(line_1, comments, rate=rate)
- self.add_clip(line_2, comments, rate=rate)
-
- elif line[0].isdigit():
- # all 'events' start_time with an edit decision. this is
- # denoted by the line beginning with a padded integer 000-999
- comments = []
- while edl_lines:
- # any non-numbered lines after an edit decision should be
- # treated as 'comments'
- # comments are string tags used by the reader to get extra
- # information not able to be found in the restricted edl
- # format
- if re.match(r'^\D', edl_lines[0]):
- comments.append(edl_lines.pop(0))
- else:
- break
-
- self.add_clip(line, comments, rate=rate)
-
- else:
- raise EDLParseError('Unknown event type')
-
- for track in self.timeline.tracks:
- # if the source_range is the same as the available_range
- # then we don't need to set it at all.
- if track.source_range == track.available_range():
- track.source_range = None
-
-
-class ClipHandler(object):
-
- def __init__(self, line, comment_data, rate=24):
- self.clip_num = None
- self.reel = None
- self.channel_code = None
- self.edl_rate = rate
- self.transition_id = None
- self.transition_data = None
- self.source_tc_in = None
- self.source_tc_out = None
- self.record_tc_in = None
- self.record_tc_out = None
-
- self.parse(line)
- self.clip = self.make_clip(comment_data)
-
- def make_clip(self, comment_data):
- clip = schema.Clip()
- clip.name = str(self.clip_num)
-
- # BLACK/BL and BARS are called out as "Special Source Identifiers" in
- # the documents referenced here:
- # https://github.com/PixarAnimationStudios/OpenTimelineIO#cmx3600-edl
- if self.reel in ['BL', 'BLACK']:
- clip.media_reference = schema.GeneratorReference()
- # TODO: Replace with enum, once one exists
- clip.media_reference.generator_kind = 'black'
- elif self.reel == 'BARS':
- clip.media_reference = schema.GeneratorReference()
- # TODO: Replace with enum, once one exists
- clip.media_reference.generator_kind = 'SMPTEBars'
- elif 'media_reference' in comment_data:
- clip.media_reference = schema.ExternalReference()
- clip.media_reference.target_url = comment_data[
- 'media_reference'
- ]
- else:
- clip.media_reference = schema.MissingReference()
-
- # this could currently break without a 'FROM CLIP' comment.
- # Without that there is no 'media_reference' Do we have a default
- # clip name?
- if 'clip_name' in comment_data:
- clip.name = comment_data["clip_name"]
- elif (
- clip.media_reference and
- hasattr(clip.media_reference, 'target_url') and
- clip.media_reference.target_url is not None
- ):
- clip.name = os.path.splitext(
- os.path.basename(clip.media_reference.target_url)
- )[0]
-
- asc_sop = comment_data.get('asc_sop', None)
- asc_sat = comment_data.get('asc_sat', None)
- if asc_sop or asc_sat:
- slope = (1, 1, 1)
- offset = (0, 0, 0)
- power = (1, 1, 1)
- sat = 1.0
-
- if asc_sop:
- triple = r'([-+]?[\d.]+) ([-+]?[\d.]+) ([-+]?[\d.]+)'
- m = re.match(
- r'\('
- + triple
- + r'\)\s*\('
- + triple + r'\)\s*\('
- + triple + r'\)',
- asc_sop
- )
- if m:
- floats = [float(g) for g in m.groups()]
- slope = [floats[0], floats[1], floats[2]]
- offset = [floats[3], floats[4], floats[5]]
- power = [floats[6], floats[7], floats[8]]
- else:
- raise EDLParseError(
- 'Invalid ASC_SOP found: {}'.format(asc_sop))
-
- if asc_sat:
- sat = float(asc_sat)
-
- clip.metadata['cdl'] = {
- 'asc_sat': sat,
- 'asc_sop': {
- 'slope': slope,
- 'offset': offset,
- 'power': power
- }
- }
-
- if 'locator' in comment_data:
- # An example EDL locator line looks like this:
- # * LOC: 01:00:01:14 RED ANIM FIX NEEDED
- # We get the part after "LOC: " as the comment_data entry
- # Given the fixed-width nature of these, we could be more
- # strict about the field widths, but there are many
- # variations of EDL, so if we are lenient then maybe we
- # can handle more of them? Only real-world testing will
- # determine this for sure...
- m = re.match(
- r'(\d\d:\d\d:\d\d:\d\d)\s+(\w*)\s+(.*)',
- comment_data["locator"]
- )
- if m:
- marker = schema.Marker()
- marker.marked_range = opentime.TimeRange(
- start_time=opentime.from_timecode(
- m.group(1),
- self.edl_rate
- ),
- duration=opentime.RationalTime()
- )
-
- # always write the source value into metadata, in case it
- # is not a valid enum somehow.
- color_parsed_from_file = m.group(2)
-
- marker.metadata = {
- "cmx_3600": {
- "color": color_parsed_from_file
- }
- }
-
- # @TODO: if it is a valid
- if hasattr(
- schema.MarkerColor,
- color_parsed_from_file.upper()
- ):
- marker.color = color_parsed_from_file.upper()
- else:
- marker.color = schema.MarkerColor.RED
-
- marker.name = m.group(3)
- clip.markers.append(marker)
- else:
- # TODO: Should we report this as a warning somehow?
- pass
-
- clip.source_range = opentime.range_from_start_end_time(
- opentime.from_timecode(self.source_tc_in, self.edl_rate),
- opentime.from_timecode(self.source_tc_out, self.edl_rate)
- )
-
- return clip
-
- def parse(self, line):
- fields = tuple(e.strip() for e in line.split() if e.strip())
- field_count = len(fields)
-
- if field_count == 9:
- # has transition data
- # this is for edits with timing or other needed info
- # transition data for D and W*** transitions is a n integer that
- # denotes frame count
- # i haven't figured out how the key transitions (K, KB, KO) work
- (
- self.clip_num,
- self.reel,
- self.channel_code,
- self.transition_type,
- self.transition_data,
- self.source_tc_in,
- self.source_tc_out,
- self.record_tc_in,
- self.record_tc_out
- ) = fields
-
- elif field_count == 8:
- # no transition data
- # this is for basic cuts
- (
- self.clip_num,
- self.reel,
- self.channel_code,
- self.transition_type,
- self.source_tc_in,
- self.source_tc_out,
- self.record_tc_in,
- self.record_tc_out
- ) = fields
-
- else:
- raise EDLParseError(
- 'incorrect number of fields [{0}] in form statement: {1}'
- ''.format(field_count, line))
-
- # Frame numbers (not just timecode) are ok
- for prop in [
- 'source_tc_in',
- 'source_tc_out',
- 'record_tc_in',
- 'record_tc_out'
- ]:
- if ':' not in getattr(self, prop):
- setattr(
- self,
- prop,
- opentime.to_timecode(
- opentime.from_frames(
- int(getattr(self, prop)),
- self.edl_rate
- ),
- self.edl_rate
- )
- )
-
-
-class CommentHandler(object):
- # this is the for that all comment 'id' tags take
- regex_template = r'\*?\s*{id}:?\s*(?P.*)'
-
- # this should be a map of all known comments that we can read
- # 'FROM CLIP' or 'FROM FILE' is a required comment to link media
- # An exception is raised if both 'FROM CLIP' and 'FROM FILE' are found
- # needs to be ordered so that FROM CLIP NAME gets matched before FROM CLIP
- comment_id_map = collections.OrderedDict([
- ('FROM CLIP NAME', 'clip_name'),
- ('FROM CLIP', 'media_reference'),
- ('FROM FILE', 'media_reference'),
- ('LOC', 'locator'),
- ('ASC_SOP', 'asc_sop'),
- ('ASC_SAT', 'asc_sat'),
- ('M2', 'motion_effect'),
- ('\\* FREEZE FRAME', 'freeze_frame'),
- ])
-
- def __init__(self, comments):
- self.handled = {}
- self.unhandled = []
- for comment in comments:
- self.parse(comment)
-
- def parse(self, comment):
- for comment_id, comment_type in self.comment_id_map.items():
- regex = self.regex_template.format(id=comment_id)
- match = re.match(regex, comment)
- if match:
- self.handled[comment_type] = match.group(
- 'comment_body'
- ).strip()
- break
- else:
- stripped = comment.lstrip('*').strip()
- if stripped:
- self.unhandled.append(stripped)
-
-
-def _expand_transitions(timeline):
- """Convert clips with metadata/transition == 'D' into OTIO transitions."""
-
- tracks = timeline.tracks
- remove_list = []
- replace_list = []
- append_list = []
- for track in tracks:
- track_iter = iter(track)
- # avid inserts an extra clip for the source
- prev_prev = None
- prev = None
- clip = next(track_iter, None)
- next_clip = next(track_iter, None)
- while clip is not None:
- transition_type = clip.metadata.get('cmx_3600', {}).get(
- 'transition',
- 'C'
- )
-
- if transition_type == 'C':
- # nothing to do, continue to the next iteration of the loop
- prev_prev = prev
- prev = clip
- clip = next_clip
- next_clip = next(track_iter, None)
- continue
- if transition_type not in ['D']:
- raise EDLParseError(
- "Transition type '{}' not supported by the CMX EDL reader "
- "currently.".format(transition_type)
- )
-
- transition_duration = clip.duration()
-
- # EDL doesn't have enough data to know where the cut point was, so
- # this arbitrarily puts it in the middle of the transition
- pre_cut = math.floor(transition_duration.value / 2)
- post_cut = transition_duration.value - pre_cut
- mid_tran_cut_pre_duration = opentime.RationalTime(
- pre_cut,
- transition_duration.rate
- )
- mid_tran_cut_post_duration = opentime.RationalTime(
- post_cut,
- transition_duration.rate
- )
-
- # expand the previous
- expansion_clip = None
- if prev and not prev_prev:
- expansion_clip = prev
- elif prev_prev:
- expansion_clip = prev_prev
- if prev:
- remove_list.append((track, prev))
-
- sr = expansion_clip.source_range
- expansion_clip.source_range = opentime.TimeRange(
- start_time=sr.start_time,
- duration=sr.duration + mid_tran_cut_pre_duration
- )
-
- # rebuild the clip as a transition
- new_trx = schema.Transition(
- name=clip.name,
- # only supported type at the moment
- transition_type=schema.TransitionTypes.SMPTE_Dissolve,
- metadata=clip.metadata
- )
- new_trx.in_offset = mid_tran_cut_pre_duration
- new_trx.out_offset = mid_tran_cut_post_duration
-
- # in from to
- replace_list.append((track, clip, new_trx))
-
- # expand the next_clip
- if next_clip:
- next_clip.source_range = opentime.TimeRange(
- next_clip.source_range.start_time - mid_tran_cut_post_duration,
- next_clip.source_range.duration + mid_tran_cut_post_duration
- )
- else:
- fill = schema.Gap(
- source_range=opentime.TimeRange(
- duration=mid_tran_cut_post_duration,
- start_time=opentime.RationalTime(
- 0,
- transition_duration.rate
- )
- )
- )
- append_list.append((track, fill))
-
- prev = clip
- clip = next_clip
- next_clip = next(track_iter, None)
-
- for (track, from_clip, to_transition) in replace_list:
- track[track.index(from_clip)] = to_transition
-
- for (track, clip_to_remove) in list(set(remove_list)):
- # if clip_to_remove in track:
- track.remove(clip_to_remove)
-
- for (track, clip) in append_list:
- track.append(clip)
-
- return timeline
-
-
-def read_from_string(input_str, rate=24, ignore_timecode_mismatch=False):
- """Reads a CMX Edit Decision List (EDL) from a string.
- Since EDLs don't contain metadata specifying the rate they are meant
- for, you may need to specify the rate parameter (default is 24).
- By default, read_from_string will throw an exception if it discovers
- invalid timecode in the EDL. For example, if a clip's record timecode
- overlaps with the previous cut. Since this is a common mistake in
- many EDLs, you can specify ignore_timecode_mismatch=True, which will
- supress these errors and attempt to guess at the correct record
- timecode based on the source timecode and adjacent cuts.
- For best results, you may wish to do something like this:
-
- Example:
- >>> try:
- ... timeline = otio.adapters.read_from_string("mymovie.edl", rate=30)
- ... except EDLParseError:
- ... print('Log a warning here')
- ... try:
- ... timeline = otio.adapters.read_from_string(
- ... "mymovie.edl",
- ... rate=30,
- ... ignore_timecode_mismatch=True)
- ... except EDLParseError:
- ... print('Log an error here')
- """
- parser = EDLParser(
- input_str,
- rate=float(rate),
- ignore_timecode_mismatch=ignore_timecode_mismatch
- )
- result = parser.timeline
- result = _expand_transitions(result)
- return result
-
-
-def write_to_string(input_otio, rate=None, style='avid', reelname_len=8):
- # TODO: We should have convenience functions in Timeline for this?
- # also only works for a single video track at the moment
-
- video_tracks = [t for t in input_otio.tracks
- if t.kind == schema.TrackKind.Video]
- audio_tracks = [t for t in input_otio.tracks
- if t.kind == schema.TrackKind.Audio]
-
- if len(video_tracks) != 1:
- raise exceptions.NotSupportedError(
- "Only a single video track is supported, got: {}".format(
- len(video_tracks)
- )
- )
-
- if len(audio_tracks) > 2:
- raise exceptions.NotSupportedError(
- "No more than 2 audio tracks are supported."
- )
- # if audio_tracks:
- # raise exceptions.NotSupportedError(
- # "No audio tracks are currently supported."
- # )
-
- # TODO: We should try to detect the frame rate and output an
- # appropriate "FCM: NON-DROP FRAME" etc here.
-
- writer = EDLWriter(
- tracks=input_otio.tracks,
- # Assume all rates are the same as the 1st track's
- rate=rate or input_otio.tracks[0].duration().rate,
- style=style,
- reelname_len=reelname_len
- )
-
- return writer.get_content_for_track_at_index(0, title=input_otio.name)
-
-
-class EDLWriter(object):
- def __init__(self, tracks, rate, style, reelname_len=8):
- self._tracks = tracks
- self._rate = rate
- self._style = style
- self._reelname_len = reelname_len
-
- if style not in VALID_EDL_STYLES:
- raise exceptions.NotSupportedError(
- "The EDL style '{}' is not supported.".format(
- style
- )
- )
-
- def get_content_for_track_at_index(self, idx, title):
- track = self._tracks[idx]
-
- # Add a gap if the last child is a transition.
- if isinstance(track[-1], schema.Transition):
- gap = schema.Gap(
- source_range=opentime.TimeRange(
- start_time=track[-1].duration(),
- duration=opentime.RationalTime(0.0, self._rate)
- )
- )
- track.append(gap)
-
- # Note: Transitions in EDLs are unconventionally represented.
- #
- # Where a transition might normally be visualized like:
- # |---57.0 Trans 43.0----|
- # |------Clip1 102.0------|----------Clip2 143.0----------|Clip3 24.0|
- #
- # In an EDL it can be thought of more like this:
- # |---0.0 Trans 100.0----|
- # |Clip1 45.0|----------------Clip2 200.0-----------------|Clip3 24.0|
-
- # Adjust cut points to match EDL event representation.
- for idx, child in enumerate(track):
- if isinstance(child, schema.Transition):
- if idx != 0:
- # Shorten the a-side
- sr = track[idx - 1].source_range
- track[idx - 1].source_range = opentime.TimeRange(
- start_time=sr.start_time,
- duration=sr.duration - child.in_offset
- )
-
- # Lengthen the b-side
- sr = track[idx + 1].source_range
- track[idx + 1].source_range = opentime.TimeRange(
- start_time=sr.start_time - child.in_offset,
- duration=sr.duration + child.in_offset
- )
-
- # Just clean up the transition for goodness sake
- in_offset = child.in_offset
- child.in_offset = opentime.RationalTime(0.0, self._rate)
- child.out_offset += in_offset
-
- # Group events into either simple clip/a-side or transition and b-side
- # to match EDL edit/event representation and edit numbers.
- events = []
- for idx, child in enumerate(track):
- if isinstance(child, schema.Transition):
- # Transition will be captured in subsequent iteration.
- continue
-
- prv = track[idx - 1] if idx > 0 else None
-
- if isinstance(prv, schema.Transition):
- events.append(
- DissolveEvent(
- events[-1] if len(events) else None,
- prv,
- child,
- self._tracks,
- track.kind,
- self._rate,
- self._style,
- self._reelname_len
- )
- )
- elif isinstance(child, schema.Clip):
- events.append(
- Event(
- child,
- self._tracks,
- track.kind,
- self._rate,
- self._style,
- self._reelname_len
- )
- )
- elif isinstance(child, schema.Gap):
- # Gaps are represented as missing record timecode, no event
- # needed.
- pass
-
- content = "TITLE: {}\n\n".format(title) if title else ''
-
- # Convert each event/dissolve-event into plain text.
- for idx, event in enumerate(events):
- event.edit_number = idx + 1
- content += event.to_edl_format() + '\n'
-
- return content
-
-
-def _supported_timing_effects(clip):
- return [
- fx for fx in clip.effects
- if isinstance(fx, schema.LinearTimeWarp)
- ]
-
-
-def _relevant_timing_effect(clip):
- # check to see if there is more than one timing effect
- effects = _supported_timing_effects(clip)
-
- if effects != clip.effects:
- for thing in clip.effects:
- if thing not in effects and isinstance(thing, schema.TimeEffect):
- raise exceptions.NotSupportedError(
- "Clip contains timing effects not supported by the EDL"
- " adapter.\nClip: {}".format(str(clip)))
-
- timing_effect = None
- if effects:
- timing_effect = effects[0]
- if len(effects) > 1:
- raise exceptions.NotSupportedError(
- "EDL Adapter only allows one timing effect / clip."
- )
-
- return timing_effect
-
-
-class Event(object):
- def __init__(
- self,
- clip,
- tracks,
- kind,
- rate,
- style,
- reelname_len
- ):
-
- line = EventLine(kind, rate, reel=_reel_from_clip(clip, reelname_len))
- line.source_in = clip.source_range.start_time
- line.source_out = clip.source_range.end_time_exclusive()
-
- timing_effect = _relevant_timing_effect(clip)
-
- if timing_effect:
- if timing_effect.effect_name == "FreezeFrame":
- line.source_out = line.source_in + opentime.RationalTime(
- 1,
- line.source_in.rate
- )
- elif timing_effect.effect_name == "LinearTimeWarp":
- value = clip.trimmed_range().duration.value / timing_effect.time_scalar
- line.source_out = (
- line.source_in + opentime.RationalTime(value, rate))
-
- range_in_timeline = clip.transformed_time_range(
- clip.trimmed_range(),
- tracks
- )
- line.record_in = range_in_timeline.start_time
- line.record_out = range_in_timeline.end_time_exclusive()
- self.line = line
-
- self.comments = _generate_comment_lines(
- clip=clip,
- style=style,
- edl_rate=rate,
- reelname_len=reelname_len,
- from_or_to='FROM'
- )
-
- self.clip = clip
- self.source_out = line.source_out
- self.record_out = line.record_out
- self.reel = line.reel
-
- def __str__(self):
- return '{type}({name})'.format(
- type=self.clip.schema_name(),
- name=self.clip.name
- )
-
- def to_edl_format(self):
- """
- Example output:
- 002 AX V C 00:00:00:00 00:00:00:05 00:00:00:05 00:00:00:10
- * FROM CLIP NAME: test clip2
- * FROM FILE: S:\\var\\tmp\\test.exr
-
- """
- lines = [self.line.to_edl_format(self.edit_number)]
- lines += self.comments if len(self.comments) else []
-
- return "\n".join(lines)
-
-
-class DissolveEvent(object):
-
- def __init__(
- self,
- a_side_event,
- transition,
- b_side_clip,
- tracks,
- kind,
- rate,
- style,
- reelname_len
- ):
- # Note: We don't make the A-Side event line here as it is represented
- # by its own event (edit number).
-
- cut_line = EventLine(kind, rate)
-
- if a_side_event:
- cut_line.reel = a_side_event.reel
- cut_line.source_in = a_side_event.source_out
- cut_line.source_out = a_side_event.source_out
- cut_line.record_in = a_side_event.record_out
- cut_line.record_out = a_side_event.record_out
-
- self.from_comments = _generate_comment_lines(
- clip=a_side_event.clip,
- style=style,
- edl_rate=rate,
- reelname_len=reelname_len,
- from_or_to='FROM'
- )
- else:
- cut_line.reel = 'BL'
- cut_line.source_in = opentime.RationalTime(0.0, rate)
- cut_line.source_out = opentime.RationalTime(0.0, rate)
- cut_line.record_in = opentime.RationalTime(0.0, rate)
- cut_line.record_out = opentime.RationalTime(0.0, rate)
-
- self.cut_line = cut_line
-
- dslve_line = EventLine(
- kind,
- rate,
- reel=_reel_from_clip(b_side_clip, reelname_len)
- )
- dslve_line.source_in = b_side_clip.source_range.start_time
- dslve_line.source_out = b_side_clip.source_range.end_time_exclusive()
- range_in_timeline = b_side_clip.transformed_time_range(
- b_side_clip.trimmed_range(),
- tracks
- )
- dslve_line.record_in = range_in_timeline.start_time
- dslve_line.record_out = range_in_timeline.end_time_exclusive()
- dslve_line.dissolve_length = transition.out_offset
- self.dissolve_line = dslve_line
-
- self.to_comments = _generate_comment_lines(
- clip=b_side_clip,
- style=style,
- edl_rate=rate,
- reelname_len=reelname_len,
- from_or_to='TO'
- )
-
- self.a_side_event = a_side_event
- self.transition = transition
- self.b_side_clip = b_side_clip
-
- # Expose so that any subsequent dissolves can borrow their values.
- self.clip = b_side_clip
- self.source_out = dslve_line.source_out
- self.record_out = dslve_line.record_out
- self.reel = dslve_line.reel
-
- def __str__(self):
- a_side = self.a_side_event
- return '{a_type}({a_name}) -> {b_type}({b_name})'.format(
- a_type=a_side.clip.schema_name() if a_side else '',
- a_name=a_side.clip.name if a_side else '',
- b_type=self.b_side_clip.schema_name(),
- b_name=self.b_side_clip.name
- )
-
- def to_edl_format(self):
- """
- Example output:
-
- Cross dissolve...
- 002 Clip1 V C 00:00:07:08 00:00:07:08 00:00:01:21 00:00:01:21
- 002 Clip2 V D 100 00:00:09:07 00:00:17:15 00:00:01:21 00:00:10:05
- * FROM CLIP NAME: Clip1
- * FROM CLIP: /var/tmp/clip1.001.exr
- * TO CLIP NAME: Clip2
- * TO CLIP: /var/tmp/clip2.001.exr
-
- Fade in...
- 001 BL V C 00:00:00:00 00:00:00:00 00:00:00:00 00:00:00:00
- 001 My_Clip V D 012 00:00:02:02 00:00:03:04 00:00:00:00 00:00:01:02
- * TO CLIP NAME: My Clip
- * TO FILE: /var/tmp/clip.001.exr
-
- Fade out...
- 002 My_Clip V C 00:00:01:12 00:00:01:12 00:00:00:12 00:00:00:12
- 002 BL V D 012 00:00:00:00 00:00:00:12 00:00:00:12 00:00:01:00
- * FROM CLIP NAME: My Clip
- * FROM FILE: /var/tmp/clip.001.exr
- """
-
- lines = [
- self.cut_line.to_edl_format(self.edit_number),
- self.dissolve_line.to_edl_format(self.edit_number)
- ]
- lines += self.from_comments if hasattr(self, 'from_comments') else []
- lines += self.to_comments if len(self.to_comments) else []
-
- return "\n".join(lines)
-
-
-class EventLine(object):
- def __init__(self, kind, rate, reel='AX'):
- self.reel = reel
- self._kind = 'V' if kind == schema.TrackKind.Video else 'A'
- self._rate = rate
-
- self.source_in = opentime.RationalTime(0.0, rate=rate)
- self.source_out = opentime.RationalTime(0.0, rate=rate)
- self.record_in = opentime.RationalTime(0.0, rate=rate)
- self.record_out = opentime.RationalTime(0.0, rate=rate)
-
- self.dissolve_length = opentime.RationalTime(0.0, rate)
-
- def to_edl_format(self, edit_number):
- ser = {
- 'edit': edit_number,
- 'reel': self.reel,
- 'kind': self._kind,
- 'src_in': opentime.to_timecode(self.source_in, self._rate),
- 'src_out': opentime.to_timecode(self.source_out, self._rate),
- 'rec_in': opentime.to_timecode(self.record_in, self._rate),
- 'rec_out': opentime.to_timecode(self.record_out, self._rate),
- 'diss': int(
- opentime.to_frames(self.dissolve_length, self._rate)
- ),
- }
-
- if self.is_dissolve():
- return "{edit:03d} {reel:8} {kind:5} D {diss:03d} " \
- "{src_in} {src_out} {rec_in} {rec_out}".format(**ser)
- else:
- return "{edit:03d} {reel:8} {kind:5} C " \
- "{src_in} {src_out} {rec_in} {rec_out}".format(**ser)
-
- def is_dissolve(self):
- return self.dissolve_length.value > 0
-
-
-def _generate_comment_lines(
- clip,
- style,
- edl_rate,
- reelname_len,
- from_or_to='FROM'
-):
- lines = []
- url = None
-
- if not clip or isinstance(clip, schema.Gap):
- return []
-
- suffix = ''
- timing_effect = _relevant_timing_effect(clip)
- if timing_effect and timing_effect.effect_name == 'FreezeFrame':
- suffix = ' FF'
-
- if clip.media_reference:
- if hasattr(clip.media_reference, 'target_url'):
- url = clip.media_reference.target_url
-
- else:
- url = clip.name
-
- if from_or_to not in ['FROM', 'TO']:
- raise exceptions.NotSupportedError(
- "The clip FROM or TO value '{}' is not supported.".format(
- from_or_to
- )
- )
-
- if timing_effect and isinstance(timing_effect, schema.LinearTimeWarp):
- lines.append(
- 'M2 {}\t\t{}\t\t\t{}'.format(
- clip.name,
- timing_effect.time_scalar * edl_rate,
- opentime.to_timecode(
- clip.trimmed_range().start_time,
- edl_rate
- )
- )
- )
-
- if clip.name:
- # Avid Media Composer outputs two spaces before the
- # clip name so we match that.
- lines.append(
- "* {from_or_to} CLIP NAME: {name}{suffix}".format(
- from_or_to=from_or_to,
- name=clip.name,
- suffix=suffix
- )
- )
- if timing_effect and timing_effect.effect_name == "FreezeFrame":
- lines.append('* * FREEZE FRAME')
- if url and style == 'avid':
- lines.append("* {from_or_to} CLIP: {url}".format(
- from_or_to=from_or_to,
- url=url
- ))
- if url and style == 'nucoda':
- lines.append("* {from_or_to} FILE: {url}".format(
- from_or_to=from_or_to,
- url=url
- ))
-
- if reelname_len and not clip.metadata.get('cmx_3600', {}).get('reel'):
- lines.append("* OTIO TRUNCATED REEL NAME FROM: {url}".format(
- url=os.path.basename(_flip_windows_slashes(url or clip.name))
- ))
-
- cdl = clip.metadata.get('cdl')
- if cdl:
- asc_sop = cdl.get('asc_sop')
- asc_sat = cdl.get('asc_sat')
- if asc_sop:
- lines.append(
- "*ASC_SOP ({} {} {}) ({} {} {}) ({} {} {})".format(
- asc_sop['slope'][0],
- asc_sop['slope'][1],
- asc_sop['slope'][2],
- asc_sop['offset'][0],
- asc_sop['offset'][1],
- asc_sop['offset'][2],
- asc_sop['power'][0],
- asc_sop['power'][1],
- asc_sop['power'][2]
- ))
- if asc_sat:
- lines.append("*ASC_SAT {}".format(
- asc_sat
- ))
-
- # Output any markers on this clip
- for marker in clip.markers:
- timecode = opentime.to_timecode(
- marker.marked_range.start_time,
- edl_rate
- )
-
- color = marker.color
- meta = marker.metadata.get("cmx_3600")
- if not color and meta and meta.get("color"):
- color = meta.get("color").upper()
- comment = (marker.name or '').upper()
- lines.append("* LOC: {} {:7} {}".format(timecode, color, comment))
-
- # If we are carrying any unhandled CMX 3600 comments on this clip
- # then output them blindly.
- extra_comments = clip.metadata.get('cmx_3600', {}).get('comments', [])
- for comment in extra_comments:
- lines.append("* {}".format(comment))
-
- return lines
-
-
-def _flip_windows_slashes(path):
- return re.sub(r'\\', '/', path)
-
-
-def _reel_from_clip(clip, reelname_len):
- if isinstance(clip, schema.Gap):
- return 'BL'
-
- elif clip.metadata.get('cmx_3600', {}).get('reel'):
- return clip.metadata.get('cmx_3600').get('reel')
-
- _reel = clip.name or 'AX'
-
- if isinstance(clip.media_reference, schema.ExternalReference):
- _reel = clip.media_reference.name or os.path.basename(
- clip.media_reference.target_url
- )
-
- # Flip Windows slashes
- _reel = os.path.basename(_flip_windows_slashes(_reel))
-
- # Strip extension
- reel = re.sub(r'([.][a-zA-Z]+)$', '', _reel)
-
- if reelname_len:
- # Remove non valid characters
- reel = re.sub(r'[^ a-zA-Z0-9]+', '', reel)
-
- if len(reel) > reelname_len:
- reel = reel[:reelname_len]
-
- elif len(reel) < reelname_len:
- reel += ' ' * (reelname_len - len(reel))
-
- return reel
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/fcp_xml.py b/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/fcp_xml.py
deleted file mode 100644
index 48f684cc36..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/fcp_xml.py
+++ /dev/null
@@ -1,1941 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""OpenTimelineIO Final Cut Pro 7 XML Adapter."""
-
-import collections
-import functools
-import itertools
-import math
-import os
-import re
-from xml.etree import cElementTree
-from xml.dom import minidom
-
-# urlparse's name changes in Python 3
-try:
- # Python 2.7
- import urlparse as urllib_parse
-except ImportError:
- # Python 3
- import urllib.parse as urllib_parse
-
-# Same with the ABC classes from collections
-try:
- # Python 3
- from collections.abc import Mapping
-except ImportError:
- # Python 2.7
- from collections import Mapping
-
-from opentimelineio import (
- core,
- opentime,
- schema,
-)
-
-# namespace to use for metadata
-META_NAMESPACE = 'fcp_xml'
-
-# Regex to match identifiers like clipitem-22
-ID_RE = re.compile(r"^(?P[a-zA-Z]*)-(?P\d*)$")
-
-
-# ---------
-# utilities
-# ---------
-
-
-class _Context(Mapping):
- """
- An inherited value context.
-
- In FCP XML there is a concept of inheritance down the element heirarchy.
- For instance, a ``clip`` element may not specify the ``rate`` locally, but
- instead inherit it from the parent ``track`` element.
-
- This object models that as a stack of elements. When a value needs to be
- queried from the context, it will be gathered by walking from the top of
- the stack until the value is found.
-
- For example, to find the ``rate`` element as an immediate child most
- appropriate to the current context, you would do something like::
- ``my_current_context["./rate"]``
-
- This object can be thought of as immutable. You get a new context when you
- push an element. This prevents inadvertant tampering with parent contexts
- that may be used at levels above.
-
- This DOES NOT support ``id`` attribute dereferencing, please make sure to
- do that prior to using this structure.
-
- .. seealso:: https://developer.apple.com/library/archive/documentation\
- /AppleApplications/Reference/FinalCutPro_XML/Basics/Basics.html#\
- //apple_ref/doc/uid/TP30001154-TPXREF102
- """
-
- def __init__(self, element=None, parent_elements=None):
- if parent_elements is not None:
- self.elements = parent_elements[:]
- else:
- self.elements = []
-
- if element is not None:
- self.elements.append(element)
-
- def _all_keys(self):
- """
- Returns a set of all the keys available in the context stack.
- """
- return set(
- itertools.chain.fromiterable(e.keys() for e in self.elements)
- )
-
- def __getitem__(self, key):
- # Walk down the contexts until the item is found
- for element in reversed(self.elements):
- found_element = element.find(key)
- if found_element is not None:
- return found_element
-
- raise KeyError(key)
-
- def __iter__(self):
- # This is unlikely to be used, so we'll do it the expensive way
- return iter(self._all_keys)
-
- def __len__(self):
- # This is unlikely to be used, so we'll do it the expensive way
- return len(self._all_keys)
-
- def context_pushing_element(self, element):
- """
- Pushes an element to the top of the stack.
-
- :param element: Element to push to the stack.
- :return: The new context with the provided element pushed to the top
- of the stack.
- :raises: :class:`ValueError` if the element is already in the stack.
- """
- for context_element in self.elements:
- if context_element == element:
- raise ValueError(
- "element {} already in context".format(element)
- )
-
- return _Context(element, self.elements)
-
-
-def _url_to_path(url):
- parsed = urllib_parse.urlparse(url)
- return parsed.path
-
-
-def _bool_value(element):
- """
- Given an xml element, returns the tag text converted to a bool.
-
- :param element: The element to fetch the value from.
-
- :return: A boolean.
- """
- return (element.text.lower() == "true")
-
-
-def _element_identification_string(element):
- """
- Gets a string that will hopefully help in identifing an element when there
- is an error.
- """
- info_string = "tag: {}".format(element.tag)
- try:
- elem_id = element.attrib["id"]
- info_string += " id: {}".format(elem_id)
- except KeyError:
- pass
-
- return info_string
-
-
-def _name_from_element(element):
- """
- Fetches the name from the ``name`` element child of the provided element.
- If no element exists, returns ``None``.
-
- :param element: The element to find the name for.
-
- :return: The name string or ``None``
- """
- name_elem = element.find("./name")
- if name_elem is not None:
- return name_elem.text
-
- return None
-
-
-def _rate_for_element(element):
- """
- Takes an FCP rate element and returns a rate to use with otio.
-
- :param element: An FCP rate element.
-
- :return: The float rate.
- """
- # rate is encoded as a timebase (int) which can be drop-frame
- base = float(element.find("./timebase").text)
- if _bool_value(element.find("./ntsc")):
- base *= 1000.0 / 1001
-
- return base
-
-
-def _rate_from_context(context):
- """
- Given the context object, gets the appropriate rate.
-
- :param context: The :class:`_Context` instance to find the rate in.
-
- :return: The rate value or ``None`` if no rate is available in the context.
- """
- try:
- rate_element = context["./rate"]
- except KeyError:
- return None
-
- return _rate_for_element(rate_element)
-
-
-def _time_from_timecode_element(tc_element, context=None):
- """
- Given a timecode xml element, returns the time that represents.
-
- .. todo:: Non Drop-Frame timecode is not yet supported by OTIO.
-
- :param tc_element: The ``timecode`` element.
- :param context: The context dict under which this timecode is being gotten.
-
- :return: The :class:`opentime.RationalTime` representation of the
- timecode.
- """
- if context is not None:
- local_context = context.context_pushing_element(tc_element)
- else:
- local_context = _Context(tc_element)
-
- # Resolve the rate
- rate = _rate_from_context(local_context)
-
- # Try using the display format and frame number
- frame = tc_element.find("./frame")
-
- # Use frame number, if available
- if frame is not None:
- frame_num = int(frame.text)
- return opentime.RationalTime(frame_num, rate)
-
- # If a TC string is provided, parse rate from it
- tc_string_element = tc_element.find("./string")
- if tc_string_element is None:
- raise ValueError("Timecode element missing required elements")
-
- tc_string = tc_string_element.text
-
- return opentime.from_timecode(tc_string, rate)
-
-
-def _track_kind_from_element(media_element):
- """
- Given an FCP XML media sub-element, returns an appropriate
- :class:`schema.TrackKind` value corresponding to that media type.
-
- :param media_element: An XML element that is a child of the ``media`` tag.
-
- :return: The corresponding :class`schema.TrackKind` value.
- :raises: :class:`ValueError` When the media type is unsupported.
- """
- element_tag = media_element.tag.lower()
- if element_tag == "audio":
- return schema.TrackKind.Audio
- elif element_tag == "video":
- return schema.TrackKind.Video
-
- raise ValueError("Unsupported media kind: {}".format(media_element.tag))
-
-
-def _is_primary_audio_channel(track):
- """
- Determines whether or not this is the "primary" audio track.
-
- audio may be structured in stereo where each channel occupies a separate
- track. This importer keeps stereo pairs ganged together as a single track.
-
- :param track: An XML track element.
-
- :return: A boolean ``True`` if this is the first track.
- """
- exploded_index = track.attrib.get('currentExplodedTrackIndex', '0')
- exploded_count = track.attrib.get('totalExplodedTrackCount', '1')
-
- return (exploded_index == '0' or exploded_count == '1')
-
-
-def _transition_cut_point(transition_item, context):
- """
- Returns the end time at which the transition progresses from one clip to
- the next.
-
- :param transition_item: The XML element for the transition.
- :param context: The context dictionary applying to this transition.
-
- :return: The :class:`opentime.RationalTime` the transition cuts at.
- """
- alignment = transition_item.find('./alignment').text
- start = int(transition_item.find('./start').text)
- end = int(transition_item.find('./end').text)
-
- # start/end time is in the parent context's rate
- local_context = context.context_pushing_element(transition_item)
- rate = _rate_from_context(local_context)
-
- if alignment in ('end', 'end-black'):
- value = end
- elif alignment in ('start', 'start-black'):
- value = start
- elif alignment in ('center',):
- value = int((start + end) / 2)
- else:
- value = int((start + end) / 2)
-
- return opentime.RationalTime(value, rate)
-
-
-def _xml_tree_to_dict(node, ignore_tags=None, omit_timing=True):
- """
- Translates the tree under a provided node mapping to a dictionary/list
- representation. XML tag attributes are placed in the dictionary with an
- ``@`` prefix.
-
- .. note:: In addition to the provided ignore tags, this filters a subset of
- timing metadata such as ``frame`` and ``string`` elements within timecode
- elements.
-
- .. warning:: This scheme does not allow for leaf elements to have
- attributes. for the moment this doesn't seem to be an issue.
-
- :param node: The root xml element to express childeren of in the
- dictionary.
- :param ignore_tags: A collection of tagnames to skip when converting.
- :param omit_timing: If ``True``, omits timing-specific tags.
-
- :return: The dictionary representation.
- """
- if node.tag == "timecode":
- additional_ignore_tags = {"frame", "string"}
- else:
- additional_ignore_tags = tuple()
-
- out_dict = collections.OrderedDict()
-
- # Handle the attributes
- out_dict.update(
- collections.OrderedDict(
- ("@{}".format(k), v) for k, v in node.attrib.items()
- )
- )
-
- # Now traverse the child tags
- encountered_tags = set()
- list_tags = set()
- for info_node in node:
- # Skip tags we were asked to omit
- node_tag = info_node.tag
- if ignore_tags and node_tag in ignore_tags:
- continue
-
- # Skip some special case tags related to timing information
- if node_tag in additional_ignore_tags:
- continue
-
- # If there are children, make this a sub-dictionary by recursing
- if len(info_node):
- node_value = _xml_tree_to_dict(info_node)
- else:
- node_value = info_node.text
-
- # If we've seen this node before, then treat it as a list
- if node_tag in list_tags:
- # We've established that this tag is a list, append to that
- out_dict[node_tag].append(node_value)
- elif node_tag in encountered_tags:
- # This appears to be a list we didn't know about, convert
- out_dict[node_tag] = [
- out_dict[node_tag], node_value
- ]
- list_tags.add(node_tag)
- else:
- # Store the value
- out_dict[node_tag] = node_value
- encountered_tags.add(node_tag)
-
- return out_dict
-
-
-def _dict_to_xml_tree(data_dict, tag):
- """
- Given a dictionary, returns an element tree storing the data. This is the
- inverse of :func:`_xml_tree_to_dict`.
-
- Any key/value pairs in the dictionary heirarchy where the key is prefixed
- with ``@`` will be treated as attributes on the containing element.
-
- .. note:: This will automatically omit some kinds of metadata it should
- be up to the xml building functions to manage (such as timecode and id).
-
- :param data_dict: The dictionary to turn into an XML tree.
- :param tag: The tag name to use for the top-level element.
-
- :return: The top element for the dictionary
- """
- top_attributes = collections.OrderedDict(
- (k[1:], v) for k, v in data_dict.items()
- if k != "@id" and k.startswith("@")
- )
- top_element = cElementTree.Element(tag, **top_attributes)
-
- def elements_for_value(python_value, element_tag):
- """ Creates a list of appropriate XML elements given a value. """
- if isinstance(python_value, dict):
- element = _dict_to_xml_tree(python_value, element_tag)
- return [element]
- elif isinstance(python_value, list):
- return itertools.chain.from_iterable(
- elements_for_value(item, element_tag) for item in python_value
- )
- else:
- element = cElementTree.Element(element_tag)
- if python_value is not None:
- element.text = str(python_value)
- return [element]
-
- # Drop timecode, rate, and link elements from roundtripping because they
- # may become stale with timeline updates.
- default_ignore_keys = {"timecode", "rate", "link"}
- specific_ignore_keys = {"samplecharacteristics": {"timecode"}}
- ignore_keys = specific_ignore_keys.get(tag, default_ignore_keys)
-
- # push the elements into the tree
- for key, value in data_dict.items():
- if key in ignore_keys:
- continue
-
- # We already handled the attributes
- if key.startswith("@"):
- continue
-
- elements = elements_for_value(value, key)
- top_element.extend(elements)
-
- return top_element
-
-
-def _element_with_item_metadata(tag, item):
- """
- Given a tag name, gets the FCP XML metadata dict and creates a tree of XML
- with that metadata under a top element with the provided tag.
-
- :param tag: The XML tag for the root element.
- :param item: An otio object with a metadata dict.
- """
- item_meta = item.metadata.get(META_NAMESPACE)
- if item_meta:
- return _dict_to_xml_tree(item_meta, tag)
-
- return cElementTree.Element(tag)
-
-
-def _get_or_create_subelement(parent_element, tag):
- """
- Given an element and tag name, either gets the direct child of parent with
- that tag name or creates a new subelement with that tag and returns it.
-
- :param parent_element: The element to get or create the subelement from.
- :param tag: The tag for the subelement.
- """
- sub_element = parent_element.find(tag)
- if sub_element is None:
- sub_element = cElementTree.SubElement(parent_element, tag)
-
- return sub_element
-
-
-def _make_pretty_string(tree_e):
- # most of the parsing in this adapter is done with cElementTree because it
- # is simpler and faster. However, the string representation it returns is
- # far from elegant. Therefor we feed it through minidom to provide an xml
- # with indentations.
- string = cElementTree.tostring(tree_e, encoding="UTF-8", method="xml")
- dom = minidom.parseString(string)
- return dom.toprettyxml(indent=' ')
-
-
-def marker_for_element(marker_element, rate):
- """
- Creates an :class:`schema.Marker` for the provided element.
-
- :param marker_element: The XML element for the marker.
- :param rate: The rate for the object the marker is attached to.
-
- :return: The :class:`schema.Marker` instance.
- """
- # TODO: The spec doc indicates that in and out are required, but doesn't
- # say they have to be locally specified, so is it possible they
- # could be inherited?
- marker_in = opentime.RationalTime(
- float(marker_element.find("./in").text), rate
- )
- marker_out_value = float(marker_element.find("./out").text)
- if marker_out_value > 0:
- marker_out = opentime.RationalTime(
- marker_out_value, rate
- )
- marker_duration = (marker_out - marker_in)
- else:
- marker_duration = opentime.RationalTime(rate=rate)
-
- marker_range = opentime.TimeRange(marker_in, marker_duration)
-
- md_dict = _xml_tree_to_dict(marker_element, {"in", "out", "name"})
- metadata = {META_NAMESPACE: md_dict} if md_dict else None
-
- return schema.Marker(
- name=_name_from_element(marker_element),
- marked_range=marker_range,
- metadata=metadata
- )
-
-
-def markers_from_element(element, context=None):
- """
- Given an element, returns the list of markers attached to it.
-
- :param element: An element with one or more ``marker`` child elements.
- :param context: The context for this element.
-
- :return: A :class:`list` of :class:`schema.Marker` instances attached
- to the provided element.
- """
- if context is not None:
- local_context = context.context_pushing_element(element)
- else:
- local_context = _Context(element)
- rate = _rate_from_context(local_context)
-
- return [marker_for_element(e, rate) for e in element.iterfind("./marker")]
-
-
-class FCP7XMLParser:
- """
- Implements parsing of an FCP XML file into an OTIO timeline.
-
- Parsing FCP XML elements include two concepts that require carrying state:
- 1. Inheritance
- 2. The id Attribute
-
- .. seealso:: https://developer.apple.com/library/archive/documentation/\
- AppleApplications/Reference/FinalCutPro_XML/Basics/Basics.html\
- #//apple_ref/doc/uid/TP30001154-TPXREF102
-
- Inheritance is implemented using a _Context object that is pushed down
- through layers of parsing. A given parsing method is passed the element to
- parse into an otio object along with the context that element exists under
- (e.x. a track element parsing method is given the track element and the
- sequence context for that track).
-
- The id attribute dereferencing is handled through a lookup table stored on
- parser instances and using the ``_derefed_`` methods to take an element and
- find dereference elements.
- """
-
- _etree = None
- """ The root etree for the FCP XML. """
-
- _id_map = None
- """ A mapping of id to the first element encountered with that id. """
-
- def __init__(self, element_tree):
- """
- Constructor, must be init with an xml etree.
- """
- self._etree = element_tree
-
- self._id_map = {}
-
- def _derefed_element(self, element):
- """
- Given an element, dereferences it by it's id attribute if needed. If
- the element has an id attribute and it's our first time encountering
- it, store the id.
- """
- if element is None:
- return element
-
- try:
- elem_id = element.attrib["id"]
- except KeyError:
- return element
-
- return self._id_map.setdefault(elem_id, element)
-
- def _derefed_iterfind(self, element, path):
- """
- Given an elemnt, finds elements with the provided path below and
- returns an iterator of the dereferenced versions of those.
-
- :param element: The XML etree element.
- :param path: The path to find subelements.
-
- :return: iterator of subelements dereferenced by id.
- """
- return (
- self._derefed_element(e) for e in element.iterfind(path)
- )
-
- def top_level_sequences(self):
- """"
- Returns a list of timelines for the top-level sequences in the file.
- """
- context = _Context()
-
- # If the tree has just sequences at the top level, this will catch them
- top_iter = self._derefed_iterfind(self._etree, "./sequence")
-
- # If there is a project or bin at the top level, this should cath them
- project_and_bin_iter = self._derefed_iterfind(
- self._etree, ".//children/sequence"
- )
-
- # Make an iterator that will exhaust both the above
- sequence_iter = itertools.chain(top_iter, project_and_bin_iter)
-
- return [self.timeline_for_sequence(s, context) for s in sequence_iter]
-
- def timeline_for_sequence(self, sequence_element, context):
- """
- Returns either an :class`schema.Timeline` parsed from a sequence
- element.
-
- :param sequence_element: The sequence element.
- :param context: The context dictionary.
-
- :return: The appropriate OTIO object for the element.
- """
- local_context = context.context_pushing_element(sequence_element)
-
- name = _name_from_element(sequence_element)
- parsed_tags = {"name", "media", "marker", "duration"}
- md_dict = _xml_tree_to_dict(sequence_element, parsed_tags)
-
- sequence_timecode = self._derefed_element(
- sequence_element.find("./timecode")
- )
- if sequence_timecode is not None:
- seq_start_time = _time_from_timecode_element(
- sequence_timecode, local_context
- )
- else:
- seq_start_time = None
-
- media_element = self._derefed_element(sequence_element.find("./media"))
- if media_element is None:
- tracks = None
- else:
- # Reach down into the media block and escalate metadata to the
- # sequence
- for media_type in media_element:
- media_info_dict = _xml_tree_to_dict(media_type, {"track"})
- if media_info_dict:
- media_dict = md_dict.setdefault(
- "media", collections.OrderedDict()
- )
- media_dict[media_type.tag] = media_info_dict
-
- tracks = self.stack_for_element(media_element, local_context)
- tracks.name = name
-
- # TODO: Should we be parsing the duration tag and pad out a track with
- # gap to match?
-
- timeline = schema.Timeline(
- name=name,
- global_start_time=seq_start_time,
- metadata={META_NAMESPACE: md_dict} if md_dict else {},
- )
- timeline.tracks = tracks
-
- # Push the sequence markers onto the top stack
- markers = markers_from_element(sequence_element, context)
- timeline.tracks.markers.extend(markers)
-
- return timeline
-
- def stack_for_element(self, element, context):
- """
- Given an element, parses out track information as a stack.
-
- :param element: The element under which to find the tracks (typically
- a ``media`` element.
- :param context: The current parser context.
-
- :return: A :class:`schema.Stack` of the tracks.
- """
- # Determine the context
- local_context = context.context_pushing_element(element)
-
- tracks = []
- media_type_elements = self._derefed_iterfind(element, "./")
- for media_type_element in media_type_elements:
- try:
- track_kind = _track_kind_from_element(media_type_element)
- except ValueError:
- # Unexpected element
- continue
-
- is_audio = (track_kind == schema.TrackKind.Audio)
- track_elements = self._derefed_iterfind(
- media_type_element, "./track"
- )
- for track_element in track_elements:
- if is_audio and not _is_primary_audio_channel(track_element):
- continue
-
- tracks.append(
- self.track_for_element(
- track_element, track_kind, local_context
- )
- )
-
- markers = markers_from_element(element, context)
-
- stack = schema.Stack(
- children=tracks,
- markers=markers,
- name=_name_from_element(element),
- )
-
- return stack
-
- def track_for_element(self, track_element, track_kind, context):
- """
- Given a track element, constructs the OTIO track.
-
- :param track_element: The track XML element.
- :param track_kind: The :class:`schema.TrackKind` for the track.
- :param context: The context dict for this track.
- """
- local_context = context.context_pushing_element(track_element)
- name_element = track_element.find("./name")
- track_name = (name_element.text if name_element is not None else None)
-
- timeline_item_tags = {"clipitem", "generatoritem", "transitionitem"}
-
- md_dict = _xml_tree_to_dict(track_element, timeline_item_tags)
- track_metadata = {META_NAMESPACE: md_dict} if md_dict else None
-
- track = schema.Track(
- name=track_name,
- kind=track_kind,
- metadata=track_metadata,
- )
-
- # Iterate through and parse track items
- track_rate = _rate_from_context(local_context)
- current_timeline_time = opentime.RationalTime(0, track_rate)
- head_transition_element = None
- for i, item_element in enumerate(track_element):
- if item_element.tag not in timeline_item_tags:
- continue
-
- item_element = self._derefed_element(item_element)
-
- # Do a lookahead to try and find the tail transition item
- try:
- tail_transition_element = track_element[i + 1]
- if tail_transition_element.tag != "transitionitem":
- tail_transition_element = None
- else:
- tail_transition_element = self._derefed_element(
- tail_transition_element
- )
- except IndexError:
- tail_transition_element = None
-
- track_item, item_range = self.item_and_timing_for_element(
- item_element,
- head_transition_element,
- tail_transition_element,
- local_context,
- )
-
- # Insert gap between timeline cursor and the new item if needed.
- if current_timeline_time < item_range.start_time:
- gap_duration = (item_range.start_time - current_timeline_time)
- gap_range = opentime.TimeRange(
- duration=gap_duration.rescaled_to(track_rate)
- )
- track.append(schema.Gap(source_range=gap_range))
-
- # Add the item and advance the timeline cursor
- track.append(track_item)
- current_timeline_time = item_range.end_time_exclusive()
-
- # Stash the element for the next iteration if it's a transition
- if item_element.tag == "transitionitem":
- head_transition_element = item_element
-
- return track
-
- def media_reference_for_file_element(self, file_element, context):
- """
- Given a file XML element, returns the
- :class`schema.ExternalReference`.
-
- :param file_element: The file xml element.
- :param context: The parent context dictionary.
-
- :return: An :class:`schema.ExternalReference`.
- """
- local_context = context.context_pushing_element(file_element)
- media_ref_rate = _rate_from_context(local_context)
-
- name = _name_from_element(file_element)
-
- # Get the full metadata
- metadata_ignore_keys = {"duration", "name", "pathurl"}
- md_dict = _xml_tree_to_dict(file_element, metadata_ignore_keys)
- metadata_dict = {META_NAMESPACE: md_dict} if md_dict else None
-
- # Determine the file path
- path_element = file_element.find("./pathurl")
- if path_element is not None:
- path = path_element.text
- else:
- path = None
-
- # Find the timing
- timecode_element = file_element.find("./timecode")
- if timecode_element is not None:
- start_time = _time_from_timecode_element(timecode_element)
- start_time = start_time.rescaled_to(media_ref_rate)
- else:
- start_time = opentime.RationalTime(0, media_ref_rate)
-
- duration_element = file_element.find("./duration")
- if duration_element is not None:
- duration = opentime.RationalTime(
- float(duration_element.text), media_ref_rate
- )
- available_range = opentime.TimeRange(start_time, duration)
- elif timecode_element is not None:
- available_range = opentime.TimeRange(
- start_time,
- opentime.RationalTime(0, media_ref_rate),
- )
- else:
- available_range = None
-
- if path is None:
- media_reference = schema.MissingReference(
- name=name,
- available_range=available_range,
- metadata=metadata_dict,
- )
- else:
- media_reference = schema.ExternalReference(
- target_url=path,
- available_range=available_range,
- metadata=metadata_dict,
- )
- media_reference.name = name
-
- return media_reference
-
- def media_reference_for_effect_element(self, effect_element):
- """
- Given an effect element, returns a generator reference.
-
- :param effect_element: The effect for the generator.
-
- :return: An :class:`schema.GeneratorReference` instance.
- """
- name = _name_from_element(effect_element)
- md_dict = _xml_tree_to_dict(effect_element, {"name"})
-
- return schema.GeneratorReference(
- name=name,
- metadata=({META_NAMESPACE: md_dict} if md_dict else None)
- )
-
- def item_and_timing_for_element(
- self, item_element, head_transition, tail_transition, context
- ):
- """
- Given a track item, returns a tuple with the appropriate OpenTimelineIO
- schema item as the first element and an
- :class:`opentime.TimeRange`of theresolved timeline range the clip
- occupies.
-
- :param item_element: The track item XML node.
- :param head_transition: The xml element for the transition immediately
- before or ``None``.
- :param tail_transition: The xml element for the transition immediately
- after or ``None``.
- :param context: The context dictionary.
-
- :return: An :class:`core.Item` subclass instance and
- :class:`opentime.TimeRange` for the item.
- """
- parent_rate = _rate_from_context(context)
-
- # Establish the start/end time in the timeline
- start_value = int(item_element.find("./start").text)
- end_value = int(item_element.find("./end").text)
-
- if start_value == -1:
- # determine based on the cut point of the head transition
- start = _transition_cut_point(head_transition, context)
-
- # This offset is needed to determing how much to advance from the
- # clip media's in time. Duration accounts for this offset for the
- # out time.
- transition_rate = _rate_from_context(
- context.context_pushing_element(head_transition)
- )
- start_offset = start - opentime.RationalTime(
- int(head_transition.find('./start').text), transition_rate
- )
- else:
- start = opentime.RationalTime(start_value, parent_rate)
- start_offset = opentime.RationalTime()
-
- if end_value == -1:
- # determine based on the cut point of the tail transition
- end = _transition_cut_point(tail_transition, context)
- else:
- end = opentime.RationalTime(end_value, parent_rate)
-
- item_range = opentime.TimeRange(start, (end - start))
-
- # Get the metadata dictionary for the item
- item_metadata_ignore_keys = {
- "name",
- "start",
- "end",
- "in",
- "out",
- "duration",
- "file",
- "marker",
- "effect",
- "rate",
- "sequence",
- }
- metadata_dict = _xml_tree_to_dict(
- item_element, item_metadata_ignore_keys
- )
-
- # deserialize the item
- if item_element.tag in {"clipitem", "generatoritem"}:
- item = self.clip_for_element(
- item_element, item_range, start_offset, context
- )
- elif item_element.tag == "transitionitem":
- item = self.transition_for_element(item_element, context)
- else:
- name = "unknown-{}".format(item_element.tag)
- item = core.Item(name=name, source_range=item_range)
-
- if metadata_dict:
- item.metadata.setdefault(META_NAMESPACE, {}).update(metadata_dict)
-
- return (item, item_range)
-
- def clip_for_element(
- self, clipitem_element, item_range, start_offset, context
- ):
- """
- Given a clipitem xml element, returns an :class:`schema.Clip`.
-
- :param clipitem_element: The element to create a clip for.
- :param item_range: The time range in the timeline the clip occupies.
- :param start_offset: The amount by which the ``in`` time of the clip
- source should be advanced (usually due to a transition).
- :param context: The parent context for the clip.
-
- :return: The :class:`schema.Clip` instance.
- """
- local_context = context.context_pushing_element(clipitem_element)
-
- name = _name_from_element(clipitem_element)
-
- file_element = self._derefed_element(clipitem_element.find("./file"))
- sequence_element = self._derefed_element(
- clipitem_element.find("./sequence")
- )
- if clipitem_element.tag == "generatoritem":
- generator_effect_element = clipitem_element.find(
- "./effect[effecttype='generator']"
- )
- else:
- generator_effect_element = None
-
- media_start_time = opentime.RationalTime()
- if sequence_element is not None:
- item = self.stack_for_element(sequence_element, local_context)
- # TODO: is there an applicable media start time we should be
- # using from nested sequences?
- elif file_element is not None or generator_effect_element is not None:
- if file_element is not None:
- media_reference = self.media_reference_for_file_element(
- file_element, local_context
- )
- # See if there is a start offset
- timecode_element = file_element.find("./timecode")
- if timecode_element is not None:
- media_start_time = _time_from_timecode_element(
- timecode_element
- )
- elif generator_effect_element is not None:
- media_reference = self.media_reference_for_effect_element(
- generator_effect_element
- )
-
- item = schema.Clip(
- name=name,
- media_reference=media_reference,
- )
- else:
- raise TypeError(
- 'Type of clip item is not supported {}'.format(
- _element_identification_string(clipitem_element)
- )
- )
-
- # Add the markers
- markers = markers_from_element(clipitem_element, context)
- item.markers.extend(markers)
-
- # Find the in time (source time relative to media start)
- clip_rate = _rate_from_context(local_context)
- in_value = float(clipitem_element.find('./in').text)
- in_time = opentime.RationalTime(in_value, clip_rate)
-
- # Offset the "in" time by the start offset of the media
- soure_start_time = in_time + media_start_time + start_offset
- duration = item_range.duration
-
- # Source Range is the item range expressed in the clip's rate (for now)
- source_range = opentime.TimeRange(
- soure_start_time.rescaled_to(clip_rate),
- duration.rescaled_to(clip_rate),
- )
-
- item.source_range = source_range
-
- # Parse the filters
- filter_iter = self._derefed_iterfind(clipitem_element, "./filter")
- for filter_element in filter_iter:
- item.effects.append(
- self.effect_from_filter_element(filter_element)
- )
-
- return item
-
- def effect_from_filter_element(self, filter_element):
- """
- Given a filter element, creates an :class:`schema.Effect`.
-
- :param filter_element: The ``filter`` element containing the effect.
-
- :return: The effect instance.
- """
- effect_element = filter_element.find("./effect")
-
- if effect_element is None:
- raise ValueError(
- "could not find effect in filter: {}".format(filter_element)
- )
-
- name = effect_element.find("./name").text
-
- effect_metadata = _xml_tree_to_dict(effect_element, {"name"})
-
- return schema.Effect(
- name,
- metadata={META_NAMESPACE: effect_metadata},
- )
-
- def transition_for_element(self, item_element, context):
- """
- Creates an OTIO transition for the provided transition element.
-
- :param item_element: The element to create a transition for.
- :param context: The parent context for the element.
-
- :return: The :class:`schema.Transition` instance.
- """
- # start and end times are in the parent's rate
- rate = _rate_from_context(context)
- start = opentime.RationalTime(
- int(item_element.find('./start').text),
- rate
- )
- end = opentime.RationalTime(
- int(item_element.find('./end').text),
- rate
- )
- cut_point = _transition_cut_point(item_element, context)
-
- transition = schema.Transition(
- name=item_element.find('./effect/name').text,
- transition_type=schema.TransitionTypes.SMPTE_Dissolve,
- in_offset=cut_point - start,
- out_offset=end - cut_point,
- )
-
- return transition
-
-
-# ------------------------
-# building single track
-# ------------------------
-
-
-def _backreference_for_item(item, tag, br_map):
- """
- Given an item, determines what the id in the backreference map should be.
- If the item is already tracked in the map, it will be returned, otherwise
- a new id will be minted.
-
- .. note:: ``br_map`` may be mutated by this function. ``br_map`` is
- intended to be an opaque data structure and only accessed through this
- function, the structure of data in br_map may change.
-
- :param item: The :class:`core.SerializableObject` to create an id for.
- :param tag: The tag name that will be used for object in xml.
- :param br_map: The dictionary containing backreference information
- generated so far.
-
- :return: A 2-tuple of (id_string, is_new_id) where the ``id_string`` is
- the value for the xml id attribute and ``is_new_id`` is ``True`` when
- this is the first time that id was encountered.
- """
- # br_map is structured as a dictionary with tags as keys, and dictionaries
- # of hash to id int as values.
-
- def id_string(id_int):
- return "{}-{}".format(tag, id_int)
-
- # Determine how to uniquely identify the referenced item
- if isinstance(item, schema.ExternalReference):
- item_hash = hash(str(item.target_url))
- else:
- # TODO: This may become a performance issue. It means that every
- # non-ref object is serialized to json and hashed each time it's
- # encountered.
- item_hash = hash(
- core.json_serializer.serialize_json_to_string(item)
- )
-
- is_new_id = False
- item_id = br_map.get(tag, {}).get(item_hash)
- if item_id is not None:
- return (id_string(item_id), is_new_id)
-
- # This is a new id, figure out what it should be.
- is_new_id = True
-
- # Attempt to preserve the ID from the input metadata.
- preferred_id = None
- orig_id_string = item.metadata.get(META_NAMESPACE, {}).get("@id")
- if orig_id_string is not None:
- orig_id_match = ID_RE.match(orig_id_string)
- if orig_id_match is not None:
- match_groups = orig_id_match.groupdict()
- orig_tagname = match_groups["tag"]
- if orig_tagname == tag:
- preferred_id = int(match_groups["id"])
-
- # Generate an id by finding the lowest value in a contiguous range not
- # colliding with an existing value
- tag_id_map = br_map.setdefault(tag, {})
- existing_ids = set(tag_id_map.values())
- if preferred_id is not None and preferred_id not in existing_ids:
- item_id = preferred_id
- else:
- # Make a range from 1 including the ID after the largest assigned
- # (hence the +2 since range is non-inclusive on the upper bound)
- max_assigned_id = max(existing_ids) if existing_ids else 0
- max_possible_id = (max_assigned_id + 2)
- possible_ids = set(range(1, max_possible_id))
-
- # Select the lowest unassigned ID
- item_id = min(possible_ids.difference(existing_ids))
-
- # Store the created id
- tag_id_map[item_hash] = item_id
-
- return (id_string(item_id), is_new_id)
-
-
-def _backreference_build(tag):
- """
- A decorator for functions creating XML elements to implement the id system
- described in FCP XML.
-
- This wrapper determines if the otio item is equivalent to one encountered
- before with the provided tag name. If the item hasn't been encountered then
- the wrapped function will be invoked and the XML element from that function
- will have the ``id`` attribute set and be stored in br_map.
- If the item is equivalent to a previously provided item, the wrapped
- function won't be invoked and a simple tag with the previous instance's id
- will be returned instead.
-
- The wrapped function must:
- - Have the otio item as the first positional argument.
- - Have br_map (backreference map, a dictionary) as the last positional
- arg. br_map stores the state for encountered items.
-
- :param tag: The xml tag of the element the wrapped function generates.
- """
- # We can also encode these back-references if an item is accessed multiple
- # times. To do this we store an id attribute on the element. For back-
- # references we then only need to return an empty element of that type with
- # the id we logged before
-
- def singleton_decorator(func):
- @functools.wraps(func)
- def wrapper(item, *args, **kwargs):
- br_map = args[-1]
-
- item_id, id_is_new = _backreference_for_item(item, tag, br_map)
-
- # if the item exists in the map already, we should use the
- # abbreviated XML element referring to the original
- if not id_is_new:
- return cElementTree.Element(tag, id=item_id)
-
- # This is the first time for this unique item, it needs it's full
- # XML. Get the element generated by the wrapped function and add
- # the id attribute.
- elem = func(item, *args, **kwargs)
- elem.attrib["id"] = item_id
-
- return elem
-
- return wrapper
-
- return singleton_decorator
-
-
-def _append_new_sub_element(parent, tag, attrib=None, text=None):
- """
- Creates a sub-element with the provided tag, attributes, and text.
-
- This is a convenience because the :class:`SubElement` constructor does not
- provide the ability to set ``text``.
-
- :param parent: The parent element.
- :param tag: The tag string for the element.
- :param attrib: An optional dictionary of attributes for the element.
- :param text: Optional text value for the element.
-
- :return: The new XML element.
- """
- elem = cElementTree.SubElement(parent, tag, **attrib or {})
- if text is not None:
- elem.text = text
-
- return elem
-
-
-def _build_rate(fps):
- """
- Given a framerate, makes a ``rate`` xml tree.
-
- :param fps: The framerate.
- :return: The fcp xml ``rate`` tree.
- """
- rate = math.ceil(fps)
-
- rate_e = cElementTree.Element('rate')
- _append_new_sub_element(rate_e, 'timebase', text=str(int(rate)))
- _append_new_sub_element(
- rate_e,
- 'ntsc',
- text='FALSE' if rate == fps else 'TRUE'
- )
- return rate_e
-
-
-def _build_timecode(time, fps, drop_frame=False, additional_metadata=None):
- """
- Makes a timecode xml element tree.
-
- .. warning:: The drop_frame parameter is currently ignored and
- auto-determined by rate. This is because the underlying otio timecode
- conversion assumes DFTC based on rate.
-
- :param time: The :class:`opentime.RationalTime` for the timecode.
- :param fps: The framerate for the timecode.
- :param drop_frame: If True, generates drop-frame timecode.
- :param additional_metadata: A dictionary with other metadata items like
- ``field``, ``reel``, ``source``, and ``format``. It is assumed this
- dictionary is of the form generated by :func:`_xml_tree_to_dict` when
- the file was read originally.
-
- :return: The ``timecode`` element.
- """
- if additional_metadata:
- # Only allow legal child items for the timecode element
- filtered = {
- k: v for k, v in additional_metadata.items()
- if k in {"field", "reel", "source", "format"}
- }
- tc_element = _dict_to_xml_tree(filtered, "timecode")
- else:
- tc_element = cElementTree.Element("timecode")
-
- tc_element.append(_build_rate(fps))
- rate_is_not_ntsc = (tc_element.find('./rate/ntsc').text == "FALSE")
- if drop_frame and rate_is_not_ntsc:
- tc_fps = fps * (1000 / 1001.0)
- else:
- tc_fps = fps
-
- # Get the time values
- tc_time = opentime.RationalTime(time.value_rescaled_to(fps), tc_fps)
- tc_string = opentime.to_timecode(tc_time, tc_fps, drop_frame)
-
- _append_new_sub_element(tc_element, "string", text=tc_string)
-
- frame_number = int(round(time.value))
- _append_new_sub_element(
- tc_element, "frame", text="{:.0f}".format(frame_number)
- )
-
- drop_frame = (";" in tc_string)
- display_format = "DF" if drop_frame else "NDF"
- _append_new_sub_element(tc_element, "displayformat", text=display_format)
-
- return tc_element
-
-
-def _build_item_timings(
- item_e,
- item,
- timeline_range,
- transition_offsets,
- timecode
-):
- # source_start is absolute time taking into account the timecode of the
- # media. But xml regards the source in point from the start of the media.
- # So we subtract the media timecode.
- item_rate = item.source_range.start_time.rate
- source_start = (item.source_range.start_time - timecode)
- source_start = source_start.rescaled_to(item_rate)
-
- source_end = (item.source_range.end_time_exclusive() - timecode)
- source_end = source_end.rescaled_to(item_rate)
-
- start = '{:.0f}'.format(timeline_range.start_time.value)
- end = '{:.0f}'.format(timeline_range.end_time_exclusive().value)
-
- item_e.append(_build_rate(item_rate))
-
- if transition_offsets[0] is not None:
- start = '-1'
- source_start -= transition_offsets[0]
- if transition_offsets[1] is not None:
- end = '-1'
- source_end += transition_offsets[1]
-
- _append_new_sub_element(
- item_e, 'duration',
- text='{:.0f}'.format(item.source_range.duration.value)
- )
- _append_new_sub_element(item_e, 'start', text=start)
- _append_new_sub_element(item_e, 'end', text=end)
- _append_new_sub_element(
- item_e,
- 'in',
- text='{:.0f}'.format(source_start.value)
- )
- _append_new_sub_element(
- item_e,
- 'out',
- text='{:.0f}'.format(source_end.value)
- )
-
-
-@_backreference_build('file')
-def _build_empty_file(media_ref, parent_range, br_map):
- file_e = _element_with_item_metadata("file", media_ref)
- _append_new_sub_element(file_e, "name", text=media_ref.name)
-
- if media_ref.available_range is not None:
- available_range = media_ref.available_range
- else:
- available_range = opentime.TimeRange(
- opentime.RationalTime(0, parent_range.start_time.rate),
- parent_range.duration,
- )
-
- ref_rate = available_range.start_time.rate
- file_e.append(_build_rate(ref_rate))
-
- # Only provide a duration if one came from the media, don't invent one.
- # For example, Slugs have no duration specified.
- if media_ref.available_range:
- duration = available_range.duration.rescaled_to(ref_rate)
- _append_new_sub_element(
- file_e,
- 'duration',
- text='{:.0f}'.format(duration.value),
- )
-
- # timecode
- ref_tc_metadata = media_ref.metadata.get(META_NAMESPACE, {}).get(
- "timecode"
- )
- tc_element = _build_timecode_from_metadata(
- available_range.start_time, ref_tc_metadata
- )
- file_e.append(tc_element)
-
- file_media_e = _get_or_create_subelement(file_e, "media")
- if file_media_e.find("video") is None:
- _append_new_sub_element(file_media_e, "video")
-
- return file_e
-
-
-@_backreference_build('file')
-def _build_file(media_reference, br_map):
- file_e = _element_with_item_metadata("file", media_reference)
-
- available_range = media_reference.available_range
- url_path = _url_to_path(media_reference.target_url)
-
- file_name = (
- media_reference.name if media_reference.name
- else os.path.basename(url_path)
- )
- _append_new_sub_element(file_e, 'name', text=file_name)
- _append_new_sub_element(file_e, 'pathurl', text=media_reference.target_url)
-
- # timing info
- file_e.append(_build_rate(available_range.start_time.rate))
- _append_new_sub_element(
- file_e, 'duration',
- text='{:.0f}'.format(available_range.duration.value)
- )
-
- # timecode
- ref_tc_metadata = media_reference.metadata.get(META_NAMESPACE, {}).get(
- "timecode"
- )
- tc_element = _build_timecode_from_metadata(
- available_range.start_time, ref_tc_metadata
- )
- file_e.append(tc_element)
-
- # we need to flag the file reference with the content types, otherwise it
- # will not get recognized
- # TODO: We should use a better method for this. Perhaps pre-walk the
- # timeline and find all the track kinds this media is present in?
- if not file_e.find("media"):
- file_media_e = _get_or_create_subelement(file_e, "media")
-
- audio_exts = {'.wav', '.aac', '.mp3', '.aif', '.aiff', '.m4a'}
- has_video = (os.path.splitext(url_path)[1].lower() not in audio_exts)
- if has_video and file_media_e.find("video") is None:
- _append_new_sub_element(file_media_e, "video")
-
- # TODO: This is assuming all files have an audio track. Not sure what
- # the implications of that are.
- if file_media_e.find("audio") is None:
- _append_new_sub_element(file_media_e, "audio")
-
- return file_e
-
-
-def _build_transition_item(
- transition_item,
- timeline_range,
- transition_offsets,
- br_map,
-):
- transition_e = _element_with_item_metadata(
- "transitionitem", transition_item
- )
- _append_new_sub_element(
- transition_e,
- 'start',
- text='{:.0f}'.format(timeline_range.start_time.value)
- )
- _append_new_sub_element(
- transition_e,
- 'end',
- text='{:.0f}'.format(timeline_range.end_time_exclusive().value)
- )
-
- # Only add an alignment if it didn't already come in from the metadata dict
- if transition_e.find("alignment") is None:
- # default center aligned
- alignment = "center"
- if not transition_item.in_offset.value:
- alignment = 'start-black'
- elif not transition_item.out_offset.value:
- alignment = 'end-black'
-
- _append_new_sub_element(transition_e, 'alignment', text=alignment)
- # todo support 'start' and 'end' alignment
-
- transition_e.append(_build_rate(timeline_range.start_time.rate))
-
- # Only add an effect if it didn't already come in from the metadata dict
- if not transition_e.find("./effect"):
- try:
- effectid = transition_item.metadata[META_NAMESPACE]["effectid"]
- except KeyError:
- effectid = "Cross Dissolve"
-
- effect_e = _append_new_sub_element(transition_e, 'effect')
- _append_new_sub_element(effect_e, 'name', text=transition_item.name)
- _append_new_sub_element(effect_e, 'effectid', text=effectid)
- _append_new_sub_element(effect_e, 'effecttype', text='transition')
- _append_new_sub_element(effect_e, 'mediatype', text='video')
-
- return transition_e
-
-
-@_backreference_build("clipitem")
-def _build_clip_item_without_media(
- clip_item,
- timeline_range,
- transition_offsets,
- br_map,
-):
- # TODO: Does this need to be a separate function or could it be unified
- # with _build_clip_item?
- clip_item_e = _element_with_item_metadata("clipitem", clip_item)
- if "frameBlend" not in clip_item_e.attrib:
- clip_item_e.attrib["frameBlend"] = "FALSE"
-
- if clip_item.media_reference.available_range:
- media_start_time = clip_item.media_reference.available_range.start_time
- else:
- media_start_time = opentime.RationalTime(
- 0, timeline_range.start_time.rate
- )
-
- _append_new_sub_element(clip_item_e, 'name', text=clip_item.name)
- clip_item_e.append(
- _build_empty_file(
- clip_item.media_reference, timeline_range, br_map
- )
- )
- clip_item_e.extend([_build_marker(m) for m in clip_item.markers])
-
- _build_item_timings(
- clip_item_e,
- clip_item,
- timeline_range,
- transition_offsets,
- media_start_time,
- )
-
- return clip_item_e
-
-
-@_backreference_build("clipitem")
-def _build_clip_item(clip_item, timeline_range, transition_offsets, br_map):
- is_generator = isinstance(
- clip_item.media_reference, schema.GeneratorReference
- )
-
- tagname = "generatoritem" if is_generator else "clipitem"
- clip_item_e = _element_with_item_metadata(tagname, clip_item)
- if "frameBlend" not in clip_item_e.attrib:
- clip_item_e.attrib["frameBlend"] = "FALSE"
-
- if is_generator:
- clip_item_e.append(_build_generator_effect(clip_item, br_map))
- else:
- clip_item_e.append(_build_file(clip_item.media_reference, br_map))
-
- # set the clip name from the media reference if not defined on the clip
- if clip_item.name is not None:
- name = clip_item.name
- elif is_generator:
- name = clip_item.media_reference.name
- else:
- url_path = _url_to_path(clip_item.media_reference.target_url)
- name = os.path.basename(url_path)
-
- _append_new_sub_element(clip_item_e, 'name', text=name)
-
- if clip_item.media_reference.available_range:
- clip_item_e.append(
- _build_rate(clip_item.source_range.start_time.rate)
- )
- clip_item_e.extend(_build_marker(m) for m in clip_item.markers)
-
- if clip_item.media_reference.available_range:
- timecode = clip_item.media_reference.available_range.start_time
- else:
- timecode = opentime.RationalTime(
- 0, clip_item.source_range.start_time.rate
- )
-
- _build_item_timings(
- clip_item_e,
- clip_item,
- timeline_range,
- transition_offsets,
- timecode
- )
-
- return clip_item_e
-
-
-def _build_generator_effect(clip_item, br_map):
- """
- Builds an effect element for the generator ref on the provided clip item.
-
- :param clip_item: a clip with a :class:`schema.GeneratorReference` as
- its ``media_reference``.
- :param br_map: The backreference map.
- """
- # Since we don't support effects in a standard way, just try and build
- # based on the metadata provided at deserialization so we can roundtrip
- generator_ref = clip_item.media_reference
- try:
- fcp_xml_effect_info = generator_ref.metadata[META_NAMESPACE]
- except KeyError:
- return _build_empty_file(
- generator_ref,
- clip_item.source_range,
- br_map,
- )
-
- # Get the XML Tree built from the metadata
- effect_element = _dict_to_xml_tree(fcp_xml_effect_info, "effect")
-
- # Validate the metadata and make sure it contains the required elements
- for required in ("effectid", "effecttype", "mediatype", "effectcategory"):
- if effect_element.find(required) is None:
- return _build_empty_file(
- generator_ref,
- clip_item.source_range,
- br_map,
- )
-
- # Add the name
- _append_new_sub_element(effect_element, "name", text=generator_ref.name)
-
- return effect_element
-
-
-@_backreference_build("clipitem")
-def _build_track_item(track, timeline_range, transition_offsets, br_map):
- clip_item_e = _element_with_item_metadata("clipitem", track)
- if "frameBlend" not in clip_item_e.attrib:
- clip_item_e.attrib["frameBlend"] = "FALSE"
-
- _append_new_sub_element(
- clip_item_e,
- 'name',
- text=os.path.basename(track.name)
- )
-
- track_e = _build_sequence_for_stack(track, timeline_range, br_map)
-
- clip_item_e.append(_build_rate(track.source_range.start_time.rate))
- clip_item_e.extend([_build_marker(m) for m in track.markers])
- clip_item_e.append(track_e)
- timecode = opentime.RationalTime(0, timeline_range.start_time.rate)
-
- _build_item_timings(
- clip_item_e,
- track,
- timeline_range,
- transition_offsets,
- timecode
- )
-
- return clip_item_e
-
-
-def _build_item(item, timeline_range, transition_offsets, br_map):
- if isinstance(item, schema.Transition):
- return _build_transition_item(
- item,
- timeline_range,
- transition_offsets,
- br_map
- )
- elif isinstance(item, schema.Clip):
- if isinstance(
- item.media_reference,
- schema.MissingReference
- ):
- return _build_clip_item_without_media(
- item,
- timeline_range,
- transition_offsets,
- br_map
- )
- else:
- return _build_clip_item(
- item,
- timeline_range,
- transition_offsets,
- br_map
- )
- elif isinstance(item, schema.Stack):
- return _build_track_item(
- item,
- timeline_range,
- transition_offsets,
- br_map
- )
- else:
- raise ValueError('Unsupported item: ' + str(item))
-
-
-def _build_top_level_track(track, track_rate, br_map):
- track_e = _element_with_item_metadata("track", track)
-
- for n, item in enumerate(track):
- if isinstance(item, schema.Gap):
- continue
-
- transition_offsets = [None, None]
- previous_item = track[n - 1] if n > 0 else None
- next_item = track[n + 1] if n + 1 < len(track) else None
- if not isinstance(item, schema.Transition):
- # find out if this item has any neighboring transition
- if isinstance(previous_item, schema.Transition):
- if previous_item.out_offset.value:
- transition_offsets[0] = previous_item.in_offset
- else:
- transition_offsets[0] = None
- if isinstance(next_item, schema.Transition):
- if next_item.in_offset.value:
- transition_offsets[1] = next_item.out_offset
- else:
- transition_offsets[1] = None
-
- timeline_range = track.range_of_child_at_index(n)
- timeline_range = opentime.TimeRange(
- timeline_range.start_time.rescaled_to(track_rate),
- timeline_range.duration.rescaled_to(track_rate)
- )
- track_e.append(
- _build_item(item, timeline_range, transition_offsets, br_map)
- )
-
- return track_e
-
-
-def _build_marker(marker):
- marker_e = _element_with_item_metadata("marker", marker)
-
- marked_range = marker.marked_range
-
- _append_new_sub_element(marker_e, 'name', text=marker.name)
- _append_new_sub_element(
- marker_e, 'in',
- text='{:.0f}'.format(marked_range.start_time.value)
- )
- _append_new_sub_element(marker_e, 'out', text='-1')
-
- return marker_e
-
-
-def _build_timecode_from_metadata(time, tc_metadata=None):
- """
- Makes a timecode element with the given time and (if available)
- ```timecode`` metadata stashed on input.
-
- :param time: The :class:`opentime.RationalTime` to encode.
- :param tc_metadata: The xml dict for the ``timecode`` element populated
- on read.
-
- :return: A timecode element.
- """
- if tc_metadata is None:
- tc_metadata = {}
-
- try:
- # Parse the rate in the preserved metadata, if available
- tc_rate = _rate_for_element(
- _dict_to_xml_tree(tc_metadata["rate"], "rate")
- )
- except KeyError:
- # Default to the rate in the start time
- tc_rate = time.rate
-
- drop_frame = (tc_metadata.get("displayformat", "NDF") == "DF")
-
- return _build_timecode(
- time,
- tc_rate,
- drop_frame,
- additional_metadata=tc_metadata,
- )
-
-
-@_backreference_build('sequence')
-def _build_sequence_for_timeline(timeline, timeline_range, br_map):
- sequence_e = _element_with_item_metadata("sequence", timeline)
-
- _add_stack_elements_to_sequence(
- timeline.tracks, sequence_e, timeline_range, br_map
- )
-
- # In the case of timelines, use the timeline name rather than the stack
- # name.
- if timeline.name:
- sequence_e.find('./name').text = timeline.name
-
- # Add the sequence global start
- if timeline.global_start_time is not None:
- seq_tc_metadata = timeline.metadata.get(META_NAMESPACE, {}).get(
- "timecode"
- )
- tc_element = _build_timecode_from_metadata(
- timeline.global_start_time, seq_tc_metadata
- )
- sequence_e.append(tc_element)
-
- return sequence_e
-
-
-@_backreference_build('sequence')
-def _build_sequence_for_stack(stack, timeline_range, br_map):
- sequence_e = _element_with_item_metadata("sequence", stack)
-
- _add_stack_elements_to_sequence(stack, sequence_e, timeline_range, br_map)
-
- return sequence_e
-
-
-def _add_stack_elements_to_sequence(stack, sequence_e, timeline_range, br_map):
- _append_new_sub_element(sequence_e, 'name', text=stack.name)
- _append_new_sub_element(
- sequence_e, 'duration',
- text='{:.0f}'.format(timeline_range.duration.value)
- )
- sequence_e.append(_build_rate(timeline_range.start_time.rate))
- track_rate = timeline_range.start_time.rate
-
- media_e = _get_or_create_subelement(sequence_e, "media")
- video_e = _get_or_create_subelement(media_e, 'video')
- audio_e = _get_or_create_subelement(media_e, 'audio')
-
- for track in stack:
- track_elements = _build_top_level_track(track, track_rate, br_map)
- if track.kind == schema.TrackKind.Video:
- video_e.append(track_elements)
- elif track.kind == schema.TrackKind.Audio:
- audio_e.append(track_elements)
-
- for marker in stack.markers:
- sequence_e.append(_build_marker(marker))
-
-
-def _build_collection(collection, br_map):
- tracks = []
- for item in collection:
- if not isinstance(item, schema.Timeline):
- continue
-
- timeline_range = opentime.TimeRange(
- start_time=item.global_start_time,
- duration=item.duration()
- )
- tracks.append(
- _build_sequence_for_timeline(item, timeline_range, br_map)
- )
-
- return tracks
-
-
-# --------------------
-# adapter requirements
-# --------------------
-
-def read_from_string(input_str):
- tree = cElementTree.fromstring(input_str)
-
- parser = FCP7XMLParser(tree)
- sequences = parser.top_level_sequences()
-
- if len(sequences) == 1:
- return sequences[0]
- elif len(sequences) > 1:
- return schema.SerializableCollection(
- name="Sequences",
- children=sequences,
- )
- else:
- raise ValueError('No top-level sequences found')
-
-
-def write_to_string(input_otio):
- tree_e = cElementTree.Element('xmeml', version="4")
- project_e = _append_new_sub_element(tree_e, 'project')
- _append_new_sub_element(project_e, 'name', text=input_otio.name)
- children_e = _append_new_sub_element(project_e, 'children')
-
- br_map = collections.defaultdict(dict)
-
- if isinstance(input_otio, schema.Timeline):
- timeline_range = opentime.TimeRange(
- start_time=input_otio.global_start_time,
- duration=input_otio.duration()
- )
- children_e.append(
- _build_sequence_for_timeline(
- input_otio, timeline_range, br_map
- )
- )
- elif isinstance(input_otio, schema.SerializableCollection):
- children_e.extend(
- _build_collection(input_otio, br_map)
- )
-
- return _make_pretty_string(tree_e)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/otio_json.py b/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/otio_json.py
deleted file mode 100644
index 66b8db2904..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/adapters/otio_json.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""This adapter lets you read and write native .otio files"""
-
-from .. import (
- core
-)
-
-
-# @TODO: Implement out of process plugins that hand around JSON
-
-
-def read_from_file(filepath):
- return core.deserialize_json_from_file(filepath)
-
-
-def read_from_string(input_str):
- return core.deserialize_json_from_string(input_str)
-
-
-def write_to_string(input_otio):
- return core.serialize_json_to_string(input_otio)
-
-
-def write_to_file(input_otio, filepath):
- return core.serialize_json_to_file(input_otio, filepath)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/__init__.py
deleted file mode 100644
index e211598bb3..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/__init__.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Algorithms for OTIO objects."""
-
-# flake8: noqa
-from .track_algo import (
- track_trimmed_to_range,
- track_with_expanded_transitions
-)
-
-from .stack_algo import (
- flatten_stack,
- top_clip_at_time,
-)
-
-from .filter import (
- filtered_composition,
- filtered_with_sequence_context
-)
-from .timeline_algo import (
- timeline_trimmed_to_range
-)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/filter.py b/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/filter.py
deleted file mode 100644
index 8f9e2ed41b..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/filter.py
+++ /dev/null
@@ -1,275 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2018 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Algorithms for filtering OTIO files. """
-
-import copy
-
-from .. import (
- schema
-)
-
-
-def _is_in(thing, container):
- return any(thing is item for item in container)
-
-
-def _isinstance_in(child, typelist):
- return any(isinstance(child, t) for t in typelist)
-
-
-def filtered_composition(
- root,
- unary_filter_fn,
- types_to_prune=None,
-):
- """Filter a deep copy of root (and children) with unary_filter_fn.
-
- types_to_prune:: tuple of types, example: (otio.schema.Gap,...)
-
- 1. Make a deep copy of root
- 2. Starting with root, perform a depth first traversal
- 3. For each item (including root):
- a. if types_to_prune is not None and item is an instance of a type
- in types_to_prune, prune it from the copy, continue.
- b. Otherwise, pass the copy to unary_filter_fn. If unary_filter_fn:
- I. returns an object: add it to the copy, replacing original
- II. returns a tuple: insert it into the list, replacing original
- III. returns None: prune it
- 4. If an item is pruned, do not traverse its children
- 5. Return the new deep copy.
-
- EXAMPLE 1 (filter):
- If your unary function is:
- def fn(thing):
- if thing.name == B:
- return thing' # some transformation of B
- else:
- return thing
-
- If you have a track: [A,B,C]
-
- filtered_composition(track, fn) => [A,B',C]
-
- EXAMPLE 2 (prune):
- If your unary function is:
- def fn(thing):
- if thing.name == B:
- return None
- else:
- return thing
-
- filtered_composition(track, fn) => [A,C]
-
- EXAMPLE 3 (expand):
- If your unary function is:
- def fn(thing):
- if thing.name == B:
- return tuple(B_1,B_2,B_3)
- else:
- return thing
-
- filtered_composition(track, fn) => [A,B_1,B_2,B_3,C]
-
- EXAMPLE 4 (prune gaps):
- track :: [Gap, A, Gap]
- filtered_composition(
- track, lambda _:_, types_to_prune=(otio.schema.Gap,)) => [A]
- """
-
- # deep copy everything
- mutable_object = copy.deepcopy(root)
-
- prune_list = set()
-
- header_list = [mutable_object]
-
- if isinstance(mutable_object, schema.Timeline):
- header_list.append(mutable_object.tracks)
-
- iter_list = header_list + list(mutable_object.each_child())
-
- for child in iter_list:
- if _safe_parent(child) is not None and _is_in(child.parent(), prune_list):
- prune_list.add(child)
- continue
-
- parent = None
- child_index = None
- if _safe_parent(child) is not None:
- child_index = child.parent().index(child)
- parent = child.parent()
- del child.parent()[child_index]
-
- # first try to prune
- if (types_to_prune and _isinstance_in(child, types_to_prune)):
- result = None
- # finally call the user function
- else:
- result = unary_filter_fn(child)
-
- if child is mutable_object:
- mutable_object = result
-
- if result is None:
- prune_list.add(child)
- continue
-
- if type(result) is not tuple:
- result = [result]
-
- if parent is not None:
- parent[child_index:child_index] = result
-
- return mutable_object
-
-
-def _safe_parent(child):
- if hasattr(child, 'parent'):
- return child.parent()
- return None
-
-
-def filtered_with_sequence_context(
- root,
- reduce_fn,
- types_to_prune=None,
-):
- """Filter a deep copy of root (and children) with reduce_fn.
-
- reduce_fn::function(previous_item, current, next_item) (see below)
- types_to_prune:: tuple of types, example: (otio.schema.Gap,...)
-
- 1. Make a deep copy of root
- 2. Starting with root, perform a depth first traversal
- 3. For each item (including root):
- a. if types_to_prune is not None and item is an instance of a type
- in types_to_prune, prune it from the copy, continue.
- b. Otherwise, pass (prev, copy, and next) to reduce_fn. If reduce_fn:
- I. returns an object: add it to the copy, replacing original
- II. returns a tuple: insert it into the list, replacing original
- III. returns None: prune it
-
- ** note that reduce_fn is always passed objects from the original
- deep copy, not what prior calls return. See below for examples
- 4. If an item is pruned, do not traverse its children
- 5. Return the new deep copy.
-
- EXAMPLE 1 (filter):
- >>> track = [A,B,C]
- >>> def fn(prev_item, thing, next_item):
- ... if prev_item.name == A:
- ... return D # some new clip
- ... else:
- ... return thing
- >>> filtered_with_sequence_context(track, fn) => [A,D,C]
-
- order of calls to fn:
- fn(None, A, B) => A
- fn(A, B, C) => D
- fn(B, C, D) => C # !! note that it was passed B instead of D.
-
- EXAMPLE 2 (prune):
- >>> track = [A,B,C]
- >>> def fn(prev_item, thing, next_item):
- ... if prev_item.name == A:
- ... return None # prune the clip
- ... else:
- ... return thing
- >>> filtered_with_sequence_context(track, fn) => [A,C]
-
- order of calls to fn:
- fn(None, A, B) => A
- fn(A, B, C) => None
- fn(B, C, D) => C # !! note that it was passed B instead of D.
-
- EXAMPLE 3 (expand):
- >>> def fn(prev_item, thing, next_item):
- ... if prev_item.name == A:
- ... return (D, E) # tuple of new clips
- ... else:
- ... return thing
- >>> filtered_with_sequence_context(track, fn) => [A, D, E, C]
-
- the order of calls to fn will be:
- fn(None, A, B) => A
- fn(A, B, C) => (D, E)
- fn(B, C, D) => C # !! note that it was passed B instead of D.
- """
-
- # deep copy everything
- mutable_object = copy.deepcopy(root)
-
- prune_list = set()
-
- header_list = [mutable_object]
-
- if isinstance(mutable_object, schema.Timeline):
- header_list.append(mutable_object.tracks)
-
- iter_list = header_list + list(mutable_object.each_child())
-
- # expand to include prev, next when appropriate
- expanded_iter_list = []
- for child in iter_list:
- if _safe_parent(child) and isinstance(child.parent(), schema.Track):
- prev_item, next_item = child.parent().neighbors_of(child)
- expanded_iter_list.append((prev_item, child, next_item))
- else:
- expanded_iter_list.append((None, child, None))
-
- for prev_item, child, next_item in expanded_iter_list:
- if _safe_parent(child) is not None and _is_in(child.parent(), prune_list):
- prune_list.add(child)
- continue
-
- parent = None
- child_index = None
- if _safe_parent(child) is not None:
- child_index = child.parent().index(child)
- parent = child.parent()
- del child.parent()[child_index]
-
- # first try to prune
- if types_to_prune and _isinstance_in(child, types_to_prune):
- result = None
- # finally call the user function
- else:
- result = reduce_fn(prev_item, child, next_item)
-
- if child is mutable_object:
- mutable_object = result
-
- if result is None:
- prune_list.add(child)
- continue
-
- if type(result) is not tuple:
- result = [result]
-
- if parent is not None:
- parent[child_index:child_index] = result
-
- return mutable_object
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/stack_algo.py b/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/stack_algo.py
deleted file mode 100644
index cdb6424b46..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/stack_algo.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-__doc__ = """ Algorithms for stack objects. """
-
-import copy
-
-from .. import (
- schema,
- opentime,
-)
-from . import (
- track_algo
-)
-
-
-def top_clip_at_time(in_stack, t):
- """Return the topmost visible child that overlaps with time t.
-
- Example:
- tr1: G1, A, G2
- tr2: [B------]
- G1, and G2 are gaps, A and B are clips.
-
- If t is within A, a will be returned. If t is within G1 or G2, B will be
- returned.
- """
-
- # ensure that it only runs on stacks
- if not isinstance(in_stack, schema.Stack):
- raise ValueError(
- "Argument in_stack must be of type otio.schema.Stack, "
- "not: '{}'".format(
- type(in_stack)
- )
- )
-
- # build a range to use the `each_child`method.
- search_range = opentime.TimeRange(
- start_time=t,
- # 0 duration so we are just sampling a point in time.
- # XXX Should this duration be equal to the length of one sample?
- # opentime.RationalTime(1, rate)?
- duration=opentime.RationalTime(0, t.rate)
- )
-
- # walk through the children of the stack in reverse order.
- for track in reversed(in_stack):
- valid_results = []
- if hasattr(track, "each_child"):
- valid_results = list(
- c for c in track.each_clip(search_range, shallow_search=True)
- if c.visible()
- )
-
- # XXX doesn't handle nested tracks/stacks at the moment
-
- for result in valid_results:
- return result
-
- return None
-
-
-def flatten_stack(in_stack):
- """Flatten a Stack, or a list of Tracks, into a single Track.
- Note that the 1st Track is the bottom one, and the last is the top.
- """
-
- flat_track = schema.Track()
- flat_track.name = "Flattened"
-
- # map of track to track.range_of_all_children
- range_track_map = {}
-
- def _get_next_item(
- in_stack,
- track_index=None,
- trim_range=None
- ):
- if track_index is None:
- # start with the top-most track
- track_index = len(in_stack) - 1
- if track_index < 0:
- # if you get to the bottom, you're done
- return
-
- track = in_stack[track_index]
- if trim_range is not None:
- track = track_algo.track_trimmed_to_range(track, trim_range)
-
- track_map = range_track_map.get(track)
- if track_map is None:
- track_map = track.range_of_all_children()
- range_track_map[track] = track_map
-
- for item in track:
- if (
- item.visible()
- or track_index == 0
- or isinstance(item, schema.Transition)
- ):
- yield item
- else:
- trim = track_map[item]
- if trim_range is not None:
- trim = opentime.TimeRange(
- start_time=trim.start_time + trim_range.start_time,
- duration=trim.duration
- )
- track_map[item] = trim
- for more in _get_next_item(in_stack, track_index - 1, trim):
- yield more
-
- for item in _get_next_item(in_stack):
- flat_track.append(copy.deepcopy(item))
-
- return flat_track
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/timeline_algo.py b/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/timeline_algo.py
deleted file mode 100644
index bbb0ae6275..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/timeline_algo.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# Copyright 2019 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Algorithms for timeline objects."""
-
-import copy
-
-from . import (
- track_algo
-)
-
-
-def timeline_trimmed_to_range(in_timeline, trim_range):
- """Returns a new timeline that is a copy of the in_timeline, but with items
- outside the trim_range removed and items on the ends trimmed to the
- trim_range. Note that the timeline is never expanded, only shortened.
- Please note that you could do nearly the same thing non-destructively by
- just setting the Track's source_range but sometimes you want to really cut
- away the stuff outside and that's what this function is meant for."""
- new_timeline = copy.deepcopy(in_timeline)
-
- for track_num, child_track in enumerate(in_timeline.tracks):
- # @TODO: put the trim_range into the space of the tracks
- # new_range = new_timeline.tracks.transformed_time_range(
- # trim_range,
- # child_track
- # )
-
- # trim the track and assign it to the new stack.
- new_timeline.tracks[track_num] = track_algo.track_trimmed_to_range(
- child_track,
- trim_range
- )
-
- return new_timeline
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/track_algo.py b/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/track_algo.py
deleted file mode 100644
index 8ac406f1d6..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/algorithms/track_algo.py
+++ /dev/null
@@ -1,236 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Algorithms for track objects."""
-
-import copy
-
-from .. import (
- schema,
- exceptions,
- opentime,
-)
-
-
-def track_trimmed_to_range(in_track, trim_range):
- """Returns a new track that is a copy of the in_track, but with items
- outside the trim_range removed and items on the ends trimmed to the
- trim_range. Note that the track is never expanded, only shortened.
- Please note that you could do nearly the same thing non-destructively by
- just setting the Track's source_range but sometimes you want to really cut
- away the stuff outside and that's what this function is meant for."""
- new_track = copy.deepcopy(in_track)
-
- track_map = new_track.range_of_all_children()
-
- # iterate backwards so we can delete items
- for c, child in reversed(list(enumerate(new_track))):
- child_range = track_map[child]
- if not trim_range.overlaps(child_range):
- # completely outside the trim range, so we discard it
- del new_track[c]
- elif trim_range.contains(child_range):
- # completely contained, keep the whole thing
- pass
- else:
- if isinstance(child, schema.Transition):
- raise exceptions.CannotTrimTransitionsError(
- "Cannot trim in the middle of a Transition."
- )
-
- # we need to clip the end(s)
- child_source_range = child.trimmed_range()
-
- # should we trim the start?
- if trim_range.start_time > child_range.start_time:
- trim_amount = trim_range.start_time - child_range.start_time
- child_source_range = opentime.TimeRange(
- start_time=child_source_range.start_time + trim_amount,
- duration=child_source_range.duration - trim_amount
-
- )
-
- # should we trim the end?
- trim_end = trim_range.end_time_exclusive()
- child_end = child_range.end_time_exclusive()
- if trim_end < child_end:
- trim_amount = child_end - trim_end
- child_source_range = opentime.TimeRange(
- start_time=child_source_range.start_time,
- duration=child_source_range.duration - trim_amount
-
- )
-
- # set the new child's trims
- child.source_range = child_source_range
-
- return new_track
-
-
-def track_with_expanded_transitions(in_track):
- """Expands transitions such that neighboring clips are trimmed into
- regions of overlap.
-
- For example, if your track is:
- Clip1, T, Clip2
-
- will return:
- Clip1', Clip1_t, T, Clip2_t, Clip2'
-
- Where Clip1' is the part of Clip1 not in the transition, Clip1_t is the
- part inside the transition and so on.
- """
-
- result_track = []
-
- seq_iter = iter(in_track)
- prev_thing = None
- thing = next(seq_iter, None)
- next_thing = next(seq_iter, None)
-
- while thing is not None:
- if isinstance(thing, schema.Transition):
- result_track.append(_expand_transition(thing, in_track))
- else:
- # not a transition, but might be trimmed by one before or after
- # in the track
- pre_transition = None
- next_transition = None
-
- if isinstance(prev_thing, schema.Transition):
- pre_transition = prev_thing
-
- if isinstance(next_thing, schema.Transition):
- next_transition = next_thing
-
- result_track.append(
- _trim_from_transitions(
- thing,
- pre=pre_transition,
- post=next_transition
- )
- )
-
- # loop
- prev_thing = thing
- thing = next_thing
- next_thing = next(seq_iter, None)
-
- return result_track
-
-
-def _expand_transition(target_transition, from_track):
- """ Expand transitions into the portions of pre-and-post clips that
- overlap with the transition.
- """
-
- result = from_track.neighbors_of(
- target_transition,
- schema.NeighborGapPolicy.around_transitions
- )
-
- trx_duration = target_transition.in_offset + target_transition.out_offset
-
- # make copies of the before and after, and modify their in/out points
- pre = copy.deepcopy(result.previous)
-
- if isinstance(pre, schema.Transition):
- raise exceptions.TransitionFollowingATransitionError(
- "cannot put two transitions next to each other in a track: "
- "{}, {}".format(
- pre,
- target_transition
- )
- )
- if target_transition.in_offset is None:
- raise RuntimeError(
- "in_offset is None on: {}".format(target_transition)
- )
-
- if target_transition.out_offset is None:
- raise RuntimeError(
- "out_offset is None on: {}".format(target_transition)
- )
-
- pre.name = (pre.name or "") + "_transition_pre"
-
- # ensure that pre.source_range is set, because it will get manipulated
- tr = pre.trimmed_range()
-
- pre.source_range = opentime.TimeRange(
- start_time=(
- tr.end_time_exclusive() - target_transition.in_offset
- ),
- duration=trx_duration.rescaled_to(
- tr.start_time
- )
- )
-
- post = copy.deepcopy(result.next)
- if isinstance(post, schema.Transition):
- raise exceptions.TransitionFollowingATransitionError(
- "cannot put two transitions next to each other in a track: "
- "{}, {}".format(
- target_transition,
- post
- )
- )
-
- post.name = (post.name or "") + "_transition_post"
-
- # ensure that post.source_range is set, because it will get manipulated
- tr = post.trimmed_range()
-
- post.source_range = opentime.TimeRange(
- start_time=(
- tr.start_time - target_transition.in_offset
- ).rescaled_to(tr.start_time),
- duration=trx_duration.rescaled_to(tr.start_time)
- )
-
- return pre, target_transition, post
-
-
-def _trim_from_transitions(thing, pre=None, post=None):
- """ Trim clips next to transitions. """
-
- result = copy.deepcopy(thing)
-
- # We might not have a source_range yet,
- # We can trim to the computed trimmed_range to
- # ensure we have something.
- new_range = result.trimmed_range()
- start_time = new_range.start_time
- duration = new_range.duration
-
- if pre:
- start_time += pre.out_offset
- duration -= pre.out_offset
-
- if post:
- duration -= post.in_offset
-
- result.source_range = opentime.TimeRange(start_time, duration)
-
- return result
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/console/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio/console/__init__.py
deleted file mode 100644
index e5f6e86988..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/console/__init__.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# Copyright 2018 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Console scripts for OpenTimelineIO
-
-.. moduleauthor:: Pixar Animation Studios
-"""
-
-# flake8: noqa
-
-# in dependency hierarchy
-from . import (
- otioconvert,
- otiocat,
- otiostat,
- console_utils,
- autogen_serialized_datamodel,
-)
-
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/console/autogen_serialized_datamodel.py b/client/ayon_core/vendor/python/python_2/opentimelineio/console/autogen_serialized_datamodel.py
deleted file mode 100644
index 046e8cbd1c..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/console/autogen_serialized_datamodel.py
+++ /dev/null
@@ -1,302 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2019 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-
-"""Generates documentation of the serialized data model for OpenTimelineIO."""
-
-import argparse
-import inspect
-import json
-import tempfile
-import sys
-
-try:
- # python2
- import StringIO as io
-except ImportError:
- # python3
- import io
-
-import opentimelineio as otio
-
-
-DOCUMENT_HEADER = """# OpenTimelineIO Serialized Data Documentation
-
-This document is a list of all the OpenTimelineIO classes that serialize to and
-from JSON, omitting SchemaDef plugins.
-
-This document is automatically generated by running
- docs/autogen_serialized_datamodel.py, or by running `make doc-model`. It is
- part of the unit tests suite and should be updated whenever the schema changes.
- If it needs to be updated, run: `make doc-model-update` and this file should be
- regenerated.
-
-# Classes
-
-"""
-
-FIELDS_ONLY_HEADER = """# OpenTimelineIO Serialized Data Documentation
-
-This document is a list of all the OpenTimelineIO classes that serialize to and
-from JSON, omitting plugins classes and docstrings.
-
-This document is automatically generated by running
- docs/autogen_serialized_datamodel.py, or by running `make doc-model`. It is
- part of the unit tests suite and should be updated whenever the schema changes.
- If it needs to be updated, run: `make doc-model-update` and this file should be
- regenerated.
-
-# Classes
-
-"""
-
-CLASS_HEADER_WITH_DOCS = """
-### {classname}
-
-*full module path*: `{modpath}`
-
-*documentation*:
-
-```
-{docstring}
-```
-
-parameters:
-"""
-
-CLASS_HEADER_ONLY_FIELDS = """
-### {classname}
-
-parameters:
-"""
-
-MODULE_HEADER = """
-## Module: {modname}
-"""
-
-PROP_HEADER = """- *{propkey}*: {prophelp}
-"""
-
-# @TODO: having type information here would be awesome
-PROP_HEADER_NO_HELP = """- *{propkey}*
-"""
-
-# three ways to try and get the property + docstring
-PROP_FETCHERS = (
- lambda cl, k: inspect.getdoc(getattr(cl, k)),
- lambda cl, k: inspect.getdoc(getattr(cl, "_" + k)),
- lambda cl, k: inspect.getdoc(getattr(cl(), k)) and "" or "",
-)
-
-
-def _parsed_args():
- """ parse commandline arguments with argparse """
-
- parser = argparse.ArgumentParser(
- description=__doc__,
- formatter_class=argparse.ArgumentDefaultsHelpFormatter
- )
- group = parser.add_mutually_exclusive_group()
- group.add_argument(
- "-d",
- "--dryrun",
- action="store_true",
- default=False,
- help="Dryrun mode - print out instead of perform actions"
- )
- group.add_argument(
- "-o",
- "--output",
- type=str,
- default=None,
- help="Update the baseline with the current version"
- )
-
- return parser.parse_args()
-
-
-# things to skip
-SKIP_CLASSES = [otio.core.SerializableObject, otio.core.UnknownSchema]
-SKIP_KEYS = ["OTIO_SCHEMA"] # not data, just for the backing format
-SKIP_MODULES = ["opentimelineio.schemadef"] # because these are plugins
-
-
-def _generate_model_for_module(mod, classes, modules):
- modules.add(mod)
-
- # fetch the classes from this module
- serializeable_classes = [
- thing for thing in mod.__dict__.values()
- if (
- inspect.isclass(thing)
- and thing not in classes
- and issubclass(thing, otio.core.SerializableObject)
- or thing in (
- otio.opentime.RationalTime,
- otio.opentime.TimeRange,
- otio.opentime.TimeTransform,
- )
- )
- ]
-
- # serialize/deserialize the classes to capture their serialized parameters
- model = {}
- for cl in serializeable_classes:
- if cl in SKIP_CLASSES:
- continue
-
- model[cl] = {}
- field_dict = json.loads(otio.adapters.otio_json.write_to_string(cl()))
- for k in field_dict.keys():
- if k in SKIP_KEYS:
- continue
-
- for fetcher in PROP_FETCHERS:
- try:
- model[cl][k] = fetcher(cl, k)
- break
- except AttributeError:
- pass
- else:
- sys.stderr.write("ERROR: could not fetch property: {}".format(k))
-
- # Stashing the OTIO_SCHEMA back into the dictionary since the
- # documentation uses this information in its header.
- model[cl]["OTIO_SCHEMA"] = field_dict["OTIO_SCHEMA"]
-
- classes.update(model)
-
- # find new modules to recurse into
- new_mods = sorted(
- (
- thing for thing in mod.__dict__.values()
- if (
- inspect.ismodule(thing)
- and thing not in modules
- and all(not thing.__name__.startswith(t) for t in SKIP_MODULES)
- )
- ),
- key=lambda mod: str(mod)
- )
-
- # recurse into the new modules and update the classes and modules values
- [_generate_model_for_module(m, classes, modules) for m in new_mods]
-
-
-def _generate_model():
- classes = {}
- modules = set()
- _generate_model_for_module(otio, classes, modules)
- return classes
-
-
-def _write_documentation(model):
- md_with_helpstrings = io.StringIO()
- md_only_fields = io.StringIO()
-
- md_with_helpstrings.write(DOCUMENT_HEADER)
- md_only_fields.write(FIELDS_ONLY_HEADER)
-
- modules = {}
- for cl in model:
- modules.setdefault(cl.__module__, []).append(cl)
-
- CURRENT_MODULE = None
- for module_list in sorted(modules):
- this_mod = ".".join(module_list.split('.')[:2])
- if this_mod != CURRENT_MODULE:
- CURRENT_MODULE = this_mod
- md_with_helpstrings.write(MODULE_HEADER.format(modname=this_mod))
- md_only_fields.write(MODULE_HEADER.format(modname=this_mod))
-
- # because these are classes, they need to sort on their stringified
- # names
- for cl in sorted(modules[module_list], key=lambda cl: str(cl)):
- modname = inspect.getmodule(cl).__name__
- label = model[cl]["OTIO_SCHEMA"]
- md_with_helpstrings.write(
- CLASS_HEADER_WITH_DOCS.format(
- classname=label,
- modpath=modname + "." + cl.__name__,
- docstring=cl.__doc__
- )
- )
- md_only_fields.write(
- CLASS_HEADER_ONLY_FIELDS.format(
- classname=label,
- )
- )
-
- for key, helpstr in sorted(model[cl].items()):
- if key in SKIP_KEYS:
- continue
- md_with_helpstrings.write(
- PROP_HEADER.format(propkey=key, prophelp=helpstr)
- )
- md_only_fields.write(
- PROP_HEADER_NO_HELP.format(propkey=key)
- )
-
- return md_with_helpstrings.getvalue(), md_only_fields.getvalue()
-
-
-def main():
- """ main entry point """
- args = _parsed_args()
- with_docs, without_docs = generate_and_write_documentation()
-
- # print it out somewhere
- if args.dryrun:
- print(with_docs)
- return
-
- output = args.output
- if not output:
- output = tempfile.NamedTemporaryFile(
- 'w',
- suffix="otio_serialized_schema.md",
- delete=False
- ).name
-
- with open(output, 'w') as fo:
- fo.write(with_docs)
-
- # write version without docstrings
- prefix, suffix = output.rsplit('.', 1)
- output_only_fields = prefix + "-only-fields." + suffix
-
- with open(output_only_fields, 'w') as fo:
- fo.write(without_docs)
-
- print("wrote documentation to {} and {}".format(output, output_only_fields))
-
-
-def generate_and_write_documentation():
- model = _generate_model()
- return _write_documentation(model)
-
-
-if __name__ == '__main__':
- main()
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/console/console_utils.py b/client/ayon_core/vendor/python/python_2/opentimelineio/console/console_utils.py
deleted file mode 100644
index 9c659433e3..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/console/console_utils.py
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# Copyright 2019 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-import ast
-
-from .. import (
- media_linker,
-)
-
-"""Utilities for OpenTimelineIO commandline modules."""
-
-
-def arg_list_to_map(arg_list, label):
- """
- Convert an argument of the form -A foo=bar from the parsed result to a map.
- """
-
- argument_map = {}
- for pair in arg_list:
- if '=' not in pair:
- raise ValueError(
- "error: {} arguments must be in the form key=value"
- " got: {}".format(label, pair)
- )
-
- key, val = pair.split('=', 1) # only split on the 1st '='
- try:
- # Sometimes we need to pass a bool, int, list, etc.
- parsed_value = ast.literal_eval(val)
- except (ValueError, SyntaxError):
- # Fall back to a simple string
- parsed_value = val
- argument_map[key] = parsed_value
-
- return argument_map
-
-
-def media_linker_name(ml_name_arg):
- """
- Parse commandline arguments for the media linker, which can be not set
- (fall back to default), "" or "none" (don't link media) or the name of a
- media linker to use.
- """
- if ml_name_arg.lower() == 'default':
- media_linker_name = media_linker.MediaLinkingPolicy.ForceDefaultLinker
- elif ml_name_arg.lower() in ['none', '']:
- media_linker_name = media_linker.MediaLinkingPolicy.DoNotLinkMedia
- else:
- media_linker_name = ml_name_arg
-
- return media_linker_name
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/console/otiocat.py b/client/ayon_core/vendor/python/python_2/opentimelineio/console/otiocat.py
deleted file mode 100644
index 9513144512..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/console/otiocat.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Print the contents of an OTIO file to stdout."""
-
-import argparse
-import sys
-
-import opentimelineio as otio
-
-
-def _parsed_args():
- """ parse commandline arguments with argparse """
-
- parser = argparse.ArgumentParser(
- description=__doc__,
- formatter_class=argparse.ArgumentDefaultsHelpFormatter
- )
- parser.add_argument(
- 'filepath',
- type=str,
- nargs='+',
- help='files to print the contents of'
- )
- parser.add_argument(
- '-a',
- '--adapter-arg',
- type=str,
- default=[],
- action='append',
- help='Extra arguments to be passed to input adapter in the form of '
- 'key=value. Values are strings, numbers or Python literals: True, '
- 'False, etc. Can be used multiple times: -a burrito="bar" -a taco=12.'
- )
- parser.add_argument(
- '-m',
- '--media-linker',
- type=str,
- default="Default",
- help=(
- "Specify a media linker. 'Default' means use the "
- "$OTIO_DEFAULT_MEDIA_LINKER if set, 'None' or '' means explicitly "
- "disable the linker, and anything else is interpreted as the name"
- " of the media linker to use."
- )
- )
- parser.add_argument(
- '-M',
- '--media-linker-arg',
- type=str,
- default=[],
- action='append',
- help='Extra arguments to be passed to the media linker in the form of '
- 'key=value. Values are strings, numbers or Python literals: True, '
- 'False, etc. Can be used multiple times: -M burrito="bar" -M taco=12.'
- )
-
- return parser.parse_args()
-
-
-def _otio_compatible_file_to_json_string(
- fpath,
- media_linker_name,
- media_linker_argument_map,
- adapter_argument_map
-):
- """Read the file at fpath with the default otio adapter and return the json
- as a string.
- """
-
- adapter = otio.adapters.from_name("otio_json")
- return adapter.write_to_string(
- otio.adapters.read_from_file(
- fpath,
- media_linker_name=media_linker_name,
- media_linker_argument_map=media_linker_argument_map,
- **adapter_argument_map
- )
- )
-
-
-def main():
- """Parse arguments and call _otio_compatible_file_to_json_string."""
-
- args = _parsed_args()
-
- media_linker_name = otio.console.console_utils.media_linker_name(
- args.media_linker
- )
-
- try:
- read_adapter_arg_map = otio.console.console_utils.arg_list_to_map(
- args.adapter_arg,
- "adapter"
- )
- media_linker_argument_map = otio.console.console_utils.arg_list_to_map(
- args.media_linker_arg,
- "media linker"
- )
- except ValueError as exc:
- sys.stderr.write("\n" + str(exc) + "\n")
- sys.exit(1)
-
- for fpath in args.filepath:
- print(
- _otio_compatible_file_to_json_string(
- fpath,
- media_linker_name,
- media_linker_argument_map,
- read_adapter_arg_map
- )
- )
-
-
-if __name__ == '__main__':
- main()
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/console/otioconvert.py b/client/ayon_core/vendor/python/python_2/opentimelineio/console/otioconvert.py
deleted file mode 100644
index 9d45a0fcf4..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/console/otioconvert.py
+++ /dev/null
@@ -1,259 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-import argparse
-import sys
-import copy
-
-import opentimelineio as otio
-
-__doc__ = """ Python wrapper around OTIO to convert timeline files between \
-formats.
-
-Available adapters: {}
-""".format(otio.adapters.available_adapter_names())
-
-
-def _parsed_args():
- """ parse commandline arguments with argparse """
-
- parser = argparse.ArgumentParser(
- description=__doc__,
- formatter_class=argparse.ArgumentDefaultsHelpFormatter
- )
- parser.add_argument(
- '-i',
- '--input',
- type=str,
- required=True,
- help='path to input file',
- )
- parser.add_argument(
- '-o',
- '--output',
- type=str,
- required=True,
- help='path to output file',
- )
- parser.add_argument(
- '-I',
- '--input-adapter',
- type=str,
- default=None,
- help="Explicitly use this adapter for reading the input file",
- )
- parser.add_argument(
- '-O',
- '--output-adapter',
- type=str,
- default=None,
- help="Explicitly use this adapter for writing the output file",
- )
- parser.add_argument(
- '-T',
- '--tracks',
- type=str,
- default=None,
- help="Pick one or more tracks, by 0-based index, separated by commas.",
- )
- parser.add_argument(
- '-m',
- '--media-linker',
- type=str,
- default="Default",
- help=(
- "Specify a media linker. 'Default' means use the "
- "$OTIO_DEFAULT_MEDIA_LINKER if set, 'None' or '' means explicitly "
- "disable the linker, and anything else is interpreted as the name"
- " of the media linker to use."
- )
- )
- parser.add_argument(
- '-M',
- '--media-linker-arg',
- type=str,
- default=[],
- action='append',
- help='Extra arguments to be passed to the media linker in the form of '
- 'key=value. Values are strings, numbers or Python literals: True, '
- 'False, etc. Can be used multiple times: -M burrito="bar" -M taco=12.'
- )
- parser.add_argument(
- '-a',
- '--adapter-arg',
- type=str,
- default=[],
- action='append',
- help='Extra arguments to be passed to input adapter in the form of '
- 'key=value. Values are strings, numbers or Python literals: True, '
- 'False, etc. Can be used multiple times: -a burrito="bar" -a taco=12.'
- )
- parser.add_argument(
- '-A',
- '--output-adapter-arg',
- type=str,
- default=[],
- action='append',
- help='Extra arguments to be passed to output adapter in the form of '
- 'key=value. Values are strings, numbers or Python literals: True, '
- 'False, etc. Can be used multiple times: -A burrito="bar" -A taco=12.'
- )
- trim_args = parser.add_argument_group(
- title="Trim Arguments",
- description="Arguments that allow you to trim the OTIO file."
- )
- trim_args.add_argument(
- '--begin',
- type=str,
- default=None,
- help=(
- "Trim out everything in the timeline before this time, in the "
- "global time frame of the timeline. Argument should be in the form"
- ' "VALUE,RATE", eg: --begin "10,24". Requires --end argument.'
- ),
- )
- trim_args.add_argument(
- '--end',
- type=str,
- default=None,
- help=(
- "Trim out everything in the timeline after this time, in the "
- "global time frame of the timeline. Argument should be in the form"
- ' "VALUE,RATE", eg: --begin "10,24". Requires --begin argument.'
- ),
- )
-
- result = parser.parse_args()
-
- if result.begin is not None and result.end is None:
- parser.error("--begin requires --end.")
- if result.end is not None and result.begin is None:
- parser.error("--end requires --begin.")
-
- if result.begin is not None:
- try:
- value, rate = result.begin.split(",")
- result.begin = otio.opentime.RationalTime(float(value), float(rate))
- except ValueError:
- parser.error(
- "--begin argument needs to be of the form: VALUE,RATE where "
- "VALUE is the (float) time value of the resulting RationalTime "
- "and RATE is the (float) time rate of the resulting RationalTime,"
- " not '{}'".format(result.begin)
- )
-
- if result.end is not None:
- try:
- value, rate = result.end.split(",")
- result.end = otio.opentime.RationalTime(float(value), float(rate))
- except ValueError:
- parser.error(
- "--end argument needs to be of the form: VALUE,RATE where "
- "VALUE is the (float) time value of the resulting RationalTime "
- "and RATE is the (float) time rate of the resulting RationalTime,"
- " not '{}'".format(result.begin)
- )
-
- return result
-
-
-def main():
- """Parse arguments and convert the files."""
-
- args = _parsed_args()
-
- in_adapter = args.input_adapter
- if in_adapter is None:
- in_adapter = otio.adapters.from_filepath(args.input).name
-
- out_adapter = args.output_adapter
- if out_adapter is None:
- out_adapter = otio.adapters.from_filepath(args.output).name
-
- media_linker_name = otio.console.console_utils.media_linker_name(
- args.media_linker
- )
-
- try:
- read_adapter_arg_map = otio.console.console_utils.arg_list_to_map(
- args.adapter_arg,
- "input adapter"
- )
- ml_args = otio.console.console_utils.arg_list_to_map(
- args.media_linker_arg,
- "media linker"
- )
- except ValueError as exc:
- sys.stderr.write("\n" + str(exc) + "\n")
- sys.exit(1)
-
- result_tl = otio.adapters.read_from_file(
- args.input,
- in_adapter,
- media_linker_name=media_linker_name,
- media_linker_argument_map=ml_args,
- **read_adapter_arg_map
- )
-
- if args.tracks:
- result_tracks = copy.deepcopy(otio.schema.Stack())
- del result_tracks[:]
- for track in args.tracks.split(","):
- tr = result_tl.tracks[int(track)]
- del result_tl.tracks[int(track)]
- print("track {0} is of kind: '{1}'".format(track, tr.kind))
- result_tracks.append(tr)
- result_tl.tracks = result_tracks
-
- # handle trim arguments
- if args.begin is not None and args.end is not None:
- result_tl = otio.algorithms.timeline_trimmed_to_range(
- result_tl,
- otio.opentime.range_from_start_end_time(args.begin, args.end)
- )
-
- try:
- write_adapter_arg_map = otio.console.console_utils.arg_list_to_map(
- args.output_adapter_arg,
- "output adapter"
- )
- except ValueError as exc:
- sys.stderr.write("\n" + str(exc) + "\n")
- sys.exit(1)
-
- otio.adapters.write_to_file(
- result_tl,
- args.output,
- out_adapter,
- **write_adapter_arg_map
- )
-
-
-if __name__ == '__main__':
- try:
- main()
- except otio.exceptions.OTIOError as err:
- sys.stderr.write("ERROR: " + str(err) + "\n")
- sys.exit(1)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/console/otiostat.py b/client/ayon_core/vendor/python/python_2/opentimelineio/console/otiostat.py
deleted file mode 100644
index 9cd554727a..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/console/otiostat.py
+++ /dev/null
@@ -1,193 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Print statistics about the otio file, including validation information."""
-
-import argparse
-import sys
-
-import opentimelineio as otio
-
-
-def _parsed_args():
- """ parse commandline arguments with argparse """
-
- parser = argparse.ArgumentParser(
- description=__doc__,
- formatter_class=argparse.ArgumentDefaultsHelpFormatter
- )
- parser.add_argument(
- 'filepath',
- type=str,
- nargs='+',
- help='files to operate on'
- )
-
- return parser.parse_args()
-
-
-TESTS = []
-
-
-def stat_check(name):
- def real_stat_check(fn):
- TESTS.append((name, fn))
- return fn
- return real_stat_check
-
-
-@stat_check("parsed")
-def _did_parse(input):
- return input and True or False
-
-
-@stat_check("top level object")
-def _top_level_object(input):
- return input._serializable_label
-
-
-@stat_check("number of tracks")
-def _num_tracks(input):
- try:
- return len(input.tracks)
- except AttributeError:
- return 0
-
-
-@stat_check("Tracks are the same length")
-def _equal_length_tracks(tl):
- if not tl.tracks:
- return True
- for i, track in enumerate(tl.tracks):
- if track.duration() != tl.tracks[0].duration():
- raise RuntimeError(
- "track {} is not the same duration as the other tracks."
- " Track {} duration, vs: {}".format(
- i,
- track.duration(),
- tl.tracks[0].duration()
- )
- )
- return True
-
-
-@stat_check("deepest nesting")
-def _deepest_nesting(input):
- def depth(parent):
- if not isinstance(parent, otio.core.Composition):
- return 1
- d = 0
- for child in parent:
- d = max(d, depth(child) + 1)
- return d
- if isinstance(input, otio.schema.Timeline):
- return depth(input.tracks) + 1
- else:
- return depth(input)
-
-
-@stat_check("number of clips")
-def _num_clips(input):
- return len(list(input.each_clip()))
-
-
-@stat_check("total duration")
-def _total_duration(input):
- try:
- return input.tracks.duration()
- except AttributeError:
- return "n/a"
-
-
-@stat_check("total duration in timecode")
-def _total_duration_timecode(input):
- try:
- d = input.tracks.duration()
- return otio.opentime.to_timecode(d, d.rate)
- except AttributeError:
- return "n/a"
-
-
-@stat_check("top level rate")
-def _top_level_rate(input):
- try:
- return input.tracks.duration().rate
- except AttributeError:
- return "n/a"
-
-
-@stat_check("clips with cdl data")
-def _clips_with_cdl_data(input):
- return len(list(c for c in input.each_clip() if 'cdl' in c.metadata))
-
-
-@stat_check("Tracks with non standard types")
-def _sequences_with_non_standard_types(input):
- return len(
- list(
- c
- for c in input.each_child(descended_from_type=otio.schema.Track)
- if c.kind not in (otio.schema.TrackKind.__dict__)
- )
- )
-
-
-def _stat_otio(input_otio):
- for (test, testfunc) in TESTS:
- try:
- print("{}: {}".format(test, testfunc(input_otio)))
- except (otio.exceptions.OTIOError) as e:
- sys.stderr.write(
- "There was an OTIO Error: "
- " {}\n".format(e),
- )
- continue
- except (Exception) as e:
- sys.stderr.write("There was a system error: {}\n".format(e))
- continue
-
-
-def main():
- """ main entry point """
- args = _parsed_args()
-
- for fp in args.filepath:
- try:
- parsed_otio = otio.adapters.read_from_file(fp)
- except (otio.exceptions.OTIOError) as e:
- sys.stderr.write(
- "The file did not successfully parse, with error:"
- " {}\n".format(e),
- )
- continue
- except (Exception) as e:
- sys.stderr.write("There was a system error: {}\n".format(e))
- continue
-
- _stat_otio(parsed_otio)
-
-
-if __name__ == '__main__':
- main()
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/__init__.py
deleted file mode 100644
index ac5c0bbcc0..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/__init__.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Internal implementation details of OpenTimelineIO."""
-
-# flake8: noqa
-
-from . import (
- serializable_object
-)
-from .serializable_object import (
- SerializableObject,
- serializable_field,
- deprecated_field,
-)
-from .composable import (
- Composable
-)
-from .item import (
- Item
-)
-from . import composition
-from .composition import (
- Composition,
-)
-from . import type_registry
-from .type_registry import (
- register_type,
- upgrade_function_for,
- schema_name_from_label,
- schema_version_from_label,
- instance_from_schema,
-)
-from .json_serializer import (
- serialize_json_to_string,
- serialize_json_to_file,
- deserialize_json_from_string,
- deserialize_json_from_file,
-)
-from .media_reference import (
- MediaReference,
-)
-from . import unknown_schema
-from .unknown_schema import (
- UnknownSchema
-)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/composable.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/composable.py
deleted file mode 100644
index 78c7fba349..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/composable.py
+++ /dev/null
@@ -1,141 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Composable class definition.
-
-An object that can be composed by tracks.
-"""
-
-import weakref
-
-from . import serializable_object
-from . import type_registry
-
-import copy
-
-
-@type_registry.register_type
-class Composable(serializable_object.SerializableObject):
- """An object that can be composed by tracks.
-
- Base class of:
- Item
- Transition
- """
-
- name = serializable_object.serializable_field(
- "name",
- doc="Composable name."
- )
- metadata = serializable_object.serializable_field(
- "metadata",
- doc="Metadata dictionary for this Composable."
- )
-
- _serializable_label = "Composable.1"
- _class_path = "core.Composable"
-
- def __init__(self, name=None, metadata=None):
- super(Composable, self).__init__()
- self._parent = None
-
- # initialize the serializable fields
- self.name = name
- self.metadata = copy.deepcopy(metadata) if metadata else {}
-
- @staticmethod
- def visible():
- """Return the visibility of the Composable. By default True."""
-
- return False
-
- @staticmethod
- def overlapping():
- """Return whether an Item is overlapping. By default False."""
-
- return False
-
- # @{ functions to express the composable hierarchy
- def _root_parent(self):
- return ([self] + self._ancestors())[-1]
-
- def _ancestors(self):
- ancestors = []
- seqi = self
- while seqi.parent() is not None:
- seqi = seqi.parent()
- ancestors.append(seqi)
- return ancestors
-
- def parent(self):
- """Return the parent Composable, or None if self has no parent."""
-
- return self._parent() if self._parent is not None else None
-
- def _set_parent(self, new_parent):
- if new_parent is not None and self.parent() is not None:
- raise ValueError(
- "Composable named '{}' is already in a composition named '{}',"
- " remove from previous parent before adding to new one."
- " Composable: {}, Composition: {}".format(
- self.name,
- self.parent() is not None and self.parent().name or None,
- self,
- self.parent()
- )
- )
- self._parent = weakref.ref(new_parent) if new_parent is not None else None
-
- def is_parent_of(self, other):
- """Returns true if self is a parent or ancestor of other."""
-
- visited = set([])
- while other.parent() is not None and other.parent() not in visited:
- if other.parent() is self:
- return True
- visited.add(other)
- other = other.parent()
-
- return False
-
- # @}
-
- def __repr__(self):
- return (
- "otio.{}("
- "name={}, "
- "metadata={}"
- ")".format(
- self._class_path,
- repr(self.name),
- repr(self.metadata)
- )
- )
-
- def __str__(self):
- return "{}({}, {})".format(
- self._class_path.split('.')[-1],
- self.name,
- str(self.metadata)
- )
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/composition.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/composition.py
deleted file mode 100644
index 4da5a4b091..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/composition.py
+++ /dev/null
@@ -1,718 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Composition base class. An object that contains `Items`."""
-
-import collections
-
-from . import (
- serializable_object,
- type_registry,
- item,
- composable,
-)
-
-from .. import (
- opentime,
- exceptions
-)
-
-
-def _bisect_right(
- seq,
- tgt,
- key_func,
- lower_search_bound=0,
- upper_search_bound=None
-):
- """Return the index of the last item in seq such that all e in seq[:index]
- have key_func(e) <= tgt, and all e in seq[index:] have key_func(e) > tgt.
-
- Thus, seq.insert(index, value) will insert value after the rightmost item
- such that meets the above condition.
-
- lower_search_bound and upper_search_bound bound the slice to be searched.
-
- Assumes that seq is already sorted.
- """
-
- if lower_search_bound < 0:
- raise ValueError('lower_search_bound must be non-negative')
-
- if upper_search_bound is None:
- upper_search_bound = len(seq)
-
- while lower_search_bound < upper_search_bound:
- midpoint_index = (lower_search_bound + upper_search_bound) // 2
-
- if tgt < key_func(seq[midpoint_index]):
- upper_search_bound = midpoint_index
- else:
- lower_search_bound = midpoint_index + 1
-
- return lower_search_bound
-
-
-def _bisect_left(
- seq,
- tgt,
- key_func,
- lower_search_bound=0,
- upper_search_bound=None
-):
- """Return the index of the last item in seq such that all e in seq[:index]
- have key_func(e) < tgt, and all e in seq[index:] have key_func(e) >= tgt.
-
- Thus, seq.insert(index, value) will insert value before the leftmost item
- such that meets the above condition.
-
- lower_search_bound and upper_search_bound bound the slice to be searched.
-
- Assumes that seq is already sorted.
- """
-
- if lower_search_bound < 0:
- raise ValueError('lower_search_bound must be non-negative')
-
- if upper_search_bound is None:
- upper_search_bound = len(seq)
-
- while lower_search_bound < upper_search_bound:
- midpoint_index = (lower_search_bound + upper_search_bound) // 2
-
- if key_func(seq[midpoint_index]) < tgt:
- lower_search_bound = midpoint_index + 1
- else:
- upper_search_bound = midpoint_index
-
- return lower_search_bound
-
-
-@type_registry.register_type
-class Composition(item.Item, collections.MutableSequence):
- """Base class for an OTIO Item that contains other Items.
-
- Should be subclassed (for example by Track and Stack), not used
- directly.
- """
-
- _serializable_label = "Composition.1"
- _composition_kind = "Composition"
- _modname = "core"
- _composable_base_class = composable.Composable
-
- def __init__(
- self,
- name=None,
- children=None,
- source_range=None,
- markers=None,
- effects=None,
- metadata=None
- ):
- item.Item.__init__(
- self,
- name=name,
- source_range=source_range,
- markers=markers,
- effects=effects,
- metadata=metadata
- )
- collections.MutableSequence.__init__(self)
-
- # Because we know that all children are unique, we store a set
- # of all the children as well to speed up __contain__ checks.
- self._child_lookup = set()
-
- self._children = []
- if children:
- # cannot simply set ._children to children since __setitem__ runs
- # extra logic (assigning ._parent pointers) and populates the
- # internal membership set _child_lookup.
- self.extend(children)
-
- _children = serializable_object.serializable_field(
- "children",
- list,
- "Items contained by this composition."
- )
-
- @property
- def composition_kind(self):
- """Returns a label specifying the kind of composition."""
-
- return self._composition_kind
-
- def __str__(self):
- return "{}({}, {}, {}, {})".format(
- self._composition_kind,
- str(self.name),
- str(self._children),
- str(self.source_range),
- str(self.metadata)
- )
-
- def __repr__(self):
- return (
- "otio.{}.{}("
- "name={}, "
- "children={}, "
- "source_range={}, "
- "metadata={}"
- ")".format(
- self._modname,
- self._composition_kind,
- repr(self.name),
- repr(self._children),
- repr(self.source_range),
- repr(self.metadata)
- )
- )
-
- transform = serializable_object.deprecated_field()
-
- def child_at_time(
- self,
- search_time,
- shallow_search=False,
- ):
- """Return the child that overlaps with time search_time.
-
- search_time is in the space of self.
-
- If shallow_search is false, will recurse into compositions.
- """
-
- range_map = self.range_of_all_children()
-
- # find the first item whose end_time_exclusive is after the
- first_inside_range = _bisect_left(
- seq=self._children,
- tgt=search_time,
- key_func=lambda child: range_map[child].end_time_exclusive(),
- )
-
- # find the last item whose start_time is before the
- last_in_range = _bisect_right(
- seq=self._children,
- tgt=search_time,
- key_func=lambda child: range_map[child].start_time,
- lower_search_bound=first_inside_range,
- )
-
- # limit the search to children who are in the search_range
- possible_matches = self._children[first_inside_range:last_in_range]
-
- result = None
- for thing in possible_matches:
- if range_map[thing].overlaps(search_time):
- result = thing
- break
-
- # if the search cannot or should not continue
- if (
- result is None
- or shallow_search
- or not hasattr(result, "child_at_time")
- ):
- return result
-
- # before you recurse, you have to transform the time into the
- # space of the child
- child_search_time = self.transformed_time(search_time, result)
-
- return result.child_at_time(child_search_time, shallow_search)
-
- def each_child(
- self,
- search_range=None,
- descended_from_type=composable.Composable,
- shallow_search=False,
- ):
- """ Generator that returns each child contained in the composition in
- the order in which it is found.
-
- Arguments:
- search_range: if specified, only children whose range overlaps with
- the search range will be yielded.
- descended_from_type: if specified, only children who are a
- descendent of the descended_from_type will be yielded.
- shallow_search: if True, will only search children of self, not
- and not recurse into children of children.
- """
- if search_range:
- range_map = self.range_of_all_children()
-
- # find the first item whose end_time_inclusive is after the
- # start_time of the search range
- first_inside_range = _bisect_left(
- seq=self._children,
- tgt=search_range.start_time,
- key_func=lambda child: range_map[child].end_time_inclusive(),
- )
-
- # find the last item whose start_time is before the
- # end_time_inclusive of the search_range
- last_in_range = _bisect_right(
- seq=self._children,
- tgt=search_range.end_time_inclusive(),
- key_func=lambda child: range_map[child].start_time,
- lower_search_bound=first_inside_range,
- )
-
- # limit the search to children who are in the search_range
- children = self._children[first_inside_range:last_in_range]
- else:
- # otherwise search all the children
- children = self._children
-
- for child in children:
- # filter out children who are not descended from the specified type
- # shortcut the isinstance if descended_from_type is composable
- # (since all objects in compositions are already composables)
- is_descendant = descended_from_type == composable.Composable
- if is_descendant or isinstance(child, descended_from_type):
- yield child
-
- # if not a shallow_search, for children that are compositions,
- # recurse into their children
- if not shallow_search and hasattr(child, "each_child"):
-
- if search_range is not None:
- search_range = self.transformed_time_range(search_range, child)
-
- for valid_child in child.each_child(
- search_range,
- descended_from_type,
- shallow_search
- ):
- yield valid_child
-
- def range_of_child_at_index(self, index):
- """Return the range of a child item in the time range of this
- composition.
-
- For example, with a track:
- [ClipA][ClipB][ClipC]
-
- The self.range_of_child_at_index(2) will return:
- TimeRange(ClipA.duration + ClipB.duration, ClipC.duration)
-
- To be implemented by subclass of Composition.
- """
-
- raise NotImplementedError
-
- def trimmed_range_of_child_at_index(self, index):
- """Return the trimmed range of the child item at index in the time
- range of this composition.
-
- For example, with a track:
-
- [ ]
-
- [ClipA][ClipB][ClipC]
-
- The range of index 2 (ClipC) will be just like
- range_of_child_at_index() but trimmed based on this Composition's
- source_range.
-
- To be implemented by child.
- """
-
- raise NotImplementedError
-
- def range_of_all_children(self):
- """Return a dict mapping children to their range in this object."""
-
- raise NotImplementedError
-
- def __copy__(self):
- result = super(Composition, self).__copy__()
-
- # Children are *not* copied with a shallow copy since the meaning is
- # ambiguous - they have a parent pointer which would need to be flipped
- # or they would need to be copied, which implies a deepcopy().
- #
- # This follows from the python documentation on copy/deepcopy:
- # https://docs.python.org/2/library/copy.html
- #
- # """
- # - A shallow copy constructs a new compound object and then (to the
- # extent possible) inserts references into it to the objects found in
- # the original.
- # - A deep copy constructs a new compound object and then, recursively,
- # inserts copies into it of the objects found in the original.
- # """
- result._children = []
-
- return result
-
- def __deepcopy__(self, md):
- result = super(Composition, self).__deepcopy__(md)
-
- # deepcopy should have already copied the children, so only parent
- # pointers need to be updated.
- [c._set_parent(result) for c in result._children]
-
- # we also need to reconstruct the membership set of _child_lookup.
- result._child_lookup.update(result._children)
-
- return result
-
- def _path_to_child(self, child):
- if not isinstance(child, composable.Composable):
- raise TypeError(
- "An object child of 'Composable' is required,"
- " not type '{}'".format(
- type(child)
- )
- )
-
- current = child
- parents = []
-
- while(current is not self):
- try:
- current = current.parent()
- except AttributeError:
- raise exceptions.NotAChildError(
- "Item '{}' is not a child of '{}'.".format(child, self)
- )
-
- parents.append(current)
-
- return parents
-
- def range_of_child(self, child, reference_space=None):
- """The range of the child in relation to another item
- (reference_space), not trimmed based on this
- composition's source_range.
-
- Note that reference_space must be in the same timeline as self.
-
- For example:
-
- | [-----] | seq
-
- [-----------------] Clip A
-
- If ClipA has duration 17, and seq has source_range: 5, duration 15,
- seq.range_of_child(Clip A) will return (0, 17)
- ignoring the source range of seq.
-
- To get the range of the child with the source_range applied, use the
- trimmed_range_of_child() method.
- """
-
- if not reference_space:
- reference_space = self
-
- parents = self._path_to_child(child)
-
- current = child
- result_range = None
-
- for parent in parents:
- index = parent.index(current)
- parent_range = parent.range_of_child_at_index(index)
-
- if not result_range:
- result_range = parent_range
- current = parent
- continue
-
- result_range = opentime.TimeRange(
- start_time=result_range.start_time + parent_range.start_time,
- duration=result_range.duration
- )
- current = parent
-
- if reference_space is not self:
- result_range = self.transformed_time_range(
- result_range,
- reference_space
- )
-
- return result_range
-
- def handles_of_child(self, child):
- """If media beyond the ends of this child are visible due to adjacent
- Transitions (only applicable in a Track) then this will return the
- head and tail offsets as a tuple of RationalTime objects. If no handles
- are present on either side, then None is returned instead of a
- RationalTime.
-
- Example usage:
- >>> head, tail = track.handles_of_child(clip)
- >>> if head:
- ... print('Do something')
- >>> if tail:
- ... print('Do something else')
- """
- return (None, None)
-
- def trimmed_range_of_child(self, child, reference_space=None):
- """Get range of the child in reference_space coordinates, after the
- self.source_range is applied.
-
- Example
- | [-----] | seq
- [-----------------] Clip A
-
- If ClipA has duration 17, and seq has source_range: 5, duration 10,
- seq.trimmed_range_of_child(Clip A) will return (5, 10)
- Which is trimming the range according to the source_range of seq.
-
- To get the range of the child without the source_range applied, use the
- range_of_child() method.
-
- Another example
- | [-----] | seq source range starts on frame 4 and goes to frame 8
- [ClipA][ClipB] (each 6 frames long)
-
- >>> seq.range_of_child(CLipA)
- 0, duration 6
- >>> seq.trimmed_range_of_child(ClipA):
- 4, duration 2
- """
-
- if not reference_space:
- reference_space = self
-
- if not reference_space == self:
- raise NotImplementedError
-
- parents = self._path_to_child(child)
-
- current = child
- result_range = None
-
- for parent in parents:
- index = parent.index(current)
- parent_range = parent.trimmed_range_of_child_at_index(index)
-
- if not result_range:
- result_range = parent_range
- current = parent
- continue
-
- result_range.start_time += parent_range.start_time
- current = parent
-
- if not self.source_range or not result_range:
- return result_range
-
- new_start_time = max(
- self.source_range.start_time,
- result_range.start_time
- )
-
- # trimmed out
- if new_start_time >= result_range.end_time_exclusive():
- return None
-
- # compute duration
- new_duration = min(
- result_range.end_time_exclusive(),
- self.source_range.end_time_exclusive()
- ) - new_start_time
-
- if new_duration.value < 0:
- return None
-
- return opentime.TimeRange(new_start_time, new_duration)
-
- def trim_child_range(self, child_range):
- if not self.source_range:
- return child_range
-
- # cropped out entirely
- past_end_time = self.source_range.start_time >= child_range.end_time_exclusive()
- before_start_time = \
- self.source_range.end_time_exclusive() <= child_range.start_time
-
- if past_end_time or before_start_time:
- return None
-
- if child_range.start_time < self.source_range.start_time:
- child_range = opentime.range_from_start_end_time(
- self.source_range.start_time,
- child_range.end_time_exclusive()
- )
-
- if (
- child_range.end_time_exclusive() >
- self.source_range.end_time_exclusive()
- ):
- child_range = opentime.range_from_start_end_time(
- child_range.start_time,
- self.source_range.end_time_exclusive()
- )
-
- return child_range
-
- # @{ SerializableObject override.
- def _update(self, d):
- """Like the dictionary .update() method.
-
- Update the data dictionary of this SerializableObject with the .data
- of d if d is a SerializableObject or if d is a dictionary, d itself.
- """
-
- # use the parent update function
- super(Composition, self)._update(d)
-
- # ...except for the 'children' field, which needs to run through the
- # insert method so that _parent pointers are correctly set on children.
- self._children = []
- self.extend(d.get('children', []))
- # @}
-
- # @{ collections.MutableSequence implementation
- def __getitem__(self, item):
- return self._children[item]
-
- def _setitem_slice(self, key, value):
- set_value = set(value)
-
- # check if any members in the new slice are repeated
- if len(set_value) != len(value):
- raise ValueError(
- "Instancing not allowed in Compositions, {} contains repeated"
- " items.".format(value)
- )
-
- old = self._children[key]
- if old:
- set_old = set(old)
- set_outside_old = set(self._children).difference(set_old)
-
- isect = set_outside_old.intersection(set_value)
- if isect:
- raise ValueError(
- "Attempting to insert duplicates of items {} already "
- "present in container, instancing not allowed in "
- "Compositions".format(isect)
- )
-
- # update old parent
- for val in old:
- val._set_parent(None)
- self._child_lookup.remove(val)
-
- # insert into _children
- self._children[key] = value
-
- # update new parent
- if value:
- for val in value:
- val._set_parent(self)
- self._child_lookup.add(val)
-
- def __setitem__(self, key, value):
- # fetch the current thing at that index/slice
- old = self._children[key]
-
- # in the case of key being a slice, old and value are both sequences
- if old is value:
- return
-
- if isinstance(key, slice):
- return self._setitem_slice(key, value)
-
- if value in self:
- raise ValueError(
- "Composable {} already present in this container, instancing"
- " not allowed in otio compositions.".format(value)
- )
-
- # unset the old child's parent and delete the membership entry.
- if old is not None:
- old._set_parent(None)
- self._child_lookup.remove(old)
-
- # put it into our list of children
- self._children[key] = value
-
- # set the new parent
- if value is not None:
- value._set_parent(self)
-
- # put it into our membership tracking set
- self._child_lookup.add(value)
-
- def insert(self, index, item):
- """Insert an item into the composition at location `index`."""
-
- if not isinstance(item, self._composable_base_class):
- raise TypeError(
- "Not allowed to insert an object of type {0} into a {1}, only"
- " objects descending from {2}. Tried to insert: {3}".format(
- type(item),
- type(self),
- self._composable_base_class,
- str(item)
- )
- )
-
- if item in self:
- raise ValueError(
- "Composable {} already present in this container, instancing"
- " not allowed in otio compositions.".format(item)
- )
-
- # set the item's parent and add it to our membership tracking and list
- # of children
- item._set_parent(self)
- self._child_lookup.add(item)
- self._children.insert(index, item)
-
- def __contains__(self, item):
- """Use our internal membership tracking set to speed up searches."""
- return item in self._child_lookup
-
- def __len__(self):
- """The len() of a Composition is the # of children in it.
- Note that this also means that a Composition with no children
- is considered False, so take care to test for "if foo is not None"
- versus just "if foo" when the difference matters."""
- return len(self._children)
-
- def __delitem__(self, key):
- # grab the old value
- old = self._children[key]
-
- # remove it from the membership tracking set and clear parent
- if old is not None:
- if isinstance(key, slice):
- for val in old:
- self._child_lookup.remove(val)
- val._set_parent(None)
- else:
- self._child_lookup.remove(old)
- old._set_parent(None)
-
- # remove it from our list of children
- del self._children[key]
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/item.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/item.py
deleted file mode 100644
index 7e035a3a9e..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/item.py
+++ /dev/null
@@ -1,243 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Implementation of the Item base class. OTIO Objects that contain media."""
-
-import copy
-
-from .. import (
- opentime,
- exceptions,
-)
-
-from . import (
- serializable_object,
- composable,
-)
-
-
-class Item(composable.Composable):
- """An Item is a Composable that can be part of a Composition or Timeline.
-
- More specifically, it is a Composable that has meaningful duration.
-
- Can also hold effects and markers.
-
- Base class of:
- - Composition (and children)
- - Clip
- - Gap
- """
-
- _serializable_label = "Item.1"
- _class_path = "core.Item"
-
- def __init__(
- self,
- name=None,
- source_range=None,
- effects=None,
- markers=None,
- metadata=None,
- ):
- super(Item, self).__init__(name=name, metadata=metadata)
-
- self.source_range = copy.deepcopy(source_range)
- self.effects = copy.deepcopy(effects) if effects else []
- self.markers = copy.deepcopy(markers) if markers else []
-
- name = serializable_object.serializable_field("name", doc="Item name.")
- source_range = serializable_object.serializable_field(
- "source_range",
- opentime.TimeRange,
- doc="Range of source to trim to. Can be None or a TimeRange."
- )
-
- @staticmethod
- def visible():
- """Return the visibility of the Item. By default True."""
-
- return True
-
- def duration(self):
- """Convience wrapper for the trimmed_range.duration of the item."""
-
- return self.trimmed_range().duration
-
- def available_range(self):
- """Implemented by child classes, available range of media."""
-
- raise NotImplementedError
-
- def trimmed_range(self):
- """The range after applying the source range."""
- if self.source_range is not None:
- return copy.copy(self.source_range)
-
- return self.available_range()
-
- def visible_range(self):
- """The range of this item's media visible to its parent.
- Includes handles revealed by adjacent transitions (if any).
- This will always be larger or equal to trimmed_range()."""
- result = self.trimmed_range()
- if self.parent():
- head, tail = self.parent().handles_of_child(self)
- if head:
- result = opentime.TimeRange(
- start_time=result.start_time - head,
- duration=result.duration + head
- )
- if tail:
- result = opentime.TimeRange(
- start_time=result.start_time,
- duration=result.duration + tail
- )
- return result
-
- def trimmed_range_in_parent(self):
- """Find and return the trimmed range of this item in the parent."""
- if not self.parent():
- raise exceptions.NotAChildError(
- "No parent of {}, cannot compute range in parent.".format(self)
- )
-
- return self.parent().trimmed_range_of_child(self)
-
- def range_in_parent(self):
- """Find and return the untrimmed range of this item in the parent."""
- if not self.parent():
- raise exceptions.NotAChildError(
- "No parent of {}, cannot compute range in parent.".format(self)
- )
-
- return self.parent().range_of_child(self)
-
- def transformed_time(self, t, to_item):
- """Converts time t in the coordinate system of self to coordinate
- system of to_item.
-
- Note that self and to_item must be part of the same timeline (they must
- have a common ancestor).
-
- Example:
-
- 0 20
- [------t----D----------]
- [--A-][t----B---][--C--]
- 100 101 110
- 101 in B = 6 in D
-
- t = t argument
- """
-
- if not isinstance(t, opentime.RationalTime):
- raise ValueError(
- "transformed_time only operates on RationalTime, not {}".format(
- type(t)
- )
- )
-
- # does not operate in place
- result = copy.copy(t)
-
- if to_item is None:
- return result
-
- root = self._root_parent()
-
- # transform t to root parent's coordinate system
- item = self
- while item != root and item != to_item:
-
- parent = item.parent()
- result -= item.trimmed_range().start_time
- result += parent.range_of_child(item).start_time
-
- item = parent
-
- ancestor = item
-
- # transform from root parent's coordinate system to to_item
- item = to_item
- while item != root and item != ancestor:
-
- parent = item.parent()
- result += item.trimmed_range().start_time
- result -= parent.range_of_child(item).start_time
-
- item = parent
-
- assert(item is ancestor)
-
- return result
-
- def transformed_time_range(self, tr, to_item):
- """Transforms the timerange tr to the range of child or self to_item."""
-
- return opentime.TimeRange(
- self.transformed_time(tr.start_time, to_item),
- tr.duration
- )
-
- markers = serializable_object.serializable_field(
- "markers",
- doc="List of markers on this item."
- )
- effects = serializable_object.serializable_field(
- "effects",
- doc="List of effects on this item."
- )
- metadata = serializable_object.serializable_field(
- "metadata",
- doc="Metadata dictionary for this item."
- )
-
- def __repr__(self):
- return (
- "otio.{}("
- "name={}, "
- "source_range={}, "
- "effects={}, "
- "markers={}, "
- "metadata={}"
- ")".format(
- self._class_path,
- repr(self.name),
- repr(self.source_range),
- repr(self.effects),
- repr(self.markers),
- repr(self.metadata)
- )
- )
-
- def __str__(self):
- return "{}({}, {}, {}, {}, {})".format(
- self._class_path.split('.')[-1],
- self.name,
- str(self.source_range),
- str(self.effects),
- str(self.markers),
- str(self.metadata)
- )
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/json_serializer.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/json_serializer.py
deleted file mode 100644
index fee8242143..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/json_serializer.py
+++ /dev/null
@@ -1,218 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Serializer for SerializableObjects to JSON
-
-Used for the otio_json adapter as well as for plugins and manifests.
-"""
-
-import json
-
-from . import (
- SerializableObject,
- type_registry,
-)
-
-from .unknown_schema import UnknownSchema
-
-from .. import (
- exceptions,
- opentime,
-)
-
-
-# @TODO: Handle file version drifting
-
-
-class _SerializableObjectEncoder(json.JSONEncoder):
-
- """ Encoder for the SerializableObject OTIO Class and its descendents. """
-
- def default(self, obj):
- for typename, encfn in _ENCODER_LIST:
- if isinstance(obj, typename):
- return encfn(obj)
-
- return json.JSONEncoder.default(self, obj)
-
-
-def serialize_json_to_string(root, indent=4):
- """Serialize a tree of SerializableObject to JSON.
-
- Returns a JSON string.
- """
-
- return _SerializableObjectEncoder(
- sort_keys=True,
- indent=indent
- ).encode(root)
-
-
-def serialize_json_to_file(root, to_file):
- """
- Serialize a tree of SerializableObject to JSON.
-
- Writes the result to the given file path.
- """
-
- content = serialize_json_to_string(root)
-
- with open(to_file, 'w') as file_contents:
- file_contents.write(content)
-
-# @{ Encoders
-
-
-def _encoded_serializable_object(input_otio):
- if not input_otio._serializable_label:
- raise exceptions.InvalidSerializableLabelError(
- input_otio._serializable_label
- )
- result = {
- "OTIO_SCHEMA": input_otio._serializable_label,
- }
- result.update(input_otio._data)
- return result
-
-
-def _encoded_unknown_schema_object(input_otio):
- orig_label = input_otio.data.get(UnknownSchema._original_label)
- if not orig_label:
- raise exceptions.InvalidSerializableLabelError(
- orig_label
- )
- # result is just a dict, not a SerializableObject
- result = {}
- result.update(input_otio.data)
- result["OTIO_SCHEMA"] = orig_label # override the UnknownSchema label
- del result[UnknownSchema._original_label]
- return result
-
-
-def _encoded_time(input_otio):
- return {
- "OTIO_SCHEMA": "RationalTime.1",
- 'value': input_otio.value,
- 'rate': input_otio.rate
- }
-
-
-def _encoded_time_range(input_otio):
- return {
- "OTIO_SCHEMA": "TimeRange.1",
- 'start_time': _encoded_time(input_otio.start_time),
- 'duration': _encoded_time(input_otio.duration)
- }
-
-
-def _encoded_transform(input_otio):
- return {
- "OTIO_SCHEMA": "TimeTransform.1",
- 'offset': _encoded_time(input_otio.offset),
- 'scale': input_otio.scale,
- 'rate': input_otio.rate
- }
-# @}
-
-
-# Ordered list of functions for encoding OTIO objects to JSON.
-# More particular cases should precede more general cases.
-_ENCODER_LIST = [
- (opentime.RationalTime, _encoded_time),
- (opentime.TimeRange, _encoded_time_range),
- (opentime.TimeTransform, _encoded_transform),
- (UnknownSchema, _encoded_unknown_schema_object),
- (SerializableObject, _encoded_serializable_object)
-]
-
-# @{ Decoders
-
-
-def _decoded_time(input_otio):
- return opentime.RationalTime(
- input_otio['value'],
- input_otio['rate']
- )
-
-
-def _decoded_time_range(input_otio):
- return opentime.TimeRange(
- input_otio['start_time'],
- input_otio['duration']
- )
-
-
-def _decoded_transform(input_otio):
- return opentime.TimeTransform(
- input_otio['offset'],
- input_otio['scale']
- )
-# @}
-
-
-# Map of explicit decoder functions to schema labels (for opentime)
-# because opentime is implemented with no knowledge of OTIO, it doesn't use the
-# same pattern as SerializableObject.
-_DECODER_FUNCTION_MAP = {
- 'RationalTime.1': _decoded_time,
- 'TimeRange.1': _decoded_time_range,
- 'TimeTransform.1': _decoded_transform,
-}
-
-
-def _as_otio(dct):
- """ Specialized JSON decoder for OTIO base Objects. """
-
- if "OTIO_SCHEMA" in dct:
- schema_label = dct["OTIO_SCHEMA"]
-
- if schema_label in _DECODER_FUNCTION_MAP:
- return _DECODER_FUNCTION_MAP[schema_label](dct)
-
- schema_name = type_registry.schema_name_from_label(schema_label)
- schema_version = type_registry.schema_version_from_label(schema_label)
- del dct["OTIO_SCHEMA"]
-
- return type_registry.instance_from_schema(
- schema_name,
- schema_version,
- dct
- )
-
- return dct
-
-
-def deserialize_json_from_string(otio_string):
- """ Deserialize a string containing JSON to OTIO objects. """
-
- return json.loads(otio_string, object_hook=_as_otio)
-
-
-def deserialize_json_from_file(otio_filepath):
- """ Deserialize the file at otio_filepath containing JSON to OTIO. """
-
- with open(otio_filepath, 'r') as file_contents:
- result = deserialize_json_from_string(file_contents.read())
- result._json_path = otio_filepath
- return result
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/media_reference.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/media_reference.py
deleted file mode 100644
index ac34852613..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/media_reference.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Media Reference Classes and Functions."""
-
-from .. import (
- opentime,
-)
-from . import (
- type_registry,
- serializable_object,
-)
-
-import copy
-
-
-@type_registry.register_type
-class MediaReference(serializable_object.SerializableObject):
- """Base Media Reference Class.
-
- Currently handles string printing the child classes, which expose interface
- into its data dictionary.
-
- The requirement is that the schema is named so that external systems can
- fetch the required information correctly.
- """
- _serializable_label = "MediaReference.1"
- _name = "MediaReference"
-
- def __init__(
- self,
- name=None,
- available_range=None,
- metadata=None
- ):
- super(MediaReference, self).__init__()
-
- self.name = name
- self.available_range = copy.deepcopy(available_range)
- self.metadata = copy.deepcopy(metadata) or {}
-
- name = serializable_object.serializable_field(
- "name",
- doc="Name of this media reference."
- )
- available_range = serializable_object.serializable_field(
- "available_range",
- opentime.TimeRange,
- doc="Available range of media in this media reference."
- )
- metadata = serializable_object.serializable_field(
- "metadata",
- dict,
- doc="Metadata dictionary."
- )
-
- @property
- def is_missing_reference(self):
- return False
-
- def __str__(self):
- return "{}({}, {}, {})".format(
- self._name,
- repr(self.name),
- repr(self.available_range),
- repr(self.metadata)
- )
-
- def __repr__(self):
- return (
- "otio.schema.{}("
- "name={},"
- " available_range={},"
- " metadata={}"
- ")"
- ).format(
- self._name,
- repr(self.name),
- repr(self.available_range),
- repr(self.metadata)
- )
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/serializable_object.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/serializable_object.py
deleted file mode 100644
index 27032569b0..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/serializable_object.py
+++ /dev/null
@@ -1,219 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Implements the otio.core.SerializableObject"""
-
-import copy
-
-from . import (
- type_registry,
-)
-
-
-class SerializableObject(object):
- """Base object for things that can be [de]serialized to/from .otio files.
-
- To define a new child class of this, you inherit from it and also use the
- register_type decorator. Then you use the serializable_field function
- above to create attributes that can be serialized/deserialized.
-
- You can use the upgrade_function_for decorator to upgrade older schemas
- to newer ones.
-
- Finally, if you're in the process of upgrading schemas and you want to
- catch code that refers to old attribute names, you can use the
- deprecated_field function. This raises an exception if code attempts to
- read or write to that attribute. After testing and before pushing, please
- remove references to deprecated_field.
-
- For example
-
- >>> import opentimelineio as otio
-
- >>> @otio.core.register_type
- ... class ExampleChild(otio.core.SerializableObject):
- ... _serializable_label = "ExampleChild.7"
- ... child_data = otio.core.serializable_field("child_data", int)
-
- # @TODO: delete once testing shows nothing is referencing this.
- >>> old_child_data_name = otio.core.deprecated_field()
-
- >>> @otio.core.upgrade_function_for(ExampleChild, 3)
- ... def upgrade_child_to_three(_data):
- ... return {"child_data" : _data["old_child_data_name"]}
- """
-
- # Every child must define a _serializable_label attribute.
- # This attribute is a string in the form of: "SchemaName.VersionNumber"
- # Where VersionNumber is an integer.
- # You can use the classmethods .schema_name() and .schema_version() to
- # query these fields.
- _serializable_label = None
- _class_path = "core.SerializableObject"
-
- def __init__(self):
- self._data = {}
-
- # @{ "Reference Type" semantics for SerializableObject
- # We think of the SerializableObject as a reference type - by default
- # comparison is pointer comparison, but you can use 'is_equivalent_to' to
- # check if the contents of the SerializableObject are the same as some
- # other SerializableObject's contents.
- #
- # Implicitly:
- # def __eq__(self, other):
- # return self is other
-
- def is_equivalent_to(self, other):
- """Returns true if the contents of self and other match."""
-
- try:
- if self._data == other._data:
- return True
-
- # XXX: Gross hack takes OTIO->JSON String->Python Dictionaries
- #
- # using the serializer ensures that we only compare fields that are
- # serializable, which is how we define equivalence.
- #
- # we use json.loads() to turn the string back into dictionaries
- # so we can use python's equivalence for things like floating
- # point numbers (ie 5.0 == 5) without having to do string
- # processing.
-
- from . import json_serializer
- import json
-
- lhs_str = json_serializer.serialize_json_to_string(self)
- lhs = json.loads(lhs_str)
-
- rhs_str = json_serializer.serialize_json_to_string(other)
- rhs = json.loads(rhs_str)
-
- return (lhs == rhs)
- except AttributeError:
- return False
- # @}
-
- def _update(self, d):
- """Like the dictionary .update() method.
-
- Update the _data dictionary of this SerializableObject with the ._data
- of d if d is a SerializableObject or if d is a dictionary, d itself.
- """
-
- if isinstance(d, SerializableObject):
- self._data.update(d._data)
- else:
- self._data.update(d)
-
- @classmethod
- def schema_name(cls):
- return type_registry.schema_name_from_label(
- cls._serializable_label
- )
-
- @classmethod
- def schema_version(cls):
- return type_registry.schema_version_from_label(
- cls._serializable_label
- )
-
- @property
- def is_unknown_schema(self):
- # in general, SerializableObject will have a known schema
- # but UnknownSchema subclass will redefine this property to be True
- return False
-
- def __copy__(self):
- raise NotImplementedError(
- "Shallow copying is not permitted. Use a deep copy."
- )
-
- def __deepcopy__(self, md):
- result = type(self)()
- result._data = copy.deepcopy(self._data, md)
-
- return result
-
- def deepcopy(self):
- return self.__deepcopy__({})
-
-
-def serializable_field(name, required_type=None, doc=None):
- """Create a serializable_field for child classes of SerializableObject.
-
- Convienence function for adding attributes to child classes of
- SerializableObject in such a way that they will be serialized/deserialized
- automatically.
-
- Use it like this:
- class foo(SerializableObject):
- bar = serializable_field("bar", required_type=int, doc="example")
-
- This would indicate that class "foo" has a serializable field "bar". So:
- f = foo()
- f.bar = "stuff"
-
- # serialize & deserialize
- otio_json = otio.adapters.from_name("otio")
- f2 = otio_json.read_from_string(otio_json.write_to_string(f))
-
- # fields should be equal
- f.bar == f2.bar
-
- Additionally, the "doc" field will become the documentation for the
- property.
- """
-
- def getter(self):
- return self._data[name]
-
- def setter(self, val):
- # always allow None values regardless of value of required_type
- if required_type is not None and val is not None:
- if not isinstance(val, required_type):
- raise TypeError(
- "attribute '{}' must be an instance of '{}', not: {}".format(
- name,
- required_type,
- type(val)
- )
- )
-
- self._data[name] = val
-
- return property(getter, setter, doc=doc)
-
-
-def deprecated_field():
- """ For marking attributes on a SerializableObject deprecated. """
-
- def getter(self):
- raise DeprecationWarning
-
- def setter(self, val):
- raise DeprecationWarning
-
- return property(getter, setter, doc="Deprecated field, do not use.")
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/type_registry.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/type_registry.py
deleted file mode 100644
index de4824c42d..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/type_registry.py
+++ /dev/null
@@ -1,152 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Core type registry system for registering OTIO types for serialization."""
-
-from .. import (
- exceptions
-)
-
-
-# Types decorate use register_type() to insert themselves into this map
-_OTIO_TYPES = {}
-
-# maps types to a map of versions to upgrade functions
-_UPGRADE_FUNCTIONS = {}
-
-
-def schema_name_from_label(label):
- """Return the schema name from the label name."""
-
- return label.split(".")[0]
-
-
-def schema_version_from_label(label):
- """Return the schema version from the label name."""
-
- return int(label.split(".")[1])
-
-
-def schema_label_from_name_version(schema_name, schema_version):
- """Return the serializeable object schema label given the name and version."""
-
- return "{}.{}".format(schema_name, schema_version)
-
-
-def register_type(classobj, schemaname=None):
- """ Register a class to a Schema Label.
-
- Normally this is used as a decorator. However, in special cases where a
- type has been renamed, you might need to register the new type to multiple
- schema names. To do this:
-
- >>> @core.register_type
- ... class MyNewClass(...):
- ... pass
-
- >>> core.register_type(MyNewClass, "MyOldName")
-
- This will parse the old schema name into the new class type. You may also
- need to write an upgrade function if the schema itself has changed.
- """
-
- if schemaname is None:
- schemaname = schema_name_from_label(classobj._serializable_label)
-
- _OTIO_TYPES[schemaname] = classobj
-
- return classobj
-
-
-def upgrade_function_for(cls, version_to_upgrade_to):
- """Decorator for identifying schema class upgrade functions.
-
- Example
- >>> @upgrade_function_for(MyClass, 5)
- ... def upgrade_to_version_five(data):
- ... pass
-
- This will get called to upgrade a schema of MyClass to version 5. My class
- must be a class deriving from otio.core.SerializableObject.
-
- The upgrade function should take a single argument - the dictionary to
- upgrade, and return a dictionary with the fields upgraded.
-
- Remember that you don't need to provide an upgrade function for upgrades
- that add or remove fields, only for schema versions that change the field
- names.
- """
-
- def decorator_func(func):
- """ Decorator for marking upgrade functions """
-
- _UPGRADE_FUNCTIONS.setdefault(cls, {})[version_to_upgrade_to] = func
-
- return func
-
- return decorator_func
-
-
-def instance_from_schema(schema_name, schema_version, data_dict):
- """Return an instance, of the schema from data in the data_dict."""
-
- if schema_name not in _OTIO_TYPES:
- from .unknown_schema import UnknownSchema
-
- # create an object of UnknownSchema type to represent the data
- schema_label = schema_label_from_name_version(schema_name, schema_version)
- data_dict[UnknownSchema._original_label] = schema_label
- unknown_label = UnknownSchema._serializable_label
- schema_name = schema_name_from_label(unknown_label)
- schema_version = schema_version_from_label(unknown_label)
-
- cls = _OTIO_TYPES[schema_name]
-
- schema_version = int(schema_version)
- if cls.schema_version() < schema_version:
- raise exceptions.UnsupportedSchemaError(
- "Schema '{}' has highest version available '{}', which is lower "
- "than requested schema version '{}'".format(
- schema_name,
- cls.schema_version(),
- schema_version
- )
- )
-
- if cls.schema_version() != schema_version:
- # since the keys are the versions to upgrade to, sorting the keys
- # before iterating through them should ensure that upgrade functions
- # are called in order.
- for version, upgrade_func in sorted(
- _UPGRADE_FUNCTIONS[cls].items()
- ):
- if version < schema_version:
- continue
-
- data_dict = upgrade_func(data_dict)
-
- obj = cls()
- obj._update(data_dict)
-
- return obj
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/core/unknown_schema.py b/client/ayon_core/vendor/python/python_2/opentimelineio/core/unknown_schema.py
deleted file mode 100644
index 94c187710e..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/core/unknown_schema.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""
-Implementation of the UnknownSchema schema.
-"""
-
-from .serializable_object import SerializableObject
-from .type_registry import register_type
-
-
-@register_type
-class UnknownSchema(SerializableObject):
- """Represents an object whose schema is unknown to us."""
-
- _serializable_label = "UnknownSchema.1"
- _name = "UnknownSchema"
- _original_label = "UnknownSchemaOriginalLabel"
-
- @property
- def is_unknown_schema(self):
- return True
-
- @property
- def data(self):
- """Exposes the data dictionary of the underlying SerializableObject
- directly.
- """
- return self._data
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/exceptions.py b/client/ayon_core/vendor/python/python_2/opentimelineio/exceptions.py
deleted file mode 100644
index 7726f2ef71..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/exceptions.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Exception classes for OpenTimelineIO"""
-
-
-class OTIOError(Exception):
- pass
-
-
-class CouldNotReadFileError(OTIOError):
- pass
-
-
-class NoKnownAdapterForExtensionError(OTIOError):
- pass
-
-
-class ReadingNotSupportedError(OTIOError):
- pass
-
-
-class WritingNotSupportedError(OTIOError):
- pass
-
-
-class NotSupportedError(OTIOError):
- pass
-
-
-class InvalidSerializableLabelError(OTIOError):
- pass
-
-
-class CannotComputeAvailableRangeError(OTIOError):
- pass
-
-
-class AdapterDoesntSupportFunctionError(OTIOError):
- pass
-
-
-class UnsupportedSchemaError(OTIOError):
- pass
-
-
-class NotAChildError(OTIOError):
- pass
-
-
-class InstancingNotAllowedError(OTIOError):
- pass
-
-
-class TransitionFollowingATransitionError(OTIOError):
- pass
-
-
-class MisconfiguredPluginError(OTIOError):
- pass
-
-
-class CannotTrimTransitionsError(OTIOError):
- pass
-
-
-class NoDefaultMediaLinkerError(OTIOError):
- pass
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/hooks.py b/client/ayon_core/vendor/python/python_2/opentimelineio/hooks.py
deleted file mode 100644
index 311154553d..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/hooks.py
+++ /dev/null
@@ -1,174 +0,0 @@
-#
-# Copyright 2018 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-from . import (
- plugins,
- core,
-)
-
-__doc__ = """
-HookScripts are plugins that run at defined points ("Hooks").
-
-They expose a hook_function with signature:
-hook_function :: otio.schema.Timeline, Dict -> otio.schema.Timeline
-
-Both hook scripts and the hooks they attach to are defined in the plugin
-manifest.
-
-You can attach multiple hook scripts to a hook. They will be executed in list
-order, first to last.
-
-They are defined by the manifests HookScripts and hooks areas.
-
->>>
-{
- "OTIO_SCHEMA" : "PluginManifest.1",
- "hook_scripts" : [
- {
- "OTIO_SCHEMA" : "HookScript.1",
- "name" : "example hook",
- "execution_scope" : "in process",
- "filepath" : "example.py"
- }
- ],
- "hooks" : {
- "pre_adapter_write" : ["example hook"],
- "post_adapter_read" : []
- }
-}
-
-The 'hook_scripts' area loads the python modules with the 'hook_function's to
-call in them. The 'hooks' area defines the hooks (and any associated
-scripts). You can further query and modify these from python.
-
->>> import opentimelineio as otio
-... hook_list = otio.hooks.scripts_attached_to("some_hook") # -> ['a','b','c']
-...
-... # to run the hook scripts:
-... otio.hooks.run("some_hook", some_timeline, optional_argument_dict)
-
-This will pass (some_timeline, optional_argument_dict) to 'a', which will
-a new timeline that will get passed into 'b' with optional_argument_dict,
-etc.
-
-To Edit the order, change the order in the list:
-
->>> hook_list[0], hook_list[2] = hook_list[2], hook_list[0]
-... print hook_list # ['c','b','a']
-
-Now c will run, then b, then a.
-
-To delete a function the list:
-
->>> del hook_list[1]
-"""
-
-
-@core.register_type
-class HookScript(plugins.PythonPlugin):
- _serializable_label = "HookScript.1"
-
- def __init__(
- self,
- name=None,
- execution_scope=None,
- filepath=None,
- ):
- """HookScript plugin constructor."""
-
- super(HookScript, self).__init__(name, execution_scope, filepath)
-
- def run(self, in_timeline, argument_map={}):
- """Run the hook_function associated with this plugin."""
-
- # @TODO: should in_timeline be passed in place? or should a copy be
- # made?
- return self._execute_function(
- "hook_function",
- in_timeline=in_timeline,
- argument_map=argument_map
- )
-
- def __str__(self):
- return "HookScript({}, {}, {})".format(
- repr(self.name),
- repr(self.execution_scope),
- repr(self.filepath)
- )
-
- def __repr__(self):
- return (
- "otio.hooks.HookScript("
- "name={}, "
- "execution_scope={}, "
- "filepath={}"
- ")".format(
- repr(self.name),
- repr(self.execution_scope),
- repr(self.filepath)
- )
- )
-
-
-def names():
- """Return a list of all the registered hooks."""
-
- return plugins.ActiveManifest().hooks.keys()
-
-
-def available_hookscript_names():
- """Return the names of HookScripts that have been registered."""
-
- return [hs.name for hs in plugins.ActiveManifest().hook_scripts]
-
-
-def available_hookscripts():
- """Return the HookScripts objects that have been registered."""
- return plugins.ActiveManifest().hook_scripts
-
-
-def scripts_attached_to(hook):
- """Return an editable list of all the hook scriptss that are attached to
- the specified hook, in execution order. Changing this list will change the
- order that scripts run in, and deleting a script will remove it from
- executing
- """
-
- # @TODO: Should this return a copy?
- return plugins.ActiveManifest().hooks[hook]
-
-
-def run(hook, tl, extra_args=None):
- """Run all the scripts associated with hook, passing in tl and extra_args.
-
- Will return the return value of the last hook script.
-
- If no hookscripts are defined, returns tl.
- """
-
- hook_scripts = plugins.ActiveManifest().hooks[hook]
- for name in hook_scripts:
- hs = plugins.ActiveManifest().from_name(name, "hook_scripts")
- tl = hs.run(tl, extra_args)
- return tl
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/media_linker.py b/client/ayon_core/vendor/python/python_2/opentimelineio/media_linker.py
deleted file mode 100644
index 25473ac1d5..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/media_linker.py
+++ /dev/null
@@ -1,169 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-""" MediaLinker plugins fire after an adapter has read a file in order to
-produce MediaReferences that point at valid, site specific media.
-
-They expose a "link_media_reference" function with the signature:
-link_media_reference :: otio.schema.Clip -> otio.core.MediaReference
-
-or:
- def linked_media_reference(from_clip):
- result = otio.core.MediaReference() # whichever subclass
- # do stuff
- return result
-
-To get context information, they can inspect the metadata on the clip and on
-the media reference. The .parent() method can be used to find the containing
-track if metadata is stored there.
-
-Please raise an instance (or child instance) of
-otio.exceptions.CannotLinkMediaError() if there is a problem linking the media.
-
-For example:
- for clip in timeline.each_clip():
- try:
- new_mr = otio.media_linker.linked_media_reference(clip)
- clip.media_reference = new_mr
- except otio.exceptions.CannotLinkMediaError:
- # or report the error
- pass
-"""
-
-import os
-
-from . import (
- exceptions,
- plugins,
- core,
-)
-
-
-# Enum describing different media linker policies
-class MediaLinkingPolicy:
- DoNotLinkMedia = "__do_not_link_media"
- ForceDefaultLinker = "__default"
-
-
-# @TODO: wrap this up in the plugin system somehow? automatically generate?
-def available_media_linker_names():
- """Return a string list of the available media linker plugins."""
-
- return [str(adp.name) for adp in plugins.ActiveManifest().media_linkers]
-
-
-def from_name(name):
- """Fetch the media linker object by the name of the adapter directly."""
-
- if name == MediaLinkingPolicy.ForceDefaultLinker or not name:
- name = os.environ.get("OTIO_DEFAULT_MEDIA_LINKER", None)
-
- if not name:
- return None
-
- # @TODO: make this handle the enums
- try:
- return plugins.ActiveManifest().from_name(
- name,
- kind_list="media_linkers"
- )
- except exceptions.NotSupportedError:
- raise exceptions.NotSupportedError(
- "media linker not supported: {}, available: {}".format(
- name,
- available_media_linker_names()
- )
- )
-
-
-def default_media_linker():
- try:
- return os.environ['OTIO_DEFAULT_MEDIA_LINKER']
- except KeyError:
- raise exceptions.NoDefaultMediaLinkerError(
- "No default Media Linker set in $OTIO_DEFAULT_MEDIA_LINKER"
- )
-
-
-def linked_media_reference(
- target_clip,
- media_linker_name=MediaLinkingPolicy.ForceDefaultLinker,
- media_linker_argument_map=None
-):
- media_linker = from_name(media_linker_name)
-
- if not media_linker:
- return target_clip
-
- # @TODO: connect this argument map up to the function call through to the
- # real linker
- if not media_linker_argument_map:
- media_linker_argument_map = {}
-
- return media_linker.link_media_reference(
- target_clip,
- media_linker_argument_map
- )
-
-
-@core.register_type
-class MediaLinker(plugins.PythonPlugin):
- _serializable_label = "MediaLinker.1"
-
- def __init__(
- self,
- name=None,
- execution_scope=None,
- filepath=None,
- ):
- super(MediaLinker, self).__init__(name, execution_scope, filepath)
-
- def link_media_reference(self, in_clip, media_linker_argument_map=None):
- media_linker_argument_map = media_linker_argument_map or {}
-
- return self._execute_function(
- "link_media_reference",
- in_clip=in_clip,
- media_linker_argument_map=media_linker_argument_map
- )
-
- def __str__(self):
- return "MediaLinker({}, {}, {})".format(
- repr(self.name),
- repr(self.execution_scope),
- repr(self.filepath)
- )
-
- def __repr__(self):
- return (
- "otio.media_linker.MediaLinker("
- "name={}, "
- "execution_scope={}, "
- "filepath={}"
- ")".format(
- repr(self.name),
- repr(self.execution_scope),
- repr(self.filepath)
- )
- )
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/opentime.py b/client/ayon_core/vendor/python/python_2/opentimelineio/opentime.py
deleted file mode 100644
index e7e58b9475..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/opentime.py
+++ /dev/null
@@ -1,856 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Library for expressing and transforming time.
-
-NOTE: This module is written specifically with a future port to C in mind.
-When ported to C, Time will be a struct and these functions should be very
-simple.
-"""
-
-import math
-import copy
-
-
-VALID_NON_DROPFRAME_TIMECODE_RATES = (
- 1,
- 12,
- 23.976,
- 23.98,
- (24000 / 1001.0),
- 24,
- 25,
- 30,
- 29.97,
- (30000 / 1001.0),
- 48,
- 50,
- 59.94,
- (60000 / 1001.0),
- 60,
-)
-
-VALID_DROPFRAME_TIMECODE_RATES = (
- 29.97,
- (30000 / 1001.0),
- 59.94,
- (60000 / 1001.0),
-)
-
-VALID_TIMECODE_RATES = (
- VALID_NON_DROPFRAME_TIMECODE_RATES + VALID_DROPFRAME_TIMECODE_RATES)
-
-_fn_cache = object.__setattr__
-
-
-class RationalTime(object):
- """ Represents an instantaneous point in time, value * (1/rate) seconds
- from time 0seconds.
- """
-
- # Locks RationalTime instances to only these attributes
- __slots__ = ['value', 'rate']
-
- def __init__(self, value=0.0, rate=1.0):
- _fn_cache(self, "value", value)
- _fn_cache(self, "rate", rate)
-
- def __setattr__(self, key, val):
- """Enforces immutability """
- raise AttributeError("RationalTime is Immutable.")
-
- def __copy__(self, memodict=None):
- return RationalTime(self.value, self.rate)
-
- # Always deepcopy, since we want this class to behave like a value type
- __deepcopy__ = __copy__
-
- def rescaled_to(self, new_rate):
- """Returns the time for this time converted to new_rate"""
-
- try:
- new_rate = new_rate.rate
- except AttributeError:
- pass
-
- if self.rate == new_rate:
- return copy.copy(self)
-
- return RationalTime(
- self.value_rescaled_to(new_rate),
- new_rate
- )
-
- def value_rescaled_to(self, new_rate):
- """Returns the time value for self converted to new_rate"""
-
- try:
- new_rate = new_rate.rate
- except AttributeError:
- pass
-
- if new_rate == self.rate:
- return self.value
-
- # TODO: This math probably needs some overrun protection
- try:
- return float(self.value) * float(new_rate) / float(self.rate)
- except (AttributeError, TypeError, ValueError):
- raise TypeError(
- "Sorry, RationalTime cannot be rescaled to a value of type "
- "'{}', only RationalTime and numbers are supported.".format(
- type(new_rate)
- )
- )
-
- def almost_equal(self, other, delta=0.0):
- try:
- rescaled_value = self.value_rescaled_to(other.rate)
- return abs(rescaled_value - other.value) <= delta
-
- except AttributeError:
- return False
-
- def __add__(self, other):
- """Returns a RationalTime object that is the sum of self and other.
-
- If self and other have differing time rates, the result will have the
- have the rate of the faster time.
- """
-
- try:
- if self.rate == other.rate:
- return RationalTime(self.value + other.value, self.rate)
- except AttributeError:
- if not isinstance(other, RationalTime):
- raise TypeError(
- "RationalTime may only be added to other objects of type "
- "RationalTime, not {}.".format(type(other))
- )
- raise
-
- if self.rate > other.rate:
- scale = self.rate
- value = self.value + other.value_rescaled_to(scale)
- else:
- scale = other.rate
- value = self.value_rescaled_to(scale) + other.value
-
- return RationalTime(value, scale)
-
- # because RationalTime is immutable, += is sugar around +
- __iadd__ = __add__
-
- def __sub__(self, other):
- """Returns a RationalTime object that is self - other.
-
- If self and other have differing time rates, the result will have the
- have the rate of the faster time.
- """
-
- try:
- if self.rate == other.rate:
- return RationalTime(self.value - other.value, self.rate)
- except AttributeError:
- if not isinstance(other, RationalTime):
- raise TypeError(
- "RationalTime may only be added to other objects of type "
- "RationalTime, not {}.".format(type(other))
- )
- raise
-
- if self.rate > other.rate:
- scale = self.rate
- value = self.value - other.value_rescaled_to(scale)
- else:
- scale = other.rate
- value = self.value_rescaled_to(scale) - other.value
-
- return RationalTime(value=value, rate=scale)
-
- def _comparable_floats(self, other):
- """Returns a tuple of two floats, (self, other), which are suitable
- for comparison.
-
- If other is not of a type that can be compared, TypeError is raised
- """
- try:
- return (
- float(self.value) / self.rate,
- float(other.value) / other.rate
- )
- except AttributeError:
- if not isinstance(other, RationalTime):
- raise TypeError(
- "RationalTime can only be compared to other objects of type "
- "RationalTime, not {}".format(type(other))
- )
- raise
-
- def __gt__(self, other):
- f_self, f_other = self._comparable_floats(other)
- return f_self > f_other
-
- def __lt__(self, other):
- f_self, f_other = self._comparable_floats(other)
- return f_self < f_other
-
- def __le__(self, other):
- f_self, f_other = self._comparable_floats(other)
- return f_self <= f_other
-
- def __ge__(self, other):
- f_self, f_other = self._comparable_floats(other)
- return f_self >= f_other
-
- def __repr__(self):
- return (
- "otio.opentime.RationalTime(value={value},"
- " rate={rate})".format(
- value=repr(self.value),
- rate=repr(self.rate),
- )
- )
-
- def __str__(self):
- return "RationalTime({}, {})".format(
- str(self.value),
- str(self.rate)
- )
-
- def __eq__(self, other):
- try:
- return self.value_rescaled_to(other.rate) == other.value
- except AttributeError:
- return False
-
- def __ne__(self, other):
- return not (self == other)
-
- def __hash__(self):
- return hash((self.value, self.rate))
-
-
-class TimeTransform(object):
- """1D Transform for RationalTime. Has offset and scale."""
-
- def __init__(self, offset=RationalTime(), scale=1.0, rate=None):
- self.offset = copy.copy(offset)
- self.scale = float(scale)
- self.rate = float(rate) if rate else None
-
- def applied_to(self, other):
- if isinstance(other, TimeRange):
- return range_from_start_end_time(
- start_time=self.applied_to(other.start_time),
- end_time_exclusive=self.applied_to(other.end_time_exclusive())
- )
-
- target_rate = self.rate if self.rate is not None else other.rate
- if isinstance(other, TimeTransform):
- return TimeTransform(
- offset=self.offset + other.offset,
- scale=self.scale * other.scale,
- rate=target_rate
- )
- elif isinstance(other, RationalTime):
- value = other.value * self.scale
- result = RationalTime(value, other.rate) + self.offset
- if target_rate is not None:
- result = result.rescaled_to(target_rate)
-
- return result
- else:
- raise TypeError(
- "TimeTransform can only be applied to a TimeTransform or "
- "RationalTime, not a {}".format(type(other))
- )
-
- def __repr__(self):
- return (
- "otio.opentime.TimeTransform(offset={}, scale={}, rate={})".format(
- repr(self.offset),
- repr(self.scale),
- repr(self.rate)
- )
- )
-
- def __str__(self):
- return (
- "TimeTransform({}, {}, {})".format(
- str(self.offset),
- str(self.scale),
- str(self.rate)
- )
- )
-
- def __eq__(self, other):
- try:
- return (
- (self.offset, self.scale, self.rate) ==
- (other.offset, other.scale, self.rate)
- )
- except AttributeError:
- return False
-
- def __ne__(self, other):
- return not (self == other)
-
- def __hash__(self):
- return hash((self.offset, self.scale, self.rate))
-
-
-class BoundStrategy(object):
- """Different bounding strategies for TimeRange """
-
- Free = 1
- Clamp = 2
-
-
-class TimeRange(object):
- """Contains a range of time, starting (and including) start_time and
- lasting duration.value * (1/duration.rate) seconds.
-
- A 0 duration TimeRange is the same as a RationalTime, and contains only the
- start_time of the TimeRange.
- """
-
- __slots__ = ['start_time', 'duration']
-
- def __init__(self, start_time=None, duration=None):
- if not isinstance(start_time, RationalTime) and start_time is not None:
- raise TypeError(
- "start_time must be a RationalTime, not "
- "'{}'".format(start_time)
- )
- if (
- duration is not None and (
- not isinstance(duration, RationalTime)
- or duration.value < 0.0
- )
- ):
- raise TypeError(
- "duration must be a RationalTime with value >= 0, not "
- "'{}'".format(duration)
- )
-
- # if the start time has not been passed in
- if not start_time:
- if duration:
- # ...get the rate from the duration
- start_time = RationalTime(rate=duration.rate)
- else:
- # otherwise use the default
- start_time = RationalTime()
- _fn_cache(self, "start_time", copy.copy(start_time))
-
- if not duration:
- # ...get the rate from the start_time
- duration = RationalTime(rate=start_time.rate)
- _fn_cache(self, "duration", copy.copy(duration))
-
- def __setattr__(self, key, val):
- raise AttributeError("TimeRange is Immutable.")
-
- def __copy__(self, memodict=None):
- # Construct a new one directly to avoid the overhead of deepcopy
- return TimeRange(
- copy.copy(self.start_time),
- copy.copy(self.duration)
- )
-
- # Always deepcopy, since we want this class to behave like a value type
- __deepcopy__ = __copy__
-
- def end_time_inclusive(self):
- """The time of the last sample that contains data in the TimeRange.
-
- If the TimeRange goes from (0, 24) w/ duration (10, 24), this will be
- (9, 24)
-
- If the TimeRange goes from (0, 24) w/ duration (10.5, 24):
- (10, 24)
-
- In other words, the last frame with data (however fractional).
- """
-
- if (
- self.end_time_exclusive() - self.start_time.rescaled_to(self.duration)
- ).value > 1:
-
- result = (
- self.end_time_exclusive() - RationalTime(1, self.start_time.rate)
- )
-
- # if the duration's value has a fractional component
- if self.duration.value != math.floor(self.duration.value):
- result = RationalTime(
- math.floor(self.end_time_exclusive().value),
- result.rate
- )
-
- return result
- else:
- return copy.deepcopy(self.start_time)
-
- def end_time_exclusive(self):
- """"Time of the first sample outside the time range.
-
- If Start Frame is 10 and duration is 5, then end_time_exclusive is 15,
- even though the last time with data in this range is 14.
-
- If Start Frame is 10 and duration is 5.5, then end_time_exclusive is
- 15.5, even though the last time with data in this range is 15.
- """
-
- return self.duration + self.start_time.rescaled_to(self.duration)
-
- def extended_by(self, other):
- """Construct a new TimeRange that is this one extended by another."""
-
- if not isinstance(other, TimeRange):
- raise TypeError(
- "extended_by requires rtime be a TimeRange, not a '{}'".format(
- type(other)
- )
- )
-
- start_time = min(self.start_time, other.start_time)
- new_end_time = max(
- self.end_time_exclusive(),
- other.end_time_exclusive()
- )
- duration = duration_from_start_end_time(start_time, new_end_time)
- return TimeRange(start_time, duration)
-
- # @TODO: remove?
- def clamped(
- self,
- other,
- start_bound=BoundStrategy.Free,
- end_bound=BoundStrategy.Free
- ):
- """Clamp 'other' (either a RationalTime or a TimeRange), according to
- self.start_time/end_time_exclusive and the bound arguments.
- """
-
- if isinstance(other, RationalTime):
- if start_bound == BoundStrategy.Clamp:
- other = max(other, self.start_time)
- if end_bound == BoundStrategy.Clamp:
- # @TODO: this should probably be the end_time_inclusive,
- # not exclusive
- other = min(other, self.end_time_exclusive())
- return other
- elif isinstance(other, TimeRange):
- start_time = other.start_time
- end = other.end_time_exclusive()
- if start_bound == BoundStrategy.Clamp:
- start_time = max(other.start_time, self.start_time)
- if end_bound == BoundStrategy.Clamp:
- end = min(self.end_time_exclusive(), end)
- duration = duration_from_start_end_time(start_time, end)
- return TimeRange(start_time, duration)
- else:
- raise TypeError(
- "TimeRange can only be applied to RationalTime objects, not "
- "{}".format(type(other))
- )
- return self
-
- def contains(self, other):
- """Return true if self completely contains other.
-
- (RationalTime or TimeRange)
- """
-
- if isinstance(other, RationalTime):
- return (
- self.start_time <= other and other < self.end_time_exclusive())
- elif isinstance(other, TimeRange):
- return (
- self.start_time <= other.start_time and
- self.end_time_exclusive() >= other.end_time_exclusive()
- )
- raise TypeError(
- "contains only accepts on otio.opentime.RationalTime or "
- "otio.opentime.TimeRange, not {}".format(type(other))
- )
-
- def overlaps(self, other):
- """Return true if self overlaps any part of other.
-
- (RationalTime or TimeRange)
- """
-
- if isinstance(other, RationalTime):
- return self.contains(other)
- elif isinstance(other, TimeRange):
- return (
- (
- self.start_time < other.end_time_exclusive() and
- other.start_time < self.end_time_exclusive()
- )
- )
- raise TypeError(
- "overlaps only accepts on otio.opentime.RationalTime or "
- "otio.opentime.TimeRange, not {}".format(type(other))
- )
-
- def __hash__(self):
- return hash((self.start_time, self.duration))
-
- def __eq__(self, rhs):
- try:
- return (
- (self.start_time, self.duration) ==
- (rhs.start_time, rhs.duration)
- )
- except AttributeError:
- return False
-
- def __ne__(self, rhs):
- return not (self == rhs)
-
- def __repr__(self):
- return (
- "otio.opentime.TimeRange(start_time={}, duration={})".format(
- repr(self.start_time),
- repr(self.duration),
- )
- )
-
- def __str__(self):
- return (
- "TimeRange({}, {})".format(
- str(self.start_time),
- str(self.duration),
- )
- )
-
-
-def from_frames(frame, fps):
- """Turn a frame number and fps into a time object.
- :param frame: (:class:`int`) Frame number.
- :param fps: (:class:`float`) Frame-rate for the (:class:`RationalTime`) instance.
-
- :return: (:class:`RationalTime`) Instance for the frame and fps provided.
- """
-
- return RationalTime(int(frame), fps)
-
-
-def to_frames(time_obj, fps=None):
- """Turn a RationalTime into a frame number."""
-
- if not fps or time_obj.rate == fps:
- return int(time_obj.value)
-
- return int(time_obj.value_rescaled_to(fps))
-
-
-def validate_timecode_rate(rate):
- """Check if rate is of valid type and value.
- Raises (:class:`TypeError` for wrong type of rate.
- Raises (:class:`VaueError`) for invalid rate value.
-
- :param rate: (:class:`int`) or (:class:`float`) The frame rate in question
- """
- if not isinstance(rate, (int, float)):
- raise TypeError(
- "rate must be or not {t}".format(t=type(rate)))
-
- if rate not in VALID_TIMECODE_RATES:
- raise ValueError(
- '{rate} is not a valid frame rate, '
- 'Please use one of these: {valid}'.format(
- rate=rate,
- valid=VALID_TIMECODE_RATES))
-
-
-def from_timecode(timecode_str, rate):
- """Convert a timecode string into a RationalTime.
-
- :param timecode_str: (:class:`str`) A colon-delimited timecode.
- :param rate: (:class:`float`) The frame-rate to calculate timecode in
- terms of.
-
- :return: (:class:`RationalTime`) Instance for the timecode provided.
- """
- # Validate rate
- validate_timecode_rate(rate)
-
- # Check if rate is drop frame
- rate_is_dropframe = rate in VALID_DROPFRAME_TIMECODE_RATES
-
- # Make sure only DF timecodes are treated as such
- treat_as_df = rate_is_dropframe and ';' in timecode_str
-
- # Check if timecode indicates drop frame
- if ';' in timecode_str:
- if not rate_is_dropframe:
- raise ValueError(
- 'Timecode "{}" indicates drop-frame rate '
- 'due to the ";" frame divider. '
- 'Passed rate ({}) is of non-drop-frame rate. '
- 'Valid drop-frame rates are: {}'.format(
- timecode_str,
- rate,
- VALID_DROPFRAME_TIMECODE_RATES))
- else:
- timecode_str = timecode_str.replace(';', ':')
-
- hours, minutes, seconds, frames = timecode_str.split(":")
-
- # Timecode is declared in terms of nominal fps
- nominal_fps = int(math.ceil(rate))
-
- if int(frames) >= nominal_fps:
- raise ValueError(
- 'Frame rate mismatch. Timecode "{}" has frames beyond {}.'.format(
- timecode_str, nominal_fps - 1))
-
- dropframes = 0
- if treat_as_df:
- if rate == 29.97:
- dropframes = 2
-
- elif rate == 59.94:
- dropframes = 4
-
- # To use for drop frame compensation
- total_minutes = int(hours) * 60 + int(minutes)
-
- # convert to frames
- value = (
- ((total_minutes * 60) + int(seconds)) * nominal_fps + int(frames)) - \
- (dropframes * (total_minutes - (total_minutes // 10)))
-
- return RationalTime(value, rate)
-
-
-def to_timecode(time_obj, rate=None, drop_frame=None):
- """Convert a RationalTime into a timecode string.
-
- :param time_obj: (:class:`RationalTime`) instance to express as timecode.
- :param rate: (:class:`float`) The frame-rate to calculate timecode in
- terms of. (Default time_obj.rate)
- :param drop_frame: (:class:`bool`) ``True`` to make drop-frame timecode,
- ``False`` for non-drop. If left ``None``, a format will be guessed
- based on rate.
-
- :return: (:class:`str`) The timecode.
- """
- if time_obj is None:
- return None
-
- rate = rate or time_obj.rate
-
- # Validate rate
- validate_timecode_rate(rate)
-
- # Check if rate is drop frame
- rate_is_dropframe = rate in VALID_DROPFRAME_TIMECODE_RATES
- if drop_frame and not rate_is_dropframe:
- raise ValueError(
- "Invalid rate for drop-frame timecode {}".format(time_obj.rate)
- )
-
- # if in auto-detect for DFTC, use the rate to decide
- if drop_frame is None:
- drop_frame = rate_is_dropframe
-
- dropframes = 0
- if drop_frame:
- if rate in (29.97, (30000 / 1001.0)):
- dropframes = 2
-
- elif rate == 59.94:
- dropframes = 4
-
- # For non-dftc, use the integral frame rate
- if not drop_frame:
- rate = round(rate)
-
- # Number of frames in an hour
- frames_per_hour = int(round(rate * 60 * 60))
- # Number of frames in a day - timecode rolls over after 24 hours
- frames_per_24_hours = frames_per_hour * 24
- # Number of frames per ten minutes
- frames_per_10_minutes = int(round(rate * 60 * 10))
- # Number of frames per minute is the round of the framerate * 60 minus
- # the number of dropped frames
- frames_per_minute = int(round(rate) * 60) - dropframes
-
- value = time_obj.value
-
- if value < 0:
- raise ValueError(
- "Negative values are not supported for converting to timecode.")
-
- # If frame_number is greater than 24 hrs, next operation will rollover
- # clock
- value %= frames_per_24_hours
-
- if drop_frame:
- d = value // frames_per_10_minutes
- m = value % frames_per_10_minutes
- if m > dropframes:
- value += (dropframes * 9 * d) + \
- dropframes * ((m - dropframes) // frames_per_minute)
- else:
- value += dropframes * 9 * d
-
- nominal_fps = int(math.ceil(rate))
-
- frames = value % nominal_fps
- seconds = (value // nominal_fps) % 60
- minutes = ((value // nominal_fps) // 60) % 60
- hours = (((value // nominal_fps) // 60) // 60)
-
- tc = "{HH:02d}:{MM:02d}:{SS:02d}{div}{FF:02d}"
-
- return tc.format(
- HH=int(hours),
- MM=int(minutes),
- SS=int(seconds),
- div=drop_frame and ";" or ":",
- FF=int(frames))
-
-
-def from_time_string(time_str, rate):
- """Convert a time with microseconds string into a RationalTime.
-
- :param time_str: (:class:`str`) A HH:MM:ss.ms time.
- :param rate: (:class:`float`) The frame-rate to calculate timecode in
- terms of.
-
- :return: (:class:`RationalTime`) Instance for the timecode provided.
- """
-
- if ';' in time_str:
- raise ValueError('Drop-Frame timecodes not supported.')
-
- hours, minutes, seconds = time_str.split(":")
- microseconds = "0"
- if '.' in seconds:
- seconds, microseconds = str(seconds).split('.')
- microseconds = microseconds[0:6]
- seconds = '.'.join([seconds, microseconds])
- time_obj = from_seconds(
- float(seconds) +
- (int(minutes) * 60) +
- (int(hours) * 60 * 60)
- )
- return time_obj.rescaled_to(rate)
-
-
-def to_time_string(time_obj):
- """
- Convert this timecode to time with microsecond, as formated in FFMPEG
-
- :return: Number formated string of time
- """
- if time_obj is None:
- return None
- # convert time object to seconds
- seconds = to_seconds(time_obj)
-
- # reformat in time string
- time_units_per_minute = 60
- time_units_per_hour = time_units_per_minute * 60
- time_units_per_day = time_units_per_hour * 24
-
- days, hour_units = divmod(seconds, time_units_per_day)
- hours, minute_units = divmod(hour_units, time_units_per_hour)
- minutes, seconds = divmod(minute_units, time_units_per_minute)
- microseconds = "0"
- seconds = str(seconds)
- if '.' in seconds:
- seconds, microseconds = str(seconds).split('.')
-
- # TODO: There are some rollover policy issues for days and hours,
- # We need to research these
-
- return "{hours}:{minutes}:{seconds}.{microseconds}".format(
- hours="{n:0{width}d}".format(n=int(hours), width=2),
- minutes="{n:0{width}d}".format(n=int(minutes), width=2),
- seconds="{n:0{width}d}".format(n=int(seconds), width=2),
- microseconds=microseconds[0:6]
- )
-
-
-def from_seconds(seconds):
- """Convert a number of seconds into RationalTime"""
-
- # Note: in the future we may consider adding a preferred rate arg
- time_obj = RationalTime(value=seconds, rate=1)
-
- return time_obj
-
-
-def to_seconds(time_obj):
- """ Convert a RationalTime into float seconds """
- return time_obj.value_rescaled_to(1)
-
-
-def from_footage(footage):
- raise NotImplementedError
-
-
-def to_footage(time_obj):
- raise NotImplementedError
-
-
-def duration_from_start_end_time(start_time, end_time_exclusive):
- """Compute duration of samples from first to last. This is not the same as
- distance. For example, the duration of a clip from frame 10 to frame 15
- is 6 frames. Result in the rate of start_time.
- """
-
- # @TODO: what to do when start_time > end_time_exclusive?
-
- if start_time.rate == end_time_exclusive.rate:
- return RationalTime(
- end_time_exclusive.value - start_time.value,
- start_time.rate
- )
- else:
- return RationalTime(
- (
- end_time_exclusive.value_rescaled_to(start_time)
- - start_time.value
- ),
- start_time.rate
- )
-
-
-# @TODO: create range from start/end [in,ex]clusive
-def range_from_start_end_time(start_time, end_time_exclusive):
- """Create a TimeRange from start and end RationalTimes."""
-
- return TimeRange(
- start_time,
- duration=duration_from_start_end_time(start_time, end_time_exclusive)
- )
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/__init__.py
deleted file mode 100644
index dedb3da37e..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Plugin system for OTIO"""
-
-# flake8: noqa
-
-from .python_plugin import PythonPlugin
-from .manifest import (
- manifest_from_file,
- ActiveManifest,
-)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/manifest.py b/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/manifest.py
deleted file mode 100644
index 2a769effec..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/manifest.py
+++ /dev/null
@@ -1,282 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Implementation of an adapter registry system for OTIO."""
-
-import inspect
-import logging
-import os
-
-# on some python interpreters, pkg_resources is not available
-try:
- import pkg_resources
-except ImportError:
- pkg_resources = None
-
-from .. import (
- core,
- exceptions,
-)
-
-
-def manifest_from_file(filepath):
- """Read the .json file at filepath into a Manifest object."""
-
- result = core.deserialize_json_from_file(filepath)
- result.source_files.append(filepath)
- result._update_plugin_source(filepath)
- return result
-
-
-def manifest_from_string(input_string):
- """Deserialize the json string into a manifest object."""
-
- result = core.deserialize_json_from_string(input_string)
-
- # try and get the caller's name
- name = "unknown"
- stack = inspect.stack()
- if len(stack) > 1 and len(stack[1]) > 3:
- # filename function name
- name = "{}:{}".format(stack[1][1], stack[1][3])
-
- # set the value in the manifest
- src_string = "call to manifest_from_string() in " + name
- result.source_files.append(src_string)
- result._update_plugin_source(src_string)
-
- return result
-
-
-@core.register_type
-class Manifest(core.SerializableObject):
- """Defines an OTIO plugin Manifest.
-
- This is an internal OTIO implementation detail. A manifest tracks a
- collection of adapters and allows finding specific adapters by suffix
-
- For writing your own adapters, consult:
- https://opentimelineio.readthedocs.io/en/latest/tutorials/write-an-adapter.html#
- """
- _serializable_label = "PluginManifest.1"
-
- def __init__(self):
- super(Manifest, self).__init__()
- self.adapters = []
- self.schemadefs = []
- self.media_linkers = []
- self.source_files = []
-
- # hook system stuff
- self.hooks = {}
- self.hook_scripts = []
-
- adapters = core.serializable_field(
- "adapters",
- type([]),
- "Adapters this manifest describes."
- )
- schemadefs = core.serializable_field(
- "schemadefs",
- type([]),
- "Schemadefs this manifest describes."
- )
- media_linkers = core.serializable_field(
- "media_linkers",
- type([]),
- "Media Linkers this manifest describes."
- )
- hooks = core.serializable_field(
- "hooks",
- type({}),
- "Hooks that hooks scripts can be attached to."
- )
- hook_scripts = core.serializable_field(
- "hook_scripts",
- type([]),
- "Scripts that can be attached to hooks."
- )
-
- def extend(self, another_manifest):
- """
- Extend the adapters, schemadefs, and media_linkers lists of this manifest
- by appending the contents of the corresponding lists of another_manifest.
- """
- if another_manifest:
- self.adapters.extend(another_manifest.adapters)
- self.schemadefs.extend(another_manifest.schemadefs)
- self.media_linkers.extend(another_manifest.media_linkers)
- self.hook_scripts.extend(another_manifest.hook_scripts)
-
- for trigger_name, hooks in another_manifest.hooks.items():
- if trigger_name in self.hooks:
- self.hooks[trigger_name].extend(hooks)
-
- def _update_plugin_source(self, path):
- """Track the source .json for a given adapter."""
-
- for thing in (self.adapters + self.schemadefs
- + self.media_linkers + self.hook_scripts):
- thing._json_path = path
-
- def from_filepath(self, suffix):
- """Return the adapter object associated with a given file suffix."""
-
- for adapter in self.adapters:
- if suffix.lower() in adapter.suffixes:
- return adapter
- raise exceptions.NoKnownAdapterForExtensionError(suffix)
-
- def adapter_module_from_suffix(self, suffix):
- """Return the adapter module associated with a given file suffix."""
-
- adp = self.from_filepath(suffix)
- return adp.module()
-
- def from_name(self, name, kind_list="adapters"):
- """Return the adapter object associated with a given adapter name."""
-
- for thing in getattr(self, kind_list):
- if name == thing.name:
- return thing
-
- raise exceptions.NotSupportedError(
- "Could not find plugin: '{}' in kind_list: '{}'."
- " options: {}".format(
- name,
- kind_list,
- getattr(self, kind_list)
- )
- )
-
- def adapter_module_from_name(self, name):
- """Return the adapter module associated with a given adapter name."""
-
- adp = self.from_name(name)
- return adp.module()
-
- def schemadef_module_from_name(self, name):
- """Return the schemadef module associated with a given schemadef name."""
-
- adp = self.from_name(name, kind_list="schemadefs")
- return adp.module()
-
-
-_MANIFEST = None
-
-
-def load_manifest():
- # build the manifest of adapters, starting with builtin adapters
- result = manifest_from_file(
- os.path.join(
- os.path.dirname(os.path.dirname(inspect.getsourcefile(core))),
- "adapters",
- "builtin_adapters.plugin_manifest.json"
- )
- )
-
- # layer contrib plugins after built in ones
- try:
- import opentimelineio_contrib as otio_c
-
- contrib_manifest = manifest_from_file(
- os.path.join(
- os.path.dirname(inspect.getsourcefile(otio_c)),
- "adapters",
- "contrib_adapters.plugin_manifest.json"
- )
- )
- result.extend(contrib_manifest)
- except ImportError:
- pass
-
- # Discover setuptools-based plugins
- if pkg_resources:
- for plugin in pkg_resources.iter_entry_points(
- "opentimelineio.plugins"
- ):
- plugin_name = plugin.name
- try:
- plugin_entry_point = plugin.load()
- try:
- plugin_manifest = plugin_entry_point.plugin_manifest()
- except AttributeError:
- if not pkg_resources.resource_exists(
- plugin.module_name,
- 'plugin_manifest.json'
- ):
- raise
- manifest_stream = pkg_resources.resource_stream(
- plugin.module_name,
- 'plugin_manifest.json'
- )
- plugin_manifest = core.deserialize_json_from_string(
- manifest_stream.read().decode('utf-8')
- )
- manifest_stream.close()
- filepath = pkg_resources.resource_filename(
- plugin.module_name,
- 'plugin_manifest.json'
- )
- plugin_manifest._update_plugin_source(filepath)
-
- except Exception:
- logging.exception(
- "could not load plugin: {}".format(plugin_name)
- )
- continue
-
- result.extend(plugin_manifest)
- else:
- # XXX: Should we print some kind of warning that pkg_resources isn't
- # available?
- pass
-
- # read local adapter manifests, if they exist
- _local_manifest_path = os.environ.get("OTIO_PLUGIN_MANIFEST_PATH", None)
- if _local_manifest_path is not None:
- for json_path in _local_manifest_path.split(":"):
- if not os.path.exists(json_path):
- # XXX: In case error reporting is requested
- # print(
- # "Warning: OpenTimelineIO cannot access path '{}' from "
- # "$OTIO_PLUGIN_MANIFEST_PATH".format(json_path)
- # )
- continue
-
- LOCAL_MANIFEST = manifest_from_file(json_path)
- result.extend(LOCAL_MANIFEST)
-
- # force the schemadefs to load and add to schemadef module namespace
- for s in result.schemadefs:
- s.module()
- return result
-
-
-def ActiveManifest(force_reload=False):
- global _MANIFEST
- if not _MANIFEST or force_reload:
- _MANIFEST = load_manifest()
-
- return _MANIFEST
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/python_plugin.py b/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/python_plugin.py
deleted file mode 100644
index c749bd5f9d..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/plugins/python_plugin.py
+++ /dev/null
@@ -1,128 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Base class for OTIO plugins that are exposed by manifests."""
-
-import os
-import imp
-
-from .. import (
- core,
- exceptions,
-)
-
-
-class PythonPlugin(core.SerializableObject):
- """A class of plugin that is encoded in a python module, exposed via a
- manifest.
- """
-
- _serializable_label = "PythonPlugin.1"
-
- def __init__(
- self,
- name=None,
- execution_scope=None,
- filepath=None,
- ):
- super(PythonPlugin, self).__init__()
- self.name = name
- self.execution_scope = execution_scope
- self.filepath = filepath
- self._json_path = None
- self._module = None
-
- name = core.serializable_field("name", doc="Adapter name.")
- execution_scope = core.serializable_field(
- "execution_scope",
- str,
- doc=(
- "Describes whether this adapter is executed in the current python"
- " process or in a subshell. Options are: "
- "['in process', 'out of process']."
- )
- )
- filepath = core.serializable_field(
- "filepath",
- str,
- doc=(
- "Absolute path or relative path to adapter module from location of"
- " json."
- )
- )
-
- def module_abs_path(self):
- """Return an absolute path to the module implementing this adapter."""
-
- filepath = self.filepath
- if not os.path.isabs(filepath):
- if not self._json_path:
- raise exceptions.MisconfiguredPluginError(
- "{} plugin is misconfigured, missing json path. "
- "plugin: {}".format(
- self.name,
- repr(self)
- )
- )
-
- filepath = os.path.join(os.path.dirname(self._json_path), filepath)
-
- return filepath
-
- def _imported_module(self, namespace):
- """Load the module this plugin points at."""
-
- pyname = os.path.splitext(os.path.basename(self.module_abs_path()))[0]
- pydir = os.path.dirname(self.module_abs_path())
-
- (file_obj, pathname, description) = imp.find_module(pyname, [pydir])
-
- with file_obj:
- # this will reload the module if it has already been loaded.
- mod = imp.load_module(
- "opentimelineio.{}.{}".format(namespace, self.name),
- file_obj,
- pathname,
- description
- )
-
- return mod
-
- def module(self):
- """Return the module object for this adapter. """
-
- if not self._module:
- self._module = self._imported_module("adapters")
-
- return self._module
-
- def _execute_function(self, func_name, **kwargs):
- """Execute func_name on this adapter with error checking."""
-
- # collects the error handling into a common place.
- if not hasattr(self.module(), func_name):
- raise exceptions.AdapterDoesntSupportFunctionError(
- "Sorry, {} doesn't support {}.".format(self.name, func_name)
- )
- return (getattr(self.module(), func_name)(**kwargs))
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/__init__.py
deleted file mode 100644
index 419f337bf6..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/__init__.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-# flake8: noqa
-
-"""User facing classes."""
-
-from .missing_reference import (
- MissingReference
-)
-from .external_reference import (
- ExternalReference
-)
-from .clip import (
- Clip,
-)
-from .track import (
- Track,
- TrackKind,
- NeighborGapPolicy,
-)
-from .stack import (
- Stack,
-)
-from .timeline import (
- Timeline,
- timeline_from_clips,
-)
-from .marker import (
- Marker,
- MarkerColor,
-)
-from .gap import (
- Gap,
-)
-from .effect import (
- Effect,
- TimeEffect,
- LinearTimeWarp,
- FreezeFrame,
-)
-from .transition import (
- Transition,
- TransitionTypes,
-)
-from .serializable_collection import (
- SerializableCollection
-)
-from .generator_reference import (
- GeneratorReference
-)
-from .schemadef import (
- SchemaDef
-)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/clip.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/clip.py
deleted file mode 100644
index 44d38dfcf1..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/clip.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Implementation of the Clip class, for pointing at media."""
-
-import copy
-
-from .. import (
- core,
- exceptions,
-)
-from . import (
- missing_reference
-)
-
-
-@core.register_type
-class Clip(core.Item):
- """The base editable object in OTIO.
-
- Contains a media reference and a trim on that media reference.
- """
-
- _serializable_label = "Clip.1"
-
- def __init__(
- self,
- name=None,
- media_reference=None,
- source_range=None,
- markers=[],
- effects=[],
- metadata=None,
- ):
- core.Item.__init__(
- self,
- name=name,
- source_range=source_range,
- markers=markers,
- effects=effects,
- metadata=metadata
- )
-
- if not media_reference:
- media_reference = missing_reference.MissingReference()
- self._media_reference = copy.deepcopy(media_reference)
-
- name = core.serializable_field("name", doc="Name of this clip.")
- transform = core.deprecated_field()
- _media_reference = core.serializable_field(
- "media_reference",
- core.MediaReference,
- "Media reference to the media this clip represents."
- )
-
- @property
- def media_reference(self):
- if self._media_reference is None:
- self._media_reference = missing_reference.MissingReference()
- return self._media_reference
-
- @media_reference.setter
- def media_reference(self, val):
- if val is None:
- val = missing_reference.MissingReference()
- self._media_reference = val
-
- def available_range(self):
- if not self.media_reference:
- raise exceptions.CannotComputeAvailableRangeError(
- "No media reference set on clip: {}".format(self)
- )
-
- if not self.media_reference.available_range:
- raise exceptions.CannotComputeAvailableRangeError(
- "No available_range set on media reference on clip: {}".format(
- self
- )
- )
-
- return copy.copy(self.media_reference.available_range)
-
- def __str__(self):
- return 'Clip("{}", {}, {}, {})'.format(
- self.name,
- self.media_reference,
- self.source_range,
- self.metadata
- )
-
- def __repr__(self):
- return (
- 'otio.schema.Clip('
- 'name={}, '
- 'media_reference={}, '
- 'source_range={}, '
- 'metadata={}'
- ')'.format(
- repr(self.name),
- repr(self.media_reference),
- repr(self.source_range),
- repr(self.metadata),
- )
- )
-
- def each_clip(self, search_range=None):
- """Yields self."""
-
- yield self
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/effect.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/effect.py
deleted file mode 100644
index 61eb4204fa..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/effect.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Implementation of Effect OTIO class."""
-
-from .. import (
- core
-)
-
-import copy
-
-
-@core.register_type
-class Effect(core.SerializableObject):
- _serializable_label = "Effect.1"
-
- def __init__(
- self,
- name=None,
- effect_name=None,
- metadata=None
- ):
- super(Effect, self).__init__()
- self.name = name
- self.effect_name = effect_name
- self.metadata = copy.deepcopy(metadata) if metadata else {}
-
- name = core.serializable_field(
- "name",
- doc="Name of this effect object. Example: 'BlurByHalfEffect'."
- )
- effect_name = core.serializable_field(
- "effect_name",
- doc="Name of the kind of effect (example: 'Blur', 'Crop', 'Flip')."
- )
- metadata = core.serializable_field(
- "metadata",
- dict,
- doc="Metadata dictionary."
- )
-
- def __str__(self):
- return (
- "Effect("
- "{}, "
- "{}, "
- "{}"
- ")".format(
- str(self.name),
- str(self.effect_name),
- str(self.metadata),
- )
- )
-
- def __repr__(self):
- return (
- "otio.schema.Effect("
- "name={}, "
- "effect_name={}, "
- "metadata={}"
- ")".format(
- repr(self.name),
- repr(self.effect_name),
- repr(self.metadata),
- )
- )
-
-
-@core.register_type
-class TimeEffect(Effect):
- "Base Time Effect Class"
- _serializable_label = "TimeEffect.1"
- pass
-
-
-@core.register_type
-class LinearTimeWarp(TimeEffect):
- "A time warp that applies a linear scale across the entire clip"
- _serializable_label = "LinearTimeWarp.1"
-
- def __init__(self, name=None, time_scalar=1, metadata=None):
- Effect.__init__(
- self,
- name=name,
- effect_name="LinearTimeWarp",
- metadata=metadata
- )
- self.time_scalar = time_scalar
-
- time_scalar = core.serializable_field(
- "time_scalar",
- doc="Linear time scalar applied to clip. "
- "2.0 = double speed, 0.5 = half speed."
- )
-
-
-@core.register_type
-class FreezeFrame(LinearTimeWarp):
- "Hold the first frame of the clip for the duration of the clip."
- _serializable_label = "FreezeFrame.1"
-
- def __init__(self, name=None, metadata=None):
- LinearTimeWarp.__init__(
- self,
- name=name,
- time_scalar=0,
- metadata=metadata
- )
- self.effect_name = "FreezeFrame"
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/external_reference.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/external_reference.py
deleted file mode 100644
index 87db4d4652..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/external_reference.py
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""
-Implementation of the ExternalReference media reference schema.
-"""
-
-from .. import (
- core,
-)
-
-
-@core.register_type
-class ExternalReference(core.MediaReference):
- """Reference to media via a url, for example "file:///var/tmp/foo.mov" """
-
- _serializable_label = "ExternalReference.1"
- _name = "ExternalReference"
-
- def __init__(
- self,
- target_url=None,
- available_range=None,
- metadata=None,
- ):
- core.MediaReference.__init__(
- self,
- available_range=available_range,
- metadata=metadata
- )
-
- self.target_url = target_url
-
- target_url = core.serializable_field(
- "target_url",
- doc=(
- "URL at which this media lives. For local references, use the "
- "'file://' format."
- )
- )
-
- def __str__(self):
- return 'ExternalReference("{}")'.format(self.target_url)
-
- def __repr__(self):
- return 'otio.schema.ExternalReference(target_url={})'.format(
- repr(self.target_url)
- )
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/gap.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/gap.py
deleted file mode 100644
index 4c8165db8f..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/gap.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-from .. import (
- core,
- opentime,
-)
-
-"""Gap Item - represents a transparent gap in content."""
-
-
-@core.register_type
-class Gap(core.Item):
- _serializable_label = "Gap.1"
- _class_path = "schema.Gap"
-
- def __init__(
- self,
- name=None,
- # note - only one of the following two arguments is accepted
- # if neither is provided, source_range will be set to an empty
- # TimeRange
- # Duration is provided as a convienence for creating a gap of a certain
- # length. IE: Gap(duration=otio.opentime.RationalTime(300, 24))
- duration=None,
- source_range=None,
- effects=None,
- markers=None,
- metadata=None,
- ):
- if duration and source_range:
- raise RuntimeError(
- "Cannot instantiate with both a source range and a duration."
- )
-
- if duration:
- source_range = opentime.TimeRange(
- opentime.RationalTime(0, duration.rate),
- duration
- )
- elif source_range is None:
- # if neither is provided, seed TimeRange as an empty Source Range.
- source_range = opentime.TimeRange()
-
- core.Item.__init__(
- self,
- name=name,
- source_range=source_range,
- effects=effects,
- markers=markers,
- metadata=metadata
- )
-
- @staticmethod
- def visible():
- return False
-
-
-# the original name for "gap" was "filler" - this will turn "Filler" found in
-# OTIO files into Gap automatically.
-core.register_type(Gap, "Filler")
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/generator_reference.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/generator_reference.py
deleted file mode 100644
index ef1dde836e..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/generator_reference.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""
-Generators are media references that _produce_ media rather than refer to it.
-"""
-
-from .. import (
- core,
-)
-
-
-@core.register_type
-class GeneratorReference(core.MediaReference):
- """
- Base class for Generators.
-
- Generators are media references that become "generators" in editorial
- systems. For example, color bars or a solid color.
- """
-
- _serializable_label = "GeneratorReference.1"
- _name = "GeneratorReference"
-
- def __init__(
- self,
- name=None,
- generator_kind=None,
- available_range=None,
- parameters=None,
- metadata=None
- ):
- super(GeneratorReference, self).__init__(
- name,
- available_range,
- metadata
- )
-
- if parameters is None:
- parameters = {}
- self.parameters = parameters
- self.generator_kind = generator_kind
-
- parameters = core.serializable_field(
- "parameters",
- dict,
- doc="Dictionary of parameters for generator."
- )
- generator_kind = core.serializable_field(
- "generator_kind",
- required_type=type(""),
- # @TODO: need to clarify if this also has an enum of supported types
- # / generic
- doc="Kind of generator reference, as defined by the "
- "schema.generator_reference.GeneratorReferenceTypes enum."
- )
-
- def __str__(self):
- return 'GeneratorReference("{}", "{}", {}, {})'.format(
- self.name,
- self.generator_kind,
- self.parameters,
- self.metadata
- )
-
- def __repr__(self):
- return (
- 'otio.schema.GeneratorReference('
- 'name={}, '
- 'generator_kind={}, '
- 'parameters={}, '
- 'metadata={}'
- ')'.format(
- repr(self.name),
- repr(self.generator_kind),
- repr(self.parameters),
- repr(self.metadata),
- )
- )
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/marker.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/marker.py
deleted file mode 100644
index d8b6f1c272..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/marker.py
+++ /dev/null
@@ -1,128 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Marker class. Holds metadata over regions of time."""
-
-from .. import (
- core,
- opentime,
-)
-
-
-class MarkerColor:
- """ Enum encoding colors of markers as strings. """
-
- PINK = "PINK"
- RED = "RED"
- ORANGE = "ORANGE"
- YELLOW = "YELLOW"
- GREEN = "GREEN"
- CYAN = "CYAN"
- BLUE = "BLUE"
- PURPLE = "PURPLE"
- MAGENTA = "MAGENTA"
- BLACK = "BLACK"
- WHITE = "WHITE"
-
-
-@core.register_type
-class Marker(core.SerializableObject):
-
- """ Holds metadata over time on a timeline """
-
- _serializable_label = "Marker.2"
- _class_path = "marker.Marker"
-
- def __init__(
- self,
- name=None,
- marked_range=None,
- color=MarkerColor.RED,
- metadata=None,
- ):
- core.SerializableObject.__init__(
- self,
- )
- self.name = name
- self.marked_range = marked_range
- self.color = color
- self.metadata = metadata or {}
-
- name = core.serializable_field("name", doc="Name of this marker.")
-
- marked_range = core.serializable_field(
- "marked_range",
- opentime.TimeRange,
- "Range this marker applies to, relative to the Item this marker is "
- "attached to (e.g. the Clip or Track that owns this marker)."
- )
-
- color = core.serializable_field(
- "color",
- required_type=type(MarkerColor.RED),
- doc="Color string for this marker (for example: 'RED'), based on the "
- "otio.schema.marker.MarkerColor enum."
- )
-
- # old name
- range = core.deprecated_field()
-
- metadata = core.serializable_field(
- "metadata",
- dict,
- "Metadata dictionary."
- )
-
- def __repr__(self):
- return (
- "otio.schema.Marker("
- "name={}, "
- "marked_range={}, "
- "metadata={}"
- ")".format(
- repr(self.name),
- repr(self.marked_range),
- repr(self.metadata),
- )
- )
-
- def __str__(self):
- return (
- "Marker("
- "{}, "
- "{}, "
- "{}"
- ")".format(
- str(self.name),
- str(self.marked_range),
- str(self.metadata),
- )
- )
-
-
-@core.upgrade_function_for(Marker, 2)
-def _version_one_to_two(data):
- data["marked_range"] = data["range"]
- del data["range"]
- return data
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/missing_reference.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/missing_reference.py
deleted file mode 100644
index 88bc1862fc..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/missing_reference.py
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""
-Implementation of the MissingReference media reference schema.
-"""
-
-from .. import (
- core,
-)
-
-
-@core.register_type
-class MissingReference(core.MediaReference):
- """Represents media for which a concrete reference is missing."""
-
- _serializable_label = "MissingReference.1"
- _name = "MissingReference"
-
- @property
- def is_missing_reference(self):
- return True
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/schemadef.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/schemadef.py
deleted file mode 100644
index 5fb4e05abd..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/schemadef.py
+++ /dev/null
@@ -1,65 +0,0 @@
-
-from .. import (
- core,
- exceptions,
- plugins,
- schemadef
-)
-
-
-@core.register_type
-class SchemaDef(plugins.PythonPlugin):
- _serializable_label = "SchemaDef.1"
-
- def __init__(
- self,
- name=None,
- execution_scope=None,
- filepath=None,
- ):
- super(SchemaDef, self).__init__(name, execution_scope, filepath)
-
- def module(self):
- """
- Return the module object for this schemadef plugin.
- If the module hasn't already been imported, it is imported and
- injected into the otio.schemadefs namespace as a side-effect.
- (redefines PythonPlugin.module())
- """
-
- if not self._module:
- self._module = self._imported_module("schemadef")
- if self.name:
- schemadef._add_schemadef_module(self.name, self._module)
-
- return self._module
-
-
-def available_schemadef_names():
- """Return a string list of the available schemadefs."""
-
- return [str(sd.name) for sd in plugins.ActiveManifest().schemadefs]
-
-
-def from_name(name):
- """Fetch the schemadef plugin object by the name of the schema directly."""
-
- try:
- return plugins.ActiveManifest().from_name(name, kind_list="schemadefs")
- except exceptions.NotSupportedError:
- raise exceptions.NotSupportedError(
- "schemadef not supported: {}, available: {}".format(
- name,
- available_schemadef_names()
- )
- )
-
-
-def module_from_name(name):
- """Fetch the plugin's module by the name of the schemadef.
-
- Will load the plugin if it has not already been loaded. Reading a file that
- contains the schemadef will also trigger a load of the plugin.
- """
- plugin = from_name(name)
- return plugin.module()
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/serializable_collection.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/serializable_collection.py
deleted file mode 100644
index 523ea77ddb..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/serializable_collection.py
+++ /dev/null
@@ -1,149 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""A serializable collection of SerializableObjects."""
-
-import collections
-import copy
-
-from .. import (
- core
-)
-
-from . import (
- clip
-)
-
-
-@core.register_type
-class SerializableCollection(
- core.SerializableObject,
- collections.MutableSequence
-):
- """A kind of composition which can hold any serializable object.
-
- This composition approximates the concept of a `bin` - a collection of
- SerializableObjects that do not have any compositing meaning, but can
- serialize to/from OTIO correctly, with metadata and a named collection.
- """
-
- _serializable_label = "SerializableCollection.1"
- _class_path = "schema.SerializableCollection"
-
- def __init__(
- self,
- name=None,
- children=None,
- metadata=None,
- ):
- super(SerializableCollection, self).__init__()
-
- self.name = name
- self._children = children or []
- self.metadata = copy.deepcopy(metadata) if metadata else {}
-
- name = core.serializable_field(
- "name",
- doc="SerializableCollection name."
- )
- _children = core.serializable_field(
- "children",
- list,
- "SerializableObject contained by this container."
- )
- metadata = core.serializable_field(
- "metadata",
- dict,
- doc="Metadata dictionary for this SerializableCollection."
- )
-
- # @{ Stringification
- def __str__(self):
- return "SerializableCollection({}, {}, {})".format(
- str(self.name),
- str(self._children),
- str(self.metadata)
- )
-
- def __repr__(self):
- return (
- "otio.{}("
- "name={}, "
- "children={}, "
- "metadata={}"
- ")".format(
- self._class_path,
- repr(self.name),
- repr(self._children),
- repr(self.metadata)
- )
- )
- # @}
-
- # @{ collections.MutableSequence implementation
- def __getitem__(self, item):
- return self._children[item]
-
- def __setitem__(self, key, value):
- self._children[key] = value
-
- def insert(self, index, item):
- self._children.insert(index, item)
-
- def __len__(self):
- return len(self._children)
-
- def __delitem__(self, item):
- del self._children[item]
- # @}
-
- def each_child(
- self,
- search_range=None,
- descended_from_type=core.composable.Composable
- ):
- for i, child in enumerate(self._children):
- # filter out children who are not descended from the specified type
- is_descendant = descended_from_type == core.composable.Composable
- if is_descendant or isinstance(child, descended_from_type):
- yield child
-
- # for children that are compositions, recurse into their children
- if hasattr(child, "each_child"):
- for valid_child in (
- c for c in child.each_child(
- search_range,
- descended_from_type
- )
- ):
- yield valid_child
-
- def each_clip(self, search_range=None):
- return self.each_child(search_range, clip.Clip)
-
-
-# the original name for "SerializableCollection" was "SerializeableCollection"
-# this will turn this misspelling found in OTIO files into the correct instance
-# automatically.
-core.register_type(SerializableCollection, 'SerializeableCollection')
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/stack.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/stack.py
deleted file mode 100644
index bf67158dc0..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/stack.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""A stack represents a series of composable.Composables that are arranged such
-that their start times are at the same point.
-
-Most commonly, this would be a series of schema.Track objects that then
-contain clips. The 0 time of those tracks would be coincide with the 0-time of
-the stack.
-
-Stacks are in compositing order, with later children obscuring earlier
-children. In other words, from bottom to top. If a stack has three children,
-[A, B, C], C is above B which is above A.
-
-A stack is the length of its longest child. If a child ends before the other
-children, then an earlier index child would be visible before it.
-"""
-
-from .. import (
- core,
- opentime,
- exceptions
-)
-
-from . import (
- clip
-)
-
-
-@core.register_type
-class Stack(core.Composition):
- _serializable_label = "Stack.1"
- _composition_kind = "Stack"
- _modname = "schema"
-
- def __init__(
- self,
- name=None,
- children=None,
- source_range=None,
- markers=None,
- effects=None,
- metadata=None
- ):
- core.Composition.__init__(
- self,
- name=name,
- children=children,
- source_range=source_range,
- markers=markers,
- effects=effects,
- metadata=metadata
- )
-
- def range_of_child_at_index(self, index):
- try:
- child = self[index]
- except IndexError:
- raise exceptions.NoSuchChildAtIndex(index)
-
- dur = child.duration()
-
- return opentime.TimeRange(
- start_time=opentime.RationalTime(0, dur.rate),
- duration=dur
- )
-
- def each_clip(self, search_range=None):
- return self.each_child(search_range, clip.Clip)
-
- def available_range(self):
- if len(self) == 0:
- return opentime.TimeRange()
-
- duration = max(child.duration() for child in self)
-
- return opentime.TimeRange(
- opentime.RationalTime(0, duration.rate),
- duration=duration
- )
-
- def range_of_all_children(self):
- child_map = {}
- for i, c in enumerate(self._children):
- child_map[c] = self.range_of_child_at_index(i)
- return child_map
-
- def trimmed_range_of_child_at_index(self, index, reference_space=None):
- range = self.range_of_child_at_index(index)
-
- if not self.source_range:
- return range
-
- range = opentime.TimeRange(
- start_time=self.source_range.start_time,
- duration=min(range.duration, self.source_range.duration)
- )
-
- return range
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/timeline.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/timeline.py
deleted file mode 100644
index fe7d6952ab..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/timeline.py
+++ /dev/null
@@ -1,133 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Implementation of the OTIO built in schema, Timeline object."""
-
-import copy
-
-from .. import (
- core,
- opentime,
-)
-
-from . import stack, track
-
-
-@core.register_type
-class Timeline(core.SerializableObject):
- _serializable_label = "Timeline.1"
-
- def __init__(
- self,
- name=None,
- tracks=None,
- global_start_time=None,
- metadata=None,
- ):
- super(Timeline, self).__init__()
- self.name = name
- self.global_start_time = copy.deepcopy(global_start_time)
-
- if tracks is None:
- tracks = []
- self.tracks = stack.Stack(name="tracks", children=tracks)
-
- self.metadata = copy.deepcopy(metadata) if metadata else {}
-
- name = core.serializable_field("name", doc="Name of this timeline.")
- tracks = core.serializable_field(
- "tracks",
- core.Composition,
- doc="Stack of tracks containing items."
- )
- metadata = core.serializable_field(
- "metadata",
- dict,
- "Metadata dictionary."
- )
- global_start_time = core.serializable_field(
- "global_start_time",
- opentime.RationalTime,
- doc="Global starting time value and rate of the timeline."
- )
-
- def __str__(self):
- return 'Timeline("{}", {})'.format(str(self.name), str(self.tracks))
-
- def __repr__(self):
- return (
- "otio.schema.Timeline(name={}, tracks={})".format(
- repr(self.name),
- repr(self.tracks)
- )
- )
-
- def each_child(self, search_range=None, descended_from_type=core.Composable):
- return self.tracks.each_child(search_range, descended_from_type)
-
- def each_clip(self, search_range=None):
- """Return a flat list of each clip, limited to the search_range."""
-
- return self.tracks.each_clip(search_range)
-
- def duration(self):
- """Duration of this timeline."""
-
- return self.tracks.duration()
-
- def range_of_child(self, child):
- """Range of the child object contained in this timeline."""
-
- return self.tracks.range_of_child(child)
-
- def video_tracks(self):
- """
- This convenience method returns a list of the top-level video tracks in
- this timeline.
- """
- return [
- trck for trck
- in self.tracks
- if (isinstance(trck, track.Track) and
- trck.kind == track.TrackKind.Video)
- ]
-
- def audio_tracks(self):
- """
- This convenience method returns a list of the top-level audio tracks in
- this timeline.
- """
- return [
- trck for trck
- in self.tracks
- if (isinstance(trck, track.Track) and
- trck.kind == track.TrackKind.Audio)
- ]
-
-
-def timeline_from_clips(clips):
- """Convenience for making a single track timeline from a list of clips."""
-
- trck = track.Track(children=clips)
- return Timeline(tracks=[trck])
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/track.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/track.py
deleted file mode 100644
index 29b0e7f1ae..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/track.py
+++ /dev/null
@@ -1,242 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Implement Track sublcass of composition."""
-
-import collections
-
-from .. import (
- core,
- opentime,
-)
-
-from . import (
- gap,
- transition,
- clip,
-)
-
-
-class TrackKind:
- Video = "Video"
- Audio = "Audio"
-
-
-class NeighborGapPolicy:
- """ enum for deciding how to add gap when asking for neighbors """
- never = 0
- around_transitions = 1
-
-
-@core.register_type
-class Track(core.Composition):
- _serializable_label = "Track.1"
- _composition_kind = "Track"
- _modname = "schema"
-
- def __init__(
- self,
- name=None,
- children=None,
- kind=TrackKind.Video,
- source_range=None,
- markers=None,
- effects=None,
- metadata=None,
- ):
- core.Composition.__init__(
- self,
- name=name,
- children=children,
- source_range=source_range,
- markers=markers,
- effects=effects,
- metadata=metadata
- )
- self.kind = kind
-
- kind = core.serializable_field(
- "kind",
- doc="Composition kind (Stack, Track)"
- )
-
- def range_of_child_at_index(self, index):
- child = self[index]
-
- # sum the durations of all the children leading up to the chosen one
- start_time = sum(
- (
- o_c.duration()
- for o_c in (c for c in self[:index] if not c.overlapping())
- ),
- opentime.RationalTime(value=0, rate=child.duration().rate)
- )
- if isinstance(child, transition.Transition):
- start_time -= child.in_offset
-
- return opentime.TimeRange(start_time, child.duration())
-
- def trimmed_range_of_child_at_index(self, index, reference_space=None):
- child_range = self.range_of_child_at_index(index)
-
- return self.trim_child_range(child_range)
-
- def handles_of_child(self, child):
- """If media beyond the ends of this child are visible due to adjacent
- Transitions (only applicable in a Track) then this will return the
- head and tail offsets as a tuple of RationalTime objects. If no handles
- are present on either side, then None is returned instead of a
- RationalTime.
-
- Example usage
-
- >>> head, tail = track.handles_of_child(clip)
- >>> if head:
- ... print('do something')
- >>> if tail:
- ... print('do something else')
- """
- head, tail = None, None
- before, after = self.neighbors_of(child)
- if isinstance(before, transition.Transition):
- head = before.in_offset
- if isinstance(after, transition.Transition):
- tail = after.out_offset
-
- return head, tail
-
- def available_range(self):
- # Sum up our child items' durations
- duration = sum(
- (c.duration() for c in self if isinstance(c, core.Item)),
- opentime.RationalTime()
- )
-
- # Add the implicit gap when a Transition is at the start/end
- if self and isinstance(self[0], transition.Transition):
- duration += self[0].in_offset
- if self and isinstance(self[-1], transition.Transition):
- duration += self[-1].out_offset
-
- result = opentime.TimeRange(
- start_time=opentime.RationalTime(0, duration.rate),
- duration=duration
- )
-
- return result
-
- def each_clip(self, search_range=None, shallow_search=False):
- return self.each_child(search_range, clip.Clip, shallow_search)
-
- def neighbors_of(self, item, insert_gap=NeighborGapPolicy.never):
- """Returns the neighbors of the item as a namedtuple, (previous, next).
-
- Can optionally fill in gaps when transitions have no gaps next to them.
-
- with insert_gap == NeighborGapPolicy.never:
- [A, B, C] :: neighbors_of(B) -> (A, C)
- [A, B, C] :: neighbors_of(A) -> (None, B)
- [A, B, C] :: neighbors_of(C) -> (B, None)
- [A] :: neighbors_of(A) -> (None, None)
-
- with insert_gap == NeighborGapPolicy.around_transitions:
- (assuming A and C are transitions)
- [A, B, C] :: neighbors_of(B) -> (A, C)
- [A, B, C] :: neighbors_of(A) -> (Gap, B)
- [A, B, C] :: neighbors_of(C) -> (B, Gap)
- [A] :: neighbors_of(A) -> (Gap, Gap)
- """
-
- try:
- index = self.index(item)
- except ValueError:
- raise ValueError(
- "item: {} is not in composition: {}".format(
- item,
- self
- )
- )
-
- previous, next_item = None, None
-
- # look before index
- if index == 0:
- if insert_gap == NeighborGapPolicy.around_transitions:
- if isinstance(item, transition.Transition):
- previous = gap.Gap(
- source_range=opentime.TimeRange(duration=item.in_offset))
- elif index > 0:
- previous = self[index - 1]
-
- if index == len(self) - 1:
- if insert_gap == NeighborGapPolicy.around_transitions:
- if isinstance(item, transition.Transition):
- next_item = gap.Gap(
- source_range=opentime.TimeRange(duration=item.out_offset))
- elif index < len(self) - 1:
- next_item = self[index + 1]
-
- return collections.namedtuple('neighbors', ('previous', 'next'))(
- previous,
- next_item
- )
-
- def range_of_all_children(self):
- """Return a dict mapping children to their range in this track."""
-
- if not self._children:
- return {}
-
- result_map = {}
-
- # Heuristic to guess what the rate should be set to based on the first
- # thing in the track.
- first_thing = self._children[0]
- if isinstance(first_thing, transition.Transition):
- rate = first_thing.in_offset.rate
- else:
- rate = first_thing.trimmed_range().duration.rate
-
- last_end_time = opentime.RationalTime(0, rate)
-
- for thing in self._children:
- if isinstance(thing, transition.Transition):
- result_map[thing] = opentime.TimeRange(
- last_end_time - thing.in_offset,
- thing.out_offset + thing.in_offset,
- )
- else:
- last_range = opentime.TimeRange(
- last_end_time,
- thing.trimmed_range().duration
- )
- result_map[thing] = last_range
- last_end_time = last_range.end_time_exclusive()
-
- return result_map
-
-
-# the original name for "track" was "sequence" - this will turn "Sequence"
-# found in OTIO files into Track automatically.
-core.register_type(Track, "Sequence")
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/transition.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schema/transition.py
deleted file mode 100644
index 93b54ab1ab..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schema/transition.py
+++ /dev/null
@@ -1,159 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Transition base class"""
-
-from .. import (
- opentime,
- core,
- exceptions,
-)
-
-import copy
-
-
-class TransitionTypes:
- """Enum encoding types of transitions.
-
- This is for representing "Dissolves" and "Wipes" defined by the
- multi-source effect as defined by SMPTE 258M-2004 7.6.3.2
-
- Other effects are handled by the `schema.Effect` class.
- """
-
- # @{ SMPTE transitions.
- SMPTE_Dissolve = "SMPTE_Dissolve"
- # SMPTE_Wipe = "SMPTE_Wipe" -- @TODO
- # @}
-
- # Non SMPTE transitions.
- Custom = "Custom_Transition"
-
-
-@core.register_type
-class Transition(core.Composable):
- """Represents a transition between two items."""
-
- _serializable_label = "Transition.1"
-
- def __init__(
- self,
- name=None,
- transition_type=None,
- # @TODO: parameters will be added later as needed (SMPTE_Wipe will
- # probably require it)
- # parameters=None,
- in_offset=None,
- out_offset=None,
- metadata=None
- ):
- core.Composable.__init__(
- self,
- name=name,
- metadata=metadata
- )
-
- # init everything as None first, so that we will catch uninitialized
- # values via exceptions
- # if parameters is None:
- # parameters = {}
- # self.parameters = parameters
- self.transition_type = transition_type
- self.in_offset = copy.deepcopy(in_offset)
- self.out_offset = copy.deepcopy(out_offset)
-
- transition_type = core.serializable_field(
- "transition_type",
- required_type=type(TransitionTypes.SMPTE_Dissolve),
- doc="Kind of transition, as defined by the "
- "schema.transition.TransitionTypes enum."
- )
- # parameters = core.serializable_field(
- # "parameters",
- # doc="Parameters of the transition."
- # )
- in_offset = core.serializable_field(
- "in_offset",
- required_type=opentime.RationalTime,
- doc="Amount of the previous clip this transition overlaps, exclusive."
- )
- out_offset = core.serializable_field(
- "out_offset",
- required_type=opentime.RationalTime,
- doc="Amount of the next clip this transition overlaps, exclusive."
- )
-
- def __str__(self):
- return 'Transition("{}", "{}", {}, {}, {})'.format(
- self.name,
- self.transition_type,
- self.in_offset,
- self.out_offset,
- # self.parameters,
- self.metadata
- )
-
- def __repr__(self):
- return (
- 'otio.schema.Transition('
- 'name={}, '
- 'transition_type={}, '
- 'in_offset={}, '
- 'out_offset={}, '
- # 'parameters={}, '
- 'metadata={}'
- ')'.format(
- repr(self.name),
- repr(self.transition_type),
- repr(self.in_offset),
- repr(self.out_offset),
- # repr(self.parameters),
- repr(self.metadata),
- )
- )
-
- @staticmethod
- def overlapping():
- return True
-
- def duration(self):
- return self.in_offset + self.out_offset
-
- def range_in_parent(self):
- """Find and return the range of this item in the parent."""
- if not self.parent():
- raise exceptions.NotAChildError(
- "No parent of {}, cannot compute range in parent.".format(self)
- )
-
- return self.parent().range_of_child(self)
-
- def trimmed_range_in_parent(self):
- """Find and return the timmed range of this item in the parent."""
- if not self.parent():
- raise exceptions.NotAChildError(
- "No parent of {}, cannot compute range in parent.".format(self)
- )
-
- return self.parent().trimmed_range_of_child(self)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/schemadef/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio/schemadef/__init__.py
deleted file mode 100644
index 568b3eaaa7..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/schemadef/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-
-def _add_schemadef_module(name, mod):
- """Insert a new module name and module object into schemadef namespace."""
- ns = globals() # the namespace dict of the schemadef package
- ns[name] = mod
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio/test_utils.py b/client/ayon_core/vendor/python/python_2/opentimelineio/test_utils.py
deleted file mode 100644
index e173275ff5..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio/test_utils.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2018 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Utility assertions for OTIO Unit tests."""
-
-import re
-
-from . import (
- adapters
-)
-
-
-class OTIOAssertions(object):
- def assertJsonEqual(self, known, test_result):
- """Convert to json and compare that (more readable)."""
- self.maxDiff = None
-
- known_str = adapters.write_to_string(known, 'otio_json')
- test_str = adapters.write_to_string(test_result, 'otio_json')
-
- def strip_trailing_decimal_zero(s):
- return re.sub(r'"(value|rate)": (\d+)\.0', r'"\1": \2', s)
-
- self.assertMultiLineEqual(
- strip_trailing_decimal_zero(known_str),
- strip_trailing_decimal_zero(test_str)
- )
-
- def assertIsOTIOEquivalentTo(self, known, test_result):
- """Test using the 'is equivalent to' method on SerializableObject"""
-
- self.assertTrue(known.is_equivalent_to(test_result))
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/__init__.py
deleted file mode 100644
index 7f7a82f46a..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/__init__.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2018 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""Unsupported contrib code for OpenTimelineIO."""
-
-# flake8: noqa
-
-from . import (
- adapters
-)
-
-__version__ = "0.11.0"
-__author__ = "Pixar Animation Studios"
-__author_email__ = "opentimelineio@pixar.com"
-__license__ = "Modified Apache 2.0 License"
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/aaf_adapter/__init__.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/aaf_adapter/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py
deleted file mode 100644
index 9e283d3747..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py
+++ /dev/null
@@ -1,764 +0,0 @@
-#
-# Copyright 2019 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""AAF Adapter Transcriber
-
-Specifies how to transcribe an OpenTimelineIO file into an AAF file.
-"""
-
-import aaf2
-import abc
-import uuid
-import opentimelineio as otio
-import os
-import copy
-import re
-
-
-AAF_PARAMETERDEF_PAN = aaf2.auid.AUID("e4962322-2267-11d3-8a4c-0050040ef7d2")
-AAF_OPERATIONDEF_MONOAUDIOPAN = aaf2.auid.AUID("9d2ea893-0968-11d3-8a38-0050040ef7d2")
-AAF_PARAMETERDEF_AVIDPARAMETERBYTEORDER = uuid.UUID(
- "c0038672-a8cf-11d3-a05b-006094eb75cb")
-AAF_PARAMETERDEF_AVIDEFFECTID = uuid.UUID(
- "93994bd6-a81d-11d3-a05b-006094eb75cb")
-AAF_PARAMETERDEF_AFX_FG_KEY_OPACITY_U = uuid.UUID(
- "8d56813d-847e-11d5-935a-50f857c10000")
-AAF_PARAMETERDEF_LEVEL = uuid.UUID("e4962320-2267-11d3-8a4c-0050040ef7d2")
-AAF_VVAL_EXTRAPOLATION_ID = uuid.UUID("0e24dd54-66cd-4f1a-b0a0-670ac3a7a0b3")
-AAF_OPERATIONDEF_SUBMASTER = uuid.UUID("f1db0f3d-8d64-11d3-80df-006008143e6f")
-
-
-class AAFAdapterError(otio.exceptions.OTIOError):
- pass
-
-
-class AAFValidationError(AAFAdapterError):
- pass
-
-
-class AAFFileTranscriber(object):
- """
- AAFFileTranscriber
-
- AAFFileTranscriber manages the file-level knowledge during a conversion from
- otio to aaf. This includes keeping track of unique tapemobs and mastermobs.
- """
-
- def __init__(self, input_otio, aaf_file, **kwargs):
- """
- AAFFileTranscriber requires an input timeline and an output pyaaf2 file handle.
-
- Args:
- input_otio: an input OpenTimelineIO timeline
- aaf_file: a pyaaf2 file handle to an output file
- """
- self.aaf_file = aaf_file
- self.compositionmob = self.aaf_file.create.CompositionMob()
- self.compositionmob.name = input_otio.name
- self.compositionmob.usage = "Usage_TopLevel"
- self.aaf_file.content.mobs.append(self.compositionmob)
- self._unique_mastermobs = {}
- self._unique_tapemobs = {}
- self._clip_mob_ids_map = _gather_clip_mob_ids(input_otio, **kwargs)
-
- def _unique_mastermob(self, otio_clip):
- """Get a unique mastermob, identified by clip metadata mob id."""
- mob_id = self._clip_mob_ids_map.get(otio_clip)
- mastermob = self._unique_mastermobs.get(mob_id)
- if not mastermob:
- mastermob = self.aaf_file.create.MasterMob()
- mastermob.name = otio_clip.name
- mastermob.mob_id = aaf2.mobid.MobID(mob_id)
- self.aaf_file.content.mobs.append(mastermob)
- self._unique_mastermobs[mob_id] = mastermob
- return mastermob
-
- def _unique_tapemob(self, otio_clip):
- """Get a unique tapemob, identified by clip metadata mob id."""
- mob_id = self._clip_mob_ids_map.get(otio_clip)
- tapemob = self._unique_tapemobs.get(mob_id)
- if not tapemob:
- tapemob = self.aaf_file.create.SourceMob()
- tapemob.name = otio_clip.name
- tapemob.descriptor = self.aaf_file.create.ImportDescriptor()
- # If the edit_rate is not an integer, we need
- # to use drop frame with a nominal integer fps.
- edit_rate = otio_clip.visible_range().duration.rate
- timecode_fps = round(edit_rate)
- tape_timecode_slot = tapemob.create_timecode_slot(
- edit_rate=edit_rate,
- timecode_fps=timecode_fps,
- drop_frame=(edit_rate != timecode_fps)
- )
- timecode_start = (
- otio_clip.media_reference.available_range.start_time.value)
- timecode_length = (
- otio_clip.media_reference.available_range.duration.value)
-
- tape_timecode_slot.segment.start = timecode_start
- tape_timecode_slot.segment.length = timecode_length
- self.aaf_file.content.mobs.append(tapemob)
- self._unique_tapemobs[mob_id] = tapemob
- return tapemob
-
- def track_transcriber(self, otio_track):
- """Return an appropriate _TrackTranscriber given an otio track."""
- if otio_track.kind == otio.schema.TrackKind.Video:
- transcriber = VideoTrackTranscriber(self, otio_track)
- elif otio_track.kind == otio.schema.TrackKind.Audio:
- transcriber = AudioTrackTranscriber(self, otio_track)
- else:
- raise otio.exceptions.NotSupportedError(
- "Unsupported track kind: {}".format(otio_track.kind))
- return transcriber
-
-
-def validate_metadata(timeline):
- """Print a check of necessary metadata requirements for an otio timeline."""
-
- all_checks = [__check(timeline, "duration().rate")]
- edit_rate = __check(timeline, "duration().rate").value
-
- for child in timeline.each_child():
- checks = []
- if isinstance(child, otio.schema.Gap):
- checks = [
- __check(child, "duration().rate").equals(edit_rate)
- ]
- if isinstance(child, otio.schema.Clip):
- checks = [
- __check(child, "duration().rate").equals(edit_rate),
- __check(child, "media_reference.available_range.duration.rate"
- ).equals(edit_rate),
- __check(child, "media_reference.available_range.start_time.rate"
- ).equals(edit_rate)
- ]
- if isinstance(child, otio.schema.Transition):
- checks = [
- __check(child, "duration().rate").equals(edit_rate),
- __check(child, "metadata['AAF']['PointList']"),
- __check(child, "metadata['AAF']['OperationGroup']['Operation']"
- "['DataDefinition']['Name']"),
- __check(child, "metadata['AAF']['OperationGroup']['Operation']"
- "['Description']"),
- __check(child, "metadata['AAF']['OperationGroup']['Operation']"
- "['Name']"),
- __check(child, "metadata['AAF']['CutPoint']")
- ]
- all_checks.extend(checks)
-
- if any(check.errors for check in all_checks):
- raise AAFValidationError("\n" + "\n".join(
- sum([check.errors for check in all_checks], [])))
-
-
-def _gather_clip_mob_ids(input_otio,
- prefer_file_mob_id=False,
- use_empty_mob_ids=False,
- **kwargs):
- """
- Create dictionary of otio clips with their corresponding mob ids.
- """
-
- def _from_clip_metadata(clip):
- """Get the MobID from the clip.metadata."""
- return clip.metadata.get("AAF", {}).get("SourceID")
-
- def _from_media_reference_metadata(clip):
- """Get the MobID from the media_reference.metadata."""
- return (clip.media_reference.metadata.get("AAF", {}).get("MobID") or
- clip.media_reference.metadata.get("AAF", {}).get("SourceID"))
-
- def _from_aaf_file(clip):
- """ Get the MobID from the AAF file itself."""
- mob_id = None
- target_url = clip.media_reference.target_url
- if os.path.isfile(target_url) and target_url.endswith("aaf"):
- with aaf2.open(clip.media_reference.target_url) as aaf_file:
- mastermobs = list(aaf_file.content.mastermobs())
- if len(mastermobs) == 1:
- mob_id = mastermobs[0].mob_id
- return mob_id
-
- def _generate_empty_mobid(clip):
- """Generate a meaningless MobID."""
- return aaf2.mobid.MobID.new()
-
- strategies = [
- _from_clip_metadata,
- _from_media_reference_metadata,
- _from_aaf_file
- ]
-
- if prefer_file_mob_id:
- strategies.remove(_from_aaf_file)
- strategies.insert(0, _from_aaf_file)
-
- if use_empty_mob_ids:
- strategies.append(_generate_empty_mobid)
-
- clip_mob_ids = {}
-
- for otio_clip in input_otio.each_clip():
- for strategy in strategies:
- mob_id = strategy(otio_clip)
- if mob_id:
- clip_mob_ids[otio_clip] = mob_id
- break
- else:
- raise AAFAdapterError("Cannot find mob ID for clip {}".format(otio_clip))
-
- return clip_mob_ids
-
-
-def _stackify_nested_groups(timeline):
- """
- Ensure that all nesting in a given timeline is in a stack container.
- This conforms with how AAF thinks about nesting, there needs
- to be an outer container, even if it's just one object.
- """
- copied = copy.deepcopy(timeline)
- for track in copied.tracks:
- for i, child in enumerate(track.each_child()):
- is_nested = isinstance(child, otio.schema.Track)
- is_parent_in_stack = isinstance(child.parent(), otio.schema.Stack)
- if is_nested and not is_parent_in_stack:
- stack = otio.schema.Stack()
- track.remove(child)
- stack.append(child)
- track.insert(i, stack)
- return copied
-
-
-class _TrackTranscriber(object):
- """
- _TrackTranscriber is the base class for the conversion of a given otio track.
-
- _TrackTranscriber is not meant to be used by itself. It provides the common
- functionality to inherit from. We need an abstract base class because Audio and
- Video are handled differently.
- """
- __metaclass__ = abc.ABCMeta
-
- def __init__(self, root_file_transcriber, otio_track):
- """
- _TrackTranscriber
-
- Args:
- root_file_transcriber: the corresponding 'parent' AAFFileTranscriber object
- otio_track: the given otio_track to convert
- """
- self.root_file_transcriber = root_file_transcriber
- self.compositionmob = root_file_transcriber.compositionmob
- self.aaf_file = root_file_transcriber.aaf_file
- self.otio_track = otio_track
- self.edit_rate = next(self.otio_track.each_child()).duration().rate
- self.timeline_mobslot, self.sequence = self._create_timeline_mobslot()
- self.timeline_mobslot.name = self.otio_track.name
-
- def transcribe(self, otio_child):
- """Transcribe otio child to corresponding AAF object"""
- if isinstance(otio_child, otio.schema.Gap):
- filler = self.aaf_filler(otio_child)
- return filler
- elif isinstance(otio_child, otio.schema.Transition):
- transition = self.aaf_transition(otio_child)
- return transition
- elif isinstance(otio_child, otio.schema.Clip):
- source_clip = self.aaf_sourceclip(otio_child)
- return source_clip
- elif isinstance(otio_child, otio.schema.Track):
- sequence = self.aaf_sequence(otio_child)
- return sequence
- elif isinstance(otio_child, otio.schema.Stack):
- operation_group = self.aaf_operation_group(otio_child)
- return operation_group
- else:
- raise otio.exceptions.NotSupportedError(
- "Unsupported otio child type: {}".format(type(otio_child)))
-
- @property
- @abc.abstractmethod
- def media_kind(self):
- """Return the string for what kind of track this is."""
- pass
-
- @property
- @abc.abstractmethod
- def _master_mob_slot_id(self):
- """
- Return the MasterMob Slot ID for the corresponding track media kind
- """
- # MasterMob's and MasterMob slots have to be unique. We handle unique
- # MasterMob's with _unique_mastermob(). We also need to protect against
- # duplicate MasterMob slots. As of now, we mandate all picture clips to
- # be created in MasterMob slot 1 and all sound clips to be created in
- # MasterMob slot 2. While this is a little inadequate, it works for now
- pass
-
- @abc.abstractmethod
- def _create_timeline_mobslot(self):
- """
- Return a timeline_mobslot and sequence for this track.
-
- In AAF, a TimelineMobSlot is a container for the Sequence. A Sequence is
- analogous to an otio track.
-
- Returns:
- Returns a tuple of (TimelineMobSlot, Sequence)
- """
- pass
-
- @abc.abstractmethod
- def default_descriptor(self, otio_clip):
- pass
-
- @abc.abstractmethod
- def _transition_parameters(self):
- pass
-
- def aaf_filler(self, otio_gap):
- """Convert an otio Gap into an aaf Filler"""
- length = otio_gap.visible_range().duration.value
- filler = self.aaf_file.create.Filler(self.media_kind, length)
- return filler
-
- def aaf_sourceclip(self, otio_clip):
- """Convert an otio Clip into an aaf SourceClip"""
- tapemob, tapemob_slot = self._create_tapemob(otio_clip)
- filemob, filemob_slot = self._create_filemob(otio_clip, tapemob, tapemob_slot)
- mastermob, mastermob_slot = self._create_mastermob(otio_clip,
- filemob,
- filemob_slot)
-
- # We need both `start_time` and `duration`
- # Here `start` is the offset between `first` and `in` values.
-
- offset = (otio_clip.visible_range().start_time -
- otio_clip.available_range().start_time)
- start = offset.value
- length = otio_clip.visible_range().duration.value
-
- compmob_clip = self.compositionmob.create_source_clip(
- slot_id=self.timeline_mobslot.slot_id,
- start=start,
- length=length,
- media_kind=self.media_kind)
- compmob_clip.mob = mastermob
- compmob_clip.slot = mastermob_slot
- compmob_clip.slot_id = mastermob_slot.slot_id
- return compmob_clip
-
- def aaf_transition(self, otio_transition):
- """Convert an otio Transition into an aaf Transition"""
- if (otio_transition.transition_type !=
- otio.schema.transition.TransitionTypes.SMPTE_Dissolve):
- print(
- "Unsupported transition type: {}".format(
- otio_transition.transition_type))
- return None
-
- transition_params, varying_value = self._transition_parameters()
-
- interpolation_def = self.aaf_file.create.InterpolationDef(
- aaf2.misc.LinearInterp, "LinearInterp", "Linear keyframe interpolation")
- self.aaf_file.dictionary.register_def(interpolation_def)
- varying_value["Interpolation"].value = (
- self.aaf_file.dictionary.lookup_interperlationdef("LinearInterp"))
-
- pointlist = otio_transition.metadata["AAF"]["PointList"]
-
- c1 = self.aaf_file.create.ControlPoint()
- c1["EditHint"].value = "Proportional"
- c1.value = pointlist[0]["Value"]
- c1.time = pointlist[0]["Time"]
-
- c2 = self.aaf_file.create.ControlPoint()
- c2["EditHint"].value = "Proportional"
- c2.value = pointlist[1]["Value"]
- c2.time = pointlist[1]["Time"]
-
- varying_value["PointList"].extend([c1, c2])
-
- op_group_metadata = otio_transition.metadata["AAF"]["OperationGroup"]
- effect_id = op_group_metadata["Operation"].get("Identification")
- is_time_warp = op_group_metadata["Operation"].get("IsTimeWarp")
- by_pass = op_group_metadata["Operation"].get("Bypass")
- number_inputs = op_group_metadata["Operation"].get("NumberInputs")
- operation_category = op_group_metadata["Operation"].get("OperationCategory")
- data_def_name = op_group_metadata["Operation"]["DataDefinition"]["Name"]
- data_def = self.aaf_file.dictionary.lookup_datadef(str(data_def_name))
- description = op_group_metadata["Operation"]["Description"]
- op_def_name = otio_transition.metadata["AAF"][
- "OperationGroup"
- ]["Operation"]["Name"]
-
- # Create OperationDefinition
- op_def = self.aaf_file.create.OperationDef(uuid.UUID(effect_id), op_def_name)
- self.aaf_file.dictionary.register_def(op_def)
- op_def.media_kind = self.media_kind
- datadef = self.aaf_file.dictionary.lookup_datadef(self.media_kind)
- op_def["IsTimeWarp"].value = is_time_warp
- op_def["Bypass"].value = by_pass
- op_def["NumberInputs"].value = number_inputs
- op_def["OperationCategory"].value = str(operation_category)
- op_def["ParametersDefined"].extend(transition_params)
- op_def["DataDefinition"].value = data_def
- op_def["Description"].value = str(description)
-
- # Create OperationGroup
- length = otio_transition.duration().value
- operation_group = self.aaf_file.create.OperationGroup(op_def, length)
- operation_group["DataDefinition"].value = datadef
- operation_group["Parameters"].append(varying_value)
-
- # Create Transition
- transition = self.aaf_file.create.Transition(self.media_kind, length)
- transition["OperationGroup"].value = operation_group
- transition["CutPoint"].value = otio_transition.metadata["AAF"]["CutPoint"]
- transition["DataDefinition"].value = datadef
- return transition
-
- def aaf_sequence(self, otio_track):
- """Convert an otio Track into an aaf Sequence"""
- sequence = self.aaf_file.create.Sequence(media_kind=self.media_kind)
- length = 0
- for nested_otio_child in otio_track:
- result = self.transcribe(nested_otio_child)
- length += result.length
- sequence.components.append(result)
- sequence.length = length
- return sequence
-
- def aaf_operation_group(self, otio_stack):
- """
- Create and return an OperationGroup which will contain other AAF objects
- to support OTIO nesting
- """
- # Create OperationDefinition
- op_def = self.aaf_file.create.OperationDef(AAF_OPERATIONDEF_SUBMASTER,
- "Submaster")
- self.aaf_file.dictionary.register_def(op_def)
- op_def.media_kind = self.media_kind
- datadef = self.aaf_file.dictionary.lookup_datadef(self.media_kind)
-
- # These values are necessary for pyaaf2 OperationDefinitions
- op_def["IsTimeWarp"].value = False
- op_def["Bypass"].value = 0
- op_def["NumberInputs"].value = -1
- op_def["OperationCategory"].value = "OperationCategory_Effect"
- op_def["DataDefinition"].value = datadef
-
- # Create OperationGroup
- operation_group = self.aaf_file.create.OperationGroup(op_def)
- operation_group.media_kind = self.media_kind
- operation_group["DataDefinition"].value = datadef
-
- length = 0
- for nested_otio_child in otio_stack:
- result = self.transcribe(nested_otio_child)
- length += result.length
- operation_group.segments.append(result)
- operation_group.length = length
- return operation_group
-
- def _create_tapemob(self, otio_clip):
- """
- Return a physical sourcemob for an otio Clip based on the MobID.
-
- Returns:
- Returns a tuple of (TapeMob, TapeMobSlot)
- """
- tapemob = self.root_file_transcriber._unique_tapemob(otio_clip)
- tapemob_slot = tapemob.create_empty_slot(self.edit_rate, self.media_kind)
- tapemob_slot.segment.length = (
- otio_clip.media_reference.available_range.duration.value)
- return tapemob, tapemob_slot
-
- def _create_filemob(self, otio_clip, tapemob, tapemob_slot):
- """
- Return a file sourcemob for an otio Clip. Needs a tapemob and tapemob slot.
-
- Returns:
- Returns a tuple of (FileMob, FileMobSlot)
- """
- filemob = self.aaf_file.create.SourceMob()
- self.aaf_file.content.mobs.append(filemob)
-
- filemob.descriptor = self.default_descriptor(otio_clip)
- filemob_slot = filemob.create_timeline_slot(self.edit_rate)
- filemob_clip = filemob.create_source_clip(
- slot_id=filemob_slot.slot_id,
- length=tapemob_slot.segment.length,
- media_kind=tapemob_slot.segment.media_kind)
- filemob_clip.mob = tapemob
- filemob_clip.slot = tapemob_slot
- filemob_clip.slot_id = tapemob_slot.slot_id
- filemob_slot.segment = filemob_clip
- return filemob, filemob_slot
-
- def _create_mastermob(self, otio_clip, filemob, filemob_slot):
- """
- Return a mastermob for an otio Clip. Needs a filemob and filemob slot.
-
- Returns:
- Returns a tuple of (MasterMob, MasterMobSlot)
- """
- mastermob = self.root_file_transcriber._unique_mastermob(otio_clip)
- timecode_length = otio_clip.media_reference.available_range.duration.value
-
- try:
- mastermob_slot = mastermob.slot_at(self._master_mob_slot_id)
- except IndexError:
- mastermob_slot = (
- mastermob.create_timeline_slot(edit_rate=self.edit_rate,
- slot_id=self._master_mob_slot_id))
- mastermob_clip = mastermob.create_source_clip(
- slot_id=mastermob_slot.slot_id,
- length=timecode_length,
- media_kind=self.media_kind)
- mastermob_clip.mob = filemob
- mastermob_clip.slot = filemob_slot
- mastermob_clip.slot_id = filemob_slot.slot_id
- mastermob_slot.segment = mastermob_clip
- return mastermob, mastermob_slot
-
-
-class VideoTrackTranscriber(_TrackTranscriber):
- """Video track kind specialization of TrackTranscriber."""
-
- @property
- def media_kind(self):
- return "picture"
-
- @property
- def _master_mob_slot_id(self):
- return 1
-
- def _create_timeline_mobslot(self):
- """
- Create a Sequence container (TimelineMobSlot) and Sequence.
-
- TimelineMobSlot --> Sequence
- """
- timeline_mobslot = self.compositionmob.create_timeline_slot(
- edit_rate=self.edit_rate)
- sequence = self.aaf_file.create.Sequence(media_kind=self.media_kind)
- timeline_mobslot.segment = sequence
- return timeline_mobslot, sequence
-
- def default_descriptor(self, otio_clip):
- # TODO: Determine if these values are the correct, and if so,
- # maybe they should be in the AAF metadata
- descriptor = self.aaf_file.create.CDCIDescriptor()
- descriptor["ComponentWidth"].value = 8
- descriptor["HorizontalSubsampling"].value = 2
- descriptor["ImageAspectRatio"].value = "16/9"
- descriptor["StoredWidth"].value = 1920
- descriptor["StoredHeight"].value = 1080
- descriptor["FrameLayout"].value = "FullFrame"
- descriptor["VideoLineMap"].value = [42, 0]
- descriptor["SampleRate"].value = 24
- descriptor["Length"].value = 1
- return descriptor
-
- def _transition_parameters(self):
- """
- Return video transition parameters
- """
- # Create ParameterDef for AvidParameterByteOrder
- byteorder_typedef = self.aaf_file.dictionary.lookup_typedef("aafUInt16")
- param_byteorder = self.aaf_file.create.ParameterDef(
- AAF_PARAMETERDEF_AVIDPARAMETERBYTEORDER,
- "AvidParameterByteOrder",
- "",
- byteorder_typedef)
- self.aaf_file.dictionary.register_def(param_byteorder)
-
- # Create ParameterDef for AvidEffectID
- avid_effect_typdef = self.aaf_file.dictionary.lookup_typedef("AvidBagOfBits")
- param_effect_id = self.aaf_file.create.ParameterDef(
- AAF_PARAMETERDEF_AVIDEFFECTID,
- "AvidEffectID",
- "",
- avid_effect_typdef)
- self.aaf_file.dictionary.register_def(param_effect_id)
-
- # Create ParameterDef for AFX_FG_KEY_OPACITY_U
- opacity_param_def = self.aaf_file.dictionary.lookup_typedef("Rational")
- opacity_param = self.aaf_file.create.ParameterDef(
- AAF_PARAMETERDEF_AFX_FG_KEY_OPACITY_U,
- "AFX_FG_KEY_OPACITY_U",
- "",
- opacity_param_def)
- self.aaf_file.dictionary.register_def(opacity_param)
-
- # Create VaryingValue
- opacity_u = self.aaf_file.create.VaryingValue()
- opacity_u.parameterdef = self.aaf_file.dictionary.lookup_parameterdef(
- "AFX_FG_KEY_OPACITY_U")
- opacity_u["VVal_Extrapolation"].value = AAF_VVAL_EXTRAPOLATION_ID
- opacity_u["VVal_FieldCount"].value = 1
-
- return [param_byteorder, param_effect_id], opacity_u
-
-
-class AudioTrackTranscriber(_TrackTranscriber):
- """Audio track kind specialization of TrackTranscriber."""
-
- @property
- def media_kind(self):
- return "sound"
-
- @property
- def _master_mob_slot_id(self):
- return 2
-
- def aaf_sourceclip(self, otio_clip):
- # Parameter Definition
- typedef = self.aaf_file.dictionary.lookup_typedef("Rational")
- param_def = self.aaf_file.create.ParameterDef(AAF_PARAMETERDEF_PAN,
- "Pan",
- "Pan",
- typedef)
- self.aaf_file.dictionary.register_def(param_def)
- interp_def = self.aaf_file.create.InterpolationDef(aaf2.misc.LinearInterp,
- "LinearInterp",
- "LinearInterp")
- self.aaf_file.dictionary.register_def(interp_def)
- # PointList
- length = otio_clip.duration().value
- c1 = self.aaf_file.create.ControlPoint()
- c1["ControlPointSource"].value = 2
- c1["Time"].value = aaf2.rational.AAFRational("0/{}".format(length))
- c1["Value"].value = 0
- c2 = self.aaf_file.create.ControlPoint()
- c2["ControlPointSource"].value = 2
- c2["Time"].value = aaf2.rational.AAFRational("{}/{}".format(length - 1, length))
- c2["Value"].value = 0
- varying_value = self.aaf_file.create.VaryingValue()
- varying_value.parameterdef = param_def
- varying_value["Interpolation"].value = interp_def
- varying_value["PointList"].extend([c1, c2])
- opgroup = self.timeline_mobslot.segment
- opgroup.parameters.append(varying_value)
-
- return super(AudioTrackTranscriber, self).aaf_sourceclip(otio_clip)
-
- def _create_timeline_mobslot(self):
- """
- Create a Sequence container (TimelineMobSlot) and Sequence.
- Sequence needs to be in an OperationGroup.
-
- TimelineMobSlot --> OperationGroup --> Sequence
- """
- # TimelineMobSlot
- timeline_mobslot = self.compositionmob.create_sound_slot(
- edit_rate=self.edit_rate)
- # OperationDefinition
- opdef = self.aaf_file.create.OperationDef(AAF_OPERATIONDEF_MONOAUDIOPAN,
- "Audio Pan")
- opdef.media_kind = self.media_kind
- opdef["NumberInputs"].value = 1
- self.aaf_file.dictionary.register_def(opdef)
- # OperationGroup
- total_length = sum([t.duration().value for t in self.otio_track])
- opgroup = self.aaf_file.create.OperationGroup(opdef)
- opgroup.media_kind = self.media_kind
- opgroup.length = total_length
- timeline_mobslot.segment = opgroup
- # Sequence
- sequence = self.aaf_file.create.Sequence(media_kind=self.media_kind)
- sequence.length = total_length
- opgroup.segments.append(sequence)
- return timeline_mobslot, sequence
-
- def default_descriptor(self, otio_clip):
- descriptor = self.aaf_file.create.PCMDescriptor()
- descriptor["AverageBPS"].value = 96000
- descriptor["BlockAlign"].value = 2
- descriptor["QuantizationBits"].value = 16
- descriptor["AudioSamplingRate"].value = 48000
- descriptor["Channels"].value = 1
- descriptor["SampleRate"].value = 48000
- descriptor["Length"].value = (
- otio_clip.media_reference.available_range.duration.value)
- return descriptor
-
- def _transition_parameters(self):
- """
- Return audio transition parameters
- """
- # Create ParameterDef for ParameterDef_Level
- def_level_typedef = self.aaf_file.dictionary.lookup_typedef("Rational")
- param_def_level = self.aaf_file.create.ParameterDef(AAF_PARAMETERDEF_LEVEL,
- "ParameterDef_Level",
- "",
- def_level_typedef)
- self.aaf_file.dictionary.register_def(param_def_level)
-
- # Create VaryingValue
- level = self.aaf_file.create.VaryingValue()
- level.parameterdef = (
- self.aaf_file.dictionary.lookup_parameterdef("ParameterDef_Level"))
-
- return [param_def_level], level
-
-
-class __check(object):
- """
- __check is a private helper class that safely gets values given to check
- for existence and equality
- """
-
- def __init__(self, obj, tokenpath):
- self.orig = obj
- self.value = obj
- self.errors = []
- self.tokenpath = tokenpath
- try:
- for token in re.split(r"[\.\[]", tokenpath):
- if token.endswith("()"):
- self.value = getattr(self.value, token.replace("()", ""))()
- elif "]" in token:
- self.value = self.value[token.strip("[]'\"")]
- else:
- self.value = getattr(self.value, token)
- except Exception as e:
- self.value = None
- self.errors.append("{}{} {}.{} does not exist, {}".format(
- self.orig.name if hasattr(self.orig, "name") else "",
- type(self.orig),
- type(self.orig).__name__,
- self.tokenpath, e))
-
- def equals(self, val):
- """Check if the retrieved value is equal to a given value."""
- if self.value is not None and self.value != val:
- self.errors.append(
- "{}{} {}.{} not equal to {} (expected) != {} (actual)".format(
- self.orig.name if hasattr(self.orig, "name") else "",
- type(self.orig),
- type(self.orig).__name__, self.tokenpath, val, self.value))
- return self
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/advanced_authoring_format.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/advanced_authoring_format.py
deleted file mode 100644
index 6c21ea3e55..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/advanced_authoring_format.py
+++ /dev/null
@@ -1,979 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""OpenTimelineIO Advanced Authoring Format (AAF) Adapter
-
-Depending on if/where PyAAF is installed, you may need to set this env var:
- OTIO_AAF_PYTHON_LIB - should point at the PyAAF module.
-"""
-
-import os
-import sys
-import numbers
-import copy
-from collections import Iterable
-import opentimelineio as otio
-
-lib_path = os.environ.get("OTIO_AAF_PYTHON_LIB")
-if lib_path and lib_path not in sys.path:
- sys.path.insert(0, lib_path)
-
-import aaf2 # noqa: E402
-import aaf2.content # noqa: E402
-import aaf2.mobs # noqa: E402
-import aaf2.components # noqa: E402
-import aaf2.core # noqa: E402
-from opentimelineio_contrib.adapters.aaf_adapter import aaf_writer # noqa: E402
-
-
-debug = False
-__names = set()
-
-
-def _get_parameter(item, parameter_name):
- values = dict((value.name, value) for value in item.parameters.value)
- return values.get(parameter_name)
-
-
-def _get_name(item):
- if isinstance(item, aaf2.components.SourceClip):
- try:
- return item.mob.name or "Untitled SourceClip"
- except AttributeError:
- # Some AAFs produce this error:
- # RuntimeError: failed with [-2146303738]: mob not found
- return "SourceClip Missing Mob?"
- if hasattr(item, 'name'):
- name = item.name
- if name:
- return name
- return _get_class_name(item)
-
-
-def _get_class_name(item):
- if hasattr(item, "class_name"):
- return item.class_name
- else:
- return item.__class__.__name__
-
-
-def _transcribe_property(prop):
- # XXX: The unicode type doesn't exist in Python 3 (all strings are unicode)
- # so we have to use type(u"") which works in both Python 2 and 3.
- if isinstance(prop, (str, type(u""), numbers.Integral, float)):
- return prop
-
- elif isinstance(prop, list):
- result = {}
- for child in prop:
- if hasattr(child, "name") and hasattr(child, "value"):
- result[child.name] = _transcribe_property(child.value)
- else:
- # @TODO: There may be more properties that we might want also.
- # If you want to see what is being skipped, turn on debug.
- if debug:
- debug_message = \
- "Skipping unrecognized property: {} of parent {}"
- print(debug_message.format(child, prop))
- return result
- elif hasattr(prop, "properties"):
- result = {}
- for child in prop.properties():
- result[child.name] = _transcribe_property(child.value)
- return result
- else:
- return str(prop)
-
-
-def _find_timecode_mobs(item):
- mobs = [item.mob]
-
- for c in item.walk():
- if isinstance(c, aaf2.components.SourceClip):
- mob = c.mob
- if mob:
- mobs.append(mob)
- else:
- continue
- else:
- # This could be 'EssenceGroup', 'Pulldown' or other segment
- # subclasses
- # See also: https://jira.pixar.com/browse/SE-3457
- # For example:
- # An EssenceGroup is a Segment that has one or more
- # alternate choices, each of which represent different variations
- # of one actual piece of content.
- # According to the AAF Object Specification and Edit Protocol
- # documents:
- # "Typically the different representations vary in essence format,
- # compression, or frame size. The application is responsible for
- # choosing the appropriate implementation of the essence."
- # It also says they should all have the same length, but
- # there might be nested Sequences inside which we're not attempting
- # to handle here (yet). We'll need a concrete example to ensure
- # we're doing the right thing.
- # TODO: Is the Timecode for an EssenceGroup correct?
- # TODO: Try CountChoices() and ChoiceAt(i)
- # For now, lets just skip it.
- continue
-
- return mobs
-
-
-def _extract_timecode_info(mob):
- """Given a mob with a single timecode slot, return the timecode and length
- in that slot as a tuple
- """
- timecodes = [slot.segment for slot in mob.slots
- if isinstance(slot.segment, aaf2.components.Timecode)]
-
- if len(timecodes) == 1:
- timecode = timecodes[0]
- timecode_start = timecode.getvalue('Start')
- timecode_length = timecode.getvalue('Length')
-
- if timecode_start is None or timecode_length is None:
- raise otio.exceptions.NotSupportedError(
- "Unexpected timecode value(s) in mob named: `{}`."
- " `Start`: {}, `Length`: {}".format(mob.name,
- timecode_start,
- timecode_length)
- )
-
- return timecode_start, timecode_length
- elif len(timecodes) > 1:
- raise otio.exceptions.NotSupportedError(
- "Error: mob has more than one timecode slots, this is not"
- " currently supported by the AAF adapter. found: {} slots, "
- " mob name is: '{}'".format(len(timecodes), mob.name)
- )
- else:
- return None
-
-
-def _add_child(parent, child, source):
- if child is None:
- if debug:
- print("Adding null child? {}".format(source))
- elif isinstance(child, otio.schema.Marker):
- parent.markers.append(child)
- else:
- parent.append(child)
-
-
-def _transcribe(item, parents, editRate, masterMobs):
- result = None
- metadata = {}
-
- # First lets grab some standard properties that are present on
- # many types of AAF objects...
- metadata["Name"] = _get_name(item)
- metadata["ClassName"] = _get_class_name(item)
-
- # Some AAF objects (like TimelineMobSlot) have an edit rate
- # which should be used for all of the object's children.
- # We will pass it on to any recursive calls to _transcribe()
- if hasattr(item, "edit_rate"):
- editRate = float(item.edit_rate)
-
- if isinstance(item, aaf2.components.Component):
- metadata["Length"] = item.length
-
- if isinstance(item, aaf2.core.AAFObject):
- for prop in item.properties():
- if hasattr(prop, 'name') and hasattr(prop, 'value'):
- key = str(prop.name)
- value = prop.value
- metadata[key] = _transcribe_property(value)
-
- # Now we will use the item's class to determine which OTIO type
- # to transcribe into. Note that the order of this if/elif/... chain
- # is important, because the class hierarchy of AAF objects is more
- # complex than OTIO.
-
- if isinstance(item, aaf2.content.ContentStorage):
- result = otio.schema.SerializableCollection()
-
- # Gather all the Master Mobs, so we can find them later by MobID
- # when we parse the SourceClips in the composition
- if masterMobs is None:
- masterMobs = {}
- for mob in item.mastermobs():
- child = _transcribe(mob, parents + [item], editRate, masterMobs)
- if child is not None:
- mobID = child.metadata.get("AAF", {}).get("MobID")
- masterMobs[mobID] = child
-
- for mob in item.compositionmobs():
- child = _transcribe(mob, parents + [item], editRate, masterMobs)
- _add_child(result, child, mob)
-
- elif isinstance(item, aaf2.mobs.Mob):
- result = otio.schema.Timeline()
-
- for slot in item.slots:
- track = _transcribe(slot, parents + [item], editRate, masterMobs)
- _add_child(result.tracks, track, slot)
-
- # Use a heuristic to find the starting timecode from
- # this track and use it for the Timeline's global_start_time
- start_time = _find_timecode_track_start(track)
- if start_time:
- result.global_start_time = start_time
-
- elif isinstance(item, aaf2.components.SourceClip):
- result = otio.schema.Clip()
-
- # Evidently the last mob is the one with the timecode
- mobs = _find_timecode_mobs(item)
- # Get the Timecode start and length values
- last_mob = mobs[-1] if mobs else None
- timecode_info = _extract_timecode_info(last_mob) if last_mob else None
-
- source_start = int(metadata.get("StartTime", "0"))
- source_length = item.length
- media_start = source_start
- media_length = item.length
-
- if timecode_info:
- media_start, media_length = timecode_info
- source_start += media_start
-
- # The goal here is to find a source range. Actual editorial opinions are found on SourceClips in the
- # CompositionMobs. To figure out whether this clip is directly in the CompositionMob, we detect if our
- # parent mobs are only CompositionMobs. If they were anything else - a MasterMob, a SourceMob, we would
- # know that this is in some indirect relationship.
- parent_mobs = filter(lambda parent: isinstance(parent, aaf2.mobs.Mob), parents)
- is_directly_in_composition = all(isinstance(mob, aaf2.mobs.CompositionMob) for mob in parent_mobs)
- if is_directly_in_composition:
- result.source_range = otio.opentime.TimeRange(
- otio.opentime.RationalTime(source_start, editRate),
- otio.opentime.RationalTime(source_length, editRate)
- )
-
- # The goal here is to find an available range. Media ranges are stored in the related MasterMob, and there
- # should only be one - hence the name "Master" mob. Somewhere down our chain (either a child or our parents)
- # is a MasterMob. For SourceClips in the CompositionMob, it is our child. For everything else, it is a
- # previously encountered parent. Find the MasterMob in our chain, and then extract the information from that.
- child_mastermob = item.mob if isinstance(item.mob, aaf2.mobs.MasterMob) else None
- parent_mastermobs = [parent for parent in parents if isinstance(parent, aaf2.mobs.MasterMob)]
- parent_mastermob = parent_mastermobs[0] if len(parent_mastermobs) > 1 else None
- mastermob = child_mastermob or parent_mastermob or None
-
- if mastermob:
- media = otio.schema.MissingReference()
- media.available_range = otio.opentime.TimeRange(
- otio.opentime.RationalTime(media_start, editRate),
- otio.opentime.RationalTime(media_length, editRate)
- )
- # copy the metadata from the master into the media_reference
- mastermob_child = masterMobs.get(str(mastermob.mob_id))
- media.metadata["AAF"] = mastermob_child.metadata.get("AAF", {})
- result.media_reference = media
-
- elif isinstance(item, aaf2.components.Transition):
- result = otio.schema.Transition()
-
- # Does AAF support anything else?
- result.transition_type = otio.schema.TransitionTypes.SMPTE_Dissolve
-
- # Extract value and time attributes of both ControlPoints used for
- # creating AAF Transition objects
- varying_value = None
- for param in item.getvalue('OperationGroup').parameters:
- if isinstance(param, aaf2.misc.VaryingValue):
- varying_value = param
- break
-
- if varying_value is not None:
- for control_point in varying_value.getvalue('PointList'):
- value = control_point.value
- time = control_point.time
- metadata.setdefault('PointList', []).append({'Value': value,
- 'Time': time})
-
- in_offset = int(metadata.get("CutPoint", "0"))
- out_offset = item.length - in_offset
- result.in_offset = otio.opentime.RationalTime(in_offset, editRate)
- result.out_offset = otio.opentime.RationalTime(out_offset, editRate)
-
- elif isinstance(item, aaf2.components.Filler):
- result = otio.schema.Gap()
-
- length = item.length
- result.source_range = otio.opentime.TimeRange(
- otio.opentime.RationalTime(0, editRate),
- otio.opentime.RationalTime(length, editRate)
- )
-
- elif isinstance(item, aaf2.components.NestedScope):
- # TODO: Is this the right class?
- result = otio.schema.Stack()
-
- for slot in item.slots:
- child = _transcribe(slot, parents + [item], editRate, masterMobs)
- _add_child(result, child, slot)
-
- elif isinstance(item, aaf2.components.Sequence):
- result = otio.schema.Track()
-
- for component in item.components:
- child = _transcribe(component, parents + [item], editRate, masterMobs)
- _add_child(result, child, component)
-
- elif isinstance(item, aaf2.components.OperationGroup):
- result = _transcribe_operation_group(
- item, parents, metadata, editRate, masterMobs
- )
-
- elif isinstance(item, aaf2.mobslots.TimelineMobSlot):
- result = otio.schema.Track()
-
- child = _transcribe(item.segment, parents + [item], editRate, masterMobs)
- _add_child(result, child, item.segment)
-
- elif isinstance(item, aaf2.mobslots.MobSlot):
- result = otio.schema.Track()
-
- child = _transcribe(item.segment, parents + [item], editRate, masterMobs)
- _add_child(result, child, item.segment)
-
- elif isinstance(item, aaf2.components.Timecode):
- pass
-
- elif isinstance(item, aaf2.components.Pulldown):
- pass
-
- elif isinstance(item, aaf2.components.EdgeCode):
- pass
-
- elif isinstance(item, aaf2.components.ScopeReference):
- # TODO: is this like FILLER?
-
- result = otio.schema.Gap()
-
- length = item.length
- result.source_range = otio.opentime.TimeRange(
- otio.opentime.RationalTime(0, editRate),
- otio.opentime.RationalTime(length, editRate)
- )
-
- elif isinstance(item, aaf2.components.DescriptiveMarker):
-
- # Markers come in on their own separate Track.
- # TODO: We should consolidate them onto the same track(s) as the clips
- # result = otio.schema.Marker()
- pass
-
- elif isinstance(item, aaf2.components.Selector):
- # If you mute a clip in media composer, it becomes one of these in the
- # AAF.
- result = _transcribe(
- item.getvalue("Selected"),
- parents + [item],
- editRate,
- masterMobs
- )
-
- alternates = [
- _transcribe(alt, parents + [item], editRate, masterMobs)
- for alt in item.getvalue("Alternates")
- ]
-
- # muted case -- if there is only one item its muted, otherwise its
- # a multi cam thing
- if alternates and len(alternates) == 1:
- metadata['muted_clip'] = True
- result.name = str(alternates[0].name) + "_MUTED"
-
- metadata['alternates'] = alternates
-
- # @TODO: There are a bunch of other AAF object types that we will
- # likely need to add support for. I'm leaving this code here to help
- # future efforts to extract the useful information out of these.
-
- # elif isinstance(item, aaf.storage.File):
- # self.extendChildItems([item.header])
-
- # elif isinstance(item, aaf.storage.Header):
- # self.extendChildItems([item.storage()])
- # self.extendChildItems([item.dictionary()])
-
- # elif isinstance(item, aaf.dictionary.Dictionary):
- # l = []
- # l.append(DummyItem(list(item.class_defs()), 'ClassDefs'))
- # l.append(DummyItem(list(item.codec_defs()), 'CodecDefs'))
- # l.append(DummyItem(list(item.container_defs()), 'ContainerDefs'))
- # l.append(DummyItem(list(item.data_defs()), 'DataDefs'))
- # l.append(DummyItem(list(item.interpolation_defs()),
- # 'InterpolationDefs'))
- # l.append(DummyItem(list(item.klvdata_defs()), 'KLVDataDefs'))
- # l.append(DummyItem(list(item.operation_defs()), 'OperationDefs'))
- # l.append(DummyItem(list(item.parameter_defs()), 'ParameterDefs'))
- # l.append(DummyItem(list(item.plugin_defs()), 'PluginDefs'))
- # l.append(DummyItem(list(item.taggedvalue_defs()), 'TaggedValueDefs'))
- # l.append(DummyItem(list(item.type_defs()), 'TypeDefs'))
- # self.extendChildItems(l)
- #
- # elif isinstance(item, pyaaf.AxSelector):
- # self.extendChildItems(list(item.EnumAlternateSegments()))
- #
- # elif isinstance(item, pyaaf.AxScopeReference):
- # #print item, item.GetRelativeScope(),item.GetRelativeSlot()
- # pass
- #
- # elif isinstance(item, pyaaf.AxEssenceGroup):
- # segments = []
- #
- # for i in xrange(item.CountChoices()):
- # choice = item.GetChoiceAt(i)
- # segments.append(choice)
- # self.extendChildItems(segments)
- #
- # elif isinstance(item, pyaaf.AxProperty):
- # self.properties['Value'] = str(item.GetValue())
-
- elif isinstance(item, Iterable):
- result = otio.schema.SerializableCollection()
- for child in item:
- result.append(
- _transcribe(
- child,
- parents + [item],
- editRate,
- masterMobs
- )
- )
- else:
- # For everything else, we just ignore it.
- # To see what is being ignored, turn on the debug flag
- if debug:
- print("SKIPPING: {}: {} -- {}".format(type(item), item, result))
-
- # Did we get anything? If not, we're done
- if result is None:
- return None
-
- # Okay, now we've turned the AAF thing into an OTIO result
- # There's a bit more we can do before we're ready to return the result.
-
- # If we didn't get a name yet, use the one we have in metadata
- if result.name is None:
- result.name = metadata["Name"]
-
- # Attach the AAF metadata
- if not result.metadata:
- result.metadata = {}
- result.metadata["AAF"] = metadata
-
- # Double check that we got the length we expected
- if isinstance(result, otio.core.Item):
- length = metadata.get("Length")
- if (
- length
- and result.source_range is not None
- and result.source_range.duration.value != length
- ):
- raise otio.exceptions.OTIOError(
- "Wrong duration? {} should be {} in {}".format(
- result.source_range.duration.value,
- length,
- result
- )
- )
-
- # Did we find a Track?
- if isinstance(result, otio.schema.Track):
- # Try to figure out the kind of Track it is
- if hasattr(item, 'media_kind'):
- media_kind = str(item.media_kind)
- result.metadata["AAF"]["MediaKind"] = media_kind
- if media_kind == "Picture":
- result.kind = otio.schema.TrackKind.Video
- elif media_kind in ("SoundMasterTrack", "Sound"):
- result.kind = otio.schema.TrackKind.Audio
- else:
- # Timecode, Edgecode, others?
- result.kind = None
-
- # Done!
- return result
-
-
-def _find_timecode_track_start(track):
- # See if we can find a starting timecode in here...
- aaf_metadata = track.metadata.get("AAF", {})
-
- # Is this a Timecode track?
- if aaf_metadata.get("MediaKind") == "Timecode":
- edit_rate = aaf_metadata.get("EditRate", "0")
- fps = aaf_metadata.get("Segment", {}).get("FPS", 0)
- start = aaf_metadata.get("Segment", {}).get("Start", "0")
-
- # Often times there are several timecode tracks, so
- # we use a heuristic to only pay attention to Timecode
- # tracks with a FPS that matches the edit rate.
- if edit_rate == str(fps):
- return otio.opentime.RationalTime(
- value=int(start),
- rate=float(edit_rate)
- )
-
- # We didn't find anything useful
- return None
-
-
-def _transcribe_linear_timewarp(item, parameters):
- # this is a linear time warp
- effect = otio.schema.LinearTimeWarp()
-
- offset_map = _get_parameter(item, 'PARAM_SPEED_OFFSET_MAP_U')
-
- # If we have a LinearInterp with just 2 control points, then
- # we can compute the time_scalar. Note that the SpeedRatio is
- # NOT correct in many AAFs - we aren't sure why, but luckily we
- # can compute the correct value this way.
- points = offset_map.get("PointList")
- if len(points) > 2:
- # This is something complicated... try the fancy version
- return _transcribe_fancy_timewarp(item, parameters)
- elif (
- len(points) == 2
- and float(points[0].time) == 0
- and float(points[0].value) == 0
- ):
- # With just two points, we can compute the slope
- effect.time_scalar = float(points[1].value) / float(points[1].time)
- else:
- # Fall back to the SpeedRatio if we didn't understand the points
- ratio = parameters.get("SpeedRatio")
- if ratio == str(item.length):
- # If the SpeedRatio == the length, this is a freeze frame
- effect.time_scalar = 0
- elif '/' in ratio:
- numerator, denominator = map(float, ratio.split('/'))
- # OTIO time_scalar is 1/x from AAF's SpeedRatio
- effect.time_scalar = denominator / numerator
- else:
- effect.time_scalar = 1.0 / float(ratio)
-
- # Is this is a freeze frame?
- if effect.time_scalar == 0:
- # Note: we might end up here if any of the code paths above
- # produced a 0 time_scalar.
- # Use the FreezeFrame class instead of LinearTimeWarp
- effect = otio.schema.FreezeFrame()
-
- return effect
-
-
-def _transcribe_fancy_timewarp(item, parameters):
-
- # For now, this is an unsupported time effect...
- effect = otio.schema.TimeEffect()
- effect.effect_name = None # Unsupported
- effect.name = item.get("Name")
-
- return effect
-
- # TODO: Here is some sample code that pulls out the full
- # details of a non-linear speed map.
-
- # speed_map = item.parameter['PARAM_SPEED_MAP_U']
- # offset_map = item.parameter['PARAM_SPEED_OFFSET_MAP_U']
- # Also? PARAM_OFFSET_MAP_U (without the word "SPEED" in it?)
- # print(speed_map['PointList'].value)
- # print(speed_map.count())
- # print(speed_map.interpolation_def().name)
- #
- # for p in speed_map.points():
- # print(" ", float(p.time), float(p.value), p.edit_hint)
- # for prop in p.point_properties():
- # print(" ", prop.name, prop.value, float(prop.value))
- #
- # print(offset_map.interpolation_def().name)
- # for p in offset_map.points():
- # edit_hint = p.edit_hint
- # time = p.time
- # value = p.value
- #
- # pass
- # # print " ", float(p.time), float(p.value)
- #
- # for i in range(100):
- # float(offset_map.value_at("%i/100" % i))
- #
- # # Test file PARAM_SPEED_MAP_U is AvidBezierInterpolator
- # # currently no implement for value_at
- # try:
- # speed_map.value_at(.25)
- # except NotImplementedError:
- # pass
- # else:
- # raise
-
-
-def _transcribe_operation_group(item, parents, metadata, editRate, masterMobs):
- result = otio.schema.Stack()
-
- operation = metadata.get("Operation", {})
- parameters = metadata.get("Parameters", {})
- result.name = operation.get("Name")
-
- # Trust the length that is specified in the AAF
- length = metadata.get("Length")
- result.source_range = otio.opentime.TimeRange(
- otio.opentime.RationalTime(0, editRate),
- otio.opentime.RationalTime(length, editRate)
- )
-
- # Look for speed effects...
- effect = None
- if operation.get("IsTimeWarp"):
- if operation.get("Name") == "Motion Control":
-
- offset_map = _get_parameter(item, 'PARAM_SPEED_OFFSET_MAP_U')
- # TODO: We should also check the PARAM_OFFSET_MAP_U which has
- # an interpolation_def().name as well.
- if offset_map is not None:
- interpolation = offset_map.interpolation.name
- else:
- interpolation = None
-
- if interpolation == "LinearInterp":
- effect = _transcribe_linear_timewarp(item, parameters)
- else:
- effect = _transcribe_fancy_timewarp(item, parameters)
-
- else:
- # Unsupported time effect
- effect = otio.schema.TimeEffect()
- effect.effect_name = None # Unsupported
- effect.name = operation.get("Name")
- else:
- # Unsupported effect
- effect = otio.schema.Effect()
- effect.effect_name = None # Unsupported
- effect.name = operation.get("Name")
-
- if effect is not None:
- result.effects.append(effect)
- effect.metadata = {
- "AAF": {
- "Operation": operation,
- "Parameters": parameters
- }
- }
-
- for segment in item.getvalue("InputSegments"):
- child = _transcribe(segment, parents + [item], editRate, masterMobs)
- if child:
- _add_child(result, child, segment)
-
- return result
-
-
-def _fix_transitions(thing):
- if isinstance(thing, otio.schema.Timeline):
- _fix_transitions(thing.tracks)
- elif (
- isinstance(thing, otio.core.Composition)
- or isinstance(thing, otio.schema.SerializableCollection)
- ):
- if isinstance(thing, otio.schema.Track):
- for c, child in enumerate(thing):
-
- # Don't touch the Transitions themselves,
- # only the Clips & Gaps next to them.
- if not isinstance(child, otio.core.Item):
- continue
-
- # Was the item before us a Transition?
- if c > 0 and isinstance(
- thing[c - 1],
- otio.schema.Transition
- ):
- pre_trans = thing[c - 1]
-
- if child.source_range is None:
- child.source_range = child.trimmed_range()
- csr = child.source_range
- child.source_range = otio.opentime.TimeRange(
- start_time=csr.start_time + pre_trans.in_offset,
- duration=csr.duration - pre_trans.in_offset
- )
-
- # Is the item after us a Transition?
- if c < len(thing) - 1 and isinstance(
- thing[c + 1],
- otio.schema.Transition
- ):
- post_trans = thing[c + 1]
-
- if child.source_range is None:
- child.source_range = child.trimmed_range()
- csr = child.source_range
- child.source_range = otio.opentime.TimeRange(
- start_time=csr.start_time,
- duration=csr.duration - post_trans.out_offset
- )
-
- for child in thing:
- _fix_transitions(child)
-
-
-def _simplify(thing):
- if isinstance(thing, otio.schema.SerializableCollection):
- if len(thing) == 1:
- return _simplify(thing[0])
- else:
- for c, child in enumerate(thing):
- thing[c] = _simplify(child)
- return thing
-
- elif isinstance(thing, otio.schema.Timeline):
- result = _simplify(thing.tracks)
-
- # Only replace the Timeline's stack if the simplified result
- # was also a Stack. Otherwise leave it (the contents will have
- # been simplified in place).
- if isinstance(result, otio.schema.Stack):
- thing.tracks = result
-
- return thing
-
- elif isinstance(thing, otio.core.Composition):
- # simplify our children
- for c, child in enumerate(thing):
- thing[c] = _simplify(child)
-
- # remove empty children of Stacks
- if isinstance(thing, otio.schema.Stack):
- for c in reversed(range(len(thing))):
- child = thing[c]
- if not _contains_something_valuable(child):
- # TODO: We're discarding metadata... should we retain it?
- del thing[c]
-
- # Look for Stacks within Stacks
- c = len(thing) - 1
- while c >= 0:
- child = thing[c]
- # Is my child a Stack also? (with no effects)
- if (
- not _has_effects(child)
- and
- (
- isinstance(child, otio.schema.Stack)
- or (
- isinstance(child, otio.schema.Track)
- and len(child) == 1
- and isinstance(child[0], otio.schema.Stack)
- and child[0]
- and isinstance(child[0][0], otio.schema.Track)
- )
- )
- ):
- if isinstance(child, otio.schema.Track):
- child = child[0]
-
- # Pull the child's children into the parent
- num = len(child)
- children_of_child = child[:]
- # clear out the ownership of 'child'
- del child[:]
- thing[c:c + 1] = children_of_child
-
- # TODO: We may be discarding metadata, should we merge it?
- # TODO: Do we need to offset the markers in time?
- thing.markers.extend(child.markers)
- # Note: we don't merge effects, because we already made
- # sure the child had no effects in the if statement above.
-
- c = c + num
- c = c - 1
-
- # skip redundant containers
- if _is_redundant_container(thing):
- # TODO: We may be discarding metadata here, should we merge it?
- result = thing[0].deepcopy()
- # TODO: Do we need to offset the markers in time?
- result.markers.extend(thing.markers)
- # TODO: The order of the effects is probably important...
- # should they be added to the end or the front?
- # Intuitively it seems like the child's effects should come before
- # the parent's effects. This will need to be solidified when we
- # add more effects support.
- result.effects.extend(thing.effects)
- # Keep the parent's length, if it has one
- if thing.source_range:
- # make sure it has a source_range first
- if not result.source_range:
- try:
- result.source_range = result.trimmed_range()
- except otio.exceptions.CannotComputeAvailableRangeError:
- result.source_range = copy.copy(thing.source_range)
- # modify the duration, but leave the start_time as is
- result.source_range = otio.opentime.TimeRange(
- result.source_range.start_time,
- thing.source_range.duration
- )
- return result
-
- # if thing is the top level stack, all of its children must be in tracks
- if isinstance(thing, otio.schema.Stack) and thing.parent() is None:
- children_needing_tracks = []
- for child in thing:
- if isinstance(child, otio.schema.Track):
- continue
- children_needing_tracks.append(child)
-
- for child in children_needing_tracks:
- orig_index = thing.index(child)
- del thing[orig_index]
- new_track = otio.schema.Track()
- new_track.append(child)
- thing.insert(orig_index, new_track)
-
- return thing
-
-
-def _has_effects(thing):
- if isinstance(thing, otio.core.Item):
- if len(thing.effects) > 0:
- return True
-
-
-def _is_redundant_container(thing):
-
- is_composition = isinstance(thing, otio.core.Composition)
- if not is_composition:
- return False
-
- has_one_child = len(thing) == 1
- if not has_one_child:
- return False
-
- am_top_level_track = (
- type(thing) is otio.schema.Track
- and type(thing.parent()) is otio.schema.Stack
- and thing.parent().parent() is None
- )
-
- return (
- not am_top_level_track
- # am a top level track but my only child is a track
- or (
- type(thing) is otio.schema.Track
- and type(thing[0]) is otio.schema.Track
- )
- )
-
-
-def _contains_something_valuable(thing):
- if isinstance(thing, otio.core.Item):
- if len(thing.effects) > 0 or len(thing.markers) > 0:
- return True
-
- if isinstance(thing, otio.core.Composition):
-
- if len(thing) == 0:
- # NOT valuable because it is empty
- return False
-
- for child in thing:
- if _contains_something_valuable(child):
- # valuable because this child is valuable
- return True
-
- # none of the children were valuable, so thing is NOT valuable
- return False
-
- if isinstance(thing, otio.schema.Gap):
- # TODO: Are there other valuable things we should look for on a Gap?
- return False
-
- # anything else is presumed to be valuable
- return True
-
-
-def read_from_file(filepath, simplify=True):
-
- with aaf2.open(filepath) as aaf_file:
-
- storage = aaf_file.content
-
- # Note: We're skipping: f.header
- # Is there something valuable in there?
-
- __names.clear()
- masterMobs = {}
-
- result = _transcribe(storage, parents=list(), editRate=None, masterMobs=masterMobs)
- top = storage.toplevel()
- if top:
- # re-transcribe just the top-level mobs
- # but use all the master mobs we found in the 1st pass
- __names.clear() # reset the names back to 0
- result = _transcribe(top, parents=list(), editRate=None, masterMobs=masterMobs)
-
- # AAF is typically more deeply nested than OTIO.
- # Lets try to simplify the structure by collapsing or removing
- # unnecessary stuff.
- if simplify:
- result = _simplify(result)
-
- # OTIO represents transitions a bit different than AAF, so
- # we need to iterate over them and modify the items on either side.
- # Note that we do this *after* simplifying, since the structure
- # may change during simplification.
- _fix_transitions(result)
-
- return result
-
-
-def write_to_file(input_otio, filepath, **kwargs):
- with aaf2.open(filepath, "w") as f:
-
- timeline = aaf_writer._stackify_nested_groups(input_otio)
-
- aaf_writer.validate_metadata(timeline)
-
- otio2aaf = aaf_writer.AAFFileTranscriber(timeline, f, **kwargs)
-
- if not isinstance(timeline, otio.schema.Timeline):
- raise otio.exceptions.NotSupportedError(
- "Currently only supporting top level Timeline")
-
- for otio_track in timeline.tracks:
- # Ensure track must have clip to get the edit_rate
- if len(otio_track) == 0:
- continue
-
- transcriber = otio2aaf.track_transcriber(otio_track)
-
- for otio_child in otio_track:
- result = transcriber.transcribe(otio_child)
- if result:
- transcriber.sequence.components.append(result)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/ale.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/ale.py
deleted file mode 100644
index 150ed6d93d..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/ale.py
+++ /dev/null
@@ -1,318 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""OpenTimelineIO Avid Log Exchange (ALE) Adapter"""
-import re
-import opentimelineio as otio
-
-DEFAULT_VIDEO_FORMAT = '1080'
-
-
-def AVID_VIDEO_FORMAT_FROM_WIDTH_HEIGHT(width, height):
- """Utility function to map a width and height to an Avid Project Format"""
-
- format_map = {
- '1080': "1080",
- '720': "720",
- '576': "PAL",
- '486': "NTSC",
- }
- mapped = format_map.get(str(height), "CUSTOM")
- # check for the 2K DCI 1080 format
- if mapped == '1080' and width > 1920:
- mapped = "CUSTOM"
- return mapped
-
-
-class ALEParseError(otio.exceptions.OTIOError):
- pass
-
-
-def _parse_data_line(line, columns, fps):
- row = line.split("\t")
-
- if len(row) < len(columns):
- # Fill in blanks for any missing fields in this row
- row.extend([""] * (len(columns) - len(row)))
-
- if len(row) > len(columns):
- raise ALEParseError("Too many values on row: " + line)
-
- try:
-
- # Gather all the columns into a dictionary
- # For expected columns, like Name, Start, etc. we will pop (remove)
- # those from metadata, leaving the rest alone.
- metadata = dict(zip(columns, row))
-
- clip = otio.schema.Clip()
- clip.name = metadata.pop("Name", None)
-
- # When looking for Start, Duration and End, they might be missing
- # or blank. Treat None and "" as the same via: get(k,"")!=""
- # To have a valid source range, you need Start and either Duration
- # or End. If all three are provided, we check to make sure they match.
- if metadata.get("Start", "") != "":
- value = metadata.pop("Start")
- try:
- start = otio.opentime.from_timecode(value, fps)
- except (ValueError, TypeError):
- raise ALEParseError("Invalid Start timecode: {}".format(value))
- duration = None
- end = None
- if metadata.get("Duration", "") != "":
- value = metadata.pop("Duration")
- try:
- duration = otio.opentime.from_timecode(value, fps)
- except (ValueError, TypeError):
- raise ALEParseError("Invalid Duration timecode: {}".format(
- value
- ))
- if metadata.get("End", "") != "":
- value = metadata.pop("End")
- try:
- end = otio.opentime.from_timecode(value, fps)
- except (ValueError, TypeError):
- raise ALEParseError("Invalid End timecode: {}".format(
- value
- ))
- if duration is None:
- duration = end - start
- if end is None:
- end = start + duration
- if end != start + duration:
- raise ALEParseError(
- "Inconsistent Start, End, Duration: " + line
- )
- clip.source_range = otio.opentime.TimeRange(
- start,
- duration
- )
-
- if metadata.get("Source File"):
- source = metadata.pop("Source File")
- clip.media_reference = otio.schema.ExternalReference(
- target_url=source
- )
-
- # We've pulled out the key/value pairs that we treat specially.
- # Put the remaining key/values into clip.metadata["ALE"]
- clip.metadata["ALE"] = metadata
-
- return clip
- except Exception as ex:
- raise ALEParseError("Error parsing line: {}\n{}".format(
- line, repr(ex)
- ))
-
-
-def _video_format_from_metadata(clips):
- # Look for clips with Image Size metadata set
- max_height = 0
- max_width = 0
- for clip in clips:
- fields = clip.metadata.get("ALE", {})
- res = fields.get("Image Size", "")
- m = re.search(r'([0-9]{1,})\s*[xX]\s*([0-9]{1,})', res)
- if m and len(m.groups()) >= 2:
- width = int(m.group(1))
- height = int(m.group(2))
- if height > max_height:
- max_height = height
- if width > max_width:
- max_width = width
-
- # We don't have any image size information, use the defaut
- if max_height == 0:
- return DEFAULT_VIDEO_FORMAT
- else:
- return AVID_VIDEO_FORMAT_FROM_WIDTH_HEIGHT(max_width, max_height)
-
-
-def read_from_string(input_str, fps=24):
-
- collection = otio.schema.SerializableCollection()
- header = {}
- columns = []
-
- def nextline(lines):
- return lines.pop(0)
-
- lines = input_str.splitlines()
- while len(lines):
- line = nextline(lines)
-
- # skip blank lines
- if line.strip() == "":
- continue
-
- if line.strip() == "Heading":
- while len(lines):
- line = nextline(lines)
-
- if line.strip() == "":
- break
-
- if "\t" not in line:
- raise ALEParseError("Invalid Heading line: " + line)
-
- segments = line.split("\t")
- while len(segments) >= 2:
- key, val = segments.pop(0), segments.pop(0)
- header[key] = val
- if len(segments) != 0:
- raise ALEParseError("Invalid Heading line: " + line)
-
- if "FPS" in header:
- fps = float(header["FPS"])
-
- if line.strip() == "Column":
- if len(lines) == 0:
- raise ALEParseError("Unexpected end of file after: " + line)
-
- line = nextline(lines)
- columns = line.split("\t")
-
- if line.strip() == "Data":
- while len(lines):
- line = nextline(lines)
-
- if line.strip() == "":
- continue
-
- clip = _parse_data_line(line, columns, fps)
-
- collection.append(clip)
-
- collection.metadata["ALE"] = {
- "header": header,
- "columns": columns
- }
-
- return collection
-
-
-def write_to_string(input_otio, columns=None, fps=None, video_format=None):
-
- # Get all the clips we're going to export
- clips = list(input_otio.each_clip())
-
- result = ""
-
- result += "Heading\n"
- header = dict(input_otio.metadata.get("ALE", {}).get("header", {}))
-
- # Force this, since we've hard coded tab delimiters
- header["FIELD_DELIM"] = "TABS"
-
- if fps is None:
- # If we weren't given a FPS, is there one in the header metadata?
- if "FPS" in header:
- fps = float(header["FPS"])
- else:
- # Would it be better to infer this by inspecting the input clips?
- fps = 24
- header["FPS"] = str(fps)
- else:
- # Put the value we were given into the header
- header["FPS"] = str(fps)
-
- # Check if we have been supplied a VIDEO_FORMAT, if not lets set one
- if video_format is None:
- # Do we already have it in the header? If so, lets leave that as is
- if "VIDEO_FORMAT" not in header:
- header["VIDEO_FORMAT"] = _video_format_from_metadata(clips)
- else:
- header["VIDEO_FORMAT"] = str(video_format)
-
- headers = list(header.items())
- headers.sort() # make the output predictable
- for key, val in headers:
- result += "{}\t{}\n".format(key, val)
-
- # If the caller passed in a list of columns, use that, otherwise
- # we need to discover the columns that should be output.
- if columns is None:
- # Is there a hint about the columns we want (and column ordering)
- # at the top level?
- columns = input_otio.metadata.get("ALE", {}).get("columns", [])
-
- # Scan all the clips for any extra columns
- for clip in clips:
- fields = clip.metadata.get("ALE", {})
- for key in fields.keys():
- if key not in columns:
- columns.append(key)
-
- # Always output these
- for c in ["Duration", "End", "Start", "Name", "Source File"]:
- if c not in columns:
- columns.insert(0, c)
-
- result += "\nColumn\n{}\n".format("\t".join(columns))
-
- result += "\nData\n"
-
- def val_for_column(column, clip):
- if column == "Name":
- return clip.name
- elif column == "Source File":
- if (
- clip.media_reference and
- hasattr(clip.media_reference, 'target_url') and
- clip.media_reference.target_url
- ):
- return clip.media_reference.target_url
- else:
- return ""
- elif column == "Start":
- if not clip.source_range:
- return ""
- return otio.opentime.to_timecode(
- clip.source_range.start_time, fps
- )
- elif column == "Duration":
- if not clip.source_range:
- return ""
- return otio.opentime.to_timecode(
- clip.source_range.duration, fps
- )
- elif column == "End":
- if not clip.source_range:
- return ""
- return otio.opentime.to_timecode(
- clip.source_range.end_time_exclusive(), fps
- )
- else:
- return clip.metadata.get("ALE", {}).get(column)
-
- for clip in clips:
- row = []
- for column in columns:
- val = str(val_for_column(column, clip) or "")
- val.replace("\t", " ") # don't allow tabs inside a value
- row.append(val)
- result += "\t".join(row) + "\n"
-
- return result
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/burnins.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/burnins.py
deleted file mode 100644
index 93741bbb14..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/burnins.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-"""FFMPEG Burnins Adapter"""
-import os
-import sys
-
-
-def build_burnins(input_otio):
- """
- Generates the burnin objects for each clip within the otio container
-
- :param input_otio: OTIO container
- :rtype: [ffmpeg_burnins.Burnins(), ...]
- """
-
- if os.path.dirname(__file__) not in sys.path:
- sys.path.append(os.path.dirname(__file__))
-
- import ffmpeg_burnins
- key = 'burnins'
-
- burnins = []
- for clip in input_otio.each_clip():
-
- # per clip burnin data
- burnin_data = clip.media_reference.metadata.get(key)
- if not burnin_data:
- # otherwise default to global burnin
- burnin_data = input_otio.metadata.get(key)
-
- if not burnin_data:
- continue
-
- media = clip.media_reference.target_url
- if media.startswith('file://'):
- media = media[7:]
- streams = burnin_data.get('streams')
- burnins.append(ffmpeg_burnins.Burnins(media,
- streams=streams))
- burnins[-1].otio_media = media
- burnins[-1].otio_overwrite = burnin_data.get('overwrite')
- burnins[-1].otio_args = burnin_data.get('args')
-
- for burnin in burnin_data.get('burnins', []):
- align = burnin.pop('align')
- function = burnin.pop('function')
- if function == 'text':
- text = burnin.pop('text')
- options = ffmpeg_burnins.TextOptions()
- options.update(burnin)
- burnins[-1].add_text(text, align, options=options)
- elif function == 'frame_number':
- options = ffmpeg_burnins.FrameNumberOptions()
- options.update(burnin)
- burnins[-1].add_frame_numbers(align, options=options)
- elif function == 'timecode':
- options = ffmpeg_burnins.TimeCodeOptions()
- options.update(burnin)
- burnins[-1].add_timecode(align, options=options)
- else:
- raise RuntimeError("Unknown function '%s'" % function)
-
- return burnins
-
-
-def write_to_file(input_otio, filepath):
- """required OTIO function hook"""
-
- for burnin in build_burnins(input_otio):
- burnin.render(os.path.join(filepath, burnin.otio_media),
- args=burnin.otio_args,
- overwrite=burnin.otio_overwrite)
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/contrib_adapters.plugin_manifest.json b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/contrib_adapters.plugin_manifest.json
deleted file mode 100644
index ceaf0a3067..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/contrib_adapters.plugin_manifest.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "OTIO_SCHEMA" : "PluginManifest.1",
- "adapters": [
- {
- "OTIO_SCHEMA": "Adapter.1",
- "name": "fcpx_xml",
- "execution_scope": "in process",
- "filepath": "fcpx_xml.py",
- "suffixes": ["fcpxml"]
- },
- {
- "OTIO_SCHEMA": "Adapter.1",
- "name": "hls_playlist",
- "execution_scope": "in process",
- "filepath": "hls_playlist.py",
- "suffixes": ["m3u8"]
- },
- {
- "OTIO_SCHEMA" : "Adapter.1",
- "name" : "rv_session",
- "execution_scope" : "in process",
- "filepath" : "rv.py",
- "suffixes" : ["rv"]
- },
- {
- "OTIO_SCHEMA" : "Adapter.1",
- "name" : "maya_sequencer",
- "execution_scope" : "in process",
- "filepath" : "maya_sequencer.py",
- "suffixes" : ["ma","mb"]
- },
- {
- "OTIO_SCHEMA" : "Adapter.1",
- "name" : "ale",
- "execution_scope" : "in process",
- "filepath" : "ale.py",
- "suffixes" : ["ale"]
- },
- {
- "OTIO_SCHEMA" : "Adapter.1",
- "name" : "burnins",
- "execution_scope" : "in process",
- "filepath" : "burnins.py",
- "suffixes" : []
- },
- {
- "OTIO_SCHEMA" : "Adapter.1",
- "name" : "AAF",
- "execution_scope" : "in process",
- "filepath" : "advanced_authoring_format.py",
- "suffixes" : ["aaf"]
- },
- {
- "OTIO_SCHEMA": "Adapter.1",
- "name": "xges",
- "execution_scope": "in process",
- "filepath": "xges.py",
- "suffixes": ["xges"]
- }
- ]
-}
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/extern_maya_sequencer.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/extern_maya_sequencer.py
deleted file mode 100644
index 45d77976cf..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/extern_maya_sequencer.py
+++ /dev/null
@@ -1,261 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-import os
-import sys
-
-# deal with renaming of default library from python 2 / 3
-try:
- import urlparse as urllib_parse
-except ImportError:
- import urllib.parse as urllib_parse
-
-# import maya and handle standalone mode
-from maya import cmds
-
-try:
- cmds.ls
-except AttributeError:
- from maya import standalone
- standalone.initialize(name='python')
-
-import opentimelineio as otio
-
-# Mapping of Maya FPS Enum to rate.
-FPS = {
- 'game': 15,
- 'film': 24,
- 'pal': 25,
- 'ntsc': 30,
- 'show': 48,
- 'palf': 50,
- 'ntscf': 60
-}
-
-
-def _url_to_path(url):
- if url is None:
- return None
-
- return urllib_parse.urlparse(url).path
-
-
-def _video_url_for_shot(shot):
- current_file = os.path.normpath(cmds.file(q=True, sn=True))
- return os.path.join(
- os.path.dirname(current_file),
- 'playblasts',
- '{base_name}_{shot_name}.mov'.format(
- base_name=os.path.basename(os.path.splitext(current_file)[0]),
- shot_name=cmds.shot(shot, q=True, shotName=True)
- )
- )
-
-
-def _match_existing_shot(item, existing_shots):
- if existing_shots is None:
- return None
-
- if item.media_reference.is_missing_reference:
- return None
-
- url_path = _url_to_path(item.media_reference.target_url)
- return next(
- (
- shot for shot in existing_shots
- if _video_url_for_shot(shot) == url_path
- ),
- None
- )
-
-
-# ------------------------
-# building single track
-# ------------------------
-
-def _build_shot(item, track_no, track_range, existing_shot=None):
- camera = None
- if existing_shot is None:
- camera = cmds.camera(name=item.name.split('.')[0] + '_cam')[0]
- cmds.shot(
- existing_shot or item.name.split('.')[0],
- e=existing_shot is not None,
- shotName=item.name,
- track=track_no,
- currentCamera=camera,
- startTime=item.trimmed_range().start_time.value,
- endTime=item.trimmed_range().end_time_inclusive().value,
- sequenceStartTime=track_range.start_time.value,
- sequenceEndTime=track_range.end_time_inclusive().value
- )
-
-
-def _build_track(track, track_no, existing_shots=None):
- for n, item in enumerate(track):
- if not isinstance(item, otio.schema.Clip):
- continue
-
- track_range = track.range_of_child_at_index(n)
- if existing_shots is not None:
- existing_shot = _match_existing_shot(item, existing_shots)
- else:
- existing_shot = None
-
- _build_shot(item, track_no, track_range, existing_shot)
-
-
-def build_sequence(timeline, clean=False):
- existing_shots = cmds.ls(type='shot') or []
- if clean:
- cmds.delete(existing_shots)
- existing_shots = []
-
- tracks = [
- track for track in timeline.tracks
- if track.kind == otio.schema.TrackKind.Video
- ]
-
- for track_no, track in enumerate(reversed(tracks)):
- _build_track(track, track_no, existing_shots=existing_shots)
-
-
-def read_from_file(path, clean=True):
- timeline = otio.adapters.read_from_file(path)
- build_sequence(timeline, clean=clean)
-
-
-# -----------------------
-# parsing single track
-# -----------------------
-
-def _get_gap(duration):
- rate = FPS.get(cmds.currentUnit(q=True, time=True), 25)
- gap_range = otio.opentime.TimeRange(
- duration=otio.opentime.RationalTime(duration, rate)
- )
- return otio.schema.Gap(source_range=gap_range)
-
-
-def _read_shot(shot):
- rate = FPS.get(cmds.currentUnit(q=True, time=True), 25)
- start = int(cmds.shot(shot, q=True, startTime=True))
- end = int(cmds.shot(shot, q=True, endTime=True)) + 1
-
- video_reference = otio.schema.ExternalReference(
- target_url=_video_url_for_shot(shot),
- available_range=otio.opentime.TimeRange(
- otio.opentime.RationalTime(value=start, rate=rate),
- otio.opentime.RationalTime(value=end - start, rate=rate)
- )
- )
-
- return otio.schema.Clip(
- name=cmds.shot(shot, q=True, shotName=True),
- media_reference=video_reference,
- source_range=otio.opentime.TimeRange(
- otio.opentime.RationalTime(value=start, rate=rate),
- otio.opentime.RationalTime(value=end - start, rate=rate)
- )
- )
-
-
-def _read_track(shots):
- v = otio.schema.Track(kind=otio.schema.track.TrackKind.Video)
-
- last_clip_end = 0
- for shot in shots:
- seq_start = int(cmds.shot(shot, q=True, sequenceStartTime=True))
- seq_end = int(cmds.shot(shot, q=True, sequenceEndTime=True))
-
- # add gap if necessary
- fill_time = seq_start - last_clip_end
- last_clip_end = seq_end + 1
- if fill_time:
- v.append(_get_gap(fill_time))
-
- # add clip
- v.append(_read_shot(shot))
-
- return v
-
-
-def read_sequence():
- rate = FPS.get(cmds.currentUnit(q=True, time=True), 25)
- shots = cmds.ls(type='shot') or []
- per_track = {}
-
- for shot in shots:
- track_no = cmds.shot(shot, q=True, track=True)
- if track_no not in per_track:
- per_track[track_no] = []
- per_track[track_no].append(shot)
-
- timeline = otio.schema.Timeline()
- timeline.global_start_time = otio.opentime.RationalTime(0, rate)
-
- for track_no in reversed(sorted(per_track.keys())):
- track_shots = per_track[track_no]
- timeline.tracks.append(_read_track(track_shots))
-
- return timeline
-
-
-def write_to_file(path):
- timeline = read_sequence()
- otio.adapters.write_to_file(timeline, path)
-
-
-def main():
- read_write_arg = sys.argv[1]
- filepath = sys.argv[2]
-
- write = False
- if read_write_arg == "write":
- write = True
-
- if write:
- # read the input OTIO off stdin
- input_otio = otio.adapters.read_from_string(
- sys.stdin.read(),
- 'otio_json'
- )
- build_sequence(input_otio, clean=True)
- cmds.file(rename=filepath)
- cmds.file(save=True, type="mayaAscii")
- else:
- cmds.file(filepath, o=True)
- sys.stdout.write(
- "\nOTIO_JSON_BEGIN\n" +
- otio.adapters.write_to_string(
- read_sequence(),
- "otio_json"
- ) +
- "\nOTIO_JSON_END\n"
- )
-
- cmds.quit(force=True)
-
-
-if __name__ == "__main__":
- main()
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/extern_rv.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/extern_rv.py
deleted file mode 100644
index f11295bb60..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/extern_rv.py
+++ /dev/null
@@ -1,327 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""RV External Adapter component.
-
-Because the rv adapter requires being run from within the RV py-interp to take
-advantage of modules inside of RV, this script gets shelled out to from the
-RV OTIO adapter.
-
-Requires that you set the environment variables:
- OTIO_RV_PYTHON_LIB - should point at the parent directory of rvSession
- OTIO_RV_PYTHON_BIN - should point at py-interp from within rv
-"""
-
-# python
-import sys
-import os
-
-# otio
-import opentimelineio as otio
-
-# rv import
-sys.path += [os.path.join(os.environ["OTIO_RV_PYTHON_LIB"], "rvSession")]
-import rvSession # noqa
-
-
-def main():
- """ entry point, should be called from the rv adapter in otio """
-
- session_file = rvSession.Session()
-
- output_fname = sys.argv[1]
-
- # read the input OTIO off stdin
- input_otio = otio.adapters.read_from_string(sys.stdin.read(), 'otio_json')
-
- result = write_otio(input_otio, session_file)
- session_file.setViewNode(result)
- session_file.write(output_fname)
-
-
-# exception class @{
-class NoMappingForOtioTypeError(otio.exceptions.OTIOError):
- pass
-# @}
-
-
-def write_otio(otio_obj, to_session, track_kind=None):
- WRITE_TYPE_MAP = {
- otio.schema.Timeline: _write_timeline,
- otio.schema.Stack: _write_stack,
- otio.schema.Track: _write_track,
- otio.schema.Clip: _write_item,
- otio.schema.Gap: _write_item,
- otio.schema.Transition: _write_transition,
- otio.schema.SerializableCollection: _write_collection,
- }
-
- if type(otio_obj) in WRITE_TYPE_MAP:
- return WRITE_TYPE_MAP[type(otio_obj)](otio_obj, to_session, track_kind)
-
- raise NoMappingForOtioTypeError(
- str(type(otio_obj)) + " on object: {}".format(otio_obj)
- )
-
-
-def _write_dissolve(pre_item, in_dissolve, post_item, to_session, track_kind=None):
- rv_trx = to_session.newNode("CrossDissolve", str(in_dissolve.name))
-
- rate = pre_item.trimmed_range().duration.rate
- rv_trx.setProperty(
- "CrossDissolve",
- "",
- "parameters",
- "startFrame",
- rvSession.gto.FLOAT,
- 1.0
- )
- rv_trx.setProperty(
- "CrossDissolve",
- "",
- "parameters",
- "numFrames",
- rvSession.gto.FLOAT,
- int(
- (
- in_dissolve.in_offset
- + in_dissolve.out_offset
- ).rescaled_to(rate).value
- )
- )
-
- rv_trx.setProperty(
- "CrossDissolve",
- "",
- "output",
- "fps",
- rvSession.gto.FLOAT,
- rate
- )
-
- pre_item_rv = write_otio(pre_item, to_session, track_kind)
- rv_trx.addInput(pre_item_rv)
-
- post_item_rv = write_otio(post_item, to_session, track_kind)
-
- node_to_insert = post_item_rv
-
- if (
- hasattr(pre_item, "media_reference")
- and pre_item.media_reference
- and pre_item.media_reference.available_range
- and hasattr(post_item, "media_reference")
- and post_item.media_reference
- and post_item.media_reference.available_range
- and (
- post_item.media_reference.available_range.start_time.rate !=
- pre_item.media_reference.available_range.start_time.rate
- )
- ):
- # write a retime to make sure post_item is in the timebase of pre_item
- rt_node = to_session.newNode("Retime", "transition_retime")
- rt_node.setTargetFps(
- pre_item.media_reference.available_range.start_time.rate
- )
-
- post_item_rv = write_otio(post_item, to_session, track_kind)
-
- rt_node.addInput(post_item_rv)
- node_to_insert = rt_node
-
- rv_trx.addInput(node_to_insert)
-
- return rv_trx
-
-
-def _write_transition(
- pre_item,
- in_trx,
- post_item,
- to_session,
- track_kind=None
-):
- trx_map = {
- otio.schema.TransitionTypes.SMPTE_Dissolve: _write_dissolve,
- }
-
- if in_trx.transition_type not in trx_map:
- return
-
- return trx_map[in_trx.transition_type](
- pre_item,
- in_trx,
- post_item,
- to_session,
- track_kind
- )
-
-
-def _write_stack(in_stack, to_session, track_kind=None):
- new_stack = to_session.newNode("Stack", str(in_stack.name) or "tracks")
-
- for seq in in_stack:
- result = write_otio(seq, to_session, track_kind)
- if result:
- new_stack.addInput(result)
-
- return new_stack
-
-
-def _write_track(in_seq, to_session, _=None):
- new_seq = to_session.newNode("Sequence", str(in_seq.name) or "track")
-
- items_to_serialize = otio.algorithms.track_with_expanded_transitions(
- in_seq
- )
-
- track_kind = in_seq.kind
-
- for thing in items_to_serialize:
- if isinstance(thing, tuple):
- result = _write_transition(*thing, to_session=to_session,
- track_kind=track_kind)
- elif thing.duration().value == 0:
- continue
- else:
- result = write_otio(thing, to_session, track_kind)
-
- if result:
- new_seq.addInput(result)
-
- return new_seq
-
-
-def _write_timeline(tl, to_session, _=None):
- result = write_otio(tl.tracks, to_session)
- return result
-
-
-def _write_collection(collection, to_session, track_kind=None):
- results = []
- for item in collection:
- result = write_otio(item, to_session, track_kind)
- if result:
- results.append(result)
-
- if results:
- return results[0]
-
-
-def _create_media_reference(item, src, track_kind=None):
- if hasattr(item, "media_reference") and item.media_reference:
- if isinstance(item.media_reference, otio.schema.ExternalReference):
- media = [str(item.media_reference.target_url)]
-
- if track_kind == otio.schema.TrackKind.Audio:
- # Create blank video media to accompany audio for valid source
- blank = "{},start={},end={},fps={}.movieproc".format(
- "blank",
- item.available_range().start_time.value,
- item.available_range().end_time_inclusive().value,
- item.available_range().duration.rate
- )
- # Inserting blank media here forces all content to only
- # produce audio. We do it twice in case we look at this in
- # stereo
- media = [blank, blank] + media
-
- src.setMedia(media)
- return True
-
- elif isinstance(item.media_reference, otio.schema.GeneratorReference):
- if item.media_reference.generator_kind == "SMPTEBars":
- kind = "smptebars"
- src.setMedia(
- [
- "{},start={},end={},fps={}.movieproc".format(
- kind,
- item.available_range().start_time.value,
- item.available_range().end_time_inclusive().value,
- item.available_range().duration.rate
- )
- ]
- )
- return True
-
- return False
-
-
-def _write_item(it, to_session, track_kind=None):
- src = to_session.newNode("Source", str(it.name) or "clip")
-
- src.setProperty(
- "RVSourceGroup",
- "source",
- "attributes",
- "otio_metadata",
- rvSession.gto.STRING, str(it.metadata)
- )
-
- range_to_read = it.trimmed_range()
-
- if not range_to_read:
- raise otio.exceptions.OTIOError(
- "No valid range on clip: {0}.".format(
- str(it)
- )
- )
-
- # because OTIO has no global concept of FPS, the rate of the duration is
- # used as the rate for the range of the source.
- # RationalTime.value_rescaled_to returns the time value of the object in
- # time rate of the argument.
- src.setCutIn(
- range_to_read.start_time.value_rescaled_to(
- range_to_read.duration
- )
- )
- src.setCutOut(
- range_to_read.end_time_inclusive().value_rescaled_to(
- range_to_read.duration
- )
- )
- src.setFPS(range_to_read.duration.rate)
-
- # if the media reference is missing
- if not _create_media_reference(it, src, track_kind):
- kind = "smptebars"
- if isinstance(it, otio.schema.Gap):
- kind = "blank"
- src.setMedia(
- [
- "{},start={},end={},fps={}.movieproc".format(
- kind,
- range_to_read.start_time.value,
- range_to_read.end_time_inclusive().value,
- range_to_read.duration.rate
- )
- ]
- )
-
- return src
-
-
-if __name__ == "__main__":
- main()
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/fcpx_xml.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/fcpx_xml.py
deleted file mode 100644
index e219b58a1a..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/fcpx_xml.py
+++ /dev/null
@@ -1,1182 +0,0 @@
-#
-# Copyright 2018 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""OpenTimelineIO Final Cut Pro X XML Adapter. """
-import os
-import subprocess
-from xml.etree import cElementTree
-from xml.dom import minidom
-from fractions import Fraction
-from datetime import date
-
-try:
- from urllib import unquote
-except ImportError:
- from urllib.parse import unquote
-
-import opentimelineio as otio
-
-META_NAMESPACE = "fcpx_xml"
-
-COMPOSABLE_ELEMENTS = ("video", "audio", "ref-clip", "asset-clip")
-
-FRAMERATE_FRAMEDURATION = {23.98: "1001/24000s",
- 24: "25/600s",
- 25: "1/25s",
- 29.97: "1001/30000s",
- 30: "100/3000s",
- 50: "1/50s",
- 59.94: "1001/60000s",
- 60: "1/60s"}
-
-
-def format_name(frame_rate, path):
- """
- Helper to get the formatName used in FCP X XML format elements. This
- uses ffprobe to get the frame size of the the clip at the provided path.
-
- Args:
- frame_rate (int): The frame rate of the clip at the provided path
- path (str): The path to the clip to probe
-
- Returns:
- str: The format name. If empty, then ffprobe couldn't find the item
- """
-
- path = path.replace("file://", "")
- path = unquote(path)
- if not os.path.exists(path):
- return ""
-
- try:
- frame_size = subprocess.check_output(
- [
- "ffprobe",
- "-v",
- "error",
- "-select_streams",
- "v:0",
- "-show_entries",
- "stream=height,width",
- "-of",
- "csv=s=x:p=0",
- path
- ]
- )
- except (subprocess.CalledProcessError, OSError):
- frame_size = ""
-
- if not frame_size:
- return ""
-
- frame_size = frame_size.rstrip()
-
- if "1920" in frame_size:
- frame_size = "1080"
-
- if frame_size.endswith("1280"):
- frame_size = "720"
-
- return "FFVideoFormat{}p{}".format(frame_size, frame_rate)
-
-
-def to_rational_time(rational_number, fps):
- """
- This converts a rational number value to an otio RationalTime object
-
- Args:
- rational_number (str): This is a rational number from an FCP X XML
- fps (int): The frame rate to use for calculating the rational time
-
- Returns:
- RationalTime: A RationalTime object
- """
-
- if rational_number == "0s" or rational_number is None:
- frames = 0
- else:
- parts = rational_number.split("/")
- if len(parts) > 1:
- frames = int(
- float(parts[0]) / float(parts[1].replace("s", "")) * float(fps)
- )
- else:
- frames = int(float(parts[0].replace("s", "")) * float(fps))
-
- return otio.opentime.RationalTime(frames, int(fps))
-
-
-def from_rational_time(rational_time):
- """
- This converts a RationalTime object to a rational number as a string
-
- Args:
- rational_time (RationalTime): a rational time object
-
- Returns:
- str: A rational number as a string
- """
-
- if int(rational_time.value) == 0:
- return "0s"
- result = Fraction(
- float(rational_time.value) / float(rational_time.rate)
- ).limit_denominator()
- if str(result.denominator) == "1":
- return "{}s".format(result.numerator)
- return "{}/{}s".format(result.numerator, result.denominator)
-
-
-class FcpxOtio(object):
- """
- This object is responsible for knowing how to convert an otio into an
- FCP X XML
- """
-
- def __init__(self, otio_timeline):
- self.otio_timeline = otio_timeline
- self.fcpx_xml = cElementTree.Element("fcpxml", version="1.8")
- self.resource_element = cElementTree.SubElement(
- self.fcpx_xml,
- "resources"
- )
- if self.otio_timeline.schema_name() == "Timeline":
- self.timelines = [self.otio_timeline]
- else:
- self.timelines = list(
- self.otio_timeline.each_child(
- descended_from_type=otio.schema.Timeline
- )
- )
-
- if len(self.timelines) > 1:
- self.event_resource = cElementTree.SubElement(
- self.fcpx_xml,
- "event",
- {"name": self._event_name()}
- )
- else:
- self.event_resource = self.fcpx_xml
-
- self.resource_count = 0
-
- def to_xml(self):
- """
- Convert an otio to an FCP X XML
-
- Returns:
- str: FCPX XML content
- """
-
- for project in self.timelines:
- top_sequence = self._stack_to_sequence(project.tracks)
-
- project_element = cElementTree.Element(
- "project",
- {
- "name": project.name,
- "uid": project.metadata.get("fcpx", {}).get("uid", "")
- }
- )
- project_element.append(top_sequence)
- self.event_resource.append(project_element)
-
- if not self.timelines:
- for clip in self._clips():
- if not clip.parent():
- self._add_asset(clip)
-
- for stack in self._stacks():
- ref_element = self._element_for_item(
- stack,
- None,
- ref_only=True,
- compound=True
- )
- self.event_resource.append(ref_element)
- child_parent_map = {c: p for p in self.fcpx_xml.iter() for c in p}
-
- for marker in [marker for marker in self.fcpx_xml.iter("marker")]:
- parent = child_parent_map.get(marker)
- marker_attribs = marker.attrib.copy()
- parent.remove(marker)
- cElementTree.SubElement(
- parent,
- "marker",
- marker_attribs
- )
-
- xml = cElementTree.tostring(
- self.fcpx_xml,
- encoding="UTF-8",
- method="xml"
- )
- dom = minidom.parseString(xml)
- pretty = dom.toprettyxml(indent=" ")
- return pretty.replace(
- '',
- '\n\n'
- )
-
- def _stack_to_sequence(self, stack, compound_clip=False):
- format_element = self._find_or_create_format_from(stack)
- sequence_element = cElementTree.Element(
- "sequence",
- {
- "duration": self._calculate_rational_number(
- stack.duration().value,
- stack.duration().rate
- ),
- "format": str(format_element.get("id"))
- }
- )
- spine = cElementTree.SubElement(sequence_element, "spine")
- video_tracks = [
- t for t in stack
- if t.kind == otio.schema.TrackKind.Video
- ]
- audio_tracks = [
- t for t in stack
- if t.kind == otio.schema.TrackKind.Audio
- ]
-
- for idx, track in enumerate(video_tracks):
- self._track_for_spine(track, idx, spine, compound_clip)
-
- for idx, track in enumerate(audio_tracks):
- lane_id = -(idx + 1)
- self._track_for_spine(track, lane_id, spine, compound_clip)
- return sequence_element
-
- def _track_for_spine(self, track, lane_id, spine, compound):
- for child in self._lanable_items(track.each_child()):
- if self._item_in_compound_clip(child) and not compound:
- continue
- child_element = self._element_for_item(
- child,
- lane_id,
- compound=compound
- )
- if not lane_id:
- spine.append(child_element)
- continue
- if child.schema_name() == "Gap":
- continue
-
- parent_element = self._find_parent_element(
- spine,
- track.trimmed_range_of_child(child).start_time,
- self._find_or_create_format_from(track).get("id")
- )
- offset = self._offset_based_on_parent(
- child_element,
- parent_element,
- self._find_or_create_format_from(track).get("id")
- )
- child_element.set(
- "offset",
- from_rational_time(offset)
- )
-
- parent_element.append(child_element)
- return []
-
- def _find_parent_element(self, spine, trimmed_range, format_id):
- for item in spine.iter():
- if item.tag not in ("clip", "asset-clip", "gap", "ref-clip"):
- continue
- if item.get("lane") is not None:
- continue
- if item.tag == "gap" and item.find("./audio") is not None:
- continue
- offset = to_rational_time(
- item.get("offset"),
- self._frame_rate_from_element(item, format_id)
- )
- duration = to_rational_time(
- item.get("duration"),
- self._frame_rate_from_element(item, format_id)
- )
- total_time = offset + duration
- if offset > trimmed_range:
- continue
- if total_time > trimmed_range:
- return item
- return None
-
- def _offset_based_on_parent(self, child, parent, default_format_id):
- parent_offset = to_rational_time(
- parent.get("offset"),
- self._frame_rate_from_element(parent, default_format_id)
- )
- child_offset = to_rational_time(
- child.get("offset"),
- self._frame_rate_from_element(child, default_format_id)
- )
-
- parent_start = to_rational_time(
- parent.get("start"),
- self._frame_rate_from_element(parent, default_format_id)
- )
- return (child_offset - parent_offset) + parent_start
-
- def _frame_rate_from_element(self, element, default_format_id):
- if element.tag == "gap":
- format_id = default_format_id
-
- if element.tag == "ref-clip":
- media_element = self._media_by_id(element.get("ref"))
- asset = media_element.find("./sequence")
- format_id = asset.get("format")
-
- if element.tag == "clip":
- if element.find("./gap") is not None:
- asset_id = element.find("./gap").find("./audio").get("ref")
- else:
- asset_id = element.find("./video").get("ref")
- asset = self._asset_by_id(asset_id)
- format_id = asset.get("format")
-
- if element.tag == "asset-clip":
- asset = self._asset_by_id(element.get("ref"))
- format_id = asset.get("format")
-
- format_element = self.resource_element.find(
- "./format[@id='{}']".format(format_id)
- )
- total, rate = format_element.get("frameDuration").split("/")
- rate = rate.replace("s", "")
- return int(float(rate) / float(total))
-
- def _element_for_item(self, item, lane, ref_only=False, compound=False):
- element = None
- duration = self._calculate_rational_number(
- item.duration().value,
- item.duration().rate
- )
- if item.schema_name() == "Clip":
- asset_id = self._add_asset(item, compound_only=compound)
- element = self._element_for_clip(item, asset_id, duration, lane)
-
- if item.schema_name() == "Gap":
- element = self._element_for_gap(item, duration)
-
- if item.schema_name() == "Stack":
- element = self._element_for_stack(item, duration, ref_only)
-
- if element is None:
- return None
- if lane:
- element.set("lane", str(lane))
- for marker in item.markers:
- marker_attribs = {
- "start": from_rational_time(marker.marked_range.start_time),
- "duration": from_rational_time(marker.marked_range.duration),
- "value": marker.name
- }
- marker_element = cElementTree.Element(
- "marker",
- marker_attribs
- )
- if marker.color == otio.schema.MarkerColor.RED:
- marker_element.set("completed", "0")
- if marker.color == otio.schema.MarkerColor.GREEN:
- marker_element.set("completed", "1")
- element.append(marker_element)
- return element
-
- def _lanable_items(self, items):
- return [
- item for item in items
- if item.schema_name() in ["Gap", "Stack", "Clip"]
- ]
-
- def _element_for_clip(self, item, asset_id, duration, lane):
- element = cElementTree.Element(
- "clip",
- {
- "name": item.name,
- "offset": from_rational_time(
- item.trimmed_range_in_parent().start_time
- ),
- "duration": duration
- }
- )
- start = from_rational_time(item.source_range.start_time)
- if start != "0s":
- element.set("start", str(start))
- if item.parent().kind == otio.schema.TrackKind.Video:
- cElementTree.SubElement(
- element,
- "video",
- {
- "offset": "0s",
- "ref": asset_id,
- "duration": self._find_asset_duration(item)
- }
- )
- else:
- gap_element = cElementTree.SubElement(
- element,
- "gap",
- {
- "name": "Gap",
- "offset": "0s",
- "duration": self._find_asset_duration(item)
- }
- )
- audio = cElementTree.SubElement(
- gap_element,
- "audio",
- {
- "offset": "0s",
- "ref": asset_id,
- "duration": self._find_asset_duration(item)
- }
- )
- if lane:
- audio.set("lane", str(lane))
- return element
-
- def _element_for_gap(self, item, duration):
- element = cElementTree.Element(
- "gap",
- {
- "name": "Gap",
- "duration": duration,
- "offset": from_rational_time(
- item.trimmed_range_in_parent().start_time
- ),
- "start": "3600s"
- }
- )
- return element
-
- def _element_for_stack(self, item, duration, ref_only):
- media_element = self._add_compound_clip(item)
- asset_id = media_element.get("id")
- element = cElementTree.Element(
- "ref-clip",
- {
- "name": item.name,
- "duration": duration,
- "ref": str(asset_id)
- }
- )
- if not ref_only:
- element.set(
- "offset",
- from_rational_time(
- item.trimmed_range_in_parent().start_time
- )
- )
- element.set(
- "start",
- from_rational_time(item.source_range.start_time)
- )
- if item.parent() and item.parent().kind == otio.schema.TrackKind.Audio:
- element.set("srcEnable", "audio")
- return element
-
- def _find_asset_duration(self, item):
- if (item.media_reference and
- not item.media_reference.is_missing_reference):
- return self._calculate_rational_number(
- item.media_reference.available_range.duration.value,
- item.media_reference.available_range.duration.rate
- )
- return self._calculate_rational_number(
- item.duration().value,
- item.duration().rate
- )
-
- def _find_asset_start(self, item):
- if (item.media_reference and
- not item.media_reference.is_missing_reference):
- return self._calculate_rational_number(
- item.media_reference.available_range.start_time.value,
- item.media_reference.available_range.start_time.rate
- )
- return self._calculate_rational_number(
- item.source_range.start_time.value,
- item.source_range.start_time.rate
- )
-
- def _clip_format_name(self, clip):
- if clip.schema_name() in ("Stack", "Track"):
- return ""
- if not clip.media_reference:
- return ""
-
- if clip.media_reference.is_missing_reference:
- return ""
-
- return format_name(
- clip.duration().rate,
- clip.media_reference.target_url
- )
-
- def _find_or_create_format_from(self, clip):
- frame_duration = self._framerate_to_frame_duration(
- clip.duration().rate
- )
- format_element = self._format_by_frame_rate(clip.duration().rate)
- if format_element is None:
- format_element = cElementTree.SubElement(
- self.resource_element,
- "format",
- {
- "id": self._resource_id_generator(),
- "frameDuration": frame_duration,
- "name": self._clip_format_name(clip)
- }
- )
- if format_element.get("name", "") == "":
- format_element.set("name", self._clip_format_name(clip))
- return format_element
-
- def _add_asset(self, clip, compound_only=False):
- format_element = self._find_or_create_format_from(clip)
- asset = self._create_asset_element(clip, format_element)
-
- if not compound_only and not self._asset_clip_by_name(clip.name):
- self._create_asset_clip_element(
- clip,
- format_element,
- asset.get("id")
- )
-
- if not clip.parent():
- asset.set("hasAudio", "1")
- asset.set("hasVideo", "1")
- return asset.get("id")
- if clip.parent().kind == otio.schema.TrackKind.Audio:
- asset.set("hasAudio", "1")
- if clip.parent().kind == otio.schema.TrackKind.Video:
- asset.set("hasVideo", "1")
- return asset.get("id")
-
- def _create_asset_clip_element(self, clip, format_element, resource_id):
- duration = self._find_asset_duration(clip)
- a_clip = cElementTree.SubElement(
- self.event_resource,
- "asset-clip",
- {
- "name": clip.name,
- "format": format_element.get("id"),
- "ref": resource_id,
- "duration": duration
- }
- )
- if clip.media_reference and not clip.media_reference.is_missing_reference:
- fcpx_metadata = clip.media_reference.metadata.get("fcpx", {})
- note_element = self._create_note_element(
- fcpx_metadata.get("note", None)
- )
- keyword_elements = self._create_keyword_elements(
- fcpx_metadata.get("keywords", [])
- )
- metadata_element = self._create_metadata_elements(
- fcpx_metadata.get("metadata", None)
- )
-
- if note_element is not None:
- a_clip.append(note_element)
- if keyword_elements:
- for keyword_element in keyword_elements:
- a_clip.append(keyword_element)
- if metadata_element is not None:
- a_clip.append(metadata_element)
-
- def _create_asset_element(self, clip, format_element):
- target_url = self._target_url_from_clip(clip)
- asset = self._asset_by_path(target_url)
- if asset is not None:
- return asset
-
- asset = cElementTree.SubElement(
- self.resource_element,
- "asset",
- {
- "name": clip.name,
- "src": target_url,
- "format": format_element.get("id"),
- "id": self._resource_id_generator(),
- "duration": self._find_asset_duration(clip),
- "start": self._find_asset_start(clip),
- "hasAudio": "0",
- "hasVideo": "0"
- }
- )
- return asset
-
- def _add_compound_clip(self, item):
- media_element = self._media_by_name(item.name)
- if media_element is not None:
- return media_element
- resource_id = self._resource_id_generator()
- media_element = cElementTree.SubElement(
- self.resource_element,
- "media",
- {
- "name": self._compound_clip_name(item, resource_id),
- "id": resource_id
- }
- )
- if item.metadata.get("fcpx", {}).get("uid", False):
- media_element.set("uid", item.metadata.get("fcpx", {}).get("uid"))
- media_element.append(self._stack_to_sequence(item, compound_clip=True))
- return media_element
-
- def _stacks(self):
- return self.otio_timeline.each_child(
- descended_from_type=otio.schema.Stack
- )
-
- def _clips(self):
- return self.otio_timeline.each_child(
- descended_from_type=otio.schema.Clip
- )
-
- def _resource_id_generator(self):
- self.resource_count += 1
- return "r{}".format(self.resource_count)
-
- def _event_name(self):
- if self.otio_timeline.name:
- return self.otio_timeline.name
- return date.strftime(date.today(), "%m-%e-%y")
-
- def _asset_by_path(self, path):
- return self.resource_element.find("./asset[@src='{}']".format(path))
-
- def _asset_by_id(self, asset_id):
- return self.resource_element.find("./asset[@id='{}']".format(asset_id))
-
- def _media_by_name(self, name):
- return self.resource_element.find("./media[@name='{}']".format(name))
-
- def _media_by_id(self, media_id):
- return self.resource_element.find("./media[@id='{}']".format(media_id))
-
- def _format_by_frame_rate(self, frame_rate):
- frame_duration = self._framerate_to_frame_duration(frame_rate)
- return self.resource_element.find(
- "./format[@frameDuration='{}']".format(frame_duration)
- )
-
- def _asset_clip_by_name(self, name):
- return self.event_resource.find(
- "./asset-clip[@name='{}']".format(name)
- )
-
- # --------------------
- # static methods
- # --------------------
-
- @staticmethod
- def _framerate_to_frame_duration(framerate):
- frame_duration = FRAMERATE_FRAMEDURATION.get(int(framerate), "")
- if not frame_duration:
- frame_duration = FRAMERATE_FRAMEDURATION.get(float(framerate), "")
- return frame_duration
-
- @staticmethod
- def _target_url_from_clip(clip):
- if (clip.media_reference and
- not clip.media_reference.is_missing_reference):
- return clip.media_reference.target_url
- return "file:///tmp/{}".format(clip.name)
-
- @staticmethod
- def _calculate_rational_number(duration, rate):
- if int(duration) == 0:
- return "0s"
- result = Fraction(float(duration) / float(rate)).limit_denominator()
- return "{}/{}s".format(result.numerator, result.denominator)
-
- @staticmethod
- def _compound_clip_name(compound_clip, resource_id):
- if compound_clip.name:
- return compound_clip.name
- return "compound_clip_{}".format(resource_id)
-
- @staticmethod
- def _item_in_compound_clip(item):
- stack_count = 0
- parent = item.parent()
- while parent is not None:
- if parent.schema_name() == "Stack":
- stack_count += 1
- parent = parent.parent()
- return stack_count > 1
-
- @staticmethod
- def _create_metadata_elements(metadata):
- if metadata is None:
- return None
- metadata_element = cElementTree.Element(
- "metadata"
- )
- for metadata_dict in metadata:
- cElementTree.SubElement(
- metadata_element,
- "md",
- {
- "key": list(metadata_dict.keys())[0],
- "value": list(metadata_dict.values())[0]
- }
- )
- return metadata_element
-
- @staticmethod
- def _create_keyword_elements(keywords):
- keyword_elements = []
- for keyword_dict in keywords:
- keyword_elements.append(
- cElementTree.Element(
- "keyword",
- keyword_dict
- )
- )
- return keyword_elements
-
- @staticmethod
- def _create_note_element(note):
- if not note:
- return None
- note_element = cElementTree.Element(
- "note"
- )
- note_element.text = note
- return note_element
-
-
-class FcpxXml(object):
- """
- This object is responsible for knowing how to convert an FCP X XML
- otio into an otio timeline
- """
-
- def __init__(self, xml_string):
- self.fcpx_xml = cElementTree.fromstring(xml_string)
- self.child_parent_map = {c: p for p in self.fcpx_xml.iter() for c in p}
-
- def to_otio(self):
- """
- Convert an FCP X XML to an otio
-
- Returns:
- OpenTimeline: An OpenTimeline Timeline object
- """
-
- if self.fcpx_xml.find("./library") is not None:
- return self._from_library()
- if self.fcpx_xml.find("./event") is not None:
- return self._from_event(self.fcpx_xml.find("./event"))
- if self.fcpx_xml.find("./project") is not None:
- return self._from_project(self.fcpx_xml.find("./project"))
- if ((self.fcpx_xml.find("./asset-clip") is not None) or
- (self.fcpx_xml.find("./ref-clip") is not None)):
- return self._from_clips()
-
- def _from_library(self):
- # We are just grabbing the first even in the project for now
- return self._from_event(self.fcpx_xml.find("./library/event"))
-
- def _from_event(self, event_element):
- container = otio.schema.SerializableCollection(
- name=event_element.get("name")
- )
- for project in event_element.findall("./project"):
- container.append(self._from_project(project))
- return container
-
- def _from_project(self, project_element):
- timeline = otio.schema.Timeline(name=project_element.get("name", ""))
- timeline.tracks = self._squence_to_stack(
- project_element.find("./sequence", {})
- )
- return timeline
-
- def _from_clips(self):
- container = otio.schema.SerializableCollection()
- if self.fcpx_xml.find("./asset-clip") is not None:
- for asset_clip in self.fcpx_xml.findall("./asset-clip"):
- container.append(
- self._build_composable(
- asset_clip,
- asset_clip.get("format")
- )
- )
-
- if self.fcpx_xml.find("./ref-clip") is not None:
- for ref_clip in self.fcpx_xml.findall("./ref-clip"):
- container.append(
- self._build_composable(
- ref_clip,
- "r1"
- )
- )
- return container
-
- def _squence_to_stack(self, sequence_element, name="", source_range=None):
- timeline_items = []
- lanes = []
- stack = otio.schema.Stack(name=name, source_range=source_range)
- for element in sequence_element.iter():
- if element.tag not in COMPOSABLE_ELEMENTS:
- continue
- composable = self._build_composable(
- element,
- sequence_element.get("format")
- )
-
- offset, lane = self._offset_and_lane(
- element,
- sequence_element.get("format")
- )
-
- timeline_items.append(
- {
- "track": lane,
- "offset": offset,
- "composable": composable,
- "audio_only": self._audio_only(element)
- }
- )
-
- lanes.append(lane)
- sorted_lanes = list(set(lanes))
- sorted_lanes.sort()
- for lane in sorted_lanes:
- sorted_items = self._sorted_items(lane, timeline_items)
- track = otio.schema.Track(
- name=lane,
- kind=self._track_type(sorted_items)
- )
-
- for item in sorted_items:
- frame_diff = (
- int(item["offset"].value) - track.duration().value
- )
- if frame_diff > 0:
- track.append(
- self._create_gap(
- 0,
- frame_diff,
- sequence_element.get("format")
- )
- )
- track.append(item["composable"])
- stack.append(track)
- return stack
-
- def _build_composable(self, element, default_format):
- timing_clip = self._timing_clip(element)
- source_range = self._time_range(
- timing_clip,
- self._format_id_for_clip(element, default_format)
- )
-
- if element.tag != "ref-clip":
- otio_composable = otio.schema.Clip(
- name=timing_clip.get("name"),
- media_reference=self._reference_from_id(
- element.get("ref"),
- default_format
- ),
- source_range=source_range
- )
- else:
- media_element = self._compound_clip_by_id(element.get("ref"))
- otio_composable = self._squence_to_stack(
- media_element.find("./sequence"),
- name=media_element.get("name"),
- source_range=source_range
- )
-
- for marker in timing_clip.findall(".//marker"):
- otio_composable.markers.append(
- self._marker(marker, default_format)
- )
-
- return otio_composable
-
- def _marker(self, element, default_format):
- if element.get("completed", None) and element.get("completed") == "1":
- color = otio.schema.MarkerColor.GREEN
- if element.get("completed", None) and element.get("completed") == "0":
- color = otio.schema.MarkerColor.RED
- if not element.get("completed", None):
- color = otio.schema.MarkerColor.PURPLE
-
- otio_marker = otio.schema.Marker(
- name=element.get("value", ""),
- marked_range=self._time_range(element, default_format),
- color=color
- )
- return otio_marker
-
- def _audio_only(self, element):
- if element.tag == "audio":
- return True
- if element.tag == "asset-clip":
- asset = self._asset_by_id(element.get("ref", None))
- if asset and asset.get("hasVideo", "0") == "0":
- return True
- if element.tag == "ref-clip":
- if element.get("srcEnable", "video") == "audio":
- return True
- return False
-
- def _create_gap(self, start_frame, number_of_frames, defualt_format):
- fps = self._format_frame_rate(defualt_format)
- source_range = otio.opentime.TimeRange(
- start_time=otio.opentime.RationalTime(start_frame, fps),
- duration=otio.opentime.RationalTime(number_of_frames, fps)
- )
- return otio.schema.Gap(source_range=source_range)
-
- def _timing_clip(self, clip):
- while clip.tag not in ("clip", "asset-clip", "ref-clip"):
- clip = self.child_parent_map.get(clip)
- return clip
-
- def _offset_and_lane(self, clip, default_format):
- clip_format_id = self._format_id_for_clip(clip, default_format)
- clip = self._timing_clip(clip)
- parent = self.child_parent_map.get(clip)
-
- parent_format_id = self._format_id_for_clip(parent, default_format)
-
- if parent.tag == "spine" and parent.get("lane", None):
- lane = parent.get("lane")
- parent = self.child_parent_map.get(parent)
- spine = True
- else:
- lane = clip.get("lane", "0")
- spine = False
-
- clip_offset_frames = self._number_of_frames(
- clip.get("offset"),
- clip_format_id
- )
-
- if spine:
- parent_start_frames = 0
- else:
- parent_start_frames = self._number_of_frames(
- parent.get("start", None),
- parent_format_id
- )
-
- parent_offset_frames = self._number_of_frames(
- parent.get("offset", None),
- parent_format_id
- )
-
- clip_offset_frames = (
- (int(clip_offset_frames) - int(parent_start_frames)) +
- int(parent_offset_frames)
- )
-
- offset = otio.opentime.RationalTime(
- clip_offset_frames,
- self._format_frame_rate(clip_format_id)
- )
-
- return offset, lane
-
- def _format_id_for_clip(self, clip, default_format):
- if not clip.get("ref", None) or clip.tag == "gap":
- return default_format
-
- resource = self._asset_by_id(clip.get("ref"))
-
- if resource is None:
- resource = self._compound_clip_by_id(
- clip.get("ref")
- ).find("sequence")
-
- return resource.get("format", default_format)
-
- def _reference_from_id(self, asset_id, default_format):
- asset = self._asset_by_id(asset_id)
- if not asset.get("src", ""):
- return otio.schema.MissingReference()
-
- available_range = otio.opentime.TimeRange(
- start_time=to_rational_time(
- asset.get("start"),
- self._format_frame_rate(
- asset.get("format", default_format)
- )
- ),
- duration=to_rational_time(
- asset.get("duration"),
- self._format_frame_rate(
- asset.get("format", default_format)
- )
- )
- )
- asset_clip = self._assetclip_by_ref(asset_id)
- metadata = {}
- if asset_clip:
- metadata = self._create_metadta(asset_clip)
- return otio.schema.ExternalReference(
- target_url=asset.get("src"),
- available_range=available_range,
- metadata={"fcpx": metadata}
- )
-
- def _create_metadta(self, item):
- metadata = {}
- for element in item.iter():
- if element.tag == "md":
- metadata.setdefault("metadata", []).append(
- {element.attrib.get("key"): element.attrib.get("value")}
- )
- # metadata.update(
- # {element.attrib.get("key"): element.attrib.get("value")}
- # )
- if element.tag == "note":
- metadata.update({"note": element.text})
- if element.tag == "keyword":
- metadata.setdefault("keywords", []).append(element.attrib)
- return metadata
-
- # --------------------
- # time helpers
- # --------------------
- def _format_frame_duration(self, format_id):
- media_format = self._format_by_id(format_id)
- total, rate = media_format.get("frameDuration").split("/")
- rate = rate.replace("s", "")
- return total, rate
-
- def _format_frame_rate(self, format_id):
- fd_total, fd_rate = self._format_frame_duration(format_id)
- return int(float(fd_rate) / float(fd_total))
-
- def _number_of_frames(self, time_value, format_id):
- if time_value == "0s" or time_value is None:
- return 0
- fd_total, fd_rate = self._format_frame_duration(format_id)
- time_value = time_value.split("/")
-
- if len(time_value) > 1:
- time_value_a, time_value_b = time_value
- return int(
- (float(time_value_a) / float(time_value_b.replace("s", ""))) *
- (float(fd_rate) / float(fd_total))
- )
-
- return int(
- int(time_value[0].replace("s", "")) *
- (float(fd_rate) / float(fd_total))
- )
-
- def _time_range(self, element, format_id):
- return otio.opentime.TimeRange(
- start_time=to_rational_time(
- element.get("start", "0s"),
- self._format_frame_rate(format_id)
- ),
- duration=to_rational_time(
- element.get("duration"),
- self._format_frame_rate(format_id)
- )
- )
- # --------------------
- # search helpers
- # --------------------
-
- def _asset_by_id(self, asset_id):
- return self.fcpx_xml.find(
- "./resources/asset[@id='{}']".format(asset_id)
- )
-
- def _assetclip_by_ref(self, asset_id):
- event = self.fcpx_xml.find("./event")
- if event is None:
- return self.fcpx_xml.find("./asset-clip[@ref='{}']".format(asset_id))
- else:
- return event.find("./asset-clip[@ref='{}']".format(asset_id))
-
- def _format_by_id(self, format_id):
- return self.fcpx_xml.find(
- "./resources/format[@id='{}']".format(format_id)
- )
-
- def _compound_clip_by_id(self, compound_id):
- return self.fcpx_xml.find(
- "./resources/media[@id='{}']".format(compound_id)
- )
-
- # --------------------
- # static methods
- # --------------------
- @staticmethod
- def _track_type(lane_items):
- audio_only_items = [l for l in lane_items if l["audio_only"]]
- if len(audio_only_items) == len(lane_items):
- return otio.schema.TrackKind.Audio
- return otio.schema.TrackKind.Video
-
- @staticmethod
- def _sorted_items(lane, otio_objects):
- lane_items = [item for item in otio_objects if item["track"] == lane]
- return sorted(lane_items, key=lambda k: k["offset"])
-
-
-# --------------------
-# adapter requirements
-# --------------------
-def read_from_string(input_str):
- """
- Necessary read method for otio adapter
-
- Args:
- input_str (str): An FCP X XML string
-
- Returns:
- OpenTimeline: An OpenTimeline object
- """
-
- return FcpxXml(input_str).to_otio()
-
-
-def write_to_string(input_otio):
- """
- Necessary write method for otio adapter
-
- Args:
- input_otio (OpenTimeline): An OpenTimeline object
-
- Returns:
- str: The string contents of an FCP X XML
- """
-
- return FcpxOtio(input_otio).to_xml()
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/ffmpeg_burnins.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/ffmpeg_burnins.py
deleted file mode 100644
index 28f0b97f55..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/ffmpeg_burnins.py
+++ /dev/null
@@ -1,424 +0,0 @@
-# MIT License
-#
-# Copyright (c) 2017 Ed Caspersen
-#
-# 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
-# allcopies 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.
-"""
-This module provides an interface to allow users to easily
-build out an FFMPEG command with all the correct filters
-for applying text (with a background) to the rendered media.
-"""
-import os
-import sys
-import json
-from subprocess import Popen, PIPE
-from PIL import ImageFont
-
-
-def _is_windows():
- """
- queries if the current operating system is Windows
-
- :rtype: bool
- """
- return sys.platform.startswith('win') or \
- sys.platform.startswith('cygwin')
-
-
-def _system_font():
- """
- attempts to determine a default system font
-
- :rtype: str
- """
- if _is_windows():
- font_path = os.path.join(os.environ['WINDIR'], 'Fonts')
- fonts = ('arial.ttf', 'calibri.ttf', 'times.ttf')
- elif sys.platform.startswith('darwin'):
- font_path = '/System/Library/Fonts'
- fonts = ('Menlo.ttc',)
- else:
- # assuming linux
- font_path = 'usr/share/fonts/msttcorefonts'
- fonts = ('arial.ttf', 'times.ttf', 'couri.ttf')
-
- system_font = None
- backup = None
- for font in fonts:
- font = os.path.join(font_path, font)
- if os.path.exists(font):
- system_font = font
- break
- else:
- if os.path.exists(font_path):
- for each in os.listdir(font_path):
- ext = os.path.splitext(each)[-1]
- if ext[1:].startswith('tt'):
- system_font = os.path.join(font_path, each)
- return system_font or backup
-
-
-# Default valuues
-FONT = _system_font()
-FONT_SIZE = 16
-FONT_COLOR = 'white'
-BG_COLOR = 'black'
-BG_PADDING = 5
-
-# FFMPEG command strings
-FFMPEG = ('ffmpeg -loglevel panic -i %(input)s '
- '%(filters)s %(args)s%(output)s')
-FFPROBE = ('ffprobe -v quiet -print_format json -show_format '
- '-show_streams %(source)s')
-BOX = 'box=1:boxborderw=%(border)d:boxcolor=%(color)s@%(opacity).1f'
-DRAWTEXT = ("drawtext=text='%(text)s':x=%(x)s:y=%(y)s:fontcolor="
- "%(color)s@%(opacity).1f:fontsize=%(size)d:fontfile='%(font)s'")
-TIMECODE = ("drawtext=timecode='%(text)s':timecode_rate=%(fps).2f"
- ":x=%(x)s:y=%(y)s:fontcolor="
- "%(color)s@%(opacity).1f:fontsize=%(size)d:fontfile='%(font)s'")
-
-
-# Valid aligment parameters.
-TOP_CENTERED = 'top_centered'
-BOTTOM_CENTERED = 'bottom_centered'
-TOP_LEFT = 'top_left'
-BOTTOM_LEFT = 'bottom_left'
-TOP_RIGHT = 'top_right'
-BOTTOM_RIGHT = 'bottom_right'
-
-
-class Options(dict):
- """
- Base options class.
- """
- _params = {
- 'opacity': 1,
- 'x_offset': 0,
- 'y_offset': 0,
- 'font': FONT,
- 'font_size': FONT_SIZE,
- 'bg_color': BG_COLOR,
- 'bg_padding': BG_PADDING,
- 'font_color': FONT_COLOR
- }
-
- def __init__(self, **kwargs):
- super(Options, self).__init__()
- params = self._params.copy()
- params.update(kwargs)
- super(Options, self).update(**params)
-
- def __setitem__(self, key, value):
- if key not in self._params:
- raise KeyError("Not a valid option key '%s'" % key)
- super(Options, self).update({key: value})
-
-
-class FrameNumberOptions(Options):
- """
- :key int frame_offset: offset the frame numbers
- :key float opacity: opacity value (0-1)
- :key str expression: expression that would be used instead of text
- :key bool x_offset: X position offset
- (does not apply to centered alignments)
- :key bool y_offset: Y position offset
- :key str font: path to the font file
- :key int font_size: size to render the font in
- :key str bg_color: background color of the box
- :key int bg_padding: padding between the font and box
- :key str font_color: color to render
- """
-
- def __init__(self, **kwargs):
- self._params.update({
- 'frame_offset': 0,
- 'expression': None
- })
- super(FrameNumberOptions, self).__init__(**kwargs)
-
-
-class TextOptions(Options):
- """
- :key float opacity: opacity value (0-1)
- :key str expression: expression that would be used instead of text
- :key bool x_offset: X position offset
- (does not apply to centered alignments)
- :key bool y_offset: Y position offset
- :key str font: path to the font file
- :key int font_size: size to render the font in
- :key str bg_color: background color of the box
- :key int bg_padding: padding between the font and box
- :key str font_color: color to render
- """
-
-
-class TimeCodeOptions(Options):
- """
- :key int frame_offset: offset the frame numbers
- :key float fps: frame rate to calculate the timecode by
- :key float opacity: opacity value (0-1)
- :key bool x_offset: X position offset
- (does not apply to centered alignments)
- :key bool y_offset: Y position offset
- :key str font: path to the font file
- :key int font_size: size to render the font in
- :key str bg_color: background color of the box
- :key int bg_padding: padding between the font and box
- :key str font_color: color to render
- """
-
- def __init__(self, **kwargs):
- self._params.update({
- 'frame_offset': 0,
- 'fps': 24
- })
- super(TimeCodeOptions, self).__init__(**kwargs)
-
-
-class Burnins(object):
- """
- Class that provides convenience API for building filter
- flags for the FFMPEG command.
- """
-
- def __init__(self, source, streams=None):
- """
- :param str source: source media file
- :param [] streams: ffprobe stream data if parsed as a pre-process
- """
- self.source = source
- self.filters = {
- 'drawtext': []
- }
- self._streams = streams or _streams(self.source)
-
- def __repr__(self):
- return '' % os.path.basename(self.source)
-
- @property
- def start_frame(self):
- """
- :rtype: int
- """
- start_time = float(self._video_stream['start_time'])
- return round(start_time * self.frame_rate)
-
- @property
- def end_frame(self):
- """
- :rtype: int
- """
- end_time = float(self._video_stream['duration'])
- return round(end_time * self.frame_rate)
-
- @property
- def frame_rate(self):
- """
- :rtype: int
- """
- data = self._video_stream
- tokens = data['r_frame_rate'].split('/')
- return int(tokens[0]) / int(tokens[1])
-
- @property
- def _video_stream(self):
- video_stream = None
- for each in self._streams:
- if each.get('codec_type') == 'video':
- video_stream = each
- break
- else:
- raise RuntimeError("Failed to locate video stream "
- "from '%s'" % self.source)
- return video_stream
-
- @property
- def resolution(self):
- """
- :rtype: (int, int)
- """
- data = self._video_stream
- return data['width'], data['height']
-
- @property
- def filter_string(self):
- """
- Generates the filter string that would be applied
- to the `-vf` argument
-
- :rtype: str
- """
- return ','.join(self.filters['drawtext'])
-
- def add_timecode(self, align, options=None):
- """
- Convenience method to create the frame number expression.
-
- :param enum align: alignment, must use provided enum flags
- :param dict options: recommended to use TimeCodeOptions
- """
- options = options or TimeCodeOptions()
- timecode = _frames_to_timecode(options['frame_offset'],
- self.frame_rate)
- options = options.copy()
- if not options.get('fps'):
- options['fps'] = self.frame_rate
- self._add_burnin(timecode.replace(':', r'\:'),
- align,
- options,
- TIMECODE)
-
- def add_frame_numbers(self, align, options=None):
- """
- Convenience method to create the frame number expression.
-
- :param enum align: alignment, must use provided enum flags
- :param dict options: recommended to use FrameNumberOptions
- """
- options = options or FrameNumberOptions()
- options['expression'] = r'%%{eif\:n+%d\:d}' % options['frame_offset']
- text = str(int(self.end_frame + options['frame_offset']))
- self._add_burnin(text, align, options, DRAWTEXT)
-
- def add_text(self, text, align, options=None):
- """
- Adding static text to a filter.
-
- :param str text: text to apply to the drawtext
- :param enum align: alignment, must use provided enum flags
- :param dict options: recommended to use TextOptions
- """
- options = options or TextOptions()
- self._add_burnin(text, align, options, DRAWTEXT)
-
- def _add_burnin(self, text, align, options, draw):
- """
- Generic method for building the filter flags.
-
- :param str text: text to apply to the drawtext
- :param enum align: alignment, must use provided enum flags
- :param dict options:
- """
- resolution = self.resolution
- data = {
- 'text': options.get('expression') or text,
- 'color': options['font_color'],
- 'size': options['font_size']
- }
- data.update(options)
- data.update(_drawtext(align, resolution, text, options))
- if 'font' in data and _is_windows():
- data['font'] = data['font'].replace(os.sep, r'\\' + os.sep)
- data['font'] = data['font'].replace(':', r'\:')
- self.filters['drawtext'].append(draw % data)
-
- if options.get('bg_color') is not None:
- box = BOX % {
- 'border': options['bg_padding'],
- 'color': options['bg_color'],
- 'opacity': options['opacity']
- }
- self.filters['drawtext'][-1] += ':%s' % box
-
- def command(self, output=None, args=None, overwrite=False):
- """
- Generate the entire FFMPEG command.
-
- :param str output: output file
- :param str args: additional FFMPEG arguments
- :param bool overwrite: overwrite the output if it exists
- :returns: completed command
- :rtype: str
- """
- output = output or ''
- if overwrite:
- output = '-y %s' % output
- return (FFMPEG % {
- 'input': self.source,
- 'output': output,
- 'args': '%s ' % args if args else '',
- 'filters': '-vf "%s"' % self.filter_string
- }).strip()
-
- def render(self, output, args=None, overwrite=False):
- """
- Render the media to a specified destination.
-
- :param str output: output file
- :param str args: additional FFMPEG arguments
- :param bool overwrite: overwrite the output if it exists
- """
- if not overwrite and os.path.exists(output):
- raise RuntimeError("Destination '%s' exists, please "
- "use overwrite" % output)
- command = self.command(output=output,
- args=args,
- overwrite=overwrite)
- proc = Popen(command, shell=True)
- proc.communicate()
- if proc.returncode != 0:
- raise RuntimeError("Failed to render '%s': %s'"
- % (output, command))
- if not os.path.exists(output):
- raise RuntimeError("Failed to generate '%s'" % output)
-
-
-def _streams(source):
- """
- :param str source: source media file
- :rtype: [{}, ...]
- """
- command = FFPROBE % {'source': source}
- proc = Popen(command, shell=True, stdout=PIPE)
- out = proc.communicate()[0]
- if proc.returncode != 0:
- raise RuntimeError("Failed to run: %s" % command)
- return json.loads(out)['streams']
-
-
-def _drawtext(align, resolution, text, options):
- """
- :rtype: {'x': int, 'y': int}
- """
- x_pos = '0'
- if align in (TOP_CENTERED, BOTTOM_CENTERED):
- x_pos = 'w/2-tw/2'
- elif align in (TOP_RIGHT, BOTTOM_RIGHT):
- ifont = ImageFont.truetype(options['font'],
- options['font_size'])
- box_size = ifont.getsize(text)
- x_pos = resolution[0] - (box_size[0] + options['x_offset'])
- elif align in (TOP_LEFT, BOTTOM_LEFT):
- x_pos = options['x_offset']
-
- if align in (TOP_CENTERED,
- TOP_RIGHT,
- TOP_LEFT):
- y_pos = '%d' % options['y_offset']
- else:
- y_pos = 'h-text_h-%d' % (options['y_offset'])
- return {'x': x_pos, 'y': y_pos}
-
-
-def _frames_to_timecode(frames, framerate):
- return '{0:02d}:{1:02d}:{2:02d}:{3:02d}'.format(
- int(frames / (3600 * framerate)),
- int(frames / (60 * framerate) % 60),
- int(frames / framerate % 60),
- int(frames % framerate))
diff --git a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/hls_playlist.py b/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/hls_playlist.py
deleted file mode 100644
index e0e3f8f872..0000000000
--- a/client/ayon_core/vendor/python/python_2/opentimelineio_contrib/adapters/hls_playlist.py
+++ /dev/null
@@ -1,1781 +0,0 @@
-#
-# Copyright 2017 Pixar Animation Studios
-#
-# Licensed under the Apache License, Version 2.0 (the "Apache License")
-# with the following modification; you may not use this file except in
-# compliance with the Apache License and the following modification to it:
-# Section 6. Trademarks. is deleted and replaced with:
-#
-# 6. Trademarks. This License does not grant permission to use the trade
-# names, trademarks, service marks, or product names of the Licensor
-# and its affiliates, except as required to comply with Section 4(c) of
-# the License and to reproduce the content of the NOTICE file.
-#
-# You may obtain a copy of the Apache License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the Apache License with the above modification is
-# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the Apache License for the specific
-# language governing permissions and limitations under the Apache License.
-#
-
-"""HLS Playlist OpenTimelineIO adapter
-
-This adapter supports authoring of HLS playlists within OpenTimelineIO by using
-clips to represent media fragments.
-
-Status:
- - Export of Media Playlists well supported
- - Export of Master Playlists supported
- - Import of Media Playlists well supported
- - Import of Master Playlists unsupported
- - Explicit Variant Stream controls in Master Playlists unsupported
-
-In general, you can author otio as follows:
- t = otio.schema.Timeline()
- track = otio.schema.Track("v1")
- track.metadata['HLS'] = {
- "EXT-X-INDEPENDENT-SEGMENTS": None,
- "EXT-X-PLAYLIST-TYPE": "VOD"
- }
- t.tracks.append(track)
-
- # Make a prototype media ref with the fragment's initialization metadata
- fragmented_media_ref = otio.schema.ExternalReference(
- target_url='video1.mp4',
- metadata={
- "streaming": {
- "init_byterange": {
- "byte_count": 729,
- "byte_offset": 0
- },
- "init_uri": "media-video-1.mp4"
- }
- }
- )
-
- # Make a copy of the media ref specifying the byte range for the fragment
- media_ref1 = fragmented_media_ref.deepcopy()
- media_ref1.available_range=otio.opentime.TimeRange(
- otio.opentime.RationalTime(0, 1),
- otio.opentime.RationalTime(2.002, 1)
- )
- media_ref1.metadata['streaming'].update(
- {
- "byte_count": 534220,
- "byte_offset": 1361
- }
- )
-
- # make the fragment and append it
- fragment1 = otio.schema.Clip(media_reference=media_ref1)
- track.append(fragment1)
-
- # (repeat to define each fragment)
-
-The code above would yield an HLS playlist like:
- #EXTM3U
- #EXT-X-VERSION:7
- #EXT-X-TARGETDURATION:2
- #EXT-X-PLAYLIST-TYPE:VOD
- #EXT-X-INDEPENDENT-SEGMENTS
- #EXT-X-MEDIA-SEQUENCE:1
- #EXT-X-MAP:BYTERANGE="729@0",URI="media-video-1.mp4"
- #EXTINF:2.00200,
- #EXT-X-BYTERANGE:534220@1361
- video1.mp4
- #EXT-X-ENDLIST
-
-If you add min_segment_duration and max_segment_duration to the timeline's
-metadata dictionary as RationalTime objects, you can control the rule set
-deciding how many fragments to accumulate into a single segment. When nothing
-is specified for these metadata keys, the adapter will create one segment per
-fragment.
-
-In general, any metadata added to the track metadata dict under the HLS
-namespace will be included at the top level of the exported playlist (see
-``EXT-X-INDEPENDENT-SEGMENTS`` and ``EXT-X-PLAYLIST-TYPE`` in the example
-above). Each segment will pass through any metadata in the HLS namespace from
-the media_reference.
-
-If you write a Timeline with more than one track specified, then the adapter
-will create an HLS master playlist.
-
-The following track metadata keys will be used to inform exported master
-playlist metadata per variant stream:
- bandwidth
- codec
- language
- mimeType
- group_id (audio)
- autoselect (audio)
- default (audio)
-These values are translated to EXT-X-STREAM-INF and EXT-X-MEDIA
-attributes as defined in sections 4.3.4.2 and 4.3.4.1 of
-draft-pantos-http-live-streaming, respectively.
-"""
-
-import re
-import copy
-
-import opentimelineio as otio
-
-# TODO: determine output version based on features used
-OUTPUT_PLAYLIST_VERSION = "7"
-
-# TODO: make sure all strings get sanitized through encoding and decoding
-PLAYLIST_STRING_ENCODING = "utf-8"
-
-# Enable isinstance(my_instance, basestring) tests in Python 3
-# This can be phased out when Python 2 support is dropped. Replace tests with:
-# isinstance(my_instance, str)
-
-try:
- basestring
-except NameError:
- basestring = str
-
-"""
-Matches a single key/value pair from an HLS Attribute List.
-See section 4.2 of draft-pantos-http-live-streaming for more detail.
-"""
-ATTRIBUTE_RE = re.compile(
- r'(?P[A-Z0-9-]+)' + r'\=' +
- r'(?P(?:\"[^\r\n"]*\")|[^,]+)' + r',?'
-)
-
-"""
-Matches AttributeValue of the above regex into appropriate data types.
-Note that these are meant to be joined using regex "or" in this order.
-"""
-_ATTRIBUTE_RE_VALUE_STR_LIST = [
- r'(?P(?P[0-9]+)x(?P[0-9]+))\Z',
- r'(?P