├── main ├── .keep ├── license.txt ├── setup.py └── json_fix │ └── __init__.py ├── tests ├── test4_1.json ├── test4_2.json ├── test4_3.json ├── test4_4.json ├── 3.json ├── test1.json ├── test5.json ├── test2.json ├── test6.json ├── 4.py ├── 1.py ├── 5.py ├── 2.py ├── 6.py └── 3.py ├── requirements.txt ├── pyproject.toml ├── run └── publish ├── README.md ├── flake.lock ├── flake.nix ├── .gitignore └── poetry.lock /main/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/test4_1.json: -------------------------------------------------------------------------------- 1 | [99] -------------------------------------------------------------------------------- /tests/test4_2.json: -------------------------------------------------------------------------------- 1 | 99 -------------------------------------------------------------------------------- /tests/test4_3.json: -------------------------------------------------------------------------------- 1 | [99] -------------------------------------------------------------------------------- /tests/test4_4.json: -------------------------------------------------------------------------------- 1 | 99 -------------------------------------------------------------------------------- /tests/3.json: -------------------------------------------------------------------------------- 1 | [1, 2, "a built-in object that is natually json-able"] -------------------------------------------------------------------------------- /tests/test1.json: -------------------------------------------------------------------------------- 1 | [1, 2, "a built-in object that is natually json-able"] -------------------------------------------------------------------------------- /tests/test5.json: -------------------------------------------------------------------------------- 1 | [1, 2, "a built-in object that is natually json-able"] -------------------------------------------------------------------------------- /tests/test2.json: -------------------------------------------------------------------------------- 1 | json.dumps(result) = [1, 2, "a built-in object that is natually json-able"] -------------------------------------------------------------------------------- /tests/test6.json: -------------------------------------------------------------------------------- 1 | json.dumps(result) = [1, 2, "a built-in object that is natually json-able"] -------------------------------------------------------------------------------- /tests/4.py: -------------------------------------------------------------------------------- 1 | import json 2 | import json_fix 3 | 4 | class Test(dict): 5 | def __json__(self): 6 | return 99 7 | 8 | with open("tests/test4_1.json", "w") as f: 9 | json.dump([Test()], f) 10 | 11 | with open("tests/test4_2.json", "w") as f: 12 | json.dump(Test(), f) 13 | 14 | with open("tests/test4_3.json", 'w') as the_file: 15 | the_file.write(str(json.dumps([Test()]))) 16 | 17 | with open("tests/test4_4.json", 'w') as the_file: 18 | the_file.write(str(json.dumps(Test()))) -------------------------------------------------------------------------------- /tests/1.py: -------------------------------------------------------------------------------- 1 | import json 2 | from json import JSONEncoder 3 | from os.path import join 4 | import json_fix 5 | 6 | # same file, or different file 7 | class YOUR_CLASS: 8 | def __json__(self): 9 | # YOUR CUSTOM CODE HERE 10 | # you probably just want to do: 11 | # return self.__dict__ 12 | return "a built-in object that is natually json-able" 13 | 14 | result = [ 1, 2, YOUR_CLASS() ] 15 | with open('tests/test1.json', 'w') as outfile: 16 | json.dump(result, outfile) -------------------------------------------------------------------------------- /tests/5.py: -------------------------------------------------------------------------------- 1 | import json 2 | from json import JSONEncoder 3 | from os.path import join 4 | import json_fix 5 | 6 | # same file, or different file 7 | class YOUR_CLASS(dict): 8 | def __json__(self): 9 | # YOUR CUSTOM CODE HERE 10 | # you probably just want to do: 11 | # return self.__dict__ 12 | return "a built-in object that is natually json-able" 13 | 14 | result = [ 1, 2, YOUR_CLASS() ] 15 | with open('tests/test5.json', 'w') as outfile: 16 | json.dump(result, outfile) -------------------------------------------------------------------------------- /tests/2.py: -------------------------------------------------------------------------------- 1 | import json 2 | from json import JSONEncoder 3 | from os.path import join 4 | import json_fix 5 | 6 | # same file, or different file 7 | class YOUR_CLASS: 8 | def __json__(self): 9 | # YOUR CUSTOM CODE HERE 10 | # you probably just want to do: 11 | # return self.__dict__ 12 | return "a built-in object that is natually json-able" 13 | 14 | result = [ 1, 2, YOUR_CLASS() ] 15 | with open("tests/test2.json", 'w') as the_file: 16 | the_file.write(f'''json.dumps(result) = {json.dumps(result)}''') -------------------------------------------------------------------------------- /tests/6.py: -------------------------------------------------------------------------------- 1 | import json 2 | from json import JSONEncoder 3 | from os.path import join 4 | import json_fix 5 | 6 | # same file, or different file 7 | class YOUR_CLASS(dict): 8 | def __json__(self): 9 | # YOUR CUSTOM CODE HERE 10 | # you probably just want to do: 11 | # return self.__dict__ 12 | return "a built-in object that is natually json-able" 13 | 14 | result = [ 1, 2, YOUR_CLASS() ] 15 | with open("tests/test6.json", 'w') as the_file: 16 | the_file.write(f'''json.dumps(result) = {json.dumps(result)}''') -------------------------------------------------------------------------------- /tests/3.py: -------------------------------------------------------------------------------- 1 | import json 2 | from json import JSONEncoder 3 | from os.path import join, dirname 4 | import json_fix 5 | 6 | # same file, or different file 7 | class YOUR_CLASS: 8 | def __json__(self): 9 | # YOUR CUSTOM CODE HERE 10 | # you probably just want to do: 11 | # return self.__dict__ 12 | return "a built-in object that is natually json-able" 13 | 14 | result = [ 1, 2, YOUR_CLASS() ] 15 | __dirname__ = dirname(__file__) 16 | with open(join(__dirname__, '3.json'), 'w') as outfile: 17 | json.dump(result, outfile) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2025.10.5 2 | charset-normalizer==3.4.4 3 | colorama==0.4.6 4 | docutils==0.22.2 5 | file-system-py==0.0.11 6 | idna==3.11 7 | importlib_metadata==8.7.0 8 | jaraco.classes==3.4.0 9 | jaraco.context==6.0.1 10 | jaraco.functools==4.3.0 11 | keyring==25.6.0 12 | keyrings.alt==5.0.2 13 | more-itertools==10.8.0 14 | nh3==0.3.1 15 | pkginfo==1.12.1.2 16 | Pygments==2.19.2 17 | readme_renderer==44.0 18 | requests==2.32.5 19 | requests-toolbelt==1.0.0 20 | rfc3986==2.0.0 21 | setuptools==80.9.0 22 | toml==0.10.2 23 | tqdm==4.67.1 24 | twine==3.4.1 25 | urllib3==2.5.0 26 | zipp==3.23.0 27 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "json_fix" 3 | version = "1.0.2" 4 | description = "allow custom class json behavior on builtin json object" 5 | authors=[] 6 | 7 | [tool.extra] 8 | author='Jeff Hykin' 9 | author_email='jeff.hykin@gmail.com' 10 | url='https://github.com/jeff-hykin/json_fix.git' 11 | license = "MIT" 12 | main_module_path = "main/json_fix" 13 | 14 | [[tool.extra.pure_python_packages]] 15 | path = "main/json_fix" 16 | 17 | [tool.poetry.dependencies] 18 | python = ">=3.7,<3.12" 19 | 20 | [tool.poetry.dev-dependencies] 21 | twine = "3.4.1" 22 | "keyrings.alt" = "4.0.2" 23 | toml = "^0.10.2" 24 | file-system-py = "0.0.11" 25 | 26 | [build-system] 27 | requires = ["poetry-core>=1.0.0"] 28 | build-backend = "poetry.core.masonry.api" 29 | -------------------------------------------------------------------------------- /main/license.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Jeffrey Hykin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /run/publish: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env -S deno run --allow-all --no-lock 2 | import fs from "node:fs" 3 | import * as dax from "https://esm.sh/@jsr/david__dax@0.43.2/mod.ts" // see: https://github.com/dsherret/dax 4 | import * as path from "https://esm.sh/jsr/@std/path@1.1.2" 5 | import { env, aliases, $stdout, $stderr, initHelpers, iterateOver } from "https://esm.sh/gh/jeff-hykin/bash2deno@0.1.0.2/helpers.js" 6 | let { $, appendTo, overwrite, hasCommand, makeScope, settings, exitCodeOfLastChildProcess } = initHelpers({ dax }) 7 | import { FileSystem, glob } from "https://deno.land/x/quickr@0.8.6/main/file_system.js" 8 | 9 | await $`cd ${FileSystem.thisFolder}/../main` 10 | await $`rm -rf ./dist` 11 | await $`python setup.py sdist bdist_wheel` 12 | // [ -d "./dist" ] 13 | if (fs.existsSync(`./dist`) && fs.lstatSync(`./dist`).isDirectory()) { 14 | await $`stty sane 2>/dev/null` 15 | var { code } = await $`twine upload ${await glob(`dist/*`)}` 16 | } 17 | if (code !== 0) { 18 | Deno.exit() 19 | } 20 | import { parse } from "https://deno.land/std@0.224.0/toml/mod.ts" 21 | var text = await Deno.readTextFile(`${FileSystem.thisFolder}/../pyproject.toml`) 22 | var version = parse(text).tool.poetry.version 23 | 24 | // tag it 25 | await $`git tag ${version}` 26 | await $`git push origin ${version}` -------------------------------------------------------------------------------- /main/setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | import toml 3 | from file_system_py import iterate_paths_in 4 | 5 | # 6 | # get the data out of the toml file 7 | # 8 | toml_info = toml.load("../pyproject.toml") 9 | package_info = {**toml_info["tool"]["poetry"], **toml_info["tool"]["extra"]} 10 | 11 | # 12 | # get the data out of the readme file 13 | # 14 | with open("../README.md", "r") as file_handle: 15 | long_description = file_handle.read() 16 | 17 | # 18 | # generate the project 19 | # 20 | setuptools.setup( 21 | name=package_info["name"], 22 | version=package_info["version"], 23 | description=package_info["description"], 24 | url=package_info["url"], 25 | author=package_info["author"], 26 | author_email=package_info["author_email"], 27 | license=package_info["license"], 28 | packages=[package_info["name"]], 29 | # package_data={ 30 | # # include all files/folders in the module (recursively) 31 | # package_info["name"]: [ 32 | # each[len(package_info["name"])+1:] 33 | # for each in iterate_paths_in(package_info["name"], recursively=True) 34 | # ], 35 | # }, 36 | install_requires=[ 37 | # examples: 38 | # 'aiohttp >= 3.7.4', 39 | # 'python-socketio >= 5.3.0', 40 | # 'requests == 2.26.0', 41 | ], 42 | classifiers=[ 43 | # examples: 44 | # 'Development Status :: 5 - Production/Stable', 45 | # 'Intended Audience :: Developers', 46 | # 'Programming Language :: Python', 47 | # "Programming Language :: Python :: 3", 48 | # "Operating System :: OS Independent", 49 | ], 50 | long_description=long_description, 51 | long_description_content_type="text/markdown", 52 | python_requires='>=3.6', 53 | ) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # What is this? 2 | 3 | A pip module that lets you define a `__json__` method, that works like `toJSON` from JavaScript.
4 | (e.g. it magically gets called whenever someone does `json.dumps(your_object)`) 5 | 6 | From a technical perspective, this module is a safe, backwards-compatible, reversable patch to the built-in python `json` object that allows classes to specify how they should be serialized. 7 | 8 | # Why? 9 | 10 | Because sometimes someone else's code (e.g. a pip module) tries to serialize your object, like 11 | ```python 12 | import json 13 | json.dumps(list_containing_your_object) 14 | ``` 15 | And you'd have to fork their code to make it not throw an error. 16 | 17 | # How do I use this tool? 18 | 19 | `pip install json-fix` 20 | 21 | ```python 22 | import json_fix # import this any time (any where) before the JSON.dumps gets called 23 | 24 | # same file, or different file 25 | class YOUR_CLASS: 26 | def __json__(self): 27 | # YOUR CUSTOM CODE HERE 28 | # you probably just want to do: 29 | # return self.__dict__ 30 | return "a built-in object that is natually json-able" 31 | ``` 32 | 33 | # How do I change how imported classes (numpy array, dataframe, etc) are jsonified? 34 | 35 | There's 2 ways; the aggressive `override_table` or the more collaboration-friendly `fallback_table`. Note: some really powerful stuff can be done safely with the fallback table! 36 | 37 | ## Override Table 38 | 39 | **CAUTION!** 40 | - The override table is so powerful it even lets you change how built in objects are serialized. You can screw yourself (infinite loop) if you're using (abusing) the override table to change giant swaths of objects instead of specific classes. 41 | - Even if a class defines a `.__json__()` method, the `json.override_table` will take priority. 42 | - The order of keys matters a lot. The last entry takes the highest priority (this lets us override pip modules even if they try using the override table). 43 | 44 | 45 | The override table is a dictionary. 46 | It has "check functions" as keys, and jsonifiers as values. 47 | 48 | ```python 49 | import json_fix # import this before the JSON.dumps gets called 50 | import json 51 | import pandas as pd 52 | 53 | SomeClassYouDidntDefine = pd.DataFrame 54 | 55 | # create a boolean function for identifying the class 56 | check_func = lambda obj: isinstance(obj, SomeClassYouDidntDefine) 57 | # then assign it to a function that does the converting 58 | json.override_table[check_func] = lambda obj_of_that_class: json.loads(obj_of_that_class.to_json()) 59 | 60 | json.dumps([ 1, 2, SomeClassYouDidntDefine() ], indent=2) # dumps as expected 61 | ``` 62 | 63 | ## Fallback Table 64 | 65 | If you want **all python classes to be jsonable by default**, we can easily do that with the fallback table. The logic is `if nothing in override table, and no .__json__ method, then check the fallback table`. 66 | 67 | ```python 68 | import json_fix # import this before the JSON.dumps gets called 69 | import json 70 | 71 | # a checker for custom objects 72 | checker = lambda obj: hasattr(obj, "__dict__") 73 | # use the __dict__ when they don't specify a __json__ method 74 | json.fallback_table[checker] = lambda obj_with_dict: obj_with_dict.__dict__ 75 | 76 | class SomeClass: 77 | def __init__(self): 78 | self.thing = 10 79 | 80 | json.dumps([ 1, 2, SomeClass() ], indent=2) # dumps as expected 81 | ``` 82 | 83 | Like the override table, the most recently-added checker will have the highest priority. 84 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "inputs": { 5 | "systems": "systems" 6 | }, 7 | "locked": { 8 | "lastModified": 1731533236, 9 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 10 | "owner": "numtide", 11 | "repo": "flake-utils", 12 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 13 | "type": "github" 14 | }, 15 | "original": { 16 | "owner": "numtide", 17 | "repo": "flake-utils", 18 | "type": "github" 19 | } 20 | }, 21 | "home-manager": { 22 | "inputs": { 23 | "nixpkgs": [ 24 | "nixpkgs" 25 | ] 26 | }, 27 | "locked": { 28 | "lastModified": 1758463745, 29 | "narHash": "sha256-uhzsV0Q0I9j2y/rfweWeGif5AWe0MGrgZ/3TjpDYdGA=", 30 | "owner": "nix-community", 31 | "repo": "home-manager", 32 | "rev": "3b955f5f0a942f9f60cdc9cacb7844335d0f21c3", 33 | "type": "github" 34 | }, 35 | "original": { 36 | "owner": "nix-community", 37 | "ref": "release-25.05", 38 | "repo": "home-manager", 39 | "type": "github" 40 | } 41 | }, 42 | "libSource": { 43 | "locked": { 44 | "lastModified": 1753579242, 45 | "narHash": "sha256-zvaMGVn14/Zz8hnp4VWT9xVnhc8vuL3TStRqwk22biA=", 46 | "owner": "divnix", 47 | "repo": "nixpkgs.lib", 48 | "rev": "0f36c44e01a6129be94e3ade315a5883f0228a6e", 49 | "type": "github" 50 | }, 51 | "original": { 52 | "owner": "divnix", 53 | "repo": "nixpkgs.lib", 54 | "type": "github" 55 | } 56 | }, 57 | "nixpkgs": { 58 | "locked": { 59 | "lastModified": 1761016216, 60 | "narHash": "sha256-G/iC4t/9j/52i/nm+0/4ybBmAF4hzR8CNHC75qEhjHo=", 61 | "owner": "NixOS", 62 | "repo": "nixpkgs", 63 | "rev": "481cf557888e05d3128a76f14c76397b7d7cc869", 64 | "type": "github" 65 | }, 66 | "original": { 67 | "owner": "NixOS", 68 | "ref": "nixos-25.05", 69 | "repo": "nixpkgs", 70 | "type": "github" 71 | } 72 | }, 73 | "nixpkgs_2": { 74 | "locked": { 75 | "lastModified": 1753934836, 76 | "narHash": "sha256-G06FmIBj0I5bMW1Q8hAEIl5N7IHMK7+Ta4KA+BmneDA=", 77 | "owner": "NixOS", 78 | "repo": "nixpkgs", 79 | "rev": "8679b16e11becd487b45d568358ddf9d5640d860", 80 | "type": "github" 81 | }, 82 | "original": { 83 | "owner": "NixOS", 84 | "ref": "nixpkgs-unstable", 85 | "repo": "nixpkgs", 86 | "type": "github" 87 | } 88 | }, 89 | "root": { 90 | "inputs": { 91 | "home-manager": "home-manager", 92 | "nixpkgs": "nixpkgs", 93 | "xome": "xome" 94 | } 95 | }, 96 | "systems": { 97 | "locked": { 98 | "lastModified": 1681028828, 99 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 100 | "owner": "nix-systems", 101 | "repo": "default", 102 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 103 | "type": "github" 104 | }, 105 | "original": { 106 | "owner": "nix-systems", 107 | "repo": "default", 108 | "type": "github" 109 | } 110 | }, 111 | "xome": { 112 | "inputs": { 113 | "flake-utils": "flake-utils", 114 | "home-manager": [ 115 | "home-manager" 116 | ], 117 | "libSource": "libSource", 118 | "nixpkgs": "nixpkgs_2" 119 | }, 120 | "locked": { 121 | "lastModified": 1759500230, 122 | "narHash": "sha256-mG01El9iD3N3hK3h3xTxfLzXtQX96klKEwTU5ArmpdU=", 123 | "owner": "jeff-hykin", 124 | "repo": "xome", 125 | "rev": "a118a7caf3f4d0bfd11193ac30f234f5ac80d0dc", 126 | "type": "github" 127 | }, 128 | "original": { 129 | "owner": "jeff-hykin", 130 | "repo": "xome", 131 | "type": "github" 132 | } 133 | } 134 | }, 135 | "root": "root", 136 | "version": 7 137 | } 138 | -------------------------------------------------------------------------------- /main/json_fix/__init__.py: -------------------------------------------------------------------------------- 1 | import json 2 | from json import JSONEncoder 3 | 4 | # 5 | # one-time 6 | # monkey-patch the json dumper 7 | # this makes external calls to `import json` never know the difference 8 | # the object will just auto-serialize 9 | # 10 | 11 | # check to make sure this only runs once 12 | if not hasattr(JSONEncoder, "original_default"): 13 | from collections import OrderedDict 14 | builtin_jsonable = (dict, list, tuple, set, frozenset, str, int, float, bool, type(None)) 15 | builtin_list_like = (list, tuple, set, frozenset) 16 | 17 | json.override_table = OrderedDict() # this allows for adding serializers to classes you didnt define yourself 18 | json.fallback_table = OrderedDict() # this allows for adding generic methods like using str(obj) or obj.__dict__ 19 | 20 | def object_to_jsonable(obj): 21 | # 22 | # first check the override_table 23 | # 24 | for each_checker in reversed(json.override_table.keys()): 25 | type_matches = isinstance(each_checker, type) and isinstance(obj, each_checker) 26 | callable_check_matches = not isinstance(each_checker, type) and callable(each_checker) and each_checker(obj) 27 | if type_matches or callable_check_matches: 28 | custom_converter_function = json.override_table[each_checker] 29 | output = custom_converter_function(obj) 30 | return handle_recursion(output) 31 | 32 | # shortcut for builtins since they're the most common (optimization) 33 | if type(obj) in builtin_jsonable: 34 | return handle_recursion(obj) 35 | 36 | # 37 | # then check the __json__ method 38 | # 39 | if hasattr(obj.__class__, "__json__"): 40 | json_method = getattr(obj.__class__, "__json__") 41 | if callable(json_method): 42 | output = json_method(obj) 43 | return handle_recursion(output) 44 | 45 | # 46 | # then check the fallback_table 47 | # 48 | for each_checker in reversed(json.fallback_table.keys()): 49 | type_matches = isinstance(each_checker, type) and isinstance(obj, each_checker) 50 | callable_check_matches = not isinstance(each_checker, type) and callable(each_checker) and each_checker(obj) 51 | if type_matches or callable_check_matches: 52 | custom_converter_function = json.fallback_table[each_checker] 53 | output = custom_converter_function(obj) 54 | return handle_recursion(output) 55 | 56 | return handle_recursion(obj) 57 | 58 | # for some reason recursion is not normally performed on builtin objects, so this forces it to occur 59 | def handle_recursion(jsonable_value): 60 | if isinstance(jsonable_value, dict): 61 | return { 62 | object_to_jsonable(each_key) : object_to_jsonable(each_value) 63 | for each_key, each_value in jsonable_value.items() 64 | } 65 | elif isinstance(jsonable_value, builtin_list_like): 66 | return [ 67 | object_to_jsonable(each) for each in jsonable_value 68 | ] 69 | else: 70 | return jsonable_value 71 | 72 | JSONEncoder.original_default = original_default = JSONEncoder.default 73 | JSONEncoder.original_encode = original_encode = JSONEncoder.encode 74 | 75 | class PatchedJsonEncoder(json.JSONEncoder): 76 | # transform objects known to JSONEncoder here 77 | def encode(self, obj, *args, **kwargs): 78 | obj = object_to_jsonable(obj) 79 | return original_encode(self, obj, *args, **kwargs) 80 | 81 | # handle objects not known to JSONEncoder here 82 | def default(self, obj, *args, **kwargs): 83 | obj = object_to_jsonable(obj) 84 | if type(obj) in builtin_jsonable: 85 | return obj 86 | return original_default(self, obj, *args, **kwargs) 87 | 88 | # apply the patch 89 | JSONEncoder.default = PatchedJsonEncoder.default 90 | JSONEncoder.encode = PatchedJsonEncoder.encode # needs to be overridden because of https://stackoverflow.com/questions/16405969/how-to-change-json-encoding-behaviour-for-serializable-python-object/16406798#16406798 91 | 92 | original_dump = json.dump 93 | json.dump = lambda obj, *args, **kwargs: original_dump((object_to_jsonable(obj) if isinstance(obj, builtin_jsonable) else obj), *args, **dict({'cls':PatchedJsonEncoder}, **kwargs)) 94 | 95 | def fix_it(): pass # to support the old interface 96 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "json_fix"; 3 | inputs = { 4 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; 5 | home-manager.url = "github:nix-community/home-manager/release-25.05"; 6 | home-manager.inputs.nixpkgs.follows = "nixpkgs"; 7 | xome.url = "github:jeff-hykin/xome"; 8 | xome.inputs.home-manager.follows = "home-manager"; 9 | }; 10 | outputs = { self, nixpkgs, xome, ... }: 11 | xome.superSimpleMakeHome { inherit nixpkgs; pure = true; } ({pkgs, system, ...}: 12 | let 13 | isMacOs = (builtins.match ".*darwin.*" system) != null; 14 | stdenvLibs = (builtins.filter 15 | (eachPkg: eachPkg != null) 16 | [ 17 | pkgs.stdenv.cc.cc 18 | (if !isMacOs then pkgs.glibc else null) 19 | pkgs.zlib 20 | pkgs.freetype 21 | pkgs.libjpeg 22 | pkgs.libpng 23 | ] 24 | ); 25 | in 26 | { 27 | # for home-manager examples, see: https://deepwiki.com/nix-community/home-manager/5-configuration-examples 28 | # all home-manager options: https://nix-community.github.io/home-manager/options.xhtml 29 | home.homeDirectory = "/tmp/virtual_homes/json_fix"; 30 | home.stateVersion = "25.05"; 31 | home.packages = stdenvLibs ++ [ 32 | (pkgs.python3.withPackages (ps: [ 33 | # ps.requests 34 | # ps.numpy 35 | # ps.pymupdf 36 | # sqlite3 is part of stdlib, but python3Full includes CLI too 37 | # (pythonPkgs.buildPythonPackage { 38 | # pname = "kittentts"; 39 | # version = "0.1.0"; 40 | # src = ./subrepos/KittenTTS; 41 | # 42 | # # Optional: if you have pyproject.toml, use `buildPythonPackage` with `pyproject` support 43 | # format = "pyproject"; 44 | # nativeBuildInputs = [ pythonPkgs.setuptools ]; 45 | # }) 46 | ])) 47 | pkgs.python3Packages.venvShellHook 48 | pkgs.sqlite 49 | pkgs.deno 50 | 51 | # vital stuff 52 | pkgs.coreutils-full 53 | pkgs.dash # needed to make "sh" 54 | 55 | # optional stuff (things you probably want) 56 | pkgs.gnugrep 57 | pkgs.findutils 58 | pkgs.wget 59 | pkgs.curl 60 | pkgs.unixtools.locale 61 | pkgs.unixtools.more 62 | pkgs.unixtools.ps 63 | pkgs.unixtools.getopt 64 | pkgs.unixtools.ifconfig 65 | pkgs.unixtools.hostname 66 | pkgs.unixtools.ping 67 | pkgs.unixtools.hexdump 68 | pkgs.unixtools.killall 69 | pkgs.unixtools.mount 70 | pkgs.unixtools.sysctl 71 | pkgs.unixtools.top 72 | pkgs.unixtools.umount 73 | pkgs.git 74 | pkgs.htop 75 | pkgs.ripgrep 76 | ]; 77 | 78 | programs = { 79 | home-manager = { 80 | enable = true; 81 | }; 82 | zsh = { 83 | enable = true; 84 | enableCompletion = true; 85 | autosuggestion.enable = true; 86 | syntaxHighlighting.enable = true; 87 | shellAliases.ll = "ls -la"; 88 | history.size = 100000; 89 | # this is kinda like .zshrc 90 | initContent = '' 91 | # lots of things need "sh" 92 | ln -s "$(which dash)" "$HOME/.local/bin/sh" 2>/dev/null 93 | 94 | # check for .pypirc for publishing to pypi 95 | if [ -f "$XOME_REAL_HOME/.pypirc" ] 96 | then 97 | rm -f "$HOME/.pypirc" 98 | ln -s "$XOME_REAL_HOME/.pypirc" "$HOME/.pypirc" 99 | fi 100 | 101 | setopt interactivecomments 102 | 103 | # 104 | # venv 105 | # 106 | export VENV_DIR=.venv 107 | 108 | # Include libstdc++ and others in linker path 109 | export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath stdenvLibs}:$LD_LIBRARY_PATH" 110 | if [ ! -d "$VENV_DIR" ]; then 111 | python3 -m venv $VENV_DIR 112 | source "$VENV_DIR/bin/activate" 113 | pip install --upgrade pip 114 | # check if file exists 115 | if [ -f "./requirements.txt" ] 116 | then 117 | pip install -r ./requirements.txt 118 | fi 119 | else 120 | source "$VENV_DIR/bin/activate" 121 | fi 122 | 123 | # this enables some impure stuff like sudo, comment it out to get FULL purity 124 | export PATH="$PATH:/usr/bin/" 125 | ''; 126 | }; 127 | # fancy prompt 128 | starship = { 129 | enable = true; 130 | enableZshIntegration = true; 131 | }; 132 | }; 133 | } 134 | ); 135 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # 2 | # Custom 3 | # 4 | dist/ 5 | build/ 6 | 7 | # 8 | # standard 9 | # 10 | **/*.do_not_sync 11 | **/*.do_not_sync.* 12 | **/*.ignore 13 | **/*.ignore.* 14 | **/*.secret 15 | **/*.secret.* 16 | 17 | # 18 | # Linux 19 | # 20 | *~ 21 | 22 | # temporary files which can be created if a process still has a handle open of a deleted file 23 | .fuse_hidden* 24 | 25 | # KDE directory preferences 26 | .directory 27 | 28 | # Linux trash folder which might appear on any partition or disk 29 | .Trash-* 30 | 31 | # .nfs files are created when an open file is removed but is still being accessed 32 | .nfs* 33 | 34 | 35 | # 36 | # MacOS 37 | # 38 | # General 39 | .DS_Store 40 | .AppleDouble 41 | .LSOverride 42 | 43 | # Thumbnails 44 | ._* 45 | 46 | # Files that might appear in the root of a volume 47 | .DocumentRevisions-V100 48 | .fseventsd 49 | .Spotlight-V100 50 | .TemporaryItems 51 | .Trashes 52 | .VolumeIcon.icns 53 | .com.apple.timemachine.donotpresent 54 | 55 | # Directories potentially created on remote AFP share 56 | .AppleDB 57 | .AppleDesktop 58 | Network Trash Folder 59 | Temporary Items 60 | .apdisk 61 | 62 | # 63 | # Windows 64 | # 65 | 66 | # visual studio projects 67 | *.cache/* 68 | **/*.cache/* 69 | \.idea 70 | 71 | # Windows thumbnail cache files 72 | Thumbs.db 73 | Thumbs.db:encryptable 74 | ehthumbs.db 75 | ehthumbs_vista.db 76 | 77 | # Dump file 78 | *.stackdump 79 | 80 | # Folder config file 81 | [Dd]esktop.ini 82 | 83 | # Recycle Bin used on file shares 84 | $RECYCLE.BIN/ 85 | 86 | # Windows Installer files 87 | *.cab 88 | *.msi 89 | *.msix 90 | *.msm 91 | *.msp 92 | 93 | # Windows shortcuts 94 | *.lnk 95 | 96 | # 97 | # VS Code 98 | # 99 | .vscode/* 100 | !.vscode/settings.json 101 | !.vscode/tasks.json 102 | !.vscode/launch.json 103 | !.vscode/extensions.json 104 | 105 | # 106 | # Vim 107 | # 108 | 109 | # Swap 110 | [._]*.s[a-v][a-z] 111 | [._]*.sw[a-p] 112 | [._]s[a-rt-v][a-z] 113 | [._]ss[a-gi-z] 114 | [._]sw[a-p] 115 | 116 | # Session 117 | Session.vim 118 | Sessionx.vim 119 | 120 | # Temporary 121 | .netrwhist 122 | *~ 123 | # Auto-generated tag files 124 | tags 125 | # Persistent undo 126 | [._]*.un~ 127 | 128 | # 129 | # Sublime text 130 | # 131 | 132 | # Cache files for Sublime Text 133 | *.tmlanguage.cache 134 | *.tmPreferences.cache 135 | *.stTheme.cache 136 | 137 | # Workspace files are user-specific 138 | *.sublime-workspace 139 | 140 | # Project files should be checked into the repository, unless a significant 141 | # proportion of contributors will probably not be using Sublime Text 142 | # *.sublime-project 143 | 144 | # SFTP configuration file 145 | sftp-config.json 146 | 147 | # Package control specific files 148 | Package Control.last-run 149 | Package Control.ca-list 150 | Package Control.ca-bundle 151 | Package Control.system-ca-bundle 152 | Package Control.cache/ 153 | Package Control.ca-certs/ 154 | Package Control.merged-ca-bundle 155 | Package Control.user-ca-bundle 156 | oscrypto-ca-bundle.crt 157 | bh_unicode_properties.cache 158 | 159 | # Sublime-github package stores a github token in this file 160 | # https://packagecontrol.io/packages/sublime-github 161 | GitHub.sublime-settings 162 | 163 | 164 | # 165 | # X Code 166 | # 167 | 168 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 169 | 170 | ## User settings 171 | xcuserdata/ 172 | 173 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 174 | *.xcscmblueprint 175 | *.xccheckout 176 | 177 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 178 | /build/ 179 | DerivedData/ 180 | *.moved-aside 181 | *.pbxuser 182 | !default.pbxuser 183 | *.mode1v3 184 | !default.mode1v3 185 | *.mode2v3 186 | !default.mode2v3 187 | *.perspectivev3 188 | !default.perspectivev3 189 | 190 | ## Xcode Patch 191 | *.xcodeproj/* 192 | !*.xcodeproj/project.pbxproj 193 | !*.xcodeproj/xcshareddata/ 194 | !*.xcworkspace/contents.xcworkspacedata 195 | /*.gcno 196 | 197 | 198 | # 199 | # Node 200 | # 201 | 202 | # Logs 203 | npm-debug.log* 204 | yarn-debug.log* 205 | yarn-error.log* 206 | lerna-debug.log* 207 | 208 | # Diagnostic reports (https://nodejs.org/api/report.html) 209 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 210 | 211 | # Runtime data 212 | pids 213 | *.pid 214 | *.seed 215 | *.pid.lock 216 | 217 | # Directory for instrumented libs generated by jscoverage/JSCover 218 | lib-cov 219 | 220 | # Coverage directory used by tools like istanbul 221 | coverage 222 | *.lcov 223 | 224 | # nyc test coverage 225 | .nyc_output 226 | 227 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 228 | .grunt 229 | 230 | # Bower dependency directory (https://bower.io/) 231 | bower_components 232 | 233 | # node-waf configuration 234 | .lock-wscript 235 | 236 | # Compiled binary addons (https://nodejs.org/api/addons.html) 237 | /build/Release 238 | 239 | # Dependency directories 240 | node_modules/ 241 | jspm_packages/ 242 | 243 | # TypeScript v1 declaration files 244 | typings/ 245 | 246 | # TypeScript cache 247 | *.tsbuildinfo 248 | 249 | # Optional npm cache directory 250 | .npm 251 | 252 | # Optional eslint cache 253 | .eslintcache 254 | 255 | # Optional REPL history 256 | .node_repl_history 257 | 258 | # Output of 'npm pack' 259 | *.tgz 260 | 261 | # Yarn Integrity file 262 | .yarn-integrity 263 | 264 | # dotenv environment variables file 265 | #.env 266 | #.env.test 267 | 268 | # parcel-bundler cache (https://parceljs.org/) 269 | .cache/* 270 | 271 | # next.js build output 272 | .next 273 | 274 | # nuxt.js build output 275 | .nuxt 276 | 277 | # vuepress build output 278 | .vuepress/dist 279 | 280 | # Serverless directories 281 | .serverless/ 282 | 283 | # FuseBox cache 284 | .fusebox/ 285 | 286 | # DynamoDB Local files 287 | .dynamodb/ 288 | 289 | # 290 | # Python 291 | # 292 | # Byte-compiled / optimized / DLL files 293 | __pycache__/ 294 | *.py[cod] 295 | *$py.class 296 | 297 | # C extensions 298 | *.so 299 | 300 | # Distribution / packaging 301 | .Python 302 | /build/ 303 | develop-eggs/ 304 | #dist/ 305 | #downloads/ 306 | eggs/ 307 | .eggs/ 308 | lib64/ 309 | /parts/ 310 | sdist/ 311 | var/ 312 | /wheels/ 313 | pip-wheel-metadata/ 314 | share/python-wheels/ 315 | *.egg-info/ 316 | .installed.cfg 317 | *.egg 318 | #MANIFEST 319 | 320 | # PyInstaller 321 | # Usually these files are written by a python script from a template 322 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 323 | #*.manifest 324 | #*.spec 325 | 326 | # Installer logs 327 | pip-log.txt 328 | pip-delete-this-directory.txt 329 | 330 | # Unit test / coverage reports 331 | htmlcov/ 332 | .tox/ 333 | .nox/ 334 | .coverage 335 | .coverage.* 336 | .cache/* 337 | nosetests.xml 338 | coverage.xml 339 | *.cover 340 | .hypothesis/ 341 | .pytest_cache/ 342 | 343 | # Translations 344 | *.mo 345 | *.pot 346 | 347 | # Django stuff: 348 | local_settings.py 349 | db.sqlite3 350 | db.sqlite3-journal 351 | 352 | # Flask stuff: 353 | #instance/ 354 | .webassets-cache 355 | 356 | # Scrapy stuff: 357 | .scrapy 358 | 359 | # Sphinx documentation 360 | docs/_build/ 361 | 362 | # PyBuilder 363 | #target/ 364 | 365 | # Jupyter Notebook 366 | .ipynb_checkpoints 367 | 368 | # IPython 369 | #profile_default/ 370 | ipython_config.py 371 | 372 | # pyenv 373 | #.python-version 374 | 375 | # pipenv 376 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 377 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 378 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 379 | # install all needed dependencies. 380 | #Pipfile.lock 381 | 382 | # celery beat schedule file 383 | celerybeat-schedule 384 | 385 | # SageMath parsed files 386 | *.sage.py 387 | 388 | # Environments 389 | #.env 390 | .venv 391 | #env/ 392 | venv/ 393 | #ENV/ 394 | env.bak/ 395 | venv.bak/ 396 | 397 | # Spyder project settings 398 | .spyderproject 399 | .spyproject 400 | 401 | # Rope project settings 402 | .ropeproject 403 | 404 | # mkdocs documentation 405 | #/site 406 | 407 | # mypy 408 | .mypy_cache/ 409 | .dmypy.json 410 | dmypy.json 411 | 412 | # Pyre type checker 413 | .pyre/ 414 | 415 | # 416 | # Ruby 417 | # 418 | *.gem 419 | .gnupg 420 | .gnupg_pre_2.1 421 | .ipython 422 | .irb_history 423 | .jupyter 424 | .keras 425 | .luarocks 426 | *.rbc 427 | #/.config 428 | /coverage/ 429 | #/InstalledFiles 430 | #/pkg/ 431 | /spec/reports/ 432 | .mongorc.js 433 | #/spec/examples.txt 434 | /test/tmp/ 435 | /test/version_tmp/ 436 | /tmp/ 437 | 438 | # Used by dotenv library to load environment variables. 439 | # .env 440 | 441 | # Ignore Byebug command history file. 442 | .byebug_history 443 | 444 | ## Specific to RubyMotion: 445 | .dat* 446 | .repl_history 447 | /build/ 448 | *.bridgesupport 449 | build-iPhoneOS/ 450 | build-iPhoneSimulator/ 451 | 452 | ## Specific to RubyMotion (use of CocoaPods): 453 | # 454 | # We recommend against adding the Pods directory to your .gitignore. However 455 | # you should judge for yourself, the pros and cons are mentioned at: 456 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 457 | # 458 | # vendor/Pods/ 459 | 460 | ## Documentation cache and generated files: 461 | /.yardoc/ 462 | /_yardoc/ 463 | #/doc/ 464 | #/rdoc/ 465 | 466 | ## Environment normalization: 467 | /.bundle/ 468 | /vendor/bundle 469 | /lib/bundler/man/ 470 | 471 | # for a library or gem 472 | .gnupg 473 | .gnupg_pre_2.1 474 | .ipython 475 | .irb_history 476 | .jupyter 477 | .keras 478 | .luarocks 479 | # intended to run in multiple environments; otherwise, check them in: 480 | # Gemfile.lock 481 | # .ruby-version 482 | # .ruby-gemset 483 | 484 | # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: 485 | .mongorc.js, you might want to ignore these files since the code is 486 | .rvmrc 487 | 488 | # 489 | # Elixr 490 | # 491 | /_build 492 | /cover 493 | #/deps 494 | #/doc 495 | /.fetch 496 | erl_crash.dump 497 | *.ez 498 | *.beam 499 | /config/*.secret.exs 500 | .elixir_ls/ 501 | 502 | # 503 | # CMake 504 | # 505 | CMakeLists.txt.user 506 | CMakeCache.txt 507 | CMakeFiles 508 | CMakeScripts 509 | #Testing 510 | #Makefile 511 | cmake_install.cmake 512 | install_manifest.txt 513 | compile_commands.json 514 | CTestTestfile.cmake 515 | _deps 516 | 517 | # 518 | # C 519 | # 520 | # Prerequisites 521 | *.d 522 | 523 | # Object files 524 | *.o 525 | *.ko 526 | *.obj 527 | *.elf 528 | 529 | # Linker output 530 | *.ilk 531 | *.map 532 | *.exp 533 | 534 | # Precompiled Headers 535 | *.gch 536 | *.pch 537 | 538 | # Libraries 539 | *.lib 540 | *.a 541 | *.la 542 | *.lo 543 | 544 | # Shared objects (inc. Windows DLLs) 545 | *.dll 546 | *.so 547 | *.so.* 548 | *.dylib 549 | 550 | # Executables 551 | *.out 552 | *.i*86 553 | *.x86_64 554 | 555 | # Debug files 556 | *.dSYM/ 557 | *.su 558 | *.idb 559 | *.pdb 560 | 561 | # Kernel Module Compile Results 562 | *.mod* 563 | *.cmd 564 | .tmp_versions/ 565 | modules.order 566 | Module.symvers 567 | Mkfile.old 568 | dkms.conf 569 | 570 | # 571 | # C++ 572 | # 573 | # Prerequisites 574 | *.d 575 | 576 | # Compiled Object files 577 | *.slo 578 | *.lo 579 | *.o 580 | *.obj 581 | 582 | # Precompiled Headers 583 | *.gch 584 | *.pch 585 | 586 | # Compiled Dynamic libraries 587 | *.so 588 | *.dylib 589 | *.dll 590 | 591 | # Fortran module files 592 | *.mod 593 | *.smod 594 | 595 | # Compiled Static libraries 596 | *.lai 597 | *.la 598 | *.a 599 | *.lib 600 | 601 | # Executables 602 | *.out 603 | 604 | # 605 | # home folder files 606 | # 607 | # ignore files in folder foo 608 | settings/.cache/* 609 | # but keep the folder 610 | settings/home/* 611 | !settings/.cache/.keep 612 | !settings/home/.zshrc 613 | !settings/home/.zshenv 614 | settings/home/Library/Caches 615 | # dont remove these next one unless you want passwords to be public 616 | # these are redundant, but kept as a fail-safe 617 | settings/home/Library/Keychains 618 | settings/home/.gnupg 619 | settings/home/.gnupg_pre_2.1 620 | settings/home/.npmrc 621 | settings/home/.vsce 622 | settings/home/.gitconfig 623 | settings/home/.mongorc.js 624 | settings/home/.ungitrc 625 | settings/home/.vuerc -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "bleach" 3 | version = "6.0.0" 4 | description = "An easy safelist-based HTML-sanitizing tool." 5 | category = "dev" 6 | optional = false 7 | python-versions = ">=3.7" 8 | 9 | [package.dependencies] 10 | six = ">=1.9.0" 11 | webencodings = "*" 12 | 13 | [package.extras] 14 | css = ["tinycss2 (>=1.1.0,<1.2)"] 15 | 16 | [[package]] 17 | name = "certifi" 18 | version = "2023.5.7" 19 | description = "Python package for providing Mozilla's CA Bundle." 20 | category = "dev" 21 | optional = false 22 | python-versions = ">=3.6" 23 | 24 | [[package]] 25 | name = "cffi" 26 | version = "1.15.1" 27 | description = "Foreign Function Interface for Python calling C code." 28 | category = "dev" 29 | optional = false 30 | python-versions = "*" 31 | 32 | [package.dependencies] 33 | pycparser = "*" 34 | 35 | [[package]] 36 | name = "charset-normalizer" 37 | version = "3.1.0" 38 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 39 | category = "dev" 40 | optional = false 41 | python-versions = ">=3.7.0" 42 | 43 | [[package]] 44 | name = "colorama" 45 | version = "0.4.6" 46 | description = "Cross-platform colored terminal text." 47 | category = "dev" 48 | optional = false 49 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 50 | 51 | [[package]] 52 | name = "cryptography" 53 | version = "40.0.2" 54 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 55 | category = "dev" 56 | optional = false 57 | python-versions = ">=3.6" 58 | 59 | [package.dependencies] 60 | cffi = ">=1.12" 61 | 62 | [package.extras] 63 | docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] 64 | docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] 65 | pep8test = ["black", "check-manifest", "mypy", "ruff"] 66 | sdist = ["setuptools-rust (>=0.11.4)"] 67 | ssh = ["bcrypt (>=3.1.5)"] 68 | test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] 69 | test-randomorder = ["pytest-randomly"] 70 | tox = ["tox"] 71 | 72 | [[package]] 73 | name = "docutils" 74 | version = "0.20" 75 | description = "Docutils -- Python Documentation Utilities" 76 | category = "dev" 77 | optional = false 78 | python-versions = ">=3.7" 79 | 80 | [[package]] 81 | name = "file-system-py" 82 | version = "0.0.11" 83 | description = "All-in-one file manipulation" 84 | category = "dev" 85 | optional = false 86 | python-versions = ">=3.6" 87 | 88 | [[package]] 89 | name = "idna" 90 | version = "3.4" 91 | description = "Internationalized Domain Names in Applications (IDNA)" 92 | category = "dev" 93 | optional = false 94 | python-versions = ">=3.5" 95 | 96 | [[package]] 97 | name = "importlib-metadata" 98 | version = "6.6.0" 99 | description = "Read metadata from Python packages" 100 | category = "dev" 101 | optional = false 102 | python-versions = ">=3.7" 103 | 104 | [package.dependencies] 105 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 106 | zipp = ">=0.5" 107 | 108 | [package.extras] 109 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 110 | perf = ["ipython"] 111 | testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] 112 | 113 | [[package]] 114 | name = "importlib-resources" 115 | version = "5.12.0" 116 | description = "Read resources from Python packages" 117 | category = "dev" 118 | optional = false 119 | python-versions = ">=3.7" 120 | 121 | [package.dependencies] 122 | zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} 123 | 124 | [package.extras] 125 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 126 | testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 127 | 128 | [[package]] 129 | name = "jaraco.classes" 130 | version = "3.2.3" 131 | description = "Utility functions for Python class constructs" 132 | category = "dev" 133 | optional = false 134 | python-versions = ">=3.7" 135 | 136 | [package.dependencies] 137 | more-itertools = "*" 138 | 139 | [package.extras] 140 | docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] 141 | testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 142 | 143 | [[package]] 144 | name = "jeepney" 145 | version = "0.8.0" 146 | description = "Low-level, pure Python DBus protocol wrapper." 147 | category = "dev" 148 | optional = false 149 | python-versions = ">=3.7" 150 | 151 | [package.extras] 152 | test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] 153 | trio = ["async_generator", "trio"] 154 | 155 | [[package]] 156 | name = "keyring" 157 | version = "23.13.1" 158 | description = "Store and access your passwords safely." 159 | category = "dev" 160 | optional = false 161 | python-versions = ">=3.7" 162 | 163 | [package.dependencies] 164 | importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} 165 | importlib-resources = {version = "*", markers = "python_version < \"3.9\""} 166 | "jaraco.classes" = "*" 167 | jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} 168 | pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} 169 | SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} 170 | 171 | [package.extras] 172 | completion = ["shtab"] 173 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] 174 | testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 175 | 176 | [[package]] 177 | name = "keyrings.alt" 178 | version = "4.0.2" 179 | description = "Alternate keyring implementations" 180 | category = "dev" 181 | optional = false 182 | python-versions = ">=3.6" 183 | 184 | [package.extras] 185 | docs = ["jaraco.packaging (>=3.2)", "rst.linker (>=1.9)", "sphinx"] 186 | testing = ["backports.unittest-mock", "fs (>=0.5,<2)", "gdata", "jaraco.test (>=3.2.0)", "keyring (>=20)", "pycryptodomex", "pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-flake8", "pytest-mypy", "python-keyczar"] 187 | 188 | [[package]] 189 | name = "more-itertools" 190 | version = "9.1.0" 191 | description = "More routines for operating on iterables, beyond itertools" 192 | category = "dev" 193 | optional = false 194 | python-versions = ">=3.7" 195 | 196 | [[package]] 197 | name = "pkginfo" 198 | version = "1.9.6" 199 | description = "Query metadata from sdists / bdists / installed packages." 200 | category = "dev" 201 | optional = false 202 | python-versions = ">=3.6" 203 | 204 | [package.extras] 205 | testing = ["pytest", "pytest-cov"] 206 | 207 | [[package]] 208 | name = "pycparser" 209 | version = "2.21" 210 | description = "C parser in Python" 211 | category = "dev" 212 | optional = false 213 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 214 | 215 | [[package]] 216 | name = "Pygments" 217 | version = "2.15.1" 218 | description = "Pygments is a syntax highlighting package written in Python." 219 | category = "dev" 220 | optional = false 221 | python-versions = ">=3.7" 222 | 223 | [package.extras] 224 | plugins = ["importlib-metadata"] 225 | 226 | [[package]] 227 | name = "pywin32-ctypes" 228 | version = "0.2.0" 229 | description = "" 230 | category = "dev" 231 | optional = false 232 | python-versions = "*" 233 | 234 | [[package]] 235 | name = "readme-renderer" 236 | version = "37.3" 237 | description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" 238 | category = "dev" 239 | optional = false 240 | python-versions = ">=3.7" 241 | 242 | [package.dependencies] 243 | bleach = ">=2.1.0" 244 | docutils = ">=0.13.1" 245 | Pygments = ">=2.5.1" 246 | 247 | [package.extras] 248 | md = ["cmarkgfm (>=0.8.0)"] 249 | 250 | [[package]] 251 | name = "requests" 252 | version = "2.30.0" 253 | description = "Python HTTP for Humans." 254 | category = "dev" 255 | optional = false 256 | python-versions = ">=3.7" 257 | 258 | [package.dependencies] 259 | certifi = ">=2017.4.17" 260 | charset-normalizer = ">=2,<4" 261 | idna = ">=2.5,<4" 262 | urllib3 = ">=1.21.1,<3" 263 | 264 | [package.extras] 265 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 266 | use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] 267 | 268 | [[package]] 269 | name = "requests-toolbelt" 270 | version = "1.0.0" 271 | description = "A utility belt for advanced users of python-requests" 272 | category = "dev" 273 | optional = false 274 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 275 | 276 | [package.dependencies] 277 | requests = ">=2.0.1,<3.0.0" 278 | 279 | [[package]] 280 | name = "rfc3986" 281 | version = "2.0.0" 282 | description = "Validating URI References per RFC 3986" 283 | category = "dev" 284 | optional = false 285 | python-versions = ">=3.7" 286 | 287 | [package.extras] 288 | idna2008 = ["idna"] 289 | 290 | [[package]] 291 | name = "SecretStorage" 292 | version = "3.3.3" 293 | description = "Python bindings to FreeDesktop.org Secret Service API" 294 | category = "dev" 295 | optional = false 296 | python-versions = ">=3.6" 297 | 298 | [package.dependencies] 299 | cryptography = ">=2.0" 300 | jeepney = ">=0.6" 301 | 302 | [[package]] 303 | name = "six" 304 | version = "1.16.0" 305 | description = "Python 2 and 3 compatibility utilities" 306 | category = "dev" 307 | optional = false 308 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 309 | 310 | [[package]] 311 | name = "toml" 312 | version = "0.10.2" 313 | description = "Python Library for Tom's Obvious, Minimal Language" 314 | category = "dev" 315 | optional = false 316 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 317 | 318 | [[package]] 319 | name = "tqdm" 320 | version = "4.65.0" 321 | description = "Fast, Extensible Progress Meter" 322 | category = "dev" 323 | optional = false 324 | python-versions = ">=3.7" 325 | 326 | [package.dependencies] 327 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 328 | 329 | [package.extras] 330 | dev = ["py-make (>=0.1.0)", "twine", "wheel"] 331 | notebook = ["ipywidgets (>=6)"] 332 | slack = ["slack-sdk"] 333 | telegram = ["requests"] 334 | 335 | [[package]] 336 | name = "twine" 337 | version = "3.4.1" 338 | description = "Collection of utilities for publishing packages on PyPI" 339 | category = "dev" 340 | optional = false 341 | python-versions = ">=3.6" 342 | 343 | [package.dependencies] 344 | colorama = ">=0.4.3" 345 | importlib-metadata = ">=3.6" 346 | keyring = ">=15.1" 347 | pkginfo = ">=1.4.2" 348 | readme-renderer = ">=21.0" 349 | requests = ">=2.20" 350 | requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" 351 | rfc3986 = ">=1.4.0" 352 | tqdm = ">=4.14" 353 | 354 | [[package]] 355 | name = "typing-extensions" 356 | version = "4.5.0" 357 | description = "Backported and Experimental Type Hints for Python 3.7+" 358 | category = "dev" 359 | optional = false 360 | python-versions = ">=3.7" 361 | 362 | [[package]] 363 | name = "urllib3" 364 | version = "2.0.2" 365 | description = "HTTP library with thread-safe connection pooling, file post, and more." 366 | category = "dev" 367 | optional = false 368 | python-versions = ">=3.7" 369 | 370 | [package.extras] 371 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 372 | secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] 373 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 374 | zstd = ["zstandard (>=0.18.0)"] 375 | 376 | [[package]] 377 | name = "webencodings" 378 | version = "0.5.1" 379 | description = "Character encoding aliases for legacy web content" 380 | category = "dev" 381 | optional = false 382 | python-versions = "*" 383 | 384 | [[package]] 385 | name = "zipp" 386 | version = "3.15.0" 387 | description = "Backport of pathlib-compatible object wrapper for zip files" 388 | category = "dev" 389 | optional = false 390 | python-versions = ">=3.7" 391 | 392 | [package.extras] 393 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 394 | testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 395 | 396 | [metadata] 397 | lock-version = "1.1" 398 | python-versions = ">=3.7,<3.12" 399 | content-hash = "4ca5960251f029b2c3fa0d41706d6c356f4209209746db2394e457c708ef0a41" 400 | 401 | [metadata.files] 402 | bleach = [ 403 | {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, 404 | {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, 405 | ] 406 | certifi = [ 407 | {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, 408 | {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, 409 | ] 410 | cffi = [ 411 | {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, 412 | {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, 413 | {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, 414 | {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, 415 | {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, 416 | {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, 417 | {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, 418 | {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, 419 | {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, 420 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, 421 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, 422 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, 423 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, 424 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, 425 | {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, 426 | {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, 427 | {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, 428 | {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, 429 | {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, 430 | {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, 431 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, 432 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, 433 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, 434 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, 435 | {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, 436 | {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, 437 | {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, 438 | {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, 439 | {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, 440 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, 441 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, 442 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, 443 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, 444 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, 445 | {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, 446 | {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, 447 | {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, 448 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, 449 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, 450 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, 451 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, 452 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, 453 | {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, 454 | {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, 455 | {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, 456 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, 457 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, 458 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, 459 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, 460 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, 461 | {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, 462 | {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, 463 | {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, 464 | {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, 465 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, 466 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, 467 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, 468 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, 469 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, 470 | {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, 471 | {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, 472 | {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, 473 | {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, 474 | {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, 475 | ] 476 | charset-normalizer = [ 477 | {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, 478 | {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, 479 | {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, 480 | {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, 481 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, 482 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, 483 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, 484 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, 485 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, 486 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, 487 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, 488 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, 489 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, 490 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, 491 | {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, 492 | {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, 493 | {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, 494 | {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, 495 | {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, 496 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, 497 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, 498 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, 499 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, 500 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, 501 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, 502 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, 503 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, 504 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, 505 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, 506 | {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, 507 | {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, 508 | {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, 509 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, 510 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, 511 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, 512 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, 513 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, 514 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, 515 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, 516 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, 517 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, 518 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, 519 | {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, 520 | {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, 521 | {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, 522 | {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, 523 | {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, 524 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, 525 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, 526 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, 527 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, 528 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, 529 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, 530 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, 531 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, 532 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, 533 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, 534 | {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, 535 | {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, 536 | {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, 537 | {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, 538 | {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, 539 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, 540 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, 541 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, 542 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, 543 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, 544 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, 545 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, 546 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, 547 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, 548 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, 549 | {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, 550 | {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, 551 | {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, 552 | ] 553 | colorama = [ 554 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 555 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 556 | ] 557 | cryptography = [ 558 | {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, 559 | {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, 560 | {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, 561 | {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, 562 | {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, 563 | {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, 564 | {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, 565 | {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, 566 | {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, 567 | {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, 568 | {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, 569 | {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, 570 | {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, 571 | {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, 572 | {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, 573 | {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, 574 | {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, 575 | {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, 576 | {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, 577 | ] 578 | docutils = [ 579 | {file = "docutils-0.20-py3-none-any.whl", hash = "sha256:a428f10de4de4774389734c986a01b4af2d802d26717108b0f1b9356862937c5"}, 580 | {file = "docutils-0.20.tar.gz", hash = "sha256:f75a5a52fbcacd81b47e42888ad2b380748aaccfb3f13af0fe69deb759f01eb6"}, 581 | ] 582 | file-system-py = [ 583 | {file = "file_system_py-0.0.11-py3-none-any.whl", hash = "sha256:dc29c6e9993174eddc781936fa1c937e6599de080c314c4de22460cb5c4a4276"}, 584 | {file = "file_system_py-0.0.11.tar.gz", hash = "sha256:8c47c1ce53c2aaf158b8b26879568b166cc10640b08769b111787241c9845212"}, 585 | ] 586 | idna = [ 587 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 588 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 589 | ] 590 | importlib-metadata = [ 591 | {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, 592 | {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, 593 | ] 594 | importlib-resources = [ 595 | {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, 596 | {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, 597 | ] 598 | "jaraco.classes" = [ 599 | {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, 600 | {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, 601 | ] 602 | jeepney = [ 603 | {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, 604 | {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, 605 | ] 606 | keyring = [ 607 | {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, 608 | {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, 609 | ] 610 | "keyrings.alt" = [ 611 | {file = "keyrings.alt-4.0.2-py3-none-any.whl", hash = "sha256:49ab586d0610e5f73e874fb3dcfc6b94f222d30a8457ef324f4124c34b3ea2f5"}, 612 | {file = "keyrings.alt-4.0.2.tar.gz", hash = "sha256:cc475635099d6edd7e475c5a479e5b4da5e811a3af04495a1e9ada488d16fe25"}, 613 | ] 614 | more-itertools = [ 615 | {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, 616 | {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, 617 | ] 618 | pkginfo = [ 619 | {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, 620 | {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, 621 | ] 622 | pycparser = [ 623 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 624 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 625 | ] 626 | Pygments = [ 627 | {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, 628 | {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, 629 | ] 630 | pywin32-ctypes = [ 631 | {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, 632 | {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, 633 | ] 634 | readme-renderer = [ 635 | {file = "readme_renderer-37.3-py3-none-any.whl", hash = "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343"}, 636 | {file = "readme_renderer-37.3.tar.gz", hash = "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273"}, 637 | ] 638 | requests = [ 639 | {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, 640 | {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, 641 | ] 642 | requests-toolbelt = [ 643 | {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, 644 | {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, 645 | ] 646 | rfc3986 = [ 647 | {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, 648 | {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, 649 | ] 650 | SecretStorage = [ 651 | {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, 652 | {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, 653 | ] 654 | six = [ 655 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 656 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 657 | ] 658 | toml = [ 659 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 660 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 661 | ] 662 | tqdm = [ 663 | {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, 664 | {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, 665 | ] 666 | twine = [ 667 | {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, 668 | {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, 669 | ] 670 | typing-extensions = [ 671 | {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, 672 | {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, 673 | ] 674 | urllib3 = [ 675 | {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, 676 | {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, 677 | ] 678 | webencodings = [ 679 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, 680 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, 681 | ] 682 | zipp = [ 683 | {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, 684 | {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, 685 | ] 686 | --------------------------------------------------------------------------------