tldr: refactoring

This commit is contained in:
Romain J 2019-12-16 18:12:10 +01:00
parent ba1122c07b
commit f42b2194cd
2881 changed files with 568359 additions and 388 deletions

2
.gitignore vendored
View file

@ -2,7 +2,7 @@
__pycache__/ __pycache__/
*.pyc *.pyc
.env .env
config.py configs/*
.DS_Store .DS_Store
private.py private.py

View file

@ -1,3 +0,0 @@
[
589949234308972556
]

76
bot.py
View file

@ -2,13 +2,13 @@ import datetime
import logging import logging
import sys import sys
from collections import deque, Counter from collections import deque, Counter
from typing import List
import aiohttp import aiohttp
import discord import discord
import git import git
from discord.ext import commands from discord.ext import commands
import config
from cogs.utils.config import Config from cogs.utils.config import Config
from cogs.utils.lang import Texts from cogs.utils.lang import Texts
from cogs.utils.version import Version from cogs.utils.version import Version
@ -20,27 +20,32 @@ build = git.Repo(search_parent_directories=True).head.object.hexsha
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
l_extensions = ( l_extensions: List[str] = [
'cogs.admin', 'cogs.admin',
'cogs.basics', 'cogs.basics',
'cogs.utility', 'cogs.utility',
'cogs.logs', 'cogs.logs',
'cogs.poll', # 'cogs.poll',
'jishaku', 'jishaku',
) ]
async def _prefix_callable(bot, message: discord.message) -> list: async def _prefix_callable(bot, message: discord.message) -> list:
extras = ['.'] extras = ['.']
if message.guild is not None: if message.guild is not None:
extras = bot.prefixes.get(str(message.guild.id), []) extras = []
if str(message.guild.id) in bot.prefixes:
extras.extend(
bot.prefixes.get(str(message.guild.id), "prefixes")
.split('-sep-')
)
return commands.when_mentioned_or(*extras)(bot, message) return commands.when_mentioned_or(*extras)(bot, message)
class TuxBot(commands.AutoShardedBot): class TuxBot(commands.AutoShardedBot):
def __init__(self, unload: list, database): def __init__(self):
super().__init__(command_prefix=_prefix_callable, pm_help=None, super().__init__(command_prefix=_prefix_callable, pm_help=None,
help_command=None, description=description, help_command=None, description=description,
help_attrs=dict(hidden=True), help_attrs=dict(hidden=True),
@ -52,28 +57,30 @@ class TuxBot(commands.AutoShardedBot):
self.command_stats = Counter() self.command_stats = Counter()
self.uptime: datetime = datetime.datetime.utcnow() self.uptime: datetime = datetime.datetime.utcnow()
self.config = config
self.database = database
self._prev_events = deque(maxlen=10) self._prev_events = deque(maxlen=10)
self.session = aiohttp.ClientSession(loop=self.loop) self.session = aiohttp.ClientSession(loop=self.loop)
self.prefixes = Config('prefixes.json') self.config = Config('./configs/config.cfg')
self.blacklist = Config('blacklist.json') self.prefixes = Config('./configs/prefixes.cfg')
self.blacklist = Config('./configs/blacklist.cfg')
self.version = Version(10, 0, 0, pre_release='a21', build=build) self.version = Version(10, 1, 0, pre_release='a0', build=build)
for extension in l_extensions: for extension in l_extensions:
if extension not in unload: try:
try: print(Texts().get("Extension loaded successfully : ")
self.load_extension(extension) + extension)
except Exception as e: log.info(Texts().get("Extension loaded successfully : ")
print(Texts().get("Failed to load extension : ") + extension)
+ extension, file=sys.stderr) self.load_extension(extension)
log.error(Texts().get("Failed to load extension : ") except Exception as e:
+ extension, exc_info=e) print(Texts().get("Failed to load extension : ")
+ extension, file=sys.stderr)
log.error(Texts().get("Failed to load extension : ")
+ extension, exc_info=e)
async def is_owner(self, user: discord.User) -> bool: async def is_owner(self, user: discord.User) -> bool:
return user.id in config.authorized_id return str(user.id) in self.config.get("permissions", "owners").split(',')
async def on_socket_response(self, msg): async def on_socket_response(self, msg):
self._prev_events.append(msg) self._prev_events.append(msg)
@ -116,8 +123,12 @@ class TuxBot(commands.AutoShardedBot):
print(self.version) print(self.version)
presence: dict = dict(status=discord.Status.dnd) presence: dict = dict(status=discord.Status.dnd)
if self.config.activity is not None: if self.config.get("bot", "Activity", fallback=None) is not None:
presence.update(activity=discord.Game(name=self.config.activity)) presence.update(
activity=discord.Game(
name=self.config.get("bot", "Activity")
)
)
await self.change_presence(**presence) await self.change_presence(**presence)
@ -127,10 +138,10 @@ class TuxBot(commands.AutoShardedBot):
@property @property
def logs_webhook(self) -> discord.Webhook: def logs_webhook(self) -> discord.Webhook:
logs_webhook = self.config.logs_webhook logs_webhook = self.config["webhook"]
webhook = discord.Webhook.partial( webhook = discord.Webhook.partial(
id=logs_webhook.get('id'), id=logs_webhook.get('ID'),
token=logs_webhook.get('token'), token=logs_webhook.get('Url'),
adapter=discord.AsyncWebhookAdapter( adapter=discord.AsyncWebhookAdapter(
self.session self.session
) )
@ -140,6 +151,19 @@ class TuxBot(commands.AutoShardedBot):
async def close(self): async def close(self):
await super().close() await super().close()
await self.session.close()
def run(self): def run(self):
super().run(config.token, reconnect=True) super().run(self.config.get("bot", "Token"), reconnect=True)
if __name__ == "__main__":
log = logging.getLogger()
print(Texts().get('Starting...'))
bot = TuxBot()
try:
bot.run()
except KeyboardInterrupt:
bot.close()

View file

@ -153,15 +153,29 @@ class Logs(commands.Cog):
await self.webhook.send(embed=e) await self.webhook.send(embed=e)
@commands.Cog.listener() @commands.Cog.listener()
async def on_guild_join(self, guild): async def on_guild_join(self, guild: discord.guild):
e = discord.Embed(colour=0x53dda4, title='New Guild') # green colour e = discord.Embed(colour=0x53dda4, title='New Guild') # green colour
await self.send_guild_stats(e, guild) await self.send_guild_stats(e, guild)
@commands.Cog.listener() @commands.Cog.listener()
async def on_guild_remove(self, guild): async def on_guild_remove(self, guild: discord.guild):
e = discord.Embed(colour=0xdd5f53, title='Left Guild') # red colour e = discord.Embed(colour=0xdd5f53, title='Left Guild') # red colour
await self.send_guild_stats(e, guild) await self.send_guild_stats(e, guild)
@commands.Cog.listener()
async def on_message(self, message: discord.message):
if message.guild is None:
e = discord.Embed(colour=0x0a97f5, title='New DM') # blue colour
e.set_author(
name=message.author,
icon_url=message.author.avatar_url_as(format='png')
)
e.description = message.content
if len(message.attachments) > 0:
e.set_image(url=message.attachments[0].url)
e.set_footer(text=f"User ID: {message.author.id}")
await self.webhook.send(embed=e)
@commands.Cog.listener() @commands.Cog.listener()
async def on_command_error(self, ctx, error): async def on_command_error(self, ctx, error):
await self.register_command(ctx) await self.register_command(ctx)
@ -246,12 +260,14 @@ class Logs(commands.Cog):
minutes = delta.total_seconds() / 60 minutes = delta.total_seconds() / 60
total = sum(self.bot.socket_stats.values()) total = sum(self.bot.socket_stats.values())
cpm = total / minutes cpm = total / minutes
await ctx.send(f'{total} socket events observed ({cpm:.2f}/minute):\n{self.bot.socket_stats}') await ctx.send(
f'{total} socket events observed ({cpm:.2f}/minute):\n{self.bot.socket_stats}')
@commands.command(name='uptime') @commands.command(name='uptime')
async def _uptime(self, ctx): async def _uptime(self, ctx):
"""Tells you how long the bot has been up for.""" """Tells you how long the bot has been up for."""
uptime = humanize.naturaltime(datetime.datetime.utcnow() - self.bot.uptime) uptime = humanize.naturaltime(
datetime.datetime.utcnow() - self.bot.uptime)
await ctx.send(f'Uptime: **{uptime}**') await ctx.send(f'Uptime: **{uptime}**')

View file

@ -22,12 +22,9 @@ class Polls(commands.Cog):
.query(Poll) \ .query(Poll) \
.filter(Poll.message_id == pld.message_id) .filter(Poll.message_id == pld.message_id)
print("-------------------------25---------------------------") if poll.count() > 0:
if poll.count() != 0:
print("-------------------------27---------------------------")
poll = poll.one() poll = poll.one()
emotes = utils_emotes.get(poll.available_choices) emotes = utils_emotes.get(poll.available_choices)
if pld.emoji.name in emotes: if pld.emoji.name in emotes:
return poll return poll
@ -52,6 +49,8 @@ class Polls(commands.Cog):
pass pass
choice = utils_emotes.get_index(pld.emoji.name) choice = utils_emotes.get_index(pld.emoji.name)
print(choice)
response = self.bot.database.session.query(Poll) \ response = self.bot.database.session.query(Poll) \
.filter( .filter(
Responses.poll_id == poll.id, Responses.poll_id == poll.id,
@ -59,18 +58,20 @@ class Polls(commands.Cog):
Responses.choice == choice Responses.choice == choice
) )
print(pld.user_id, poll.id, choice)
if response.count() != 0: if response.count() != 0:
print("--pre delete--")
response = response.one() response = response.one()
self.bot.database.session.delete(response) self.bot.database.session.delete(response)
print("--post delete--")
else: else:
print("--pre add--")
response = Responses( response = Responses(
user=pld.user_id, user=pld.user_id,
poll_id=poll.id, poll_id=poll.id,
choice=choice choice=choice
) )
self.bot.database.session.add(response) self.bot.database.session.add(response)
print("--post add--")
self.bot.database.session.commit() self.bot.database.session.commit()
"""---------------------------------------------------------------------""" """---------------------------------------------------------------------"""

View file

@ -1,4 +1,4 @@
import json import configparser
class Config: class Config:
@ -7,11 +7,8 @@ class Config:
def __init__(self, name): def __init__(self, name):
self.name = name self.name = name
try: self._db: configparser.ConfigParser = configparser.ConfigParser()
with open(self.name, 'r') as f: self._db.read(self.name)
self._db = json.load(f)
except FileNotFoundError:
self._db = {}
def __contains__(self, item): def __contains__(self, item):
return item in self._db return item in self._db
@ -19,9 +16,8 @@ class Config:
def __getitem__(self, item): def __getitem__(self, item):
return self._db[str(item)] return self._db[str(item)]
def get(self, key, *args): def all(self) -> list:
"""Retrieves a config entry.""" return self._db.sections()
return self._db.get(str(key), *args)
def all(self) -> dict: def get(self, *args, **kwargs) -> str:
return self._db return self._db.get(*args, **kwargs)

View file

@ -1,10 +1,16 @@
from .config import Config
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, session from sqlalchemy.orm import sessionmaker, session
class Database: class Database:
def __init__(self, config): def __init__(self, config: Config):
self.engine = create_engine(config.postgresql, echo=True) conf_postgresql = config["postgresql"]
postgresql = 'postgresql://{}:{}@{}/{}'.format(
conf_postgresql.get("Username"), conf_postgresql.get("Password"),
conf_postgresql.get("Host"), conf_postgresql.get("DBName"))
self.engine = create_engine(postgresql, echo=False)
Session = sessionmaker() Session = sessionmaker()
Session.configure(bind=self.engine) Session.configure(bind=self.engine)

View file

@ -1,5 +1,5 @@
import gettext import gettext
import config from .config import Config
from cogs.utils.database import Database from cogs.utils.database import Database
from .models.lang import Lang from .models.lang import Lang
@ -22,7 +22,7 @@ class Texts:
@staticmethod @staticmethod
def get_locale(ctx): def get_locale(ctx):
database = Database(config) database = Database(Config("./configs/config.cfg"))
if ctx is not None: if ctx is not None:
current = database.session\ current = database.session\

View file

@ -1,3 +1,6 @@
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from .lang import Lang from .lang import Lang
from .warn import Warn from .warn import Warn
from .poll import Poll, Responses # from .poll import Poll, Responses

View file

@ -1,6 +1,5 @@
from sqlalchemy.ext.declarative import declarative_base from . import Base
from sqlalchemy import Column, String from sqlalchemy import Column, String
Base = declarative_base()
class Lang(Base): class Lang(Base):

View file

@ -1,10 +1,8 @@
import datetime import datetime
from sqlalchemy.ext.declarative import declarative_base from . import Base
from sqlalchemy import Column, Integer, String, BIGINT, TIMESTAMP from sqlalchemy import Column, Integer, String, BIGINT, TIMESTAMP
Base = declarative_base()
class Warn(Base): class Warn(Base):
__tablename__ = 'warns' __tablename__ = 'warns'

0
configs/blacklist.cfg Normal file
View file

2
configs/prefixes.cfg Normal file
View file

@ -0,0 +1,2 @@
[280805240977227776]
prefixes = b.

View file

@ -1,10 +0,0 @@
from .initializer import Config
setup = Config()
setup.install()
setup.ask()
setup.save()
setup.clean()

View file

@ -1,92 +0,0 @@
from pip._internal import main as pip
import shutil
from .langs import locales, texts
class Config:
def __init__(self):
self.config = {
'log_channel_id': '<INSERT_LOG_CHANNEL_HERE (in int)>',
'main_server_id': '<INSERT_MAIN_CHANNEL_ID_HERE (in int)>',
'authorized_id': '[admin ids here (in int)]',
}
with open('requirements.txt', 'r') as f:
self.packages = f.read().split('\n')
def input(self, key, **kwargs):
locale = self.config.get('locale', 'multiple')
print('\n\033[4m' + texts.get(locale).get(key) + '\033[0m')
response = input('> ')
if kwargs.get('valid'):
while response not in kwargs.get('valid'):
print('\033[36m' + '/'.join(kwargs.get('valid')) + '\033[0m')
response = input('> ')
if not kwargs.get('empty', True):
while len(response) == 0:
print('\033[41m' + texts.get(locale).get('not_empty')
+ '\033[0m')
response = input('> ')
else:
response = kwargs.get('default', None) if len(response) == 0 \
else response
self.config[key] = response
def install(self):
self.input('locale', valid=locales)
print('\n\n\033[4;36m'
+ texts.get(self.config.get('locale')).get('install')
+ '\033[0m\n')
for package in self.packages:
pip(['install', package])
def ask(self):
print('\n\n\033[4;36m' + texts.get(self.config.get('locale'))
.get('conf') + '\033[0m\n')
self.input('token', empty=False)
self.input('postgresql_username', empty=False)
self.input('postgresql_password', empty=False)
self.input('postgresql_dbname', empty=False)
print('\n\n\033[4;36m' + texts.get(self.config.get('locale'))
.get('logs') + '\033[0m\n')
self.input('wh_id', empty=True)
self.input('wh_token', empty=True)
print('\n\n\033[4;36m' + texts.get(self.config.get('locale'))
.get('misc') + '\033[0m\n')
self.input('activity', empty=True)
def save(self):
with open('config.py', 'w') as file:
postgresql = f"postgresql://" \
f"{self.config.get('postgresql_username')}:" \
f"{self.config.get('postgresql_password')}" \
f"@localhost/{self.config.get('postgresql_dbname')}"
file.write(f"postgresql = '{postgresql}'\n")
logs_webhook = dict(id=int(self.config.get('wh_id')),
token=self.config.get('wh_token'))
file.write(f"logs_webhook = '{logs_webhook}'\n")
for key, value in self.config.items():
if not key.startswith('postgresql_') \
and not key.startswith('wh_'):
value = f"'{value}'" if type(value) is str else value
file.write(f"{key} = {value}\n")
print('\n\n\033[4;36m' + texts.get(self.config.get('locale'))
.get('end') + '\033[0m\n')
def clean(self):
print('\n\n\033[4;36m'
+ texts.get(self.config.get('locale')).get('clean')
+ '\033[0m\n')

View file

@ -1,61 +0,0 @@
locales = ['fr', 'en']
texts = {
'fr': {
'install': "Installation des modules...",
'conf': "Configuration...",
'token': "Veuillez entrer le token",
'not_empty': "Cette valeur ne doit pas être vide",
'postgresql_username': "Veuillez entrer le nom d'utilisateur de postgresql",
'postgresql_password': "Veuillez entrer le mot de passe de postgresql",
'postgresql_dbname': "Veuillez entrer le nom de la base de donnée",
'logs': "Channel de logs (non obligatoire)",
'wh_id': "L'id du webhook pour le channel de logs",
'wh_token': "Le token du webhook pour le channel de logs",
'misc': 'Autre',
'activity': "Joue à ...",
'end': "Configuration terminée, vous pouvez à tout moment la rectifier en modifiant le fichier config.py",
'clean': "Nettoyage..."
},
'en': {
'install': "Installation of the modules....",
'conf': "Configuration...",
'token': "Please enter the token",
'not_empty': "This value must not be empty",
'postgresql_username': "Please enter the postgresql username",
'postgresql_password': "Please enter the postgresql password",
'postgresql_dbname': "Please enter the database name",
'logs': "Log channel (not required)",
'wh_id': "Webhook id for log channel",
'wh_token': "Webhook token for log channel",
'misc': 'Misc',
'activity': "Playing ...",
'end': "Configuration completed, you can fix it at any time by modifying the config.py file",
'clean': "Cleaning..."
},
'multiple': {
'locale': "Veuillez choisir une langue | Please choose a language "
"[fr/en]",
'not_empty': "Cette valeur ne doit pas être vide |"
" This value must not be empty"
}
}

View file

@ -15,59 +15,48 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
#: launcher.py:51
msgid "Starting..." msgid "Starting..."
msgstr "" msgstr ""
#: launcher.py:56 launcher.py:57
msgid "Could not set up PostgreSQL..." msgid "Could not set up PostgreSQL..."
msgstr "" msgstr ""
#: launcher.py:68
msgid "Launch without loading the <TEXT> module" msgid "Launch without loading the <TEXT> module"
msgstr "" msgstr ""
#: launcher.py:73
msgid "Search for update" msgid "Search for update"
msgstr "" msgstr ""
#: launcher.py:73
msgid "Checking for update..." msgid "Checking for update..."
msgstr "" msgstr ""
#: launcher.py:89
msgid "A new version is available !" msgid "A new version is available !"
msgstr "" msgstr ""
#: launcher.py:93
msgid "Update ? [Y/n] " msgid "Update ? [Y/n] "
msgstr "" msgstr ""
#: launcher.py:97
msgid "Downloading..." msgid "Downloading..."
msgstr "" msgstr ""
#: launcher.py:108
msgid "Tuxbot is up to date" msgid "Tuxbot is up to date"
msgstr "" msgstr ""
#: bot.py:52
msgid "Failed to load extension : " msgid "Failed to load extension : "
msgstr "" msgstr ""
#: bot.py:59 msgid "Extension loaded successfully : "
msgstr ""
msgid "This command cannot be used in private messages." msgid "This command cannot be used in private messages."
msgstr "" msgstr ""
#: bot.py:63
msgid "Sorry. This command is disabled and cannot be used." msgid "Sorry. This command is disabled and cannot be used."
msgstr "" msgstr ""
#: bot.py:66
msgid "In " msgid "In "
msgstr "" msgstr ""
#: bot.py:77
msgid "Ready:" msgid "Ready:"
msgstr "" msgstr ""

View file

@ -15,59 +15,48 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
#: launcher.py:51
msgid "Starting..." msgid "Starting..."
msgstr "Démarrage..." msgstr "Démarrage..."
#: launcher.py:56 launcher.py:57
msgid "Could not set up PostgreSQL..." msgid "Could not set up PostgreSQL..."
msgstr "Impossible de lancer PostgreSQL..." msgstr "Impossible de lancer PostgreSQL..."
#: launcher.py:68
msgid "Launch without loading the <TEXT> module" msgid "Launch without loading the <TEXT> module"
msgstr "Lancer sans charger le module <TEXT>" msgstr "Lancer sans charger le module <TEXT>"
#: launcher.py:73
msgid "Search for update" msgid "Search for update"
msgstr "Rechercher les mises à jour" msgstr "Rechercher les mises à jour"
#: launcher.py:73
msgid "Checking for update..." msgid "Checking for update..."
msgstr "Recherche de mise à jour..." msgstr "Recherche de mise à jour..."
#: launcher.py:89
msgid "A new version is available !" msgid "A new version is available !"
msgstr "Une nouvelle version est disponible !" msgstr "Une nouvelle version est disponible !"
#: launcher.py:93
msgid "Update ? [Y/n] " msgid "Update ? [Y/n] "
msgstr "Mettre à jour ? [O/n]" msgstr "Mettre à jour ? [O/n]"
#: launcher.py:97
msgid "Downloading..." msgid "Downloading..."
msgstr "Téléchargement..." msgstr "Téléchargement..."
#: launcher.py:108
msgid "Tuxbot is up to date" msgid "Tuxbot is up to date"
msgstr "Tuxbot est à jour" msgstr "Tuxbot est à jour"
#: bot.py:52
msgid "Failed to load extension : " msgid "Failed to load extension : "
msgstr "Impossible de charger l'extension : " msgstr "Impossible de charger l'extension : "
#: bot.py:59 msgid "Extension loaded successfully : "
msgstr "Extension chargée avec succes : "
msgid "This command cannot be used in private messages." msgid "This command cannot be used in private messages."
msgstr "Cette commande ne peut pas être utilisée en message privé." msgstr "Cette commande ne peut pas être utilisée en message privé."
#: bot.py:63
msgid "Sorry. This command is disabled and cannot be used." msgid "Sorry. This command is disabled and cannot be used."
msgstr "Désolé mais cette commande est désactivée." msgstr "Désolé mais cette commande est désactivée."
#: bot.py:66
msgid "In " msgid "In "
msgstr "Dans " msgstr "Dans "
#: bot.py:77
msgid "Ready:" msgid "Ready:"
msgstr "Prêt :" msgstr "Prêt :"

View file

@ -1,116 +0,0 @@
try:
import config
from cogs.utils.lang import Texts
except ModuleNotFoundError:
import extras.first_run
import contextlib
import logging
import socket
import sys
import click
import git
import requests
from bot import TuxBot
from cogs.utils.database import Database
@contextlib.contextmanager
def setup_logging():
try:
logging.getLogger('discord').setLevel(logging.INFO)
logging.getLogger('discord.http').setLevel(logging.WARNING)
log = logging.getLogger()
log.setLevel(logging.INFO)
handler = logging.FileHandler(filename='logs/tuxbot.log',
encoding='utf-8', mode='w')
fmt = logging.Formatter('[{levelname:<7}] [{asctime}]'
' {name}: {message}',
'%Y-%m-%d %H:%M:%S', style='{')
handler.setFormatter(fmt)
log.addHandler(handler)
yield
finally:
handlers = log.handlers[:]
for handler in handlers:
handler.close()
log.removeHandler(handler)
def run_bot(unload: list = []):
log = logging.getLogger()
print(Texts().get('Starting...'))
try:
database = Database(config)
except socket.gaierror:
click.echo(Texts().get("Could not set up PostgreSQL..."),
file=sys.stderr)
log.exception(Texts().get("Could not set up PostgreSQL..."))
return
bot = TuxBot(unload, database)
bot.run()
@click.command()
@click.option('-d', '--unload', multiple=True, type=str,
help=Texts().get("Launch without loading the <TEXT> module"))
@click.option('-u', '--update', is_flag=True,
help=Texts().get("Search for update"))
def main(**kwargs):
if kwargs.get('update'):
_update()
with setup_logging():
run_bot(kwargs.get('unload'))
@click.option('-d', '--update', is_flag=True,
help=Texts().get("Search for update"))
def _update():
print(Texts().get("Checking for update..."))
local = git.Repo(search_parent_directories=True)
current = local.head.object.hexsha
gitea = 'https://git.gnous.eu/api/v1/'
origin = requests.get(gitea + 'repos/gnouseu/tuxbot-bot/branches/rewrite')
last = origin.json().get('commit').get('id')
if current != last:
print(Texts().get("A new version is available !"))
check = None
while check not in ['', 'y', 'n', 'o']:
check = input(Texts().get("Update ? [Y/n] ")).lower().strip()
print(check)
if check in ['y', '', 'o']:
print(Texts().get("Downloading..."))
origin = git.Repo(search_parent_directories=True) \
.remotes['origin']
origin.pull()
with setup_logging():
run_bot()
else:
with setup_logging():
run_bot()
else:
print(Texts().get("Tuxbot is up to date") + '\n')
with setup_logging():
run_bot()
if __name__ == '__main__':
main()

7
migrate.py Normal file
View file

@ -0,0 +1,7 @@
from cogs.utils.models import *
from cogs.utils.config import Config
from cogs.utils.database import Database
database = Database(Config("config.cfg"))
Base.metadata.create_all(database.engine)

File diff suppressed because one or more lines are too long

View file

@ -1,11 +0,0 @@
{
"280805240977227776": [
"b!!"
],
"303633056944881686": [
"b!!"
],
"336642139381301249": [
"b!!"
]
}

View file

@ -1,13 +1,9 @@
humanize
discord.py[voice] discord.py[voice]
jishaku jishaku
lxml
click
asyncpg
sqlalchemy
gitpython gitpython
requests sqlalchemy
psycopg2
configparser
psutil psutil
werkzeug
tcp_latency tcp_latency
yarl i18n

76
venv/bin/activate Normal file
View file

@ -0,0 +1,76 @@
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly
deactivate () {
# reset old environment variables
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
PATH="${_OLD_VIRTUAL_PATH:-}"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r
fi
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
PS1="${_OLD_VIRTUAL_PS1:-}"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset VIRTUAL_ENV
if [ ! "${1:-}" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
# unset irrelevant variables
deactivate nondestructive
VIRTUAL_ENV="/home/romain/gnousEU/tuxbot-bot/venv"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
unset PYTHONHOME
fi
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
_OLD_VIRTUAL_PS1="${PS1:-}"
if [ "x(venv) " != x ] ; then
PS1="(venv) ${PS1:-}"
else
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
# special case for Aspen magic directories
# see http://www.zetadev.com/software/aspen/
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
else
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
fi
fi
export PS1
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r
fi

37
venv/bin/activate.csh Normal file
View file

@ -0,0 +1,37 @@
# This file must be used with "source bin/activate.csh" *from csh*.
# You cannot run it directly.
# Created by Davide Di Blasi <davidedb@gmail.com>.
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
# Unset irrelevant variables.
deactivate nondestructive
setenv VIRTUAL_ENV "/home/romain/gnousEU/tuxbot-bot/venv"
set _OLD_VIRTUAL_PATH="$PATH"
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
set _OLD_VIRTUAL_PROMPT="$prompt"
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
if ("venv" != "") then
set env_name = "venv"
else
if (`basename "VIRTUAL_ENV"` == "__") then
# special case for Aspen magic directories
# see http://www.zetadev.com/software/aspen/
set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
else
set env_name = `basename "$VIRTUAL_ENV"`
endif
endif
set prompt = "[$env_name] $prompt"
unset env_name
endif
alias pydoc python -m pydoc
rehash

75
venv/bin/activate.fish Normal file
View file

@ -0,0 +1,75 @@
# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
# you cannot run it directly
function deactivate -d "Exit virtualenv and return to normal shell environment"
# reset old environment variables
if test -n "$_OLD_VIRTUAL_PATH"
set -gx PATH $_OLD_VIRTUAL_PATH
set -e _OLD_VIRTUAL_PATH
end
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
set -e _OLD_VIRTUAL_PYTHONHOME
end
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
functions -e fish_prompt
set -e _OLD_FISH_PROMPT_OVERRIDE
functions -c _old_fish_prompt fish_prompt
functions -e _old_fish_prompt
end
set -e VIRTUAL_ENV
if test "$argv[1]" != "nondestructive"
# Self destruct!
functions -e deactivate
end
end
# unset irrelevant variables
deactivate nondestructive
set -gx VIRTUAL_ENV "/home/romain/gnousEU/tuxbot-bot/venv"
set -gx _OLD_VIRTUAL_PATH $PATH
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
# unset PYTHONHOME if set
if set -q PYTHONHOME
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
set -e PYTHONHOME
end
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
# fish uses a function instead of an env var to generate the prompt.
# save the current fish_prompt function as the function _old_fish_prompt
functions -c fish_prompt _old_fish_prompt
# with the original prompt function renamed, we can override with our own.
function fish_prompt
# Save the return status of the last command
set -l old_status $status
# Prompt override?
if test -n "(venv) "
printf "%s%s" "(venv) " (set_color normal)
else
# ...Otherwise, prepend env
set -l _checkbase (basename "$VIRTUAL_ENV")
if test $_checkbase = "__"
# special case for Aspen magic directories
# see http://www.zetadev.com/software/aspen/
printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal)
else
printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
end
end
# Restore the return status of the previous command.
echo "exit $old_status" | .
_old_fish_prompt
end
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
end

10
venv/bin/chardetect Executable file
View file

@ -0,0 +1,10 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from chardet.cli.chardetect import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

10
venv/bin/easy_install Executable file
View file

@ -0,0 +1,10 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

10
venv/bin/easy_install-3.7 Executable file
View file

@ -0,0 +1,10 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from setuptools.command.easy_install import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

10
venv/bin/import_expression Executable file
View file

@ -0,0 +1,10 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from import_expression.__main__ import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

10
venv/bin/pip Executable file
View file

@ -0,0 +1,10 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

10
venv/bin/pip3 Executable file
View file

@ -0,0 +1,10 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

10
venv/bin/pip3.7 Executable file
View file

@ -0,0 +1,10 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
venv/bin/pybabel Executable file
View file

@ -0,0 +1,8 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from babel.messages.frontend import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

1
venv/bin/python Symbolic link
View file

@ -0,0 +1 @@
python3.7

1
venv/bin/python3 Symbolic link
View file

@ -0,0 +1 @@
python3.7

1
venv/bin/python3.7 Symbolic link
View file

@ -0,0 +1 @@
/usr/local/bin/python3.7

8
venv/bin/tcp-latency Executable file
View file

@ -0,0 +1,8 @@
#!/home/romain/gnousEU/tuxbot-bot/venv/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from tcp_latency.tcp_latency import _main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(_main())

View file

@ -0,0 +1 @@
pip

View file

@ -0,0 +1,29 @@
Copyright (c) 2013-2019 by the Babel Team, see AUTHORS for more information.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The name of the author may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -0,0 +1,31 @@
Metadata-Version: 2.1
Name: Babel
Version: 2.7.0
Summary: Internationalization utilities
Home-page: http://babel.pocoo.org/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
Requires-Dist: pytz (>=2015.7)
A collection of tools for internationalizing Python applications.

View file

@ -0,0 +1,815 @@
../../../bin/pybabel,sha256=X97VAhJYxnLuo8P_afP6cjXSHxOVROguRI628oADXjA,256
Babel-2.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Babel-2.7.0.dist-info/LICENSE,sha256=Wg311G6MsUvV1MLNdzOLIvaB_oi9NCNmJrGjrjtQEBo,1451
Babel-2.7.0.dist-info/METADATA,sha256=Sakpsddm3zC_mjuf8Xl2jlGr9l6fN3QH5TZOJCKBxbs,1223
Babel-2.7.0.dist-info/RECORD,,
Babel-2.7.0.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110
Babel-2.7.0.dist-info/entry_points.txt,sha256=dyIkorJhQj3IvTvmMylr1wEzW7vfxTw5RTOWa8zoqh0,764
Babel-2.7.0.dist-info/top_level.txt,sha256=mQO3vNkqlcYs_xRaL5EpRIy1IRjMp4N9_vdwmiemPXo,6
babel/__init__.py,sha256=Z867BI00sB-W9VXa74LciJmUXnLcDE8HYet2sPuwwwA,714
babel/__pycache__/__init__.cpython-37.pyc,,
babel/__pycache__/_compat.cpython-37.pyc,,
babel/__pycache__/core.cpython-37.pyc,,
babel/__pycache__/dates.cpython-37.pyc,,
babel/__pycache__/languages.cpython-37.pyc,,
babel/__pycache__/lists.cpython-37.pyc,,
babel/__pycache__/localedata.cpython-37.pyc,,
babel/__pycache__/numbers.cpython-37.pyc,,
babel/__pycache__/plural.cpython-37.pyc,,
babel/__pycache__/support.cpython-37.pyc,,
babel/__pycache__/units.cpython-37.pyc,,
babel/__pycache__/util.cpython-37.pyc,,
babel/_compat.py,sha256=DHx6vQR-LazZlNdeBE7wGTOBv1_1HWbRboKOkX76TiY,1685
babel/core.py,sha256=fkxYTtAryVBEwsfYg78Y-eRfq_dRkzSFlMSXoDoliSM,36907
babel/dates.py,sha256=LLBcjpOs_8Ng9StJdk-HcUxUnrTTtLtKYKOdLzxGJYU,67479
babel/global.dat,sha256=h29NSbHmHUP3FulyRoiU6aDSj7FgcGBZyc212lnUL_c,253062
babel/languages.py,sha256=UmLTj4Nai3kQrwHX6jptehVLeAw-KAdxcmcp2iDlgvI,2743
babel/lists.py,sha256=nON3qfMoLLap0YTTRGBYWbwekBFknIABbulnsX70lrk,2719
babel/locale-data/af.dat,sha256=n7zhDTHDXh8voszXVJXnIaLC_ihEYStNBQdNZC_TKYE,167016
babel/locale-data/af_NA.dat,sha256=SCCik7H53r08j9VR2MlOEPFagN5P153ef0fbsIFwsvY,1425
babel/locale-data/af_ZA.dat,sha256=TvoOI0O5FP8QqIwI506xwhymtW-ZwtnGSh7OGg8W69s,626
babel/locale-data/agq.dat,sha256=K7_PXOHrOyQBaZgHpJFpsI7DyOoOgxij1TmGPvHW3r8,17399
babel/locale-data/agq_CM.dat,sha256=gn5wN9w6lKBCTkuKLwKCFrnkSAxA5Utr1N9py-ciqkc,627
babel/locale-data/ak.dat,sha256=TI9PGam0sIfflHMh1jbrZ9hKpRVfcZVLC1rGyFFTZh8,15911
babel/locale-data/ak_GH.dat,sha256=iTuDrca96IQYXDwnpNiqKtGn8d83kgs-LsWTfJntS4s,607
babel/locale-data/am.dat,sha256=lT1XWTPuNzjyYF_VTyqhmCGAY7upVMPUlD70ebWnqcw,198396
babel/locale-data/am_ET.dat,sha256=8zdStIXJmVpgppSVpZUwV04WJ4kUWQwFWRVb6AQZahY,626
babel/locale-data/ar.dat,sha256=8ClpxZdrXplVALQ7UzQRwmmEbJMo5nSH1wNzQVfXBr8,335041
babel/locale-data/ar_001.dat,sha256=gmM0xCrg2w8yy4Xh8viSHsnitl6HnuuDMv1yRdaE9Us,1698
babel/locale-data/ar_AE.dat,sha256=0HjSYklVuIAiTVYB-qEzvdHa2jpX0d1bOxoNhPORbO0,1056
babel/locale-data/ar_BH.dat,sha256=Yt0X2Col8Ha78QaBs5_H0FDllYTwUeGSZI7VCvMplqk,669
babel/locale-data/ar_DJ.dat,sha256=0hcv-LMM77rO6XsghzDdqbIgEXy7b3be1ENh994EWrM,647
babel/locale-data/ar_DZ.dat,sha256=LxHWSDb5T857YqpPqJebqi4rrm08IvgvuK-B8I8B7PI,1731
babel/locale-data/ar_EG.dat,sha256=7NhEtUCRy1NrFLHz8VXla7JSZdILpnIc65DYOD7zLYY,706
babel/locale-data/ar_EH.dat,sha256=CNFFp1Dwz32d0TcaMjTKIYVxJovVaFLlUvf9ACV-9tQ,607
babel/locale-data/ar_ER.dat,sha256=gRdDWAO_ViChJEPChaJcNSIX4DmMbkAMPOpKnq1QuZU,628
babel/locale-data/ar_IL.dat,sha256=v57QG4365fJbwLF6usm9-fEuq9qJYd74nRD_gWmoTk4,1213
babel/locale-data/ar_IQ.dat,sha256=4Xi7cAbOE20jYoFxqifGshiC5tGrXrEUCsiZGwR21kg,2354
babel/locale-data/ar_JO.dat,sha256=LouBd_IYs070hS-CYkyqg5_Y8sE-_y6cl_TNp-lGFcU,2353
babel/locale-data/ar_KM.dat,sha256=vvAkx4__TxagJozvyudv38VzVgIljVPBPvyMGsz11G8,1179
babel/locale-data/ar_KW.dat,sha256=oWH9zhdJxQivmCEgKERJ8ADEobK0BqdIf_6zfUfGgkY,669
babel/locale-data/ar_LB.dat,sha256=cKY3x_auClEkSF-O9bdUuG5bOi-X4HZcZv-7HcM_uV0,2354
babel/locale-data/ar_LY.dat,sha256=NsVSuzMZGJg7-AN4FurzzIMh8iqQECSEPJHF6bW0nJQ,1670
babel/locale-data/ar_MA.dat,sha256=4XxmrdYhzerIdqqgHLH55Hg9W0cMFcqHjcAlPLRNn2g,2025
babel/locale-data/ar_MR.dat,sha256=IRZkTxOZ39eZDjDDr_h9GjzgGbS9Kylg-8QQfJAzl0Y,2191
babel/locale-data/ar_OM.dat,sha256=SwCPf_1V4qcSfB6F3LzQo861te_t91Kk4GUX8IV_A_M,669
babel/locale-data/ar_PS.dat,sha256=hGNnwUj0XR-x19RySMnnOgC0Kd4odVkj85gYJHXxGLg,2291
babel/locale-data/ar_QA.dat,sha256=Ymdu7PL0gvtu7JPJ-hUyoL1eN_mHss3ZF0XzMkqrsFQ,669
babel/locale-data/ar_SA.dat,sha256=MxBfIMX4A3Na-0pYAK868hW35JMWu5msIVsF8PRWF0c,1906
babel/locale-data/ar_SD.dat,sha256=nl5A-ub3QRuVC94h7X9Ak3gG9nrtylVXPh3O7Pb9PvY,669
babel/locale-data/ar_SO.dat,sha256=5dbXvnXAyzeXNoRifm6dn9iHT3uR1-sERZJvw0xrdAw,626
babel/locale-data/ar_SS.dat,sha256=xeUbi35nGVXcOa1H9b97Qx0GhQGmzbQmuyQwhpP7dFs,649
babel/locale-data/ar_SY.dat,sha256=bHN5TGlFMD7H2qIWGO_5GCLjtPm2z5u6pLDLPTksCWo,2353
babel/locale-data/ar_TD.dat,sha256=NbYxtvmfDFCgyukJrfEluSKqSvxGkXkFdVjbowqUUmM,607
babel/locale-data/ar_TN.dat,sha256=utHPqirZxiuEj86xGgZwtv50o4sqavbD-pCLA02EkC0,1669
babel/locale-data/ar_YE.dat,sha256=ugcwooc31b9YRfoeVUihy87zQGHbpe3Pcp_GzSmYk8Y,669
babel/locale-data/as.dat,sha256=v0f4nBxj3fZPic9BPsPp4w61wfdUWeyrn0fZjyfNWTg,230479
babel/locale-data/as_IN.dat,sha256=_1h7wmRt7evqXyqFIKyo7Ppjclhn5w9rMtLEZG7Fdgc,649
babel/locale-data/asa.dat,sha256=uX2LqOD_JuPjax_NYcVVCrXUCKAzA0xAve7S6ZzfeY4,16240
babel/locale-data/asa_TZ.dat,sha256=Rfjx5YBakJ7TNX3X4uETtuArOF40ftdEonNMAwVNRzs,608
babel/locale-data/ast.dat,sha256=RiZhHO8GKLb6a6dSEdV5LLGpLzzfhNz0XMzHpgB5_Es,210339
babel/locale-data/ast_ES.dat,sha256=-iocl3j5ah7FgqKU9XQR-adJKP8bGsBMLBFrbg8NjbY,645
babel/locale-data/az.dat,sha256=QWl1YVyX7U_hMfum9QuBZBz4zB3NXNEYbuuJC6Ja-P4,191875
babel/locale-data/az_Cyrl.dat,sha256=nPqsNWZo8xrNUv-N8zko_9Ve5pQ9WIDMdeI95CytiPs,38954
babel/locale-data/az_Cyrl_AZ.dat,sha256=0C_Y00OpozgdcwgbDOGs2R67PQ0TBF1bMz4ovHLmZ8o,626
babel/locale-data/az_Latn.dat,sha256=7wrR4YWwEpz672DsTtFe7BItp0oMldPoRHnDT4yP38g,2246
babel/locale-data/az_Latn_AZ.dat,sha256=MxhS4BIHuziBc2dKVrCvBHWw-zt-ZRqb_mc7QyRegm4,626
babel/locale-data/bas.dat,sha256=O9JPLvooFeB-9j1_1l_ceoknZUVVG7aTxXf0Pud4Xss,17184
babel/locale-data/bas_CM.dat,sha256=6roi5oBt9ByVAnbFcedUcRg2HmkLI7m_gL8L8Xx18II,627
babel/locale-data/be.dat,sha256=H_LUM0cEwMyAkBnw0UvBLHTR-mYnJxv9pXOjYsLZrUE,258410
babel/locale-data/be_BY.dat,sha256=GTDO3Za8gEdwa1UabcPJ32n-rSJMvRfzBA_sh0Mv19c,626
babel/locale-data/bem.dat,sha256=-_tBxlhspwM9kCqBwWO7BtjzMW-lA53eZ2omKfErUng,6555
babel/locale-data/bem_ZM.dat,sha256=d2G4WKDe_WNPgAv1JxwRp4vsMfyIGdgBfj5xhy3E5MY,608
babel/locale-data/bez.dat,sha256=bOuSiU51Cl-TV2XlIdyvBaRSvWrua_6FJSf0Yd3bT4w,17031
babel/locale-data/bez_TZ.dat,sha256=pPQxCLShiJXgsePTeWi_2VtDRgjIorpbw2Ab-43Pvfw,608
babel/locale-data/bg.dat,sha256=UJAqU4JVTF_CqUzNFPOpGadCFUe8YoG_-GZJ_wCwygs,228458
babel/locale-data/bg_BG.dat,sha256=S98UqeOmRzTvOPoQeaXthy7N_0-ZCi3g3qScIOkGPxE,644
babel/locale-data/bm.dat,sha256=UvSMvGOkaTuc1xClsfD0-6WaTGswrRKfYq89SzD8imQ,15938
babel/locale-data/bm_ML.dat,sha256=SYWVELAdIQjQ3lBuH6pTth6iAqJNNaIx7BcxGiVwnos,607
babel/locale-data/bn.dat,sha256=78q3cks0mrxGtG7Ap3UAHakz6y9ADBlJVF2is2BWX5c,257002
babel/locale-data/bn_BD.dat,sha256=MwMquIkmom46hTd8CKQqNjq0h9oIT6kWmj-rTvLDXsM,626
babel/locale-data/bn_IN.dat,sha256=r2TxDmuVgf4o9O7Cf4A1b5C-V9KwuY-0P_l8tAd-sKA,884
babel/locale-data/bo.dat,sha256=3dtXet1Kn30N9c7_IKIVXY-Y2i7Hy9pWsIp262awTMg,22546
babel/locale-data/bo_CN.dat,sha256=MvO2V4RU2DlFEFgbOw-hjWd6urYl307-WshKY3rlTfY,626
babel/locale-data/bo_IN.dat,sha256=IORPH-j_pfMPkLapwgn1WpiXBz0Ww14YpwqWlbPzrps,722
babel/locale-data/br.dat,sha256=Efh7GVXZ7TseoExgtaItATT6JYDbCaCURZTsDmXOEWM,252311
babel/locale-data/br_FR.dat,sha256=YpLV2DDbxqxCSqEIeARiZFN93Zdm-sIvK1WbZSFaDfE,644
babel/locale-data/brx.dat,sha256=7B-M7g9qrHT2PDvZq-6xTP898ngNpqH-qwiB3JvY8gA,124250
babel/locale-data/brx_IN.dat,sha256=bwkbIeGZgMgv1gqFuvtEcg8IaUw8fU8386EX9NxwazA,650
babel/locale-data/bs.dat,sha256=xA5-CHy_ckC36r_0fjX6F8tGkwtVvr5Q3fPs1Af1KOk,236345
babel/locale-data/bs_Cyrl.dat,sha256=qpMX1PaPmMJl2MhacaXdE8cy1q3vPVvlIQRsKCNj6lk,191220
babel/locale-data/bs_Cyrl_BA.dat,sha256=BgEXeYz5aTttgFbOjVxMt8iVwiiYfUW2K-sCsjqcqrs,626
babel/locale-data/bs_Latn.dat,sha256=uwk-ewWX9CKMAfLwY_vXGjHF_g4Wr9DrpESqKQxUmtc,1978
babel/locale-data/bs_Latn_BA.dat,sha256=edblc-NRnO8KuX3JVgKLz_gnAwYe2j01L3iORx-8IW4,626
babel/locale-data/ca.dat,sha256=VkbK3W_WAdeKSNAPreqIHHehmkXa29lio6HUuFchyas,205061
babel/locale-data/ca_AD.dat,sha256=bNYq_kpURgNvLK9gIo8oTycE1bPkGYTKMqa6JKHaLkM,644
babel/locale-data/ca_ES.dat,sha256=B0ToeaEZp_47D_jlPmegrl2nux7jJdhTjERBHAllQ5s,644
babel/locale-data/ca_ES_VALENCIA.dat,sha256=faT9vchH9xCQ3oY6aR2shGI-nra3S2BHllCzqcvI1Xg,3694
babel/locale-data/ca_FR.dat,sha256=JxBZKaUKWLHNi01OliUAwDTlDAob7flGt2J_5gYaZRU,663
babel/locale-data/ca_IT.dat,sha256=F-cytzBQLU3eQ7d-eqwL5FBwUsyES-w7IenrpJfRGKU,644
babel/locale-data/ccp.dat,sha256=D-Z3zFzkvAtx4TFn94QvpQXfbzVSE3KNWIa7HRCCvJs,275311
babel/locale-data/ccp_BD.dat,sha256=X4bHc5AxNakoqr-IIiW5pXlshq1rkhmd4j0vASONKCY,627
babel/locale-data/ccp_IN.dat,sha256=CkS-g4E_3UpAWPJjcfSgLLlcyuD27IU-Qm4IWbAwj20,650
babel/locale-data/ce.dat,sha256=gwy0HT8b1m8DmGvv5a8wee3bFCNEYbDa0pwxlmJaonY,138724
babel/locale-data/ce_RU.dat,sha256=rKRXXvqaIlC_Tfa5SF9R6HucBA-8xKjx2A0rYkq6ico,644
babel/locale-data/ceb.dat,sha256=YwpY0r-7M6KN1YmcaLW7SgFSdx1yFp52mVqibrVQ4cs,14214
babel/locale-data/ceb_PH.dat,sha256=IIz-5_7M1McMnHJN34FagjNAKNFeyvgDIHo2RC0qaJo,627
babel/locale-data/cgg.dat,sha256=5Yi9LIsGO_eigtjnod_HlXYMFk7f_GyahSbPgM2yHkI,16281
babel/locale-data/cgg_UG.dat,sha256=29oSxuO0qn15ASh7buIKuXO7mY8l0CCjXPlLeTtqBGY,608
babel/locale-data/chr.dat,sha256=xXmjvaz3o4oorx1Mz8mSYeR0mY1U7m6Kk9FaIdIdK34,196079
babel/locale-data/chr_US.dat,sha256=j11CnbcC2COjt8xpooqGlEaMuY7HogdiNJLxKfeBvTU,645
babel/locale-data/ckb.dat,sha256=RkC398fj4MV-J3h5gXZIVvx02o-QNVoLejjxegf6QUY,41589
babel/locale-data/ckb_IQ.dat,sha256=aFZTJDR-waJrFCJrO2ugN4TRok8PWQ3gcEmdV6O_T7U,670
babel/locale-data/ckb_IR.dat,sha256=yrnqsVJoq9LsKcSg_ohDFgHkWBjxYrR24hlZOUSgk94,1222
babel/locale-data/cs.dat,sha256=jh-2Zl-BZDY4XdLcLQkUbirc0T3LoLD43EY63kfd-fo,287652
babel/locale-data/cs_CZ.dat,sha256=Imyqwx45p8yWaflAiltP7ccTxXK0F3potP7N2RTbv7s,644
babel/locale-data/cu.dat,sha256=rPG2xcL0oE-YmO73cZTNqfj0yY4mIKV2_58uWin5cXE,20286
babel/locale-data/cu_RU.dat,sha256=LkEMZZAlLI59QsMHcLj_yE9c7vvXGnFE1FSvnkgZkwE,644
babel/locale-data/cy.dat,sha256=eWrgesXXY9RM0NtaNKPdVocHizrtfpt1nKJFAawESl0,321884
babel/locale-data/cy_GB.dat,sha256=rCCg3lvwpJORx7LgBBF2dWsd6VnYybbrA2Na7gu7Q_I,644
babel/locale-data/da.dat,sha256=lE_A0Soj5f717xbJRW-885u210Qb80YafUnsIJ95y4U,197581
babel/locale-data/da_DK.dat,sha256=vP5m0YY7VSUJcHy4fJHTaaYnJFWKEv0N80rUCEd7pPw,644
babel/locale-data/da_GL.dat,sha256=OodsMwjqjnqXSimIZCOmUWDLLiIR9vvRj0imLbqx-mo,607
babel/locale-data/dav.dat,sha256=A8cH1vXScTUFVf2lRV0hMXQ957TF3vFcfxdejDO0hIo,16323
babel/locale-data/dav_KE.dat,sha256=tcXkL0o3AyPNTHJy5FlubLlhfHI6XzDwSK3lXSJMws4,627
babel/locale-data/de.dat,sha256=qIRVbYLDdmpybehjkMIM3VGlNVFPpUk9x5J1mIE4PUQ,197068
babel/locale-data/de_AT.dat,sha256=32JpQ4PJkEsB0dlBCz4BOqrFV6ANrXeYZivIGtw55OI,2581
babel/locale-data/de_BE.dat,sha256=pubC4Po4M_ZKPiT6EBNPMqi5TT9p_v-cf4V624OX2GE,644
babel/locale-data/de_CH.dat,sha256=DsfawA4hefcW9wyxOmvvkcmOdVQr4CivD37so9Bk_AY,4023
babel/locale-data/de_DE.dat,sha256=2ON8LeGdw4j5qNt9W0QKYTxxTZMTnAMR7pTw6qnwoHg,644
babel/locale-data/de_IT.dat,sha256=7adTDuD3BT7FDRebEbAq8VDJPVof1zhCfSTPFd0Ojm0,1637
babel/locale-data/de_LI.dat,sha256=cgNDay03PtZnrNp06QeLFXcLdsA8ObWQy9pW_NFepj8,1339
babel/locale-data/de_LU.dat,sha256=CQs6M5llCpctge33i5uLbxUzxTgNyuXa-izDdHwIVLg,1083
babel/locale-data/dje.dat,sha256=agpAQ8Rcw1YbFLLtsKktAqSazx2zpq8QpCNrHX7v2MI,16245
babel/locale-data/dje_NE.dat,sha256=RuHsfFP4RVlgcjI8SNx2Fu6TLMbxKkHMNcT-oiJIMOM,608
babel/locale-data/dsb.dat,sha256=kozmD1hEZMJgcGpEkRHvaYP2Qr8CJFI85L8fVIAu8hM,179612
babel/locale-data/dsb_DE.dat,sha256=7T-uUURejnX_8k9QPe_18AlJaUSEe9sA9TMmQ1wgZMQ,645
babel/locale-data/dua.dat,sha256=bcxuGLFcYCtVFRPd5SgDkhTWbuqkxOD3mSgpdGOY4Eg,5376
babel/locale-data/dua_CM.dat,sha256=lIrnKrSo0EoxlBu9GBhXq510jzSkiEsjqqUqC_995XE,627
babel/locale-data/dyo.dat,sha256=PnfWJWkoPW-ejx4amchVKh7Fgj0QUhQZRKunyHtTNxc,10562
babel/locale-data/dyo_SN.dat,sha256=-x1xQXODFTNEgMz82mei0ikGCKCtFqaxU_NfECwqST4,608
babel/locale-data/dz.dat,sha256=tJZ6GIwTI1Bdbu58kL1EkSXljEaKeK4m4izG2a9ILV8,89987
babel/locale-data/dz_BT.dat,sha256=VdAHDYTPNqFMnYGYbHo576XYFPG2UF384aLrehyaqts,626
babel/locale-data/ebu.dat,sha256=HbHtkTdQzr5YZAkDkcFVHLrgjvX666F3RtNfS0Pp8jY,16295
babel/locale-data/ebu_KE.dat,sha256=cTzjMTyTnaPHdpt23aNKauKqMbsLluKDRAtqLlEcHdM,627
babel/locale-data/ee.dat,sha256=sbuNGrchVAjxZSubXsHsHsZhHnxDF6EQvlUsBituVeY,142502
babel/locale-data/ee_GH.dat,sha256=wQJ8oXvauwAl57jr4kCI8Lbab1x5TkDHXekT4DFthso,607
babel/locale-data/ee_TG.dat,sha256=TM0UYyUrl-Bmt1jlWRIF5bV2I2VE66u05sKuR8FGEFY,1159
babel/locale-data/el.dat,sha256=p_pvI3tl89K1INhijzoF7kqTS-3O9G1E6ZJbrzFxxok,238804
babel/locale-data/el_CY.dat,sha256=VD2Go4Sc1zQVjMJtLGvnmuF5OPEIeywn2Wwf4H6Fdjk,626
babel/locale-data/el_GR.dat,sha256=zCFaaWmChFq2CF-AKZwRnBVUrM7g3sLNzZnJwrSIIZI,644
babel/locale-data/en.dat,sha256=wX1t7tIVoUaqjyZItj-cKAaXrfqsCGL7ECdLhTSIj-A,188908
babel/locale-data/en_001.dat,sha256=D2FJZ32li6xFhpO-R9idEpvtufrPSiN4ek0LRdzYTu0,22984
babel/locale-data/en_150.dat,sha256=qTgjmREIoEc2Tb0aLkbDyjAzCKmCT8TVzcCpLX-Ryy8,1783
babel/locale-data/en_AE.dat,sha256=CN_hxkBYRCd-a9Bz3FlCK-EFnZQK_toPEIc4XFZXiEw,4132
babel/locale-data/en_AG.dat,sha256=1DmA0Xy8J-0SnJ1Q6v4esqx9Pefv-HSW78yVFJmrj9U,645
babel/locale-data/en_AI.dat,sha256=bhCQZ-Z5tOZRQW3PTA1rUs1sQGjGEbKximNzwVSchG4,1197
babel/locale-data/en_AS.dat,sha256=_SIxul_ScgcJ-XykW7DL3KHVNv64MupuobtohitMP4c,626
babel/locale-data/en_AT.dat,sha256=0SVp9Ppii1u4xW0iw5g23pZgoOf5oGK25-irBqFVMns,1218
babel/locale-data/en_AU.dat,sha256=sWiCpDVuk_oH7fZe2a8dyMYEy8anAaewADDb7DQAw00,19371
babel/locale-data/en_BB.dat,sha256=baZlkeds3JOu-3UKCF8ujDV4rvfXYlaKgJ4Dc1fXqiI,626
babel/locale-data/en_BE.dat,sha256=a7P2EyuIaAjbXY7j58nq31PwGuZf1lYRFnojFYj_OMI,1511
babel/locale-data/en_BI.dat,sha256=bkq4k2bBo_E3A8wwX7QEnZkU5LtQdTrMk2-QQ4imhMw,1180
babel/locale-data/en_BM.dat,sha256=X6PvUgbDx6OwHMalkjAXDd0lydkRBsSBrZqNl6UVNoc,645
babel/locale-data/en_BS.dat,sha256=9TrCiUQfxHHx7g-yz-_GI2klqVu2g252j0LuXaktYRo,829
babel/locale-data/en_BW.dat,sha256=X-9K41JjPlc41gmxcpaodMoIwXn5fa96bQYbJqv-R_U,2789
babel/locale-data/en_BZ.dat,sha256=eWzZruSKi_tgKUOc2rXUdxwNefFNhkLWXEan5uKgYI8,2968
babel/locale-data/en_CA.dat,sha256=fjrU_3issiPH6OyYP7McT5ksLmvajnuZ-E1MeTGuN5o,23633
babel/locale-data/en_CC.dat,sha256=B5QeLVVvHi6KfCjRyhNIOqSCQOUZAqw2oXjAWJhgRnA,1178
babel/locale-data/en_CH.dat,sha256=3sFUD9lRJQzMY-3aEbRem9G11PSz5qK405qUUSAIJgA,1118
babel/locale-data/en_CK.dat,sha256=sK0edWgfCMJRg0cwNPMEybw4r3xMqvpWEqndFBiWNvw,1178
babel/locale-data/en_CM.dat,sha256=6bqtyCDo46KZ9i4uwBJFM0ycKp5xMfKM1k2otywINNk,1428
babel/locale-data/en_CX.dat,sha256=aBkfLVs1UrWVD6v5uwBtSWBPVV4laI_FJqzutMfgG9s,1178
babel/locale-data/en_CY.dat,sha256=ccjHkNGpGSiwfPpVuQ6i-bP6V1DUzgl-uZkksWdgSY8,626
babel/locale-data/en_DE.dat,sha256=VEBAVN7p29z-qYL4NfxSToa6NoODpWBrE2Ubt7lzrdQ,970
babel/locale-data/en_DG.dat,sha256=MwocxJMOwXkvTQWxNUWVrJJ0aoodMD_ynLWZmJw1bQc,1159
babel/locale-data/en_DK.dat,sha256=5FZcz_4YOiccWFgO78b17TMTraw3jHBQxZ9KGOFGPKo,2368
babel/locale-data/en_DM.dat,sha256=6Rm5kjxUpw1DEtfbgMyvqxGc3adeO1k3-d1m2Hmmpwg,645
babel/locale-data/en_ER.dat,sha256=txc2R0EnMpsjnCYuYvwmufbkFsZoAICHle1dqc9BffE,878
babel/locale-data/en_FI.dat,sha256=ZzcResQZZ2FjJ_mibuL3uUNoko6y7eLBmnL-csiHl2A,2300
babel/locale-data/en_FJ.dat,sha256=AkxJVXEQLA1Ua0DngWALCkrXqrUubqYV19gSTpzSz4g,663
babel/locale-data/en_FK.dat,sha256=DyyvgOqM5DTTLJd_q4p3LxhnoGDiJTIQGKGNxhmIou8,1201
babel/locale-data/en_FM.dat,sha256=H--72gqzWZz5eW4lUNxBsNBxCln8004Xx65RlJ2S2lA,607
babel/locale-data/en_GB.dat,sha256=97zYSLKA0m4v7P-V_TFSN_UKyIUKDZAjTftemDkO-oc,4341
babel/locale-data/en_GD.dat,sha256=bgvDAPFq8l7HTa1kE5IzpVU29YsGZkEmmqyIsSRCJQU,626
babel/locale-data/en_GG.dat,sha256=ifKq9gm5rf9YNecYWdijPzNYoI_Qf1dFozvQIhDR8Y0,1264
babel/locale-data/en_GH.dat,sha256=hy1ltceBe1aTrg3z-DHmfB-bnAfWYpEA1OEZ5gsyql4,880
babel/locale-data/en_GI.dat,sha256=1Iy-rJ22TireT4CzQfqaqi3a202-tCvmb7zdJ4314is,1219
babel/locale-data/en_GM.dat,sha256=z2DFG5DR5B8RtTTIsVwZATy0S8rv6zAWLyRscQd3k8w,876
babel/locale-data/en_GU.dat,sha256=bMtawZxXvjc5yRXtQXrjZPTX4ZCMpnNF4CVS_1F9K5w,706
babel/locale-data/en_GY.dat,sha256=BqU6DCTro_M6hKRhOa9m0hyBDkpP0sB8RfHbDP2qrVo,685
babel/locale-data/en_HK.dat,sha256=ECm3X9TpRz3BRiZzS5PE9PPWavfqzmIOtxKHWJViFl4,2041
babel/locale-data/en_IE.dat,sha256=2lBAkPxrSoaj7bZJk8cji60rG8vvmccyjGpqDhpnBTw,2061
babel/locale-data/en_IL.dat,sha256=AX8nfaJRv06sLvsAwjd_6T-4Bq3bsUX2t09IbslQuh0,1415
babel/locale-data/en_IM.dat,sha256=H0aqDWIDNMcvtiWVlyCxLrUuKck6W4Z7PSaFTBgZN4w,1264
babel/locale-data/en_IN.dat,sha256=V9VhRVn8_5Gxz-flT_wSPUXB-ZeQvrxkHQ054fe70I4,2935
babel/locale-data/en_IO.dat,sha256=XHbYlZcZAPiASCNOgblEjjfEteKK1t_yMs5KuH7mbXw,1159
babel/locale-data/en_JE.dat,sha256=mTXSvtZBCgkwSDw_98BlFoHt4t8HmT8LpG4EwyLxFXg,1264
babel/locale-data/en_JM.dat,sha256=bkStMWRlXL3avU9nP8SqLr3RgexXFf2759B-ddWpYSU,1617
babel/locale-data/en_KE.dat,sha256=zIumuglOQkXXw6UBWKjYVsM4Xh9ofXtjzSSELyG0dek,1449
babel/locale-data/en_KI.dat,sha256=yzrJdQnlYEqBLzn0_lhvdvwLgO8PNu7amY049pRWNvY,626
babel/locale-data/en_KN.dat,sha256=Okq8Q5sfYpMAFO1mWI0zrnt5T1HOIS0RsizwmOvDnvg,626
babel/locale-data/en_KY.dat,sha256=6OZST-EB0kOfsSXlH3Lf50yIDUXEqb3Tv4pt41bHCcI,810
babel/locale-data/en_LC.dat,sha256=uT6fq9Y7SonQiwTniGmVdoEiRD8V9xnG2v0JPq7_JHA,626
babel/locale-data/en_LR.dat,sha256=3X0kSLR9P2riE7L3coz02uSB0RBvBjmGDI4xNw9IDbE,876
babel/locale-data/en_LS.dat,sha256=C-zMOTGHLkrT9Rcy7Fb6iyqdsLVxTFEkfDBMxq1bnhA,876
babel/locale-data/en_MG.dat,sha256=2tWGxQYUoBOnqap1IPgCbk-uEOJVohjPMwJwm3eZ-Q0,1429
babel/locale-data/en_MH.dat,sha256=bbe847fcBp-4kzZv-XJvFWSbVz0p9RyUz11Q5BBkyrk,1359
babel/locale-data/en_MO.dat,sha256=pL92dz8HCGnjF-wdGm8wsnouPCLFTCOE7vhstf8XpfM,821
babel/locale-data/en_MP.dat,sha256=15WnCMndLQPYhH94O54yb39H-WI_Cbv1wOs226UjhEA,1340
babel/locale-data/en_MS.dat,sha256=HKKSWqRV5wLDYJ8bsfptoeUmTKM4WF6uQXCCWSn4tAI,1178
babel/locale-data/en_MT.dat,sha256=jG_r8nn4zfVenRg4NnDCE49KUwgwSZMULF1fn6-Aaxc,1945
babel/locale-data/en_MU.dat,sha256=dTXBxkoStB11NJEfCI7Lk-aikFtQfNbzqu_AO00Dv8o,1429
babel/locale-data/en_MW.dat,sha256=S3sP1oPcKqzi1LuD0RPS_zhHjh-QwML8N690WMu4lwE,877
babel/locale-data/en_MY.dat,sha256=r7yQs7ToO6rVdU03_THwkvj5of3irIgsaBP7NVVa-hg,707
babel/locale-data/en_NA.dat,sha256=TUtOUjM6gdOCCxRo1hyY2uD0FAxuAsJ5zX2ttnqi3PU,876
babel/locale-data/en_NF.dat,sha256=3Ax90cl26hC11xws1R1BR7f3a3Aq0bir0iLJpoZyQS8,1178
babel/locale-data/en_NG.dat,sha256=sFZNrlCMZepXl5e9keqii9Z5zFuyS16R8oseYHN7T6o,1430
babel/locale-data/en_NL.dat,sha256=5nDlKVas8Unr6igs2LEZP-vABuwzCm_-FouqtOoi76Q,1115
babel/locale-data/en_NR.dat,sha256=CYRxajoGhR7Q4_cLTM7e0CxZ5WvRkuIAPB78bMt-sFU,1178
babel/locale-data/en_NU.dat,sha256=CCM0oHPRMBwNCGlNJm94krl1zyJvVCTIr4yD9XOTers,1178
babel/locale-data/en_NZ.dat,sha256=-BiOtyCtqLAyIOwsI-IlWLi0vjoxUAOkqR9I58QLOWw,2252
babel/locale-data/en_PG.dat,sha256=g6U0Ch-VKEDfF67z7xPDto7M21uck2BLN1fxMVdYUN4,626
babel/locale-data/en_PH.dat,sha256=iyRv_Jzm5_mzlOEv57K5SY0F1p7Q62IEEhSwl7-zl3Y,647
babel/locale-data/en_PK.dat,sha256=VgvTUaova5Mn2m1PH1vmTL5SY47fiF52g-0rNlFxNGE,1977
babel/locale-data/en_PN.dat,sha256=uw5Q9dusFuS0N_WpHusewTgruprVn6rH5AmAcTqNkhA,1178
babel/locale-data/en_PR.dat,sha256=wiMMS_iLTFOKBnPfXBKi8axJ18gZs_AhsSX-C5xbXuc,626
babel/locale-data/en_PW.dat,sha256=YsAyfY2ZCIxcH7vjdDhhJw0i1aZBUjnhswCmvFPTcEI,791
babel/locale-data/en_RW.dat,sha256=SXtqSRArmZ8Ae6tRLBVKN9U2jbcj4SBMVlmJOPfFY88,1429
babel/locale-data/en_SB.dat,sha256=TeRvJTZaVeth3jfMShL4J0uOP-c1ALqPuGz4Eay40y0,626
babel/locale-data/en_SC.dat,sha256=lUN96sufcnMy_OfIOEl6UCRSSvo_QItmM9rrwBHWLBQ,1179
babel/locale-data/en_SD.dat,sha256=0HivywfMrAPu5oRYBvds840J3Z6VyuucNEwLVQtYLA0,919
babel/locale-data/en_SE.dat,sha256=Nu0YE8yE53k2b9-z2_v0psDPiBEXS3CSUj1qRyvMUoo,1445
babel/locale-data/en_SG.dat,sha256=LT5fEP_actBmosDXIwGlfrS1aCuLJpN3ZOZA4XzVjfU,2075
babel/locale-data/en_SH.dat,sha256=5XMQM5SJRvoOIRqaR41oTHFJExn5V7GDUX5xiWlwF4E,1201
babel/locale-data/en_SI.dat,sha256=UjOS7UvVNnplRgs7YHYq_y3VO1mOaa989GxkXgaBMgE,986
babel/locale-data/en_SL.dat,sha256=1rmpoVhWrAXrcs-bHLXkrg-kpDL_YZalzDuH2fqR4k4,877
babel/locale-data/en_SS.dat,sha256=oGCDgGIjDXUK9hT1suYMfML6oHRHm313ecMk7k3nNmY,899
babel/locale-data/en_SX.dat,sha256=9s9Gw3t7w-GJsdo6kj-1x0g2TqQQmwfjPN3HbK8UGFQ,1181
babel/locale-data/en_SZ.dat,sha256=9Z4vBh4OBz9qkogw6-_gC5TQMhZBr88afkxbW6W9sek,876
babel/locale-data/en_TC.dat,sha256=jSfmNR9nqY3QY3N1OV5hlpZqi1zbULjy6FoBgkp1yWw,607
babel/locale-data/en_TK.dat,sha256=7Gy79svNx87Zoojlbh47BuKDzXGnX8MAtDZfp8lwgVs,1178
babel/locale-data/en_TO.dat,sha256=_jEqtNA13O7OvHiS2nYxJRJkSVTEwHp0Gz8a9Ap2Qi0,627
babel/locale-data/en_TT.dat,sha256=vckW6xKEehZYDQSnUNFc4atkBHUoYuQIHwSh2955a0w,645
babel/locale-data/en_TV.dat,sha256=zxOKaQFXMQ-Xuop3ypoHtrkNnjJxEsBMLzY8qo06_4Q,1178
babel/locale-data/en_TZ.dat,sha256=y1E2NWDNV24pOB07058E130ucyopZL-ES-J3BLZxf2g,1430
babel/locale-data/en_UG.dat,sha256=YQAlu-EAk9G9yvfvTQ15JGjfHYdBcaaspXwLDlbQ44g,1430
babel/locale-data/en_UM.dat,sha256=-dAHtvQRXZvhqFx4Ywp5ZfEmyLmmas7IoEyZqiUMBNk,644
babel/locale-data/en_US.dat,sha256=MXmrAUts6riPcAPxycocGvrM5Pe1Yy4c1bgrMf1X1CM,644
babel/locale-data/en_US_POSIX.dat,sha256=ItCAoaRpz7l_hVn33T09k8oO6G2zaTPLVhetlzyRu1Q,1222
babel/locale-data/en_VC.dat,sha256=Iw2ujy8fVyq5JqWFMZpI4mV8Se5tshArasCTGBiiAYw,626
babel/locale-data/en_VG.dat,sha256=4bSbfJa4Ce2prdCxLLgLLavOIgLzDd8SPAXOudWIGbE,607
babel/locale-data/en_VI.dat,sha256=z93RamsD556JVbwZ4QgFpZl51wlljnQL2PaLjZz-AIU,644
babel/locale-data/en_VU.dat,sha256=G35aw89Q2xsVnTFS4KD01XW2zejaqcEovjriXjcTh0U,627
babel/locale-data/en_WS.dat,sha256=Mugt5NlU0-LzAyWlSsLv7yUli8JgZdwcuwnxsRiU0pU,647
babel/locale-data/en_ZA.dat,sha256=MBf_0lOrGeM0Arv0-lAbLO3W8UR8WYdDwyhBGyWSMbY,3290
babel/locale-data/en_ZM.dat,sha256=QF860N1xHPumZFZUTGddFIUF6SGBBzga4-QoFozR13E,876
babel/locale-data/en_ZW.dat,sha256=yY7aWXU5ZJbBowJmIGIa5RvoanIkTHvOiiQqIp63jis,3220
babel/locale-data/eo.dat,sha256=TMUDwM_wjcv8djKo31VYxyFR3Mt_LIiEisfBu_pqN6k,40766
babel/locale-data/eo_001.dat,sha256=tSaGBVAG3TxoCtDe47FyjEQ5TfafFOfiLMuGo_UHtRA,841
babel/locale-data/es.dat,sha256=VaR2n-jrrDSsyTdDayniQ3astW1gipiOHaQPQHBWEdE,194176
babel/locale-data/es_419.dat,sha256=nUWG6Iwzuf3F3b0JTiSMPWWLrvY0rpjdoTybS2dxfYM,26732
babel/locale-data/es_AR.dat,sha256=Ghc1MeHAXi16RC3ZKebD5d2woK4nAJQ65f4BkCBO4VQ,9240
babel/locale-data/es_BO.dat,sha256=aQDwHqAMdFenAwv6-_r03hhEoyiDyxLZXzocEbBJfsQ,1995
babel/locale-data/es_BR.dat,sha256=QZywQ5KZyLte_fNcqbDIygsPzmDF6Ja9As1TFzHMyL0,646
babel/locale-data/es_BZ.dat,sha256=a7sxdDb9LL0tGBxsi1BDaAp6f5Uja3sCJUxhD3RHHHg,645
babel/locale-data/es_CL.dat,sha256=1EN5nTveM5IM2j8yUW8Y1-9ETVwCb8zzp4OGfLQxbko,5519
babel/locale-data/es_CO.dat,sha256=5t2IwUjWhe4ac35CmHySMf3T1h53HVwVTkU-ArphtUE,8827
babel/locale-data/es_CR.dat,sha256=2BdF9W_FF2r69u1RwZVZYo5mpZtSZ09VQXYLLZDMzzY,1840
babel/locale-data/es_CU.dat,sha256=sgvidA7XSwMT_7G8aC-Wa0ORz6uo183Wi-Kqfi6MB9Q,647
babel/locale-data/es_DO.dat,sha256=Ky4Hi1jNM_D54yZqdOHHcJo3p955IR4UqoWOcf8EoC4,4375
babel/locale-data/es_EA.dat,sha256=KsGmYEQF3RGUBwIl6cy9rrK_w6EfBFQEumG_eUjfLs4,607
babel/locale-data/es_EC.dat,sha256=QuO779SP9qI4P3ibEvXN85Vz5TNZwVawZ2xzSsX_ls4,3428
babel/locale-data/es_ES.dat,sha256=h4CfqSZjQiBcat4Ail-hSnB-m-Y_NugqeBfxIgMt4bc,644
babel/locale-data/es_GQ.dat,sha256=RQKztBLLAiTfMLf3BGg7dKptJiuAtnJnqCzDDwsNsPk,890
babel/locale-data/es_GT.dat,sha256=9AynkT_3-f1NgQwjHLhDBuTdk1g-fEk6L-lgByM9UzM,5401
babel/locale-data/es_HN.dat,sha256=HG_KSm5wCWirqFgpkqsblYDIP-DvG8uXCJl5SerlPB4,3630
babel/locale-data/es_IC.dat,sha256=CVkbqGdI9IV5YLwQm98JmeV_j9aNVBVXfybiAfUllTM,607
babel/locale-data/es_MX.dat,sha256=RtDHQqHZ0k4x6swSZzqEBAMz1H0dDvg1dbp6x3c84bc,30227
babel/locale-data/es_NI.dat,sha256=PoUvRbw15FFGGMSXH1UcGAMFDE56pUhCwqMy-OQJONI,1774
babel/locale-data/es_PA.dat,sha256=_FLAiUSNiqSMOo_4Rie9jUQbuRyPvWayhasf0h2offg,4038
babel/locale-data/es_PE.dat,sha256=J7BX7ZMyKLKaoZqdnaJ6ZhEE8IobYAgdbr3cdKdmZJo,4997
babel/locale-data/es_PH.dat,sha256=GjEpZddkkAk4djW5BGTdAbNB3uNLxyF9gRI0Bq9TJ3I,1223
babel/locale-data/es_PR.dat,sha256=r1ZKqoFKiRSgmnMsQqmrUg6YJE6mIQ7X9XgpE0G40Ys,3899
babel/locale-data/es_PY.dat,sha256=JbyP6zYSw27ITxC1cnjOG9GdF9uyvYkvTHN7Tu0a7-4,5696
babel/locale-data/es_SV.dat,sha256=tjtwln9QSey5X6pYLlGnjTAhqHr-qWB0QpG4w2njsAE,1482
babel/locale-data/es_US.dat,sha256=VrgZvQX1GgetFpYpHvckiQYogVWRwjc2M8D-7TxZv2Y,24121
babel/locale-data/es_UY.dat,sha256=tim90leiltAPHB6PL4tKlPxtRdOQeyGdZkmhcX3Mt_k,2620
babel/locale-data/es_VE.dat,sha256=zoBdAd14aue2QuyRO3mezQrhE9cxwcBf9NKlk7ztd2A,3869
babel/locale-data/et.dat,sha256=24aCVLFHNppuQ0X_vnBr4OVFcmWZe5dupyyxcfTEe-I,196651
babel/locale-data/et_EE.dat,sha256=UwAPPde8mci_crGM2PS2J8THqUklf4iLC0LNkJfhIm0,644
babel/locale-data/eu.dat,sha256=WVuvurT0swPV-ulsfGd2jOpdLnXcbeDs2Ffwf8Q-ulU,173710
babel/locale-data/eu_ES.dat,sha256=e2mycbz_gicbFO2NxOroBar1paVtVks6rbKU0DQk6hQ,644
babel/locale-data/ewo.dat,sha256=CVDmRkKDgI98Ivojg5oKXKmA7nVSweqZwBOXA8GhMe8,17648
babel/locale-data/ewo_CM.dat,sha256=yI-aZ1OfnkLk61VJZjwNOTD7D2vMJtMSLKsd00E59uw,627
babel/locale-data/fa.dat,sha256=FKYp2fb-CSGnNTlCC3A7rMbyzhsLtRVuNKD5P26dhFo,209713
babel/locale-data/fa_AF.dat,sha256=NaSQ96MgGR5EB_RrJuP7gFiVrb6loUYEMYcypy7zyoI,10921
babel/locale-data/fa_IR.dat,sha256=_6JotyeGMhpci4hEoWxCqlzsc95z74XWfNvGlGLtWLU,669
babel/locale-data/ff.dat,sha256=xPo7THascqSO1Rwq2MGxSCutINq4u6E0KdHNA1auG-o,16137
babel/locale-data/ff_Latn.dat,sha256=qOic-JuCdeeklvJgvz_ic-aw9d3EsppDxyFQm7wj0mM,857
babel/locale-data/ff_Latn_BF.dat,sha256=TBLGrbWzDpgdEEYFKQkpZQkv2I0K51gAkxkurqqohVg,607
babel/locale-data/ff_Latn_CM.dat,sha256=ZQcoR9AgeNUiLmlOJpSHw3Yd5sbahiRIaB2lsQkOsWw,626
babel/locale-data/ff_Latn_GH.dat,sha256=7DSLmQiwlps_cxa7MaALYb7DX_AVYlGnu15UqDtApyw,1206
babel/locale-data/ff_Latn_GM.dat,sha256=xbEOy_TAIY-LSlRkH64Vsg9xfbKVrCkmwamam8Z3xds,1202
babel/locale-data/ff_Latn_GN.dat,sha256=ULYUzwcPqC_gimeYGNJH_j-bIOlzZ20uoedKbXB6jxc,627
babel/locale-data/ff_Latn_GW.dat,sha256=lTepLAkz6EAUlbB21jVvqGFUKf5JtLzxaOViEFlwj9o,607
babel/locale-data/ff_Latn_LR.dat,sha256=Lw-PTOI2dHUkdIDKR0M2QaJCGyI0MUHJK79r_khRokA,1202
babel/locale-data/ff_Latn_MR.dat,sha256=taaeZq7jyy_js3p3c0Yu5UNx4qqUTZ6zMRNowaqodLY,1203
babel/locale-data/ff_Latn_NE.dat,sha256=iRB6Y3Yvt1tzteou4XSPNImRDVwE9N89BZ21Y8n9A1U,607
babel/locale-data/ff_Latn_NG.dat,sha256=iYPaPREiLDN1GaFfnhAPlFgOIMeGiUBcESuCiffDGnI,628
babel/locale-data/ff_Latn_SL.dat,sha256=_u93myYrYvpfjoKunJyec1UR0N_sLUQwHftaG9RPOns,1203
babel/locale-data/ff_Latn_SN.dat,sha256=-2Hxjt9xNLa_654UcxzMMv1KwUzUhE1wKPyg6jJ-cJU,607
babel/locale-data/fi.dat,sha256=czptLtqLLwRaT87E8j4viQYquDALQk_dO4Z38WvE0Yk,220945
babel/locale-data/fi_FI.dat,sha256=MGv__27w2XhG65cGxiclFzXkB_D_mtD80vGGsy6nGHQ,644
babel/locale-data/fil.dat,sha256=BOUOPdsMPhiofGhRVZanQzT3o3b8bK3V-bPqJ3tMKAo,172841
babel/locale-data/fil_PH.dat,sha256=MTbJNbhtGJjMyeNVaDc06RxfS4iJax53eUzWVERHSzk,627
babel/locale-data/fo.dat,sha256=kCxt3Qo3lYS5H-DL_DHwQOsIYEqOkgs_GtQQ44Cozv0,157255
babel/locale-data/fo_DK.dat,sha256=lmV9_xmi7w1HrXr5Yw7buNhw8hkF5DuWjQByYKIFm64,665
babel/locale-data/fo_FO.dat,sha256=1YHlmzgNj00QkxBql37zGh2Xk59lIuEbf4AKb7eTPSk,644
babel/locale-data/fr.dat,sha256=OGxp5sUu9_y5IP-Ku2J-5FDGvkpVbTqOGgQ36ZXt7PY,219084
babel/locale-data/fr_BE.dat,sha256=XvJOf1Tlc0LpQ3-hhQMfSC_XiiGOSR4P-bHQPtcboBM,1272
babel/locale-data/fr_BF.dat,sha256=Yg6rGyEXEZDbXdN1s2EmVqgVKAzdkaSRsWYbbF9QIW4,607
babel/locale-data/fr_BI.dat,sha256=QTAzACKRrDjWBIvPnuh-S7pKSgQ0-EaPibEA9bnw-2Y,628
babel/locale-data/fr_BJ.dat,sha256=84mKliQXBjf3pNe-WKeZERB1Bcdtxy-SZL8uMHZal_c,607
babel/locale-data/fr_BL.dat,sha256=Ka59fV0FRq0JzEeNzq-St-Mf848YNmOCCKEpLp4EX5g,607
babel/locale-data/fr_CA.dat,sha256=J6ijg4KmEIHf2UergLrNzEP8TdL7s-7iYK188NvccSg,66182
babel/locale-data/fr_CD.dat,sha256=iqZnRL-wo8a8aVUWQElzQt2-Gue91GXrjaxZZ5JgmJ8,1124
babel/locale-data/fr_CF.dat,sha256=RwuuRJZlNtIhH0rxZ0Q_mfYx_Z5Q3HA_D52-qMSNaUY,607
babel/locale-data/fr_CG.dat,sha256=GLdmlB2XcqX8tkO6l77gX8QUiA1-5eoQG9392mOXupI,607
babel/locale-data/fr_CH.dat,sha256=i1hobiCDrCYMXMOmTILEGR33AgD_S4Idqo_xXn7g0SY,3101
babel/locale-data/fr_CI.dat,sha256=AMmxI3EDyAk6_eB5vGbm14Z2bUL2RkkkgjOLqqYwrZA,607
babel/locale-data/fr_CM.dat,sha256=_EXjlq9zVSLhwAr9dlGsxBYYaLBuSYIJ_-i3yQy62ns,2101
babel/locale-data/fr_DJ.dat,sha256=eahykN-Lv0UwRDXuwv7-28RSO9l8kC9mOOHHXG99Ad0,1223
babel/locale-data/fr_DZ.dat,sha256=JKNF1ht8PGAL4-e60lungLzK4K20v4DGZbNQt15o3fs,1265
babel/locale-data/fr_FR.dat,sha256=a3YB7XtoKNc7Xdt-U_6EuFyVBEgFgHeZ9CvBc3Yzjx4,644
babel/locale-data/fr_GA.dat,sha256=Ps4qHm0s51rRNwpSw2YbSexqC7sDYMfyu0zL0iJc6b8,607
babel/locale-data/fr_GF.dat,sha256=F8q_LQGRmooV6LxNIHDfnG3oDXXGnYYopP-ujwDSizw,710
babel/locale-data/fr_GN.dat,sha256=pq1ao_Medwq07tp6P5AtqZPlrBzqtIA2R6ywLllJyQY,627
babel/locale-data/fr_GP.dat,sha256=weJ00L82hKf6xOGLC61Tij1VJ5H3bvN0dnSUEUV27Pg,644
babel/locale-data/fr_GQ.dat,sha256=KwtyyIOmimlf-5-PEfzlJsztaM0CXx13IDZ68jdBYmo,607
babel/locale-data/fr_HT.dat,sha256=JcnL7Nkbmlcm2GsiQIxnEcrB5VoeHuw0i9Io3ujI640,1891
babel/locale-data/fr_KM.dat,sha256=wAFOqIYkxtC8fubh9W9hKEOw89O2qmIWGH-z8m4zC3Y,627
babel/locale-data/fr_LU.dat,sha256=X48QX-y6C5HuwtOvBCYjYbG153us51yvLE66MTYk0g8,705
babel/locale-data/fr_MA.dat,sha256=HAKjUmYRtiYg5bPuxpmWOiETyHSM2e3F0MJKyF7clRo,1295
babel/locale-data/fr_MC.dat,sha256=xg-cqOKfvudfHpU0YEWJwKBYdPUUCyf04623NkzlPIA,644
babel/locale-data/fr_MF.dat,sha256=y7K9sxuz2cfiM5mxj5HP3vUrFwUvxdNqhNXBmf7IrhQ,607
babel/locale-data/fr_MG.dat,sha256=Ie_c98hiYNsbSsj3XgSZBv8vBsDJvGhPXD7cBBtzSSY,627
babel/locale-data/fr_ML.dat,sha256=xtckB_DZJRbd9j-aekggaDo2wtG4K4Q2MeG3GBupvPM,1144
babel/locale-data/fr_MQ.dat,sha256=taQ9FDzbIrvD6LgkraEmPVD_Un0unsJXkgkU1rH_718,644
babel/locale-data/fr_MR.dat,sha256=PbXQYUYZlFU8URmI8OeZ6O7SAZZOx_TCL2bxs_ilAxI,1203
babel/locale-data/fr_MU.dat,sha256=8fELzIJhgczk9JucdI1IMikCSnL5k8LCk1dS68q6opg,627
babel/locale-data/fr_NC.dat,sha256=uMR2yxfoIpxTTmeGka9y7p0hnL3ch6F24SBvbDLrl8s,607
babel/locale-data/fr_NE.dat,sha256=Qx4bREydf4aupR9SU7ZZt72aoVBHzDSdQs2bWnDTa_Y,607
babel/locale-data/fr_PF.dat,sha256=nvJ7u7lByAKHmmz4HghF9_RaL5f3r2HF4YRyOMl8AKM,607
babel/locale-data/fr_PM.dat,sha256=uorRfZ9XXMmL3UebWphyYLgmkIQaKgHBQfR2YDbKwWU,607
babel/locale-data/fr_RE.dat,sha256=biR9VqHmRXkXuNVbp62tu5m0e47UOupW8xLHCseLfzs,1160
babel/locale-data/fr_RW.dat,sha256=ya3hnx8I_04vbYN8UolfgHuDGYsxIMyIcC99i6hxgYI,627
babel/locale-data/fr_SC.dat,sha256=_l7VQ0RTuCTNdRpKIb4_59iTeU5ACXYRTQ6MTrg2CHM,627
babel/locale-data/fr_SN.dat,sha256=vUOjpMoha0OtOvwn70YnaafSUc_KwL2iwgQzeYWjH6o,1295
babel/locale-data/fr_SY.dat,sha256=ue9tpydvd35pkJSa3spqtBLRhVNesB8cUHGsaV6_xhk,1265
babel/locale-data/fr_TD.dat,sha256=txJhV9BQyT0mzhyO--I5U4Tg7aFJybP1mIFWGCnY9i8,1183
babel/locale-data/fr_TG.dat,sha256=6wDKXhxKopznkvtYoOrdWSnoyG6uFIZBMfsVBaicOPI,607
babel/locale-data/fr_TN.dat,sha256=Ezx2vA1loQOWkUJ7J4AJp9kkNOG1LZtht3aFo5RpelQ,1203
babel/locale-data/fr_VU.dat,sha256=ZgQ6sA467JMwLeFluaFNu0K371_nB6U60xoVu8f5-Ag,1203
babel/locale-data/fr_WF.dat,sha256=3cX5YsVQSnIWvtZUfWDvmS6j1ROn5n2y7NQhaMVd2BA,607
babel/locale-data/fr_YT.dat,sha256=PlyHp0evijlgZNqwlqzGA3Vd5Sg-8YqAshn0qa2DOjk,607
babel/locale-data/fur.dat,sha256=l7MnjsGyf6paBvhc2ptmAzs76ozv3dFl9ZOgKxsF5uE,35099
babel/locale-data/fur_IT.dat,sha256=ejwvN9cxtQZwBkyXQAZpNYUzYFysgFxVgvXVKclQJRc,645
babel/locale-data/fy.dat,sha256=G_LaZPkRr04wFmJ9kGuI_AeG52QymjLrPEVwbooJfWQ,110136
babel/locale-data/fy_NL.dat,sha256=nhxKtw7-G25m_7b7tSRqOJnimegsXUPL4HUh-5A1ZaE,644
babel/locale-data/ga.dat,sha256=pOfrnacrPyVVIj2mIVQ3Zx3xuLpsfiyQ5MkpQrcySQE,315363
babel/locale-data/ga_IE.dat,sha256=EnRVPIh4VUjDfkiB9s02m2TP3vDnBaHlmKPgfW95AbI,644
babel/locale-data/gd.dat,sha256=F7tTnoJpF_v73ELahGQKGS8JxkYOErOa_rRsoeFp7wY,286062
babel/locale-data/gd_GB.dat,sha256=U0i4ctdbsfL5CoppA4cD5B98vSfsfz0liAAGQ0A81bY,644
babel/locale-data/gl.dat,sha256=wD6yvNvveYtPHMlxgnPDol4n2w2sJxeE3nBJTLZZrT8,171486
babel/locale-data/gl_ES.dat,sha256=QnkGnjNmjUPyyrlCJH_ERU8d2R7hoxwaOjgAnDsrr4k,644
babel/locale-data/gsw.dat,sha256=qggIqARI0NVgVe3t1I6BqiufNHifSpVwZZKuEvr4Jh0,108107
babel/locale-data/gsw_CH.dat,sha256=MYXozdZ0H_TO_tLGex3-9jMtxwA_ggC67YOtIL7HVP4,645
babel/locale-data/gsw_FR.dat,sha256=Tqt7-0qu6jwWgmUJqpE-IlXVdxJWwSzl0CL5fFjvsrU,645
babel/locale-data/gsw_LI.dat,sha256=z97gmIurjhls6p3KuVQaEjtVhKMN3Gb1N6DZFp4Z2X8,645
babel/locale-data/gu.dat,sha256=EPgHFPlwI-8galuxjZfM_SKN30m5FxFNuHs94u0DN-8,240477
babel/locale-data/gu_IN.dat,sha256=IKkO1dxbal-2z4ryCnkkfqnIq9ODz7mkcIA1qTMHqz0,649
babel/locale-data/guz.dat,sha256=p_lLOLBUf11NUyX3s_ko99ZWvzznAfoLt8eZzfHzNVA,16068
babel/locale-data/guz_KE.dat,sha256=mZPi0_BX7npx8EdqhpWJind4kbNhw7OYAAqu7lAo-H0,627
babel/locale-data/gv.dat,sha256=0Dl1uBLCFLB7Az64CxnnqE4q8LIfSS0aPeAce-Vkxg8,4167
babel/locale-data/gv_IM.dat,sha256=PABxweL3RYxPq4l55rn6LROd-5DVwKZ0pysu1Fuc6nI,625
babel/locale-data/ha.dat,sha256=Qoz8fQprv6EosR4QwGBn7fWFrhclPtxFWuht4SWYpes,48450
babel/locale-data/ha_GH.dat,sha256=w8NWdFj6TIKsC8eo2kWorNwgLj4sZYYi56ufkWfzySw,1206
babel/locale-data/ha_NE.dat,sha256=J2YetP7_CacIyuOkdRf6iiqsJ5u7RdLH5n_4UHFUyUc,48142
babel/locale-data/ha_NG.dat,sha256=jlzeaMkYJFe_hIpCbfJIZn98hJWUh7EAroefrGANiqg,607
babel/locale-data/haw.dat,sha256=tXRuf2DBns0_OvMJt1wNoQkknnKXG97hHLqo1ixldzw,16127
babel/locale-data/haw_US.dat,sha256=oOE5jDDNwZpoRIAsW9IH9z8O4dJvDkJGBcrhxqclTag,645
babel/locale-data/he.dat,sha256=oz7v2LgGDOqaDQM7PX6N_YVZwKS-o1wu1GcrhKJ7wJU,261916
babel/locale-data/he_IL.dat,sha256=t5wXL5OtYL02_veNJ6q8Jjl6tO_rvngx-k-ET_8Rke4,669
babel/locale-data/hi.dat,sha256=qN2bvRPesEdxGLGXCXGGs8kXyqZFaFOs-OtOcwqtfK0,236155
babel/locale-data/hi_IN.dat,sha256=_E26Mtk63x0S_sHBIDa0OH2l-671oKocLyKNbyOxhts,649
babel/locale-data/hr.dat,sha256=XidD6n4-tSsjxwUu0Du6XuQmxSuY4EoH6FwOkIHzuoA,219476
babel/locale-data/hr_BA.dat,sha256=vXmTmPdhw_3UK7Uq-DtS69o4hV1p9qh_ATXztcz-edI,1179
babel/locale-data/hr_HR.dat,sha256=mOAx3MaOIHtwTdxBS2LqjvttQODxHsqDlUHHFolsE2Q,626
babel/locale-data/hsb.dat,sha256=0WoqoPYp46ku2fxzcewLkyXAA3sjnCwkwwd59DKAAMU,179147
babel/locale-data/hsb_DE.dat,sha256=AD3yaZypLO6rR-ljF8F3NnVJxCYYCxL9WTMUpagn6Qg,645
babel/locale-data/hu.dat,sha256=bokUuxUQyJkPGvtaEesVa3BVOS0WZ6ZLREN8lb0YtNs,190503
babel/locale-data/hu_HU.dat,sha256=HzJJfSglsxs-2KNMktuKpZ9yOMa6bfQ7eudxGh0orHk,644
babel/locale-data/hy.dat,sha256=USOsG-90IoRXB-uvsQcCvwFskJS9MIuRcQ6ZYcO2tB4,207877
babel/locale-data/hy_AM.dat,sha256=E4cN87TIR1DzbY8ih_H4bv-s6sC0EuAO2F1l3I7xKt4,626
babel/locale-data/ia.dat,sha256=AbRm3U78keo7BHpisZrZhxe9zH3Ss846DrslrRo52z0,112799
babel/locale-data/ia_001.dat,sha256=hlAa0qtQHkLi2GpqHmsEyROZth9cXgmAH1-4X3dGlR8,932
babel/locale-data/id.dat,sha256=7FGnheeRztRFIuqveQHXi--GtIBJX5eGHZ3DiFEc9VQ,159525
babel/locale-data/id_ID.dat,sha256=89br-9nXjDl_YMYlmEZsXntLYg3zVvhnWhPW7I8TsK4,626
babel/locale-data/ig.dat,sha256=FJX1bguZTb9nzeGLvV0-rCCPMSJD4zNBB4vRovFhnDk,19576
babel/locale-data/ig_NG.dat,sha256=zLSkkEBmGK6ao-gQHmpoLw0QGnpk9AIfpHuwReF436U,607
babel/locale-data/ii.dat,sha256=jqN5Jw5vYev2U5prUjk7W8b2ZDcEqfRWFY3F6TRX03A,12609
babel/locale-data/ii_CN.dat,sha256=kSOyQhGFX7GGD9QbOTiQ03AIwHKTlPiAA79bhpnd3RA,626
babel/locale-data/is.dat,sha256=2wQuZCiLU8LVDm_etN6Q0Sb2uUgj1906stigLji9lvk,184858
babel/locale-data/is_IS.dat,sha256=ggPurORP9YiNltg50UxSvBn-IxSLQkh1Z7vfuAIat2Q,644
babel/locale-data/it.dat,sha256=kZer8Sb4ged3pz5ZqH0NxxTblZGQih9UTQMKdzjHjt4,186750
babel/locale-data/it_CH.dat,sha256=x6SYxtwSWqZ7uK-WH7KnW9JQXFt7vjDVWLeRdxNMOX0,2794
babel/locale-data/it_IT.dat,sha256=69HQXaQ0Hwq5FyY_HFQer2_TaNRK1cBkfwcQoOgD3Q4,644
babel/locale-data/it_SM.dat,sha256=-_kXYm4nypjxW8slleVL6npDk4swP0VuVVyDSZzusQA,644
babel/locale-data/it_VA.dat,sha256=bRLH_PNEqsBmiEeJ4M2QrT7m-lxfJ5a0mtzpOm4wUnY,644
babel/locale-data/ja.dat,sha256=44T77KPAAaPXTo2vWGPev9w8uSgBjuxH0NdE3Rw6zV0,195480
babel/locale-data/ja_JP.dat,sha256=_CcStROLo6tiJ1AUoPpL9-zhxd3dWAcgH4UxcKW5p5k,626
babel/locale-data/jgo.dat,sha256=JHgE9Kgm8gcKZXkRFnBOZL8SWmVefD76VPN1EM660yQ,12649
babel/locale-data/jgo_CM.dat,sha256=EA-EL_vITEcScepi8XtIZp9SfEo8yNtP8mjMDRmurrk,627
babel/locale-data/jmc.dat,sha256=ACdBwmyvLhD-wfTDx5C9BkKiLgAwYi7MXIZjWdnqDs4,16120
babel/locale-data/jmc_TZ.dat,sha256=YEigUlJSIsg-2I3KAGmE_7yjVxXeavgHrzATPawzjZ0,608
babel/locale-data/jv.dat,sha256=bugx3sMto8K-q6UzIdI9_ojxBU4freLUOFll-ZETNrk,127658
babel/locale-data/jv_ID.dat,sha256=jqAFeLVxdIWZRCImM11zmQxFVN-dTNSHqkJjMd0fL9Q,626
babel/locale-data/ka.dat,sha256=PMXkpUZaQ_RakmWrSOapK6BVvijldgDvMO5S5sBzZBM,256694
babel/locale-data/ka_GE.dat,sha256=Nexqnu44i7cXrHB0jlI_229QKiNr_k1TSvCRgb_Zs14,626
babel/locale-data/kab.dat,sha256=Y9PhkPEATNfpisfItTMvOrgnz4QOSJKONa2Xiz4u59k,134995
babel/locale-data/kab_DZ.dat,sha256=7hA6qIdD8G5tnw61QlzIlnS5U__261v3XMZT2Wr93X4,670
babel/locale-data/kam.dat,sha256=bcQ2hEj3o40MkIoAuecyMBXwN2xCRvPoalAKBmbVDYM,16227
babel/locale-data/kam_KE.dat,sha256=1FV6VA2MmH4ZgMbVnb24DpSO3XAYfQzmKxz3z6CBAjg,627
babel/locale-data/kde.dat,sha256=f-939iTq5qzLyicPxbSOfbEd5zUzqNxVOJsIP-2sGoE,16527
babel/locale-data/kde_TZ.dat,sha256=BNkDCTvTEt2R4XEQbKwuNKe_n132hEdXd_YaYunBcL8,608
babel/locale-data/kea.dat,sha256=XBJTSBu8-1l_psgKfETjGEq29Q-l2mAd-XqgpKt01FE,71368
babel/locale-data/kea_CV.dat,sha256=vucrSfeOhAM0D2XqJADgq1aQj73Y83CxF-5dBMPjT0g,608
babel/locale-data/khq.dat,sha256=xIIW5VdIykrnI2yYkhlJzskHmJtESjaDC3GMB9PlI8g,15992
babel/locale-data/khq_ML.dat,sha256=KdvooU50jIQ2C4KfGTuRStG_55DFqJxRh5UtULTAQW4,608
babel/locale-data/ki.dat,sha256=zVuht0vDiuwqzW0ifSGnmQ0UvWm3RyyWCA9zzEFrY5M,16175
babel/locale-data/ki_KE.dat,sha256=JWVi4WSFtN_grtZ1IzyNQlSb1tzHGg0UxFV9MdcONUg,626
babel/locale-data/kk.dat,sha256=PAr_CVdN5k0hKuGNK9hz6vVVdPqcfLe03yGEL6djPr0,204884
babel/locale-data/kk_KZ.dat,sha256=XSbqJqUhzr0pVwmcdJJPydCzCawHbVeP0u4DNA_jhXE,626
babel/locale-data/kkj.dat,sha256=fNklRbLpQSyan1SPutZRhWBypx8TWYjc1j3UIvwYTwk,4907
babel/locale-data/kkj_CM.dat,sha256=zBage_7dyPY1TQoWCrfV2TPdlDLYTSAFmoj25CyvALs,627
babel/locale-data/kl.dat,sha256=ARiEanVrxmHJWpZoDHL3-5bDLLpnc9nS76f7Kp0EqBY,58262
babel/locale-data/kl_GL.dat,sha256=U8dA1dcOZa88aDh_Za4Q_cuO-QkjQON-623nTSwvzJo,607
babel/locale-data/kln.dat,sha256=0KelxA56bvhWs7VzcNIzxcJg9wg6P2bfOkZf1ksltd8,18062
babel/locale-data/kln_KE.dat,sha256=pA_rLiD4YhTe_VqEzm1jUNqr-p3oC_RW2Q2JCptdo5A,627
babel/locale-data/km.dat,sha256=I0D0wPvYR6vlyAqaPiNmS3du1xnjKYALBalmsisoGZU,199952
babel/locale-data/km_KH.dat,sha256=pJZh2Z4Gna9qJRlOE-yQUcTXYMJLxXW2GiA41f911PQ,626
babel/locale-data/kn.dat,sha256=rI2BegUtzlVb2hNxE99hBpeFtNzVHoOdhVYQsh_hllU,254243
babel/locale-data/kn_IN.dat,sha256=O1SMSp5lyz45vrJD6qZOGdUJvk8sA_pEMpfZ7GT1Hcg,649
babel/locale-data/ko.dat,sha256=3ewk1I7Tm2zL68NIomcXz-j08yxgg_sILYHgKkn46n8,168189
babel/locale-data/ko_KP.dat,sha256=Irg8tFOdTqkLtdsJK-whgWIl6CYpzQP5RQSBXFt5lzA,807
babel/locale-data/ko_KR.dat,sha256=iWEE9J7ywo-4HLyDz5nRWPCIBwxMXN-g8ZVluEgP254,626
babel/locale-data/kok.dat,sha256=rzStfhkGwa7NIRzhCOntT-evQiacjkBTH3I7F24Pc8A,82765
babel/locale-data/kok_IN.dat,sha256=RxPYjH26AlDPH57oj9jYulR-b4PZST3ejoheHedo2Bw,650
babel/locale-data/ks.dat,sha256=P0rhXLRGAZk9ltGxyomMfGhleHVGmt0Ah_mWMYTpkbA,102488
babel/locale-data/ks_IN.dat,sha256=FbxiVs_-h7d9TExduoM5qzHoWM6j60ymcgK1_2sjGKg,649
babel/locale-data/ksb.dat,sha256=R8_UFjgnrqwE8sBhSdvxmmE3pjBkNJKSbjW0xvc4eQM,16095
babel/locale-data/ksb_TZ.dat,sha256=P6Ek580ObjaXqb-Niin4LoZm-eBCTCZ_NDULLzMeC8Q,608
babel/locale-data/ksf.dat,sha256=XAtIX8SXZvHlRlMgRfFKFDaQlnVN1AuK2LjxTWQY260,16569
babel/locale-data/ksf_CM.dat,sha256=_uUJd2qMvazQrVHTPOtyXTDlMvbuoISj1F1s4EH0DOc,627
babel/locale-data/ksh.dat,sha256=7CaMQbLiUj_7eMvTq8m0mFmYr7kHfthLgCZerVssnNo,88940
babel/locale-data/ksh_DE.dat,sha256=VH8heoZOq8IaxYfsA9eB4CBxb_M1bSvV4pdJ8Z2E-EQ,645
babel/locale-data/ku.dat,sha256=Dw_Ht0WncxRqQySXLb0an4q7FaRG4oomDNNzGp3XxWY,25250
babel/locale-data/ku_TR.dat,sha256=M_qtiMFC7haUg8UTe3AZ1i-uMY8hzxjtpUgLM2kEYA0,626
babel/locale-data/kw.dat,sha256=xYQtQdmpCyUVtWGhBb714h-X_IK6ImM_0yPXyYerZJ0,7263
babel/locale-data/kw_GB.dat,sha256=-Xb3hs90VWg54TdwSerXDq3lxuOc-Y_wMyfdt9i-agA,644
babel/locale-data/ky.dat,sha256=xnyKiVz_OQ00SVC0ab6tF2lsjZOoLDXI9vKYaGKtcKc,198490
babel/locale-data/ky_KG.dat,sha256=KjjmZqSgzsCGALW0y1fiURGMVa7qmafuit7QKHfJEPk,626
babel/locale-data/lag.dat,sha256=OZ2DjZQ-J3Gn8NWaF8byI4KmSO0gxo6ynBR63oK89rI,17194
babel/locale-data/lag_TZ.dat,sha256=SCwIMT10n8D1ekVMqg6nAcRXYq6MJXNeWOsvVX8IkOw,608
babel/locale-data/lb.dat,sha256=FhQHzrbTMvwFSRCjlRF6Y6FRqDKKiXqhtJiP2x-sJMA,164416
babel/locale-data/lb_LU.dat,sha256=olHjVPCdBZkqm868qqx4i65Wwx6AOPe3lINW6aJAbeA,644
babel/locale-data/lg.dat,sha256=Tk3WfKfVjXIw1gCFo5hlyNuxhuqYdGe5a2jkjPDVYyU,16487
babel/locale-data/lg_UG.dat,sha256=qCr6389TVehgSTUVXvzatoLF1e022IThG7RjKuJpACE,607
babel/locale-data/lkt.dat,sha256=Av8k434perqFI_6BRP6EPkvchiPN_nO2CklTNVE80FQ,12787
babel/locale-data/lkt_US.dat,sha256=Ri8yk6RWC_94pO6kLYqlpBv03WiLu1rRWfmaNDI6IOY,645
babel/locale-data/ln.dat,sha256=yQJCBmMpVevkIOBOUGvrMkp_QhqUwdk7inbzdAEAdBY,25944
babel/locale-data/ln_AO.dat,sha256=gEc6KBMCLUvrJkXrbO9QBF21m4dzmbA30ThJTD0IhLo,627
babel/locale-data/ln_CD.dat,sha256=wd8KeWpyBgRxFdZOzPRq6rPq8E2BhpWr9-6sZpT4VuM,607
babel/locale-data/ln_CF.dat,sha256=Uz79NMUs8cX3JzPyKMf4u9_byQhjbl1wSGZsb0atVI4,607
babel/locale-data/ln_CG.dat,sha256=9Fq944Hcd7zuj_TDXg8RiHhLVlhxrchJSSD1TwsImbE,607
babel/locale-data/lo.dat,sha256=gDnF_vrRlupEleLl6cLJAjSHOQrYZ_LXQgllbgc6hmI,217931
babel/locale-data/lo_LA.dat,sha256=gWqRr8oGNYTNVtYlY9w5uqi9JSgzDujHxvaJZW1V3T4,626
babel/locale-data/lrc.dat,sha256=YdYWaAoqdqGpAmmjgdnIWYdVSVT-swZUtdX_3TOSBwU,19108
babel/locale-data/lrc_IQ.dat,sha256=mjDNrH0bJqU2uNIPr4W13ychqJLfa89zSoHyAflcM50,1246
babel/locale-data/lrc_IR.dat,sha256=htOM82RqZN8DsREw0zziwiwEf1Q2wRwzN4O1EPSUucs,670
babel/locale-data/lt.dat,sha256=iVizf8vz2hHKOs3M_WJsRUecMBMtgfJMAvXYWnBYdjc,281388
babel/locale-data/lt_LT.dat,sha256=xcQ9WNnIdoq-pTrJDlo6J2SKztAPEXxOK8xN09nbqsQ,644
babel/locale-data/lu.dat,sha256=iaOgjHXhBbxqkaMZfnIjZ9yE_ivOogLi_pIltMav4DU,15940
babel/locale-data/lu_CD.dat,sha256=kt1Ck2JozYYmkDCjbBbDR4U1PqKsmVHCQQqQViFWoDE,607
babel/locale-data/luo.dat,sha256=OMmTjOcNBykKCDRQkrlMnvTXd4TTWph1KNFEYeOp5BQ,15937
babel/locale-data/luo_KE.dat,sha256=mkNhvC4s9Ay-_oOw0UAbozSEtyhwktZb4IEXqHb7R6E,627
babel/locale-data/luy.dat,sha256=AivHUzk0jfpYWCd9XP-Vgn5SplZZ3Ruk7rVJTXhEqoY,15911
babel/locale-data/luy_KE.dat,sha256=GQ1Tripph0Kv8EWkDmbUkBoGNRu_Z6_nLraREYDOJIg,627
babel/locale-data/lv.dat,sha256=aYbZgH9misbuEu8xd2OPukaAcwmqJZkQjMB9I2TRq60,211983
babel/locale-data/lv_LV.dat,sha256=RTXhOKiDi25vJqvlFjMfx4ipS6IAz9NOsPfvqDA1xHw,626
babel/locale-data/mas.dat,sha256=GrT-spd-MlSJf_rY-oBo322W_GHL4BGR5-b9WAWhIJw,17349
babel/locale-data/mas_KE.dat,sha256=dvwGyYsRBTACJmRkHe9OqHdBcE7-_3JETAE5DcZxyOw,627
babel/locale-data/mas_TZ.dat,sha256=_awVxs_AqCJK_nFGOWUV8CfM0wkBTOyTxp1wf2wx38I,629
babel/locale-data/mer.dat,sha256=dfZLAHiehC0aQF-BXQRnSXnJlOkC0R5HU8uMpPqBMDk,16140
babel/locale-data/mer_KE.dat,sha256=VAEMZzP_zylJ_jGnwsvys8iwOWMxpnFD2FM73GEhVFg,627
babel/locale-data/mfe.dat,sha256=f7Hwcx7ufQhlyaXWkshVNcgbh6RbSWBa_YtQhy2nXDo,15169
babel/locale-data/mfe_MU.dat,sha256=fXUaGJO-Fk72_qgRVSQXN_4lCMNiOfLbtcrEMoc3Z-E,608
babel/locale-data/mg.dat,sha256=7bWB6HH3HhS2boHUg3Fk6mCT0hTOz3Ev3X9KfXZbEMA,23602
babel/locale-data/mg_MG.dat,sha256=Nvn9k4UDSq5ryL5pXMItBWimjPbby559_heRzkodQOQ,607
babel/locale-data/mgh.dat,sha256=sBxM1pG-ctAdiJ9hl4Hag3hN31bkQBRC2t6R7YIqnF8,10532
babel/locale-data/mgh_MZ.dat,sha256=bj3fkT73aicgmEW0wNj8Tl1fMg2raeXoMaC3u-CobtM,627
babel/locale-data/mgo.dat,sha256=1YpgmLHiJWcmqQvNcxpOIfKfOQ1etEAMDxkQi-psLm0,8266
babel/locale-data/mgo_CM.dat,sha256=PF1Fm-f95o7Lu9qG5FhDJCaHBmXmV1yCuacaLuiJcUY,627
babel/locale-data/mi.dat,sha256=P7-TssxweXKOKPlQy2VcGNMmiFVVVe7LP3hv6aWtiOk,19166
babel/locale-data/mi_NZ.dat,sha256=d_K1LO5OIXVG8bHH1WSIVFWt7mqjxrk9T1FUY7Kr3ko,626
babel/locale-data/mk.dat,sha256=n5yeB-nRq2EjOqcfESsgXiuuspwby7SS1l79DazdC3g,230242
babel/locale-data/mk_MK.dat,sha256=GT9GwufrdgHTNvJlilW5X73eWe7x8nPNu0orikX-q6s,626
babel/locale-data/ml.dat,sha256=TEf5l5IQe9_eEMqM81zevTtjxYnTU4ri4xdIrUIUfas,282791
babel/locale-data/ml_IN.dat,sha256=v0Q-8P2QVsISoVj0c7_SPRfv20HgUV7UpMkkyDXbr_4,649
babel/locale-data/mn.dat,sha256=bRv5302YnTCpr3_mHntO_5niulNYjgAIpzQbE1gyA4U,196664
babel/locale-data/mn_MN.dat,sha256=BU1qpiwX_J5qR1sdIZzJWIWhA2vVo4R85xQCMO53zeA,626
babel/locale-data/mr.dat,sha256=pTtl6V-f6FrjTSAdZRDI6uxb83NjwdyrOswfplw6GKU,242765
babel/locale-data/mr_IN.dat,sha256=aef7VFbvFenw6pJg7ZDW9vV52b9PENWqbIZ3ttetPiU,649
babel/locale-data/ms.dat,sha256=qTclc9o5XP5CTlDz3RDep-QXIKYCjSKcseELT9H53XQ,141460
babel/locale-data/ms_BN.dat,sha256=nmT_ZUqySFofHKPBOeB79OXLF0_rN9_1l7Ene73Tovs,1275
babel/locale-data/ms_MY.dat,sha256=V8RAiIYkRQeK0zZmGrMX_kYD81Y2jdyK8UkwWficNrw,626
babel/locale-data/ms_SG.dat,sha256=fN3UCsrV9k3HFZuIlgDV1Zx84C9EVpyOcGmy8HTM9VY,645
babel/locale-data/mt.dat,sha256=NvIc3Em2gHEQOmJNNyG4BlPFKayvF1oWOiXTyJKMfUI,99982
babel/locale-data/mt_MT.dat,sha256=XbWtjBItwBOzQ9dfXffkG7ip2cQtJUr_uOLXc3nP-Y8,626
babel/locale-data/mua.dat,sha256=5u-bhk5Yqn4Ol-rPRUa440aVFzOb-ehzlYykaVALBQ4,16624
babel/locale-data/mua_CM.dat,sha256=jU0ODX7XWhTxSHF4Zr1r6qX4F6GMTIhfojNXPlQeVzU,627
babel/locale-data/my.dat,sha256=0UdwyYsfpnde3_TNEl0ayDs42Zgg-QrRyuLehT1EJ9I,207004
babel/locale-data/my_MM.dat,sha256=Bzi2JR91HdxPj-Z0eaOLHk8UK7tTh3YVb65GdioGkgY,626
babel/locale-data/mzn.dat,sha256=vwdqMcpOLkqkInioKWteaAVTJj-zYLNNI27VcZA6S30,65508
babel/locale-data/mzn_IR.dat,sha256=Sx-axN08t4qUK6gkdZJI9gE_od94O9yBOl7R-xydR74,670
babel/locale-data/naq.dat,sha256=vBYqqBMEGqzIQx5SW1A_P3rbt7IAQAHBaBFc6GpSYWM,16670
babel/locale-data/naq_NA.dat,sha256=SVEYeRqX3deeAluOQ37gwHfm5cGLcPwiNtIKsGLaRlo,608
babel/locale-data/nb.dat,sha256=7TBrzSoRB76QUbA2V1dSgapFQhNxRQ02oxXxdnQeZxk,206686
babel/locale-data/nb_NO.dat,sha256=La0HFi0QPvkipslkGYJWyrvR6qyZSrVf3rxyFy5MAeM,644
babel/locale-data/nb_SJ.dat,sha256=kfp9zsPvpbuegd2KdJl4WO2eppXw-ybSBDrj_5-Sepw,625
babel/locale-data/nd.dat,sha256=-x3R97oZR6KBTEa7fIudTqIzEGLVO4ErMabTlbH5cqE,16364
babel/locale-data/nd_ZW.dat,sha256=VVVYbvzg8pvKDAUDUfCOBwVjgSqR8kRNZa3OvIMolxE,626
babel/locale-data/nds.dat,sha256=3Atq1yjM2MyTIsdO0hTSNHuRa-3XrXHsctO9BXE7QA4,50653
babel/locale-data/nds_DE.dat,sha256=g4IgcJMM4s8ZDbkks7VetJ60Fv_SDd2Z7KYNtt9EwKA,645
babel/locale-data/nds_NL.dat,sha256=LwfMpT7rOaqwl7fz_0H_rnApfhJpG_WG29HY5fAW4vA,645
babel/locale-data/ne.dat,sha256=CDG36HQ3kKDZcPo1_aTwmnLqLKHg7J-tx-twaveRRCo,243069
babel/locale-data/ne_IN.dat,sha256=Ty0qfdsX3laEfDmVosUYb1nO4lbPuSwUiUklpZ4CivU,1283
babel/locale-data/ne_NP.dat,sha256=_aOsODQJSx-2Qp518aT1E7U512mda8-coqIfgRf-pjs,626
babel/locale-data/nl.dat,sha256=xb8ziI2bEfydTIXYg5xpiF4EzxyKe2_9-BHzDKpBbfw,195437
babel/locale-data/nl_AW.dat,sha256=lWaFk0qMUWo_XmeHAOHypINaoLCgBOytw5qh02PjR2g,629
babel/locale-data/nl_BE.dat,sha256=F20Z12nxs501ipOGOVYEWgoMwOM37I2l__E-nytDl9Y,1853
babel/locale-data/nl_BQ.dat,sha256=NjO4GFRK0oeyv6-hC5I5TWijntLMaQkvTTeMTxeo2go,626
babel/locale-data/nl_CW.dat,sha256=a6rSPV1TGf0Iqj4WPtNdCMturkN_acf-wTdGwTjjcmo,629
babel/locale-data/nl_NL.dat,sha256=Z5xxMZmUPdO3at7G0RRR1jvz0nNRAErbp-u7EhLRJ9Q,644
babel/locale-data/nl_SR.dat,sha256=6KsySLDzDt8H_rmCVslpGWYLln01xoKdnjkga1MgbY8,687
babel/locale-data/nl_SX.dat,sha256=ax_nqnWCIEWLBF_OAZApdqoZxHGmrrpc9OXt_2GVKTM,629
babel/locale-data/nmg.dat,sha256=JHmpf4ywpHJH5X8pM-aIQeKqXICoMuvUgH6LfvYA95U,16241
babel/locale-data/nmg_CM.dat,sha256=kfA43rC6-mmtCEQ4KahPBUyi1SLoxOm2_k557QI7Z-I,627
babel/locale-data/nn.dat,sha256=3xzcFn_sSkfJdOutUmKmMXnuNvpUbqEfsmYUCR44V3o,179805
babel/locale-data/nn_NO.dat,sha256=D9aXKaMt_90RbYBc98NvfkVZ_fYV2qjg0JgsEHKXpE4,644
babel/locale-data/nnh.dat,sha256=iJ8maFwvQWWF2z83wPNeDWCjtXJkb-6BdqWTNe8S4vU,6787
babel/locale-data/nnh_CM.dat,sha256=iCo3O7kW-Lcsr5g1Bv5bfLm8FeKXt68i6aq0Qqa1cM8,627
babel/locale-data/nus.dat,sha256=cdQBVX2H5tuWRZUTUORxThKZb8ZA79CFis8Kuetgjxo,9183
babel/locale-data/nus_SS.dat,sha256=EVZv-VLRZIXfmHowg2c8xkeZcrFC6DWKbb9aYzuykl0,608
babel/locale-data/nyn.dat,sha256=glQUHKEgHma36QtPbPimKIoFNkaJflVPo6r9zpx15eI,16328
babel/locale-data/nyn_UG.dat,sha256=m8ciJ8wJ7Ss0sZEwo7hLys0p8X9Tc3iaPAIjKEvvzak,608
babel/locale-data/om.dat,sha256=C_dYC8Os3xZXrR2l_U3HBivYw6aidjIq7ROnCYtY9Ds,16609
babel/locale-data/om_ET.dat,sha256=Og-EdTbZ_HAokrmbPFbOUuekkmh7ch2DKDZctUISASU,626
babel/locale-data/om_KE.dat,sha256=2ANK67n7vvRAps6fTVn15wa2yYnz_2yy303bozguDSo,1584
babel/locale-data/or.dat,sha256=hN4VKCkslHZrQ7ti_sU0z_NiZoiEPkYbmmg6wcKMGkw,237035
babel/locale-data/or_IN.dat,sha256=Dw9dokygCMjypNY4sndqyvOnTFsaqW7pq_UPLLHqtTY,649
babel/locale-data/os.dat,sha256=8dpK1HvfjQPT978fBRPiuk1wRtlSp4N4lcyPGbxy3lQ,17648
babel/locale-data/os_GE.dat,sha256=hSmyrOpT0abvV17Q5Myoar7UMieDCmckpszmuRQJxfQ,626
babel/locale-data/os_RU.dat,sha256=HRXdDl4XLKTYX63EpDJYq556qySfi_W9q_qzuQL3J0A,686
babel/locale-data/pa.dat,sha256=kZGBG23ACj27nI-LNf02A3Vqw_KFvk5D2lQHH0G6UXk,237090
babel/locale-data/pa_Arab.dat,sha256=Xe20lZpLm3stLXFQTLIq5PKUD7TvC4ORuMzRZiONqJA,3967
babel/locale-data/pa_Arab_PK.dat,sha256=_VUdc706YAQSu8NoUCuvHosko2l8GtwMdvTXQkuh8oY,626
babel/locale-data/pa_Guru.dat,sha256=RemwK9VZViIqmbpdFqso7S9xD55LITJbW3sewM9oRUQ,1267
babel/locale-data/pa_Guru_IN.dat,sha256=S0ctHEKJ7RxJFlvLs31Yflmn3-RwlWb_zc_gCyVYzrA,649
babel/locale-data/pl.dat,sha256=kbqTerSZmugR4oZtKNUgvAbQFeRSK3uk5QfgvD32Xk4,228149
babel/locale-data/pl_PL.dat,sha256=3aqxuKmM1y3xnRC3iG6DRzNquFCjOhSe-USlt0jKY0I,644
babel/locale-data/prg.dat,sha256=cvJ-ohjlFKFxS89iBJxru6s2seI9xnB6GLQor53PfjU,20221
babel/locale-data/prg_001.dat,sha256=1SYLtROetU-QpYhHxtQWxcY5wNmVnqFxk-J1-3BLYoI,1585
babel/locale-data/ps.dat,sha256=QNalPguMKEGOci07W4rvZ5iHYDPK_eziWOIvKT_Aq7k,142340
babel/locale-data/ps_AF.dat,sha256=SvjOBEFhyxjFIfXoaTObaS7vNyKTC5-Q1qkOetchsWw,669
babel/locale-data/ps_PK.dat,sha256=bpR4HtSC8OlQ7_J0bMbZLFV7VwPzthm93offnsFF7Vs,7979
babel/locale-data/pt.dat,sha256=lrMOGnflLfsboEb198U1WjHI--FEF92bvn5hcr2bKqI,185356
babel/locale-data/pt_AO.dat,sha256=QxTSJ_njOOr9W8_wFKMefA5_X_vLLmbTyTShIPr2TYk,1013
babel/locale-data/pt_BR.dat,sha256=QIoCEwQ4MVDEptP3uYSfuxaUg8LM6Udx_j0u5Pmsscs,626
babel/locale-data/pt_CH.dat,sha256=1vlk7Moo0YazBGXzCnhzraOQ3na7vMkhiacGprATTPo,644
babel/locale-data/pt_CV.dat,sha256=TuFHk3Ps62TlH8OXoA0I5n20WXMtJwRkTX9F-ifPPSI,1038
babel/locale-data/pt_GQ.dat,sha256=n0jtozbmyMELo3v12qZh0bLpOXkl5Yo3-SaoNQzB76o,607
babel/locale-data/pt_GW.dat,sha256=kzmvupn16Ryy-Ad021sANJicQ405NWoLR3W0hYNgEHY,993
babel/locale-data/pt_LU.dat,sha256=2PCOkLE4Fpb5rr0S2yGHzWr02NXkEU1DFq9cb3jYPEk,663
babel/locale-data/pt_MO.dat,sha256=ASQA8OF0aPTEMnnUxPgOuTbVb-Viwruz72TsvnJXhCQ,1610
babel/locale-data/pt_MZ.dat,sha256=OyyIvwlWPVXczu-1QDtFD9x3TCgbuWVmSfabMU50XIU,1033
babel/locale-data/pt_PT.dat,sha256=JY6J734UdlBda2-mpgdbopkJ29vH6yRCa3Drs8TXlLY,95387
babel/locale-data/pt_ST.dat,sha256=XFGnYoCcv12C1dIPHpxn_yWF9TO42Ze6HqHaVX6lJXs,1013
babel/locale-data/pt_TL.dat,sha256=Kjoj1JE5C_EsdKbWricnpKTUirMnSI2bVcljIDUEtXg,993
babel/locale-data/qu.dat,sha256=UUdFgTeC0zefb0AXhnHREXZ_bRxMx4L3gZERS2byRFA,63678
babel/locale-data/qu_BO.dat,sha256=VSRgVtWlTouId0GarX_ZO5CZYAY7HulYTZQzsrcKpC4,854
babel/locale-data/qu_EC.dat,sha256=_Ftb9lPp9eFysmiuzd0LXl_da6UfcDdAH9iK4_OfceM,828
babel/locale-data/qu_PE.dat,sha256=u7IelNiSOLZ2gSHzXBLQloraDKQK6rn-Gj3PDrpg7v4,626
babel/locale-data/rm.dat,sha256=6VF_YfKkH4zszgClWGpCutJLsTtPzjz8YqqIIbN0cIs,67703
babel/locale-data/rm_CH.dat,sha256=nM16gH9DyFuCWJvzmeUYDeI935TZvG9PeHlnJtwsDJ0,644
babel/locale-data/rn.dat,sha256=fM0YjSf63MqPnOGaoSAiJ8pGuNLeS89EbA1uvZffPD8,16834
babel/locale-data/rn_BI.dat,sha256=ysozkQZjd7MbdqQR0Appe1Z0pWEI4Uvt2sOjh1Bm33g,607
babel/locale-data/ro.dat,sha256=0F4YaitEpsSgSlFL-spgysyo8PD5nWzldC3JRPR5iKY,214600
babel/locale-data/ro_MD.dat,sha256=BPMaAQ0BsOZkbpcwrDCR1dAYiIpEoq-d2QttEiTxLsU,3468
babel/locale-data/ro_RO.dat,sha256=YGMdthocAJEwwzNv1M1FpXmx1npnT1o6QEj6AIUJA1g,626
babel/locale-data/rof.dat,sha256=_9WDdCvXcsispR_Jc_bd29GLdco-0vv8BGBAuM_x45c,16222
babel/locale-data/rof_TZ.dat,sha256=SSYWLiv1Okua7sYRhIAvr9NDMLo-s0R9fVOnh380Hu8,608
babel/locale-data/root.dat,sha256=3EUwOJF9fGXgbeqm_oB0m72qKAi4P2KtMhTX0tgfCno,39989
babel/locale-data/ru.dat,sha256=4CN7wom0dRoNu6rl9v1J0obCQ_hqEhFFGogsD11Wotg,297015
babel/locale-data/ru_BY.dat,sha256=lucENheWCnm6l2kFWx5iiOQ90RnN-a3SrbbpSMEH23c,667
babel/locale-data/ru_KG.dat,sha256=q9H-sCDazhmCcmFn-QlJ1eBwVnXaGmqTFZT4W-9ssHs,650
babel/locale-data/ru_KZ.dat,sha256=zOoq7g7gEqS5ScuiwnNbhFcCYXEBVQ45hoH7x-SKlAs,647
babel/locale-data/ru_MD.dat,sha256=XQc4LwXm3XLmevt8NRZEVQ5tj03YVkeeHdVb_mzH0wI,645
babel/locale-data/ru_RU.dat,sha256=UZR5Khv2hLp9BZbGcy8Fxg_luQDS8dgxQqXnmrYOGKs,644
babel/locale-data/ru_UA.dat,sha256=OVdhP1Te2SUv0a46Hp1FTLUVwBTbNyinQDy1RLLE1ko,1765
babel/locale-data/rw.dat,sha256=gah0pwvkYNXB7CP42-1B5CMFxjVNjNKBXPBjdPumHuw,16234
babel/locale-data/rw_RW.dat,sha256=lw9-N-Bp6o2kOraBdnpqbHXS9S06vRGoRnTi13_-IDE,607
babel/locale-data/rwk.dat,sha256=UK-qdX5VjbSXmZ1sWLpUggwyEbekDq1nSWMqwgYdPYw,16109
babel/locale-data/rwk_TZ.dat,sha256=qOwICQ4gh7wiNjyNsrZXTCxpEgydLb3KLC-aGSaTdiw,608
babel/locale-data/sah.dat,sha256=qTZCEQCAO_up0P4P-GCMC_Kzofutc-1oSBqmetTCvqg,47992
babel/locale-data/sah_RU.dat,sha256=fOJxjNB4yurKvi_Nf5qd_vZ6Ph0P5TreDKysCfkMkAM,645
babel/locale-data/saq.dat,sha256=_DqapaXzmUP8SkniGLNOgMtUOCixaqY-2P6V6BUbHXg,16507
babel/locale-data/saq_KE.dat,sha256=lO5cOVp83wj9tFYBb-OT_EoKnvI81obyEODz__dalok,627
babel/locale-data/sbp.dat,sha256=B8DxXa27HxQ03WmXTxDWsUPpr2Xy66X5utdQ0lTjmQo,16532
babel/locale-data/sbp_TZ.dat,sha256=Ck2aub_MmSbx5Ixgs3RxF7dJU90nUufYP7cj1eq1eeQ,608
babel/locale-data/sd.dat,sha256=TyFszAcJ_BrtUiPW3HO8I3ZCQDGJJt5lukJMGWeb1uo,188120
babel/locale-data/sd_PK.dat,sha256=tYuzmCxNr02-FV1pgkN94YAvn67EdkluBYaUTr9S3A4,626
babel/locale-data/se.dat,sha256=cWzX95vS957wbyZvvNNrhu1QzUcSBMCH1RVy7buxSsI,72355
babel/locale-data/se_FI.dat,sha256=ASUyHt_ysdjsBx4jb2V3d7TFnnCrvKrAYOwvYHSdvfE,46541
babel/locale-data/se_NO.dat,sha256=9fc96ChjeOE9FGup8pr5S_zGqirgrITKl28Qz0lHu6M,644
babel/locale-data/se_SE.dat,sha256=pVfO3I0swSWy7w8Jb0V-om95t4fWuDWB1YdE_Lr-Gf4,685
babel/locale-data/seh.dat,sha256=LsaTKr3qRHEBZWqNElUVVxIS46jCkcyaoYn0d8lSq0A,15963
babel/locale-data/seh_MZ.dat,sha256=0diTZF6N0YXrV0kLWl9RY-0JXNWQ3uEToZEbCt6fOq4,627
babel/locale-data/ses.dat,sha256=dnGrI4ChN-RlvGcNMK8pcMGNgNuDzfsx8XF7RmAhz2Y,16051
babel/locale-data/ses_ML.dat,sha256=9Ske0UaoHZbpE8jhXhk-VL3HhIhmXnsIbcNQZeO08Qk,608
babel/locale-data/sg.dat,sha256=NLfT67esLoB5WoBHWk7E0TmROwJQ6VXil5yiqzOkUag,16688
babel/locale-data/sg_CF.dat,sha256=7BfhzANJ38-LvzQu3NSxTdhJtQ4kTwcKQAkt_NOWHtM,607
babel/locale-data/shi.dat,sha256=3VVluM_KYVrNoROBAAs3xUORYRV3p9-Whq9pBS-slDw,22106
babel/locale-data/shi_Latn.dat,sha256=uJs5g6f9GlIzLrzmtgx1rjgY9xWypEsYciU0lTEbtiY,15670
babel/locale-data/shi_Latn_MA.dat,sha256=Erhb65aX0qGNECddJ7M8fKy2zjJlOxXSKx42GdQdf0A,608
babel/locale-data/shi_Tfng.dat,sha256=N4AQ70s0OZV-xQ4VWLo5bGuPPWk2AxmAjNuNwvG6bIQ,965
babel/locale-data/shi_Tfng_MA.dat,sha256=Erhb65aX0qGNECddJ7M8fKy2zjJlOxXSKx42GdQdf0A,608
babel/locale-data/si.dat,sha256=SUEexMOM-IB__OVxxxhsDx4RAb5P3mw88ZoS-gemPTI,237479
babel/locale-data/si_LK.dat,sha256=r7FqkzM6vXhR4XJ5rou9GYtU_PEyYXE3tZZqsLyR-mc,626
babel/locale-data/sk.dat,sha256=HOqji-Ab_yHtmlHJtbnrTy8wAbZW0pemfjhxeZeU72o,246088
babel/locale-data/sk_SK.dat,sha256=EOO68wv6kuaSIKyg_BNUAfCCffzGwQlG0ABrSFcDJF4,644
babel/locale-data/sl.dat,sha256=AZ3B8_mrbyi03b28ovtymTa7G08kAijUL-XKIqdDLqM,237036
babel/locale-data/sl_SI.dat,sha256=0JTmTrnyrjJHBBK5TeJw_c-WW0ZmLYWZxiXPS2serts,626
babel/locale-data/smn.dat,sha256=V4oN72KuQA5RQjG6DCR2RFo4USYyOiFFLZu8hA0QZVk,42730
babel/locale-data/smn_FI.dat,sha256=87dist-cLsNDQvOxUdqRgAuktFuar6Tts6CRw41B1k4,645
babel/locale-data/sn.dat,sha256=DdCgeUS6dW5p-d4oye7sMvAKDG1v99WB8alp27YF_dk,23304
babel/locale-data/sn_ZW.dat,sha256=351RLV0bhiAOnieNqRyHN3oqG-v2GvJsYUSqXm1wHaU,626
babel/locale-data/so.dat,sha256=M7lVxEpfLSVGo07ZxLvnLWPGwZTmzT3N2mKWLvhS2iY,160943
babel/locale-data/so_DJ.dat,sha256=4nw-1K0M7naoWcZ63Gars4xqbghDMiSHbZpXIbPP6OQ,647
babel/locale-data/so_ET.dat,sha256=fsS5yO4V8ciQMRZwZ6NDWcQBQFCxe1SnVgH6BUurHSE,646
babel/locale-data/so_KE.dat,sha256=E6NS6cdOmMJTOUpVuwgBE24tiDpcC5IOw_JZhkMjbd8,1199
babel/locale-data/so_SO.dat,sha256=AFtTqshg30FEAb50Q2lAC39KETj0xcSxc2DdMegt2zQ,607
babel/locale-data/sq.dat,sha256=dU1WRBIEsS2Lg6f4mGs_Rc0-PjyrQO1syYMLcaVM3gk,173926
babel/locale-data/sq_AL.dat,sha256=5SVT0s2J5NyvKwdqzWW1S2PIj33PVVz3pWw248jn17c,626
babel/locale-data/sq_MK.dat,sha256=PsaPJulWBIFlvRKlnhK0he5lZm_AXVYmeyCq53YQcAI,1199
babel/locale-data/sq_XK.dat,sha256=d_afvPzsozxIT1_MAI-fK_-V8nHTN07NmyhuBwQAdVo,1178
babel/locale-data/sr.dat,sha256=Ki0eLxOs1OAdQX-0Vr0rSnWC67af2gDpGeXr7OuSEWM,277049
babel/locale-data/sr_Cyrl.dat,sha256=0n_px-LQ4ZndDQXL0o_mRHgVxLFeYLNjn5MGOovuOoY,1978
babel/locale-data/sr_Cyrl_BA.dat,sha256=kKuyKTEZCb1Gja2U90yXFFfUDBAKW_ErHKjdHuJ1ZN0,3930
babel/locale-data/sr_Cyrl_ME.dat,sha256=gKr7GFHjcxb7Sq9uINfs8VEP2y7MNh1pJ2h2VGqblM8,3724
babel/locale-data/sr_Cyrl_RS.dat,sha256=2TmzkiJSNDpNIij3yJ8nDhrKRNPUV1XX1_RXOKaGvAw,626
babel/locale-data/sr_Cyrl_XK.dat,sha256=43d0NPoc03YrzZBie2_7DLy5oScODx-cFOK5e9hOMxQ,2607
babel/locale-data/sr_Latn.dat,sha256=-jvRgfFrHOe4yU5pAbwigibdz7b_Wef6VzoQn3t86S4,230271
babel/locale-data/sr_Latn_BA.dat,sha256=egRvjBkcg2d2Zm_ehAqKrixzVpD9EtOws6JVnbVusc0,4195
babel/locale-data/sr_Latn_ME.dat,sha256=tnFSZ7uoBD6mSZL32MvharPQR1QL_oV_XaJ38bc4gbE,3579
babel/locale-data/sr_Latn_RS.dat,sha256=6mUxn3NaqRzjHSNgJA_xzJCefSUxqXSUEsoMJ-juYUI,626
babel/locale-data/sr_Latn_XK.dat,sha256=6BLGB40r1xCprUQ_rR6TVqubuxmhQAUKyEJa5XWAGs0,2693
babel/locale-data/sv.dat,sha256=TZH0cY_a8DJK5BAZLOPgACkWLLwFkf5swjFulbKwJTQ,213436
babel/locale-data/sv_AX.dat,sha256=qxZlBDrxLtr7jugZ2tsY6liGF9U84UyZIT7Ap8eL7iA,644
babel/locale-data/sv_FI.dat,sha256=aV9hIsn7qoQ6nGzCbnJpiiPRSYFOq0yogn8ujMenwqU,1391
babel/locale-data/sv_SE.dat,sha256=HUamjd52mLuY8GbVgBeijJpc--Z3dnARh2lcE4QvUYw,644
babel/locale-data/sw.dat,sha256=OBKVQn-9PlGNBo89Ms1lDlr2yRQ8gX_1lUMDn1bhzMw,175523
babel/locale-data/sw_CD.dat,sha256=dsCHY8aKyhmiRIIiStPfM3RK7oyvdUUYXY94Or28t28,2698
babel/locale-data/sw_KE.dat,sha256=o7UlPWH8XMknIL_QFrQHFYzS7KRh9f0SFyekUCJZ_kE,4051
babel/locale-data/sw_TZ.dat,sha256=igleCvk2ZHZM9NoYRtnSd1s-oxuQjL1wLRvD_ZLBovo,607
babel/locale-data/sw_UG.dat,sha256=SmNCoGRulbvTy-uR4zcKFkELWxnfZRHTFQQCkMzL99g,628
babel/locale-data/ta.dat,sha256=hIoFhN-PxAoTw0W7Qiy0UXsD-qxIoiNeV-9jNuHr5Mk,256586
babel/locale-data/ta_IN.dat,sha256=U63SpEBo7jY11wGhZNMFeC3pyS0ExnmbUlmDjgOeuuo,649
babel/locale-data/ta_LK.dat,sha256=jTOsLhe3x-1CXvk6IDUuiEwrc0OvqkmsJmZjpQgDbpw,1199
babel/locale-data/ta_MY.dat,sha256=eO3c5Qh0zUMlQeFZgQSzQedaSz7mLTFlVDKR1Z-2VH0,1256
babel/locale-data/ta_SG.dat,sha256=1MxGlD45nwX3TAvpVESvP4CXrmxgqySQjeZjzH4Cofo,1275
babel/locale-data/te.dat,sha256=lPRz8YpMlzuXt_B5br8V3dYjMFTZ6metR2KM0xCF42Y,255657
babel/locale-data/te_IN.dat,sha256=nRtR37nSryged20zk3SQMpmOf-UuNFjL_2YFTMpyN7k,649
babel/locale-data/teo.dat,sha256=XiaLo3ISyEZi89ypqEUw0Yom5tknINNoJzne6gtXQio,16723
babel/locale-data/teo_KE.dat,sha256=adkRA-mbnesgQLGfXEqwmXSVQDi63TQyosUzSLt3Xu4,648
babel/locale-data/teo_UG.dat,sha256=jfrgUMX_AeETJJFHJAx4dXi9nXjywSwr6tZUQksea7c,608
babel/locale-data/tg.dat,sha256=mjaUWm9mGHcYYsk5vmlrFj9zTXf5WcJMRDGex2axIB4,29662
babel/locale-data/tg_TJ.dat,sha256=DvdJs-nLilO1-m1YgIOjEeY_f0Viv5FYjZ9VR8O6BAc,626
babel/locale-data/th.dat,sha256=hj2O37fbmx_Nb49pOFF2oniumaxVDlkOA5ULcI9hD8o,230260
babel/locale-data/th_TH.dat,sha256=msHIvTxB6gWoJP5-ClkGH_IedRgXpRQzZPj0oIyVkyU,626
babel/locale-data/ti.dat,sha256=l6soKgfd9j_zCwP2oOKDdY-P-8FUul0u8WvGiAW1VZ8,73057
babel/locale-data/ti_ER.dat,sha256=9n_DeoDAeCwpjxww70RaNjQFwSY0dAOwwdAxYhVhw_Q,976
babel/locale-data/ti_ET.dat,sha256=uo6aLFMfTxKNSCagtB8OrTa99SUAmiNUA1txEd0tHtE,626
babel/locale-data/tk.dat,sha256=TcKx03xQoOnnIbGUZGszP3MDMoy3Ncaq6ALq2j93j5w,165033
babel/locale-data/tk_TM.dat,sha256=te9O_n9WobfEaJnREwyPHVH4EMHcvdClBXZVPDWXKqA,626
babel/locale-data/to.dat,sha256=3Pl69HQ7EZkoRYPF_uD8XCinhZeYGlQLeYGRp8sLXco,155039
babel/locale-data/to_TO.dat,sha256=4uG_hh9oRlbSUKvlRBuU4uKaGSSs8WXIdQ6oPE9nsXw,607
babel/locale-data/tr.dat,sha256=bwVttS8wUkqEjHqWYckkC3mIBMvlR204MbbKx2RTxUk,199237
babel/locale-data/tr_CY.dat,sha256=O7i548Pkn7b38K67zCSjikwvr3fqUzgQFtw85HwftvE,1202
babel/locale-data/tr_TR.dat,sha256=60u8smbVf6BBW48PI-x3EpHvJ8tsbUSbJHhCqFwqEWY,626
babel/locale-data/tt.dat,sha256=_FR8BBZRdW9-Oio2iafGcu48Z9FtldL05h1qzhmM1OA,33295
babel/locale-data/tt_RU.dat,sha256=KMOS9m6E-8xqJQZQghSnhQdNjkNVu0dXsQkFwnfl7lM,644
babel/locale-data/twq.dat,sha256=OEwG2SXr9fEeQCMaHxjvKWlWLVtUhGamoG4qG6wjUmo,16224
babel/locale-data/twq_NE.dat,sha256=qI3KClszp7x1J6kAz3_warLhjR4nJfJo_KfvlGfrnLo,608
babel/locale-data/tzm.dat,sha256=ZYs6PgmbBXaPk6WRnQxKT5wzR0RzqXFPa12OWoO7dUc,16200
babel/locale-data/tzm_MA.dat,sha256=Iju1azWHoAUAq4eKXDIeqAfAEz4HrOo7iUtyrOvSpl4,608
babel/locale-data/ug.dat,sha256=TfYKG15NTf4fouUcNaqdusAKRxa1RISFoA8RYi4LN5s,128365
babel/locale-data/ug_CN.dat,sha256=U8dQkbFRAbqdAKISnFUw0FNUPmzrkJdLpK4n_14alKk,626
babel/locale-data/uk.dat,sha256=vdV4W3lJEEENgT6Z37OtNlhQPDq8sVw7nWzL3hCidSo,307335
babel/locale-data/uk_UA.dat,sha256=aG-RNa11ss0qW7vF50ajYL0qAxtKC-2ghG-P4W6vI8g,626
babel/locale-data/ur.dat,sha256=rw0vgCWeX-JSUbVwTUGvRddcKePa_yrnoFDb-_2SoW4,192380
babel/locale-data/ur_IN.dat,sha256=R-Q6ZyVoQOPtQr-7izba7emv8X589nguoMF477kk7-k,12616
babel/locale-data/ur_PK.dat,sha256=pjqQbfrTsrzcFl30FILINl2ELO3fBxiaRBhCr-KxWlE,626
babel/locale-data/uz.dat,sha256=9hnTiZ-2Ug_qye8uaQ_y6yORtJx6ufmXVo7yXEeRXv4,167959
babel/locale-data/uz_Arab.dat,sha256=5iCqhCA86006i6CS3bLMZ9IsxWlQoPmQKFbD5pRUJO4,4135
babel/locale-data/uz_Arab_AF.dat,sha256=Sx_uYNKZPq-kRomMbkZ9n8QRHjADxn9Jnga6fTVCn2s,669
babel/locale-data/uz_Cyrl.dat,sha256=GYkeuqND_cGOn_PWn6yDG-GJl-739xKvN51DjAFRRKs,98765
babel/locale-data/uz_Cyrl_UZ.dat,sha256=3wc5_aiBB_CAeYu5YRxPxZHUd0sZ4nIXafgKFDygfZs,626
babel/locale-data/uz_Latn.dat,sha256=U7k5KfSvCsFk2Atujg4-iVDmGikwr-vkjPTpb0D_vP8,1283
babel/locale-data/uz_Latn_UZ.dat,sha256=3aYJK9kmVFmLlDvDgL1ndruFKWOqVlHHJjag1NqV1a4,626
babel/locale-data/vai.dat,sha256=RqFFCMxtJ670vHHKuitqD_dDlWU2PBHYjgw-9yA8fTE,19046
babel/locale-data/vai_Latn.dat,sha256=X4-xL0o7OgV8SCyY9w5JPbtwU24MfloL1z1fS9FGL_A,15311
babel/locale-data/vai_Latn_LR.dat,sha256=wILwRiJahBELmxou0KnRkVMZReFA3tiFJzmb_OqZhNc,608
babel/locale-data/vai_Vaii.dat,sha256=HR8PB6naRA8D96Yn5Iy8ODPw8CLzpfrVoXyXd0apmLM,684
babel/locale-data/vai_Vaii_LR.dat,sha256=wILwRiJahBELmxou0KnRkVMZReFA3tiFJzmb_OqZhNc,608
babel/locale-data/vi.dat,sha256=q1bLXzF2MlouEux5Mf1jmX1aHrQ_ymF1F6o4hOSmCJY,163315
babel/locale-data/vi_VN.dat,sha256=ysK3bxwU2cv3FiZx5XYBq5kGCnsRAIYXefasVKTIKXE,626
babel/locale-data/vo.dat,sha256=oGgNNbnkX_qhkH1hjxpt0molwl0N68bFK4mP0Yh2k7o,5246
babel/locale-data/vo_001.dat,sha256=QsXTJYVDrzM24v2rKaWPgtSSN54Ege4iHGzzdxCElg0,841
babel/locale-data/vun.dat,sha256=n04FmbzLYMYEmZaOUMxpxLNF-v6OeB_RtLVQH6_vOc8,16119
babel/locale-data/vun_TZ.dat,sha256=0sIAdc6gRGhTbpGXbPkAwTzO7g-QBG0WdKsmjvFSxY0,608
babel/locale-data/wae.dat,sha256=qRzR0haJ9sG5gyquuNV8SZXHdSL-Ku8F0j9OGnYsIDE,28712
babel/locale-data/wae_CH.dat,sha256=7C-tFbrZbBSHRUeTh5pVAS-8twkecVsqzHHXfE5BJ-w,645
babel/locale-data/wo.dat,sha256=Wbq-Hjgk2y_GIAVbiGK7oT7Cdewbl20WN8w71cN75L4,25738
babel/locale-data/wo_SN.dat,sha256=SFe418ytRv4n5qYdd7PB5Z7wW2lMXKLaOZ6iTb1dTw4,607
babel/locale-data/xh.dat,sha256=aizGIMM4WRNrhmWoZSfTGjT2zPbTxyrZYokFCwFDYFI,15076
babel/locale-data/xh_ZA.dat,sha256=Si4fXBHGmX5L_vioWN-a_PowYRePLdkfsBgvfSIN_7c,626
babel/locale-data/xog.dat,sha256=MgoUNE6v6h13pdogvhGzpyc45PJlCUuLzk_xlQVSHFE,16608
babel/locale-data/xog_UG.dat,sha256=7Ft3wGj-9xqf-9AUUQlteuqRqcQKdmYx69SapgOjZCE,608
babel/locale-data/yav.dat,sha256=TgY99ASgQyjnMOCW4N2x3xonlWPNekJvOudZ53b325Q,15354
babel/locale-data/yav_CM.dat,sha256=7Zh5rEYu5q9jspiu_9pbQ3xewmLg_my-9Rt7rqOELnE,627
babel/locale-data/yi.dat,sha256=8oRirXWekzHxj00Uer9bzo08HWKIKAAS5MBFjfuipw4,30403
babel/locale-data/yi_001.dat,sha256=7Xf8CLNU0_JtRoWjwRdeOMQUxuCOIfMn6JgtuU3y2yk,903
babel/locale-data/yo.dat,sha256=ZufCWXkkr0h2lFvqXBzIrSTAfUOYV1aWOo_0-dgEr8Y,36073
babel/locale-data/yo_BJ.dat,sha256=v7sGbQbpNvx_925zeSHoAtlRlGj7aZuZ1Q-REvqaL9s,35277
babel/locale-data/yo_NG.dat,sha256=9XY2uokNDXCH8mbxl2lIRWAr0h39yAteR52zoOq7P7g,607
babel/locale-data/yue.dat,sha256=kDR-_CW4CAqqV-76GqPuvezZ55XloDm1cq9ckhoqPrc,176622
babel/locale-data/yue_Hans.dat,sha256=_GkNxpR7Ako3sJcHGfBiWl6aOswYZCGImDsM2Aj-BZ0,176532
babel/locale-data/yue_Hans_CN.dat,sha256=FzQmGCVsYnueDspYNGYj_DXHmMt_HLYG5gGmRFUHyT4,627
babel/locale-data/yue_Hant.dat,sha256=Na0Odc_YNhhVKjF2-IECRD83MTyW5JxDa214bVwKeSE,1297
babel/locale-data/yue_Hant_HK.dat,sha256=Ec0YPHv508DXmz4WTZyRXL3o1Vzt4g9aNtLy2QEC0ko,627
babel/locale-data/zgh.dat,sha256=D4nbMm0USubx9XKDP5MCvIe0QjMKsTWvZC_5EWOAYkQ,30568
babel/locale-data/zgh_MA.dat,sha256=jC43Fo4jRYvZlJw8YHkxMp397MnNJcV98LTJNXom-kQ,608
babel/locale-data/zh.dat,sha256=m43JIyhOjoSliRYPlfNr1BtwGB0weDIyhj8fgbX5iCs,178476
babel/locale-data/zh_Hans.dat,sha256=GjCjyfNKG8X93jBUM1Kz2xyOzaRo9c7d-wNjUxMQtC4,1296
babel/locale-data/zh_Hans_CN.dat,sha256=p5jtbCp3q1z8RyhHQbdEYtxxHeJZjE6hPHCZeaKuY18,626
babel/locale-data/zh_Hans_HK.dat,sha256=HFh5Iu49qjRP-aGP4Drj2Nd-afmy_nXurl2mz5CrsgE,4321
babel/locale-data/zh_Hans_MO.dat,sha256=4u8prMqf76bZEGZWmnttt8rFnOG9GQ9TJ-qvhDJMBV4,3266
babel/locale-data/zh_Hans_SG.dat,sha256=_d4ULzZoQycECN9bjIaWM7QT6NeqppuqZ_2J77SxEa8,3462
babel/locale-data/zh_Hant.dat,sha256=J-_FNz7Imicihh7kKd6t-AiB7JFNO_Et9D4L5BZL5GM,182449
babel/locale-data/zh_Hant_HK.dat,sha256=gna8uBk3yehPbTncX4g-xu_PKtqIx0m6wab3OFkocCo,54211
babel/locale-data/zh_Hant_MO.dat,sha256=ZAm_SZd9QU5d9yIpBY7zkXjftOuUsxO5n76GBC7PEr0,648
babel/locale-data/zh_Hant_TW.dat,sha256=HbzN_NAwhpX9xJ2wB2lCg-DcBsiCuP7lp3RK6xNtM58,626
babel/locale-data/zu.dat,sha256=Tk8uVFm5e3BT0K4TcTCBmh-KVbrfpP4EiUxAb97G5-M,170194
babel/locale-data/zu_ZA.dat,sha256=_bcquTfNmZuNRLAfnjIPVwShwnBdealyaQtkfbJB5bI,626
babel/localedata.py,sha256=YRA37osx1uFriIA6xsV4PH73pzZIRKAGC3DMAoiAhbY,7317
babel/localtime/__init__.py,sha256=97IqJD5FNnhre8jiYaEisp7PeWaBMhsb8EH0Gd2q5bM,1721
babel/localtime/__pycache__/__init__.cpython-37.pyc,,
babel/localtime/__pycache__/_unix.cpython-37.pyc,,
babel/localtime/__pycache__/_win32.cpython-37.pyc,,
babel/localtime/_unix.py,sha256=P66o3ErKXzhFvj3e3Qk6MBS7AR0qsDqSQclIAMHKp18,4801
babel/localtime/_win32.py,sha256=dGzhQ8AlY5iItSd-i3Fi2O3YWuVJ83PFSWe7EG2BaBg,3086
babel/messages/__init__.py,sha256=FslIS7Co5VK7Ec4g44kFO7m7zWw2-fQuu4gvTzqeIrk,254
babel/messages/__pycache__/__init__.cpython-37.pyc,,
babel/messages/__pycache__/catalog.cpython-37.pyc,,
babel/messages/__pycache__/checkers.cpython-37.pyc,,
babel/messages/__pycache__/extract.cpython-37.pyc,,
babel/messages/__pycache__/frontend.cpython-37.pyc,,
babel/messages/__pycache__/jslexer.cpython-37.pyc,,
babel/messages/__pycache__/mofile.cpython-37.pyc,,
babel/messages/__pycache__/plurals.cpython-37.pyc,,
babel/messages/__pycache__/pofile.cpython-37.pyc,,
babel/messages/catalog.py,sha256=kSj7z8QcQblXLvwyEC5AsuXZ1PnHEyWpBM49X0jUNqQ,32296
babel/messages/checkers.py,sha256=KwSkPIg3JJyjvhxkMOAAZFUs5ZQNae_wnMKRAYP6sis,6085
babel/messages/extract.py,sha256=E3mIosZGF6wNcVyylNIDbm1osgJsgRcOMGJnYNVLmus,26428
babel/messages/frontend.py,sha256=xN1sO2Y3Qp4FGj94vQToev3HeAzmFK5knWKtRzVpnzo,38729
babel/messages/jslexer.py,sha256=81Cun16nkMdbML2NAxixUls1fr2FHaW_-Uqju0wrL7s,6334
babel/messages/mofile.py,sha256=Ry-YGbadmabyB2I0WC8lGSBwLgYPXWOChzRILtcjs4A,7204
babel/messages/plurals.py,sha256=fXgXJ9kTllO0OjqQ-mqrpXW2lXNY1FTa9UrGrlaGBuc,7206
babel/messages/pofile.py,sha256=tGdqHM3tDSyDc6CFw9RwHDxCMQTEgacooKREqUnJBuk,21795
babel/numbers.py,sha256=wa9bdJvj5PZvM1wX7rzd4hdp3i6mx8nlk6et6aQKTF8,38551
babel/plural.py,sha256=rI02SVvzNQNniSh6TjfWIdwONJ3cE8JRS-V43P-KlC4,21314
babel/support.py,sha256=MSiTpW8BHfYAZMF6zfkfcv_pReGlmxDbAdNu96DzFjM,22303
babel/units.py,sha256=0Sl-FFQTRK36UMlFDZyDuTgRm1C8gT8SK02P3ViAr5M,11105
babel/util.py,sha256=JRSyuEezoLBMDDpIGrsgoV9bRTyOOS9CZEVppRbUjWo,7582

View file

@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.33.1)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any

View file

@ -0,0 +1,22 @@
[console_scripts]
pybabel = babel.messages.frontend:main
[distutils.commands]
compile_catalog = babel.messages.frontend:compile_catalog
extract_messages = babel.messages.frontend:extract_messages
init_catalog = babel.messages.frontend:init_catalog
update_catalog = babel.messages.frontend:update_catalog
[distutils.setup_keywords]
message_extractors = babel.messages.frontend:check_message_extractors
[babel.checkers]
num_plurals = babel.messages.checkers:num_plurals
python_format = babel.messages.checkers:python_format
[babel.extractors]
ignore = babel.messages.extract:extract_nothing
python = babel.messages.extract:extract_python
javascript = babel.messages.extract:extract_javascript

View file

@ -0,0 +1 @@
babel

View file

@ -0,0 +1,41 @@
GitPython was originally written by Michael Trier.
GitPython 0.2 was partially (re)written by Sebastian Thiel, based on 0.1.6 and git-dulwich.
Contributors are:
-Michael Trier <mtrier _at_ gmail.com>
-Alan Briolat
-Florian Apolloner <florian _at_ apolloner.eu>
-David Aguilar <davvid _at_ gmail.com>
-Jelmer Vernooij <jelmer _at_ samba.org>
-Steve Frécinaux <code _at_ istique.net>
-Kai Lautaportti <kai _at_ lautaportti.fi>
-Paul Sowden <paul _at_ idontsmoke.co.uk>
-Sebastian Thiel <byronimo _at_ gmail.com>
-Jonathan Chu <jonathan.chu _at_ me.com>
-Vincent Driessen <me _at_ nvie.com>
-Phil Elson <pelson _dot_ pub _at_ gmail.com>
-Bernard `Guyzmo` Pratz <guyzmo+gitpython+pub@m0g.net>
-Timothy B. Hartman <tbhartman _at_ gmail.com>
-Konstantin Popov <konstantin.popov.89 _at_ yandex.ru>
-Peter Jones <pjones _at_ redhat.com>
-Anson Mansfield <anson.mansfield _at_ gmail.com>
-Ken Odegard <ken.odegard _at_ gmail.com>
-Alexis Horgix Chotard
-Piotr Babij <piotr.babij _at_ gmail.com>
-Mikuláš Poul <mikulaspoul _at_ gmail.com>
-Charles Bouchard-Légaré <cblegare.atl _at_ ntis.ca>
-Yaroslav Halchenko <debian _at_ onerussian.com>
-Tim Swast <swast _at_ google.com>
-William Luc Ritchie
-David Host <hostdm _at_ outlook.com>
-A. Jesse Jiryu Davis <jesse _at_ emptysquare.net>
-Steven Whitman <ninloot _at_ gmail.com>
-Stefan Stancu <stefan.stancu _at_ gmail.com>
-César Izurieta <cesar _at_ caih.org>
-Arthur Milchior <arthur _at_ milchior.fr>
-Anil Khatri <anil.soccer.khatri _at_ gmail.com>
-JJ Graham <thetwoj _at_ gmail.com>
-Ben Thayer <ben _at_ benthayer.com>
Portions derived from other open source works and are clearly marked.

View file

@ -0,0 +1,30 @@
Copyright (C) 2008, 2009 Michael Trier and contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the GitPython project nor the names of
its contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -0,0 +1,29 @@
Metadata-Version: 2.1
Name: GitPython
Version: 3.0.5
Summary: Python Git Library
Home-page: https://github.com/gitpython-developers/GitPython
Author: Sebastian Thiel, Michael Trier
Author-email: byronimo@gmail.com, mtrier@gmail.com
License: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Operating System :: POSIX
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Requires-Python: >=3.0, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
Requires-Dist: gitdb2 (>=2.0.0)
GitPython is a python library used to interact with Git repositories

View file

@ -0,0 +1,207 @@
GitPython-3.0.5.dist-info/AUTHORS,sha256=QleDRpZmrngZXrZxZVPInx1CGC6WBs2wgquWA4u1R48,1645
GitPython-3.0.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
GitPython-3.0.5.dist-info/LICENSE,sha256=_WV__CzvY9JceMq3gI1BTdA6KC5jiTSR_RHDL5i-Z_s,1521
GitPython-3.0.5.dist-info/METADATA,sha256=Dh4IlJPr-rEGh3U-aLCdO8p-myboJXkcU6MX0SJWAsI,1094
GitPython-3.0.5.dist-info/RECORD,,
GitPython-3.0.5.dist-info/WHEEL,sha256=p46_5Uhzqz6AzeSosiOnxK-zmFja1i22CrQCjmYe8ec,92
GitPython-3.0.5.dist-info/top_level.txt,sha256=0hzDuIp8obv624V3GmbqsagBWkk8ohtGU-Bc1PmTT0o,4
git/__init__.py,sha256=8bGCzvbncwo7QrZPEkY8mozm-JTkrGaNlSMCS-pFWHk,2334
git/__pycache__/__init__.cpython-37.pyc,,
git/__pycache__/cmd.cpython-37.pyc,,
git/__pycache__/compat.cpython-37.pyc,,
git/__pycache__/config.cpython-37.pyc,,
git/__pycache__/db.cpython-37.pyc,,
git/__pycache__/diff.cpython-37.pyc,,
git/__pycache__/exc.cpython-37.pyc,,
git/__pycache__/remote.cpython-37.pyc,,
git/__pycache__/util.cpython-37.pyc,,
git/cmd.py,sha256=gZn9tM9Oy6Xao8O_Q6_xOlhYYhzU5dagxQ4DA5Cwyk0,42869
git/compat.py,sha256=g00yP8eq-ap2IOXXo6mppHd-4Iw8q-d6tDvQegj5UYw,9436
git/config.py,sha256=HJnL92g8GmpwNgH2LOkV3Z1eRK3KGgOh-gbGmHP4fiQ,28415
git/db.py,sha256=bhsP6H_7pAnm5hUBKod8ZguYrmYMB2L4RgkNswiMgEo,1963
git/diff.py,sha256=QaI2R3uyB0k9YOuBTOmzdIF7Om9iWgEzHtmJVRQJ7Xc,19965
git/exc.py,sha256=j09XYwbEitorNgZNeNvsCnroQ-IUUM2f35rO2Hy8Myw,4907
git/index/__init__.py,sha256=Wj5zgJggZkEXueEDXdijxXahzxhextC08k70n0lHRN0,129
git/index/__pycache__/__init__.cpython-37.pyc,,
git/index/__pycache__/base.cpython-37.pyc,,
git/index/__pycache__/fun.cpython-37.pyc,,
git/index/__pycache__/typ.cpython-37.pyc,,
git/index/__pycache__/util.cpython-37.pyc,,
git/index/base.py,sha256=jkb965u7XrZ4rJFwUqbpfX2vx5AURcdt48KLag1NzKU,52209
git/index/fun.py,sha256=EmS1szuhLthtoVw9fJZf2QKyiXAbcgZjM9ghfxfUgoI,14280
git/index/typ.py,sha256=GLBZbDS3yScHJs0U18CX-heLTDjjGu6fN7T2L_NQr4A,4976
git/index/util.py,sha256=l6oh9_1KU1v5GQdpxqCOqs6WLt5xN1uWvkVHQqcCToA,2902
git/objects/__init__.py,sha256=6C02LlMygiFwTYtncz3GxEQfzHZr2WvUId0fnJ8HfLo,683
git/objects/__pycache__/__init__.cpython-37.pyc,,
git/objects/__pycache__/base.cpython-37.pyc,,
git/objects/__pycache__/blob.cpython-37.pyc,,
git/objects/__pycache__/commit.cpython-37.pyc,,
git/objects/__pycache__/fun.cpython-37.pyc,,
git/objects/__pycache__/tag.cpython-37.pyc,,
git/objects/__pycache__/tree.cpython-37.pyc,,
git/objects/__pycache__/util.cpython-37.pyc,,
git/objects/base.py,sha256=UZiyzyzx4_OJ3bWnwqb3mqh0LXT7oo0biYaTm-sLuAw,6689
git/objects/blob.py,sha256=evI3ptPmlln6gLpoQRvbIKjK4v59nT8ipd1vk1dGYtc,927
git/objects/commit.py,sha256=-4Wn1dvM1EM6Su_NNZH-FKdyBtXM18jK4TUORApnnos,20761
git/objects/fun.py,sha256=UKFhCINLA4X7YjnGH1hxF0Uj2sHsKbxFDd3rrQmRq6U,7352
git/objects/submodule/__init__.py,sha256=OsMeiex7cG6ev2f35IaJ5csH-eXchSoNKCt4HXUG5Ws,93
git/objects/submodule/__pycache__/__init__.cpython-37.pyc,,
git/objects/submodule/__pycache__/base.cpython-37.pyc,,
git/objects/submodule/__pycache__/root.cpython-37.pyc,,
git/objects/submodule/__pycache__/util.cpython-37.pyc,,
git/objects/submodule/base.py,sha256=s8H54844tc09U76G3-2lM2X3A518AGyVTD1rvEh81tM,53875
git/objects/submodule/root.py,sha256=N2i0PjRcw5bNLLIDAkviQjXhf9RvGSfVnbav4FNzkXo,17656
git/objects/submodule/util.py,sha256=VdgIG-cBo47b_7JcolAvjWaIMU0X5oImLjJ4wluc_iw,2745
git/objects/tag.py,sha256=OFeN6ZkLU5zVTz_1xuPNpz4YoEgpSpVZ1MMJnnUyGqE,3127
git/objects/tree.py,sha256=Ta1qAkuwzn7lk54_d7knqF2WL6DOc2MQG1k8mKLel1s,11069
git/objects/util.py,sha256=fmukvCi3HUjD9fE8AtNgn0qhsImKCJGZ5sdEwGiM358,12451
git/refs/__init__.py,sha256=3CRfAyE-Z78rJ3kSdKR1PNiXHEjHLw2VkU2JyDviNDU,242
git/refs/__pycache__/__init__.cpython-37.pyc,,
git/refs/__pycache__/head.cpython-37.pyc,,
git/refs/__pycache__/log.cpython-37.pyc,,
git/refs/__pycache__/reference.cpython-37.pyc,,
git/refs/__pycache__/remote.cpython-37.pyc,,
git/refs/__pycache__/symbolic.cpython-37.pyc,,
git/refs/__pycache__/tag.cpython-37.pyc,,
git/refs/head.py,sha256=KY_-Hgm3JDJParX380zxQv5-slxtTNnUE8xs--8nt9U,8706
git/refs/log.py,sha256=NI8RndjtjKzOoqo2hx_ThSQ1lt0trHMgJYW_1ML62_E,10918
git/refs/reference.py,sha256=OcQMwHJuelR1yKe1EF0IBfxeQZYv2kf0xunNSVwZV-M,4408
git/refs/remote.py,sha256=6JOyIurnomM3tNXdKRXfMK_V75gJNgr9_2sdevKU_tI,1670
git/refs/symbolic.py,sha256=TtPRNbt1dnki-_TAjAn3gP_h9Ixgba7z0rWcy7_WbQ8,26840
git/refs/tag.py,sha256=qoHwJ9suHx8u8NNg-6GvNftK36RnCNkpElRjh2r9wcI,2964
git/remote.py,sha256=aJsDcJwqGd3iqGBmDPrWzAlHMRYG1vUAnhjYS3J-k8k,35739
git/repo/__init__.py,sha256=ssUH4IVCoua5shI5h1l46P0X1kp82ydxVcH3PIVCnzg,108
git/repo/__pycache__/__init__.cpython-37.pyc,,
git/repo/__pycache__/base.cpython-37.pyc,,
git/repo/__pycache__/fun.cpython-37.pyc,,
git/repo/base.py,sha256=9h61NMN4IK4-kUBEmavZHlzO5fkJrux19YORfyeA8xs,44515
git/repo/fun.py,sha256=SuguBZs4sZE_SvAcfvn7yxXdoxKmgQdwUhgKAkeyISQ,11396
git/test/__init__.py,sha256=q-WCITGqFKTHnRFjUvJz5hUJBi8SP4InaAZRXZ8qj8k,220
git/test/__pycache__/__init__.cpython-37.pyc,,
git/test/__pycache__/test_actor.cpython-37.pyc,,
git/test/__pycache__/test_base.cpython-37.pyc,,
git/test/__pycache__/test_blob.cpython-37.pyc,,
git/test/__pycache__/test_commit.cpython-37.pyc,,
git/test/__pycache__/test_config.cpython-37.pyc,,
git/test/__pycache__/test_db.cpython-37.pyc,,
git/test/__pycache__/test_diff.cpython-37.pyc,,
git/test/__pycache__/test_docs.cpython-37.pyc,,
git/test/__pycache__/test_exc.cpython-37.pyc,,
git/test/__pycache__/test_fun.cpython-37.pyc,,
git/test/__pycache__/test_git.cpython-37.pyc,,
git/test/__pycache__/test_index.cpython-37.pyc,,
git/test/__pycache__/test_reflog.cpython-37.pyc,,
git/test/__pycache__/test_refs.cpython-37.pyc,,
git/test/__pycache__/test_remote.cpython-37.pyc,,
git/test/__pycache__/test_repo.cpython-37.pyc,,
git/test/__pycache__/test_stats.cpython-37.pyc,,
git/test/__pycache__/test_submodule.cpython-37.pyc,,
git/test/__pycache__/test_tree.cpython-37.pyc,,
git/test/__pycache__/test_util.cpython-37.pyc,,
git/test/fixtures/__pycache__/cat_file.cpython-37.pyc,,
git/test/fixtures/blame,sha256=4EDRSXdgbRtxHU_2lASFXC7eNShL2cVq3IU43tLWlD4,3663
git/test/fixtures/blame_binary,sha256=YLzoHqTAuv2Uv8IILh4ndQxJ_A1c09176E-3d5FMQsM,14807
git/test/fixtures/blame_complex_revision,sha256=tPguLsqmLxjuZWg5nRcdZCZeaBi-LOeVQEHfTX6X_B0,7645
git/test/fixtures/blame_incremental,sha256=3VXtrk8LVqfS5f2vsP5DTzFU3opeevUbENQUq22vTdw,982
git/test/fixtures/blame_incremental_2.11.1_plus,sha256=JDA_xCevOrOMDeKW-U8svYeA0E8Pa3sI7G8GALpxOHw,1154
git/test/fixtures/cat_file.py,sha256=7RDIymGyByw8I1OibenXM-DVsZ0_7gpazeYYG4C5GDM,136
git/test/fixtures/cat_file_blob,sha256=ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw,11
git/test/fixtures/cat_file_blob_nl,sha256=GJShnIW6FTrL90OsTkP8AEyJFgSyb4xp4eg-oq_HxI8,12
git/test/fixtures/cat_file_blob_size,sha256=JdTyqG3rXiV0uzIQtnuyT8xK-xn5OntloFfaqHSp0Y4,3
git/test/fixtures/commit_invalid_data,sha256=QlV-Pw5mw1Vhp6qivAQY5kcBP_BMJ_OIdLCinmes5Sw,242
git/test/fixtures/commit_with_gpgsig,sha256=3in_tJPkQv2K1wFx-PGqaCZQe40liMnl9cMYOJ8krTA,1387
git/test/fixtures/diff_2,sha256=sxE-xkV5lQrUEbpllp2X_AcFfPUmUr2wvSsc9qkZQLc,1994
git/test/fixtures/diff_2f,sha256=na11T8R1dhJUOKeO-fEeHymOxhXNrjvzzmA_r7x6oJM,732
git/test/fixtures/diff_abbrev-40_full-index_M_raw_no-color,sha256=AW-YEfutyH_RVyaP2nCTPhtjvkfqWi7NVL4s9Ab3Qww,109
git/test/fixtures/diff_change_in_type,sha256=Wo1iCaT1YBfGn5ZSJ40H7iVeqXKm-v-qJnsBUBKrpsI,319
git/test/fixtures/diff_change_in_type_raw,sha256=67KYtwIlQdTSwesABnIYTZxFgiwPhVyBXaDFoPXRFt4,108
git/test/fixtures/diff_copied_mode,sha256=rzKjhxG_HWuzMJAuGlVS6RKYV6g7Ko8lhc1CdwxGj-g,95
git/test/fixtures/diff_copied_mode_raw,sha256=dssv9FuXzR_-urJrkaZkBySxHosrGMyna4TxjVsOl-k,122
git/test/fixtures/diff_f,sha256=sNsG26bYvqU4pK_RwahaO-Lya8O9Xonwlyth8do_ptY,504
git/test/fixtures/diff_file_with_spaces,sha256=BOvQkq4AjQ_cR1e0iLYDQdNq2BLa-P5xhI4Xal7hYcE,216
git/test/fixtures/diff_i,sha256=792rEQvP9Q-MNxZ3_FsvhG5emE_q1nT9jpmQ_A1hFWE,5705
git/test/fixtures/diff_index_patch,sha256=qd9jD_eAQY5I9OLsbqdz3-lm_ncL2ALJhVLyj3enAfk,4598
git/test/fixtures/diff_index_raw,sha256=odNXPZQ4rlBnqYfJvvTKGS8QvfJE33WN_X-lIRMT8NI,101
git/test/fixtures/diff_initial,sha256=1RJTg7QSTdMGlqLDvjFUhKtV0bAV2NFW8rHBgzlVfyg,76
git/test/fixtures/diff_mode_only,sha256=pqDOHBLm09TWZ0orff-S7pCkQktD2sooW5mURG0vqLQ,46005
git/test/fixtures/diff_new_mode,sha256=b70EDNoC_gfq_P_fVFCIqT3WHU_P0l-1jhuR2cSEJFg,546
git/test/fixtures/diff_numstat,sha256=_Ls171vvsERXlRiJ1i1tA5vHyoYCzt3hKorFmic7UyE,22
git/test/fixtures/diff_p,sha256=3YlhR3UNFIPDv90Zn1vCXC46kQCVDuepUZIzwzD8xmk,19273
git/test/fixtures/diff_patch_binary,sha256=CLWigD0x0z3n_fpdh8LlkEyRUy7oDiWM-CJpGrqWPiM,155
git/test/fixtures/diff_patch_unsafe_paths,sha256=jsc2GM8j56puEDnMEhlBHG4jIhziN0uY8cuzGTTtHmw,3145
git/test/fixtures/diff_raw_binary,sha256=-PUPqf5wop8KkmubHnPK6RAVinlJuQf9Lqo4VBff23I,103
git/test/fixtures/diff_rename,sha256=-f4kqw0Zt1lRZZOmt5I0w9Jenbr3PngyTH2QeUQfv8g,415
git/test/fixtures/diff_rename_raw,sha256=VVBUjGEoXWWMYQFq-dyE708DijCnG974Qn79plVT39Q,112
git/test/fixtures/diff_tree_numstat_root,sha256=NbBofQm3wGm-1hyz8XKIoxMtC_bzz4x8TlxxuF8LLDU,63
git/test/fixtures/for_each_ref_with_path_component,sha256=hHVSiVHNEW5PKSPP4zFxxpYs4EYlPSJ9y-yykzkpWjk,84
git/test/fixtures/git_config,sha256=_Igi3In2TsksvwUdn7YcusMv-069ftMdlV1G7ZCs8nU,1517
git/test/fixtures/git_config-inc.cfg,sha256=jYjjNgfYBBkEAXYj5wLy7en-ISXbvVyOOfOmKsURYdc,92
git/test/fixtures/git_config_global,sha256=_tFDHYTW1Hxue2WXqjafVm_b9eM-OjTV6WTD2yZ3aqM,366
git/test/fixtures/git_config_multiple,sha256=xhyn_df95CrbWfA_YWV_Y1eR9bpbc-xZxWAnzCJTUU4,121
git/test/fixtures/git_config_with_comments,sha256=Q9IHrB4KE3l15iXoYD9-4TIMyd_rFczQ1CPAu-CI8bU,3997
git/test/fixtures/git_config_with_empty_value,sha256=686iisjxnex4YeT4qWdjsQh22X8UDw5yzKSerefFSTM,35
git/test/fixtures/git_file,sha256=44Qr9_8TluxWGPiPjDT4dEyF8x3fvnA9W7moDNiFAKo,16
git/test/fixtures/index,sha256=OBeM4XodizcBFgK_7S92fdjNTaitNxGzSBkcHXXWQvs,163616
git/test/fixtures/index_merge,sha256=IdtRRV85gi9dGFC4LNuGrZU2yttGAAANeS0_qvNO85w,9192
git/test/fixtures/issue-301_stderr,sha256=z6QL_UgCKQ1MMviNQNdhM22hOgp00zfJyc5LCm7Jl64,302879
git/test/fixtures/ls_tree_a,sha256=uBvIY8-7HnaBvSsVYigYJdsbeslxrtfeXh-tWXKtOnc,429
git/test/fixtures/ls_tree_b,sha256=pW3aIRcXMA1ZSE36049fJWeiVQl95qk_31U8Eh3Tc1c,119
git/test/fixtures/ls_tree_commit,sha256=cOgzX5Qcqvy4LU4dIBkcc63ccrOPBLab5DsCQPVpz_E,173
git/test/fixtures/ls_tree_empty,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
git/test/fixtures/reflog_HEAD,sha256=8J5zwsJRmdb8xdWyQoRUzJYJnDSaeo0rLa5uthBovyQ,114210
git/test/fixtures/reflog_invalid_date,sha256=VlAYk2kGs3CySphJV0OmWwpWZK_uB9FxICTICZuKwSM,409
git/test/fixtures/reflog_invalid_email,sha256=1OoNdoGKNcNKWVQAv5ZKSgVEt0zSkigvHOTs3MMhVW0,411
git/test/fixtures/reflog_invalid_newsha,sha256=i-xph-C12dZT-dEKWS4VTDtX4AzQVUcCF3KXfMp9Gu0,404
git/test/fixtures/reflog_invalid_oldsha,sha256=guzXH-wQOfz3yQJFMChzhuXcgQ6G6rGTSwlIdBVX8Wg,398
git/test/fixtures/reflog_invalid_sep,sha256=0D9WHWpIGE2tQXD8utDcq-bbxdgVnWWCAMK_vwI3-zA,415
git/test/fixtures/reflog_master,sha256=K1-VX1oQ3gM_23qTjVV-8yQOXeXuRtePgUXAE6D1TVo,31286
git/test/fixtures/rev_list,sha256=pJPFZuJGwLzQ6m4P2d7VNaRLdMefGxxtztgU9fQfCCU,123
git/test/fixtures/rev_list_bisect_all,sha256=r0gnyZwq-IVHxNss4qE6zMv29PEcLyE0t_fV4MKISHc,2172
git/test/fixtures/rev_list_commit_diffs,sha256=n8qhU8FHEqr7Z8z8PvRGEODveuPbFIuaXB8UYGTqTPc,306
git/test/fixtures/rev_list_commit_idabbrev,sha256=W_cHcxor5sFGeS8-nmIpWNim-wtFY7636Hwh04Sfve8,271
git/test/fixtures/rev_list_commit_stats,sha256=1bZgYDN3iqjdIiZtYUuPNZXcyJYlDiusy3dw5utnr3M,244
git/test/fixtures/rev_list_count,sha256=wyBmlaA46bFntXaF6nx28phdDPwTZVW5kJr71pRrmb0,26855
git/test/fixtures/rev_list_delta_a,sha256=ikrcoYkO311vbCS_xoeyKE6myYKlKP5by88KU4oG6qI,328
git/test/fixtures/rev_list_delta_b,sha256=iiTGJRF2nzZrsHLXB1oOcZaoLvnSGAB3B9PLt5acmno,451
git/test/fixtures/rev_list_single,sha256=YqAJowQ_ujS8kUnNfBlm8ibKY7ki5vu2nXc_vt-4nq0,293
git/test/fixtures/rev_parse,sha256=y9iM5H6QPxDLEoGO9D4qSMBuDw4nz196c5VMflC1rak,8
git/test/fixtures/show_empty_commit,sha256=xeKoNCOFUPZcSztV3olKSs6u14fVdHwjnkGYLsEcZn8,252
git/test/fixtures/uncommon_branch_prefix_FETCH_HEAD,sha256=NO36DB4HWl4sOisR6EdFroTDakA-4XOx2kk4lFQIsiQ,603
git/test/fixtures/uncommon_branch_prefix_stderr,sha256=4-rJlXvPu-1ByjZzsUUJXFruPRxan7C5ssNtM7qZbeo,324
git/test/lib/__init__.py,sha256=k2xMRT9FC0m3yX_iMKaDcyuuZe0tGSr95ork3VOaeWk,414
git/test/lib/__pycache__/__init__.cpython-37.pyc,,
git/test/lib/__pycache__/asserts.cpython-37.pyc,,
git/test/lib/__pycache__/helper.cpython-37.pyc,,
git/test/lib/asserts.py,sha256=_9sOUHopeO-3PZOkxMXfTWaTxxPaWwmpnAVaDxpcaWk,2273
git/test/lib/helper.py,sha256=TI69pdx0xIMhfzOzBDB3BwqPvPsykp9bUXiyw2B0Xd8,13592
git/test/performance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
git/test/performance/__pycache__/__init__.cpython-37.pyc,,
git/test/performance/__pycache__/lib.cpython-37.pyc,,
git/test/performance/__pycache__/test_commit.cpython-37.pyc,,
git/test/performance/__pycache__/test_odb.cpython-37.pyc,,
git/test/performance/__pycache__/test_streams.cpython-37.pyc,,
git/test/performance/lib.py,sha256=qSicSiyRI30rP3EFeVoevC_sBDgXDFtZKIFr_Ikz84g,2427
git/test/performance/test_commit.py,sha256=ws8ORcvg3h0eXkI2G7a4OEl5QFG-9s2Agf0ut_8sUqU,3732
git/test/performance/test_odb.py,sha256=knbDhq2sRagwyGHKQ7uNZLWN8bzYt_VF6bNucoON6dI,2651
git/test/performance/test_streams.py,sha256=YriRvZ8i-yhMtQ5UdyGUt-X-fKhSddACwtT5e09bDyE,5816
git/test/test_actor.py,sha256=1bYmrTwWAYT_Qj9l9chbvuI8nNtHY6yGlDRJDDEq9A0,1242
git/test/test_base.py,sha256=k6I5nG7ZeBCYpXwi3HX_mvURFelgvQFys5pWVQR6kjw,5649
git/test/test_blob.py,sha256=Bs4FWke9Sjzx06EJuG9hh1T5qBgJEEz4aBCcr3cW9L0,878
git/test/test_commit.py,sha256=I9bHaid6bAR9vdEYyYLxP0Dfosn0vJ_ylCb_r-BYttI,15442
git/test/test_config.py,sha256=ZbUjlEwmIAKlpbpiJm8lizNUaopxLfslzsHiHtiaJMY,16611
git/test/test_db.py,sha256=e9UNddyQfoa-kzZo-XyrwVuYiq887NUkYrK8wZkTu9M,939
git/test/test_diff.py,sha256=49pEtXt6KTm3fHT3x0C1N7eh-lU4FY1pGDCZ8-k9bpw,15797
git/test/test_docs.py,sha256=XZZnXG7ya-liddMy39Ao6YtsRvYY3pXKMQXAW3gmulI,25340
git/test/test_exc.py,sha256=0DBYNiYVfPVlFKYRzqsoZUJnf0lQiUDmdrRIIHWeSlE,5123
git/test/test_fun.py,sha256=a91XgGk-YPwlgJEc-gy2tI_ilSq29XSQEywwc-kDnG0,10456
git/test/test_git.py,sha256=Jxd8gd0NKCnWPP0q9XbRdaMs6ZBb8xHaNRULYaAuWRk,11164
git/test/test_index.py,sha256=SoT5SRXnbsITU9zTkbCrUNUhnGqYer3T7HIs3O1C9pU,37348
git/test/test_reflog.py,sha256=vfI-NQCtnGlJEUtYR0_k7Y1Hc4pZQ5F_T4T49hxSnNU,3505
git/test/test_refs.py,sha256=2rNm9HdJZTWXx775JHG_R9Pd5X022IQ9C2CbP_9vDoE,23357
git/test/test_remote.py,sha256=pdrahbBiS513mS4oBLME2-pAsg0aMCYH5OoYaB9fD04,27019
git/test/test_repo.py,sha256=LkgJY_MC4F_2ZRgyDZ_zIQixuv3dcMuNkZP4Y9ChAlY,40101
git/test/test_stats.py,sha256=qmF2lL1wW0tEd17E-tkjmpPFVXzjREf7KW5JMCTQ4Zg,971
git/test/test_submodule.py,sha256=yyMisD-6UH0Im4sAKGgG1XTNMIBTbs5bRAz-3iZivOw,41981
git/test/test_tree.py,sha256=nR5OAQZLhv7kISoL3RO8ppkXAbKFYz3XlPAxABU1b4o,4046
git/test/test_util.py,sha256=BWEFonEy5ZasCvNRKWqfqfnEQ3wVHVtMqnWkqfmfqAI,9308
git/util.py,sha256=uJX0Q4FXyFYBhRQPWj6Cbe5KJCI7pvQzOn0wTSFtuKE,31606

View file

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.33.6)
Root-Is-Purelib: true
Tag: py3-none-any

View file

@ -0,0 +1 @@
pip

View file

@ -0,0 +1,174 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

View file

@ -0,0 +1,196 @@
Metadata-Version: 2.1
Name: PyNaCl
Version: 1.3.0
Summary: Python binding to the Networking and Cryptography (NaCl) library
Home-page: https://github.com/pyca/pynacl/
Author: The PyNaCl developers
Author-email: cryptography-dev@python.org
License: Apache License 2.0
Platform: UNKNOWN
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Provides-Extra: docs
Provides-Extra: tests
Requires-Dist: six
Requires-Dist: cffi (>=1.4.1)
Provides-Extra: docs
Requires-Dist: sphinx (>=1.6.5); extra == 'docs'
Requires-Dist: sphinx-rtd-theme; extra == 'docs'
Provides-Extra: tests
Requires-Dist: pytest (!=3.3.0,>=3.2.1); extra == 'tests'
Requires-Dist: hypothesis (>=3.27.0); extra == 'tests'
===============================================
PyNaCl: Python binding to the libsodium library
===============================================
.. image:: https://img.shields.io/pypi/v/pynacl.svg
:target: https://pypi.org/project/PyNaCl/
:alt: Latest Version
.. image:: https://travis-ci.org/pyca/pynacl.svg?branch=master
:target: https://travis-ci.org/pyca/pynacl
.. image:: https://codecov.io/github/pyca/pynacl/coverage.svg?branch=master
:target: https://codecov.io/github/pyca/pynacl?branch=master
PyNaCl is a Python binding to `libsodium`_, which is a fork of the
`Networking and Cryptography library`_. These libraries have a stated goal of
improving usability, security and speed. It supports Python 2.7 and 3.4+ as
well as PyPy 2.6+.
.. _libsodium: https://github.com/jedisct1/libsodium
.. _Networking and Cryptography library: https://nacl.cr.yp.to/
Features
--------
* Digital signatures
* Secret-key encryption
* Public-key encryption
* Hashing and message authentication
* Password based key derivation and password hashing
Installation
============
Binary wheel install
--------------------
PyNaCl ships as a binary wheel on OS X, Windows and Linux ``manylinux1`` [#many]_ ,
so all dependencies are included. Make sure you have an up-to-date pip
and run:
.. code-block:: console
$ pip install pynacl
Linux source build
------------------
PyNaCl relies on `libsodium`_, a portable C library. A copy is bundled
with PyNaCl so to install you can run:
.. code-block:: console
$ pip install pynacl
If you'd prefer to use the version of ``libsodium`` provided by your
distribution, you can disable the bundled copy during install by running:
.. code-block:: console
$ SODIUM_INSTALL=system pip install pynacl
.. warning:: Usage of the legacy ``easy_install`` command provided by setuptools
is generally discouraged, and is completely unsupported in PyNaCl's case.
.. _libsodium: https://github.com/jedisct1/libsodium
.. [#many] `manylinux1 wheels <https://www.python.org/dev/peps/pep-0513/>`_
are built on a baseline linux environment based on Centos 5.11
and should work on most x86 and x86_64 glibc based linux environments.
Changelog
=========
1.3.0 2018-09-26
----------------
* Added support for Python 3.7.
* Update ``libsodium`` to 1.0.16.
* Run and test all code examples in PyNaCl docs through sphinx's
doctest builder.
* Add low-level bindings for chacha20-poly1305 AEAD constructions.
* Add low-level bindings for the chacha20-poly1305 secretstream constructions.
* Add low-level bindings for ed25519ph pre-hashed signing construction.
* Add low-level bindings for constant-time increment and addition
on fixed-precision big integers represented as little-endian
byte sequences.
* Add low-level bindings for the ISO/IEC 7816-4 compatible padding API.
* Add low-level bindings for libsodium's crypto_kx... key exchange
construction.
* Set hypothesis deadline to None in tests/test_pwhash.py to avoid
incorrect test failures on slower processor architectures. GitHub
issue #370
1.2.1 - 2017-12-04
------------------
* Update hypothesis minimum allowed version.
* Infrastructure: add proper configuration for readthedocs builder
runtime environment.
1.2.0 - 2017-11-01
------------------
* Update ``libsodium`` to 1.0.15.
* Infrastructure: add jenkins support for automatic build of
``manylinux1`` binary wheels
* Added support for ``SealedBox`` construction.
* Added support for ``argon2i`` and ``argon2id`` password hashing constructs
and restructured high-level password hashing implementation to expose
the same interface for all hashers.
* Added support for 128 bit ``siphashx24`` variant of ``siphash24``.
* Added support for ``from_seed`` APIs for X25519 keypair generation.
* Dropped support for Python 3.3.
1.1.2 - 2017-03-31
------------------
* reorder link time library search path when using bundled
libsodium
1.1.1 - 2017-03-15
------------------
* Fixed a circular import bug in ``nacl.utils``.
1.1.0 - 2017-03-14
------------------
* Dropped support for Python 2.6.
* Added ``shared_key()`` method on ``Box``.
* You can now pass ``None`` to ``nonce`` when encrypting with ``Box`` or
``SecretBox`` and it will automatically generate a random nonce.
* Added support for ``siphash24``.
* Added support for ``blake2b``.
* Added support for ``scrypt``.
* Update ``libsodium`` to 1.0.11.
* Default to the bundled ``libsodium`` when compiling.
* All raised exceptions are defined mixing-in
``nacl.exceptions.CryptoError``
1.0.1 - 2016-01-24
------------------
* Fix an issue with absolute paths that prevented the creation of wheels.
1.0 - 2016-01-23
----------------
* PyNaCl has been ported to use the new APIs available in cffi 1.0+.
Due to this change we no longer support PyPy releases older than 2.6.
* Python 3.2 support has been dropped.
* Functions to convert between Ed25519 and Curve25519 keys have been added.
0.3.0 - 2015-03-04
------------------
* The low-level API (`nacl.c.*`) has been changed to match the
upstream NaCl C/C++ conventions (as well as those of other NaCl bindings).
The order of arguments and return values has changed significantly. To
avoid silent failures, `nacl.c` has been removed, and replaced with
`nacl.bindings` (with the new argument ordering). If you have code which
calls these functions (e.g. `nacl.c.crypto_box_keypair()`), you must review
the new docstrings and update your code/imports to match the new
conventions.

View file

@ -0,0 +1,65 @@
PyNaCl-1.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
PyNaCl-1.3.0.dist-info/LICENSE.txt,sha256=0xdK1j5yHUydzLitQyCEiZLTFDabxGMZcgtYAskVP-k,9694
PyNaCl-1.3.0.dist-info/METADATA,sha256=pl3lEk7jyuFK7MNHloWA3m28tYU6xHI-S4le43id_x8,6632
PyNaCl-1.3.0.dist-info/RECORD,,
PyNaCl-1.3.0.dist-info/WHEEL,sha256=C4bGFJmj_qggBmsPGIGQ0FKvkClHeS8w8oo07-tVF_E,108
PyNaCl-1.3.0.dist-info/top_level.txt,sha256=wfdEOI_G2RIzmzsMyhpqP17HUh6Jcqi99to9aHLEslo,13
nacl/__init__.py,sha256=PS9BuXZoCwSvrDpB8HXldTHnA6lb4y00IRi3uqdW5_E,1170
nacl/__pycache__/__init__.cpython-37.pyc,,
nacl/__pycache__/encoding.cpython-37.pyc,,
nacl/__pycache__/exceptions.cpython-37.pyc,,
nacl/__pycache__/hash.cpython-37.pyc,,
nacl/__pycache__/hashlib.cpython-37.pyc,,
nacl/__pycache__/public.cpython-37.pyc,,
nacl/__pycache__/secret.cpython-37.pyc,,
nacl/__pycache__/signing.cpython-37.pyc,,
nacl/__pycache__/utils.cpython-37.pyc,,
nacl/_sodium.abi3.so,sha256=sv2gxhpN8C_iHXhPays7QUezt3axiim7W9zm6ddQzH8,2486075
nacl/bindings/__init__.py,sha256=dNH1zFjW87qszsld5oy6xMf2S1w2v_qshQwYHp66pz4,14943
nacl/bindings/__pycache__/__init__.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_aead.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_box.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_generichash.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_hash.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_kx.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_pwhash.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_scalarmult.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_secretbox.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_secretstream.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_shorthash.cpython-37.pyc,,
nacl/bindings/__pycache__/crypto_sign.cpython-37.pyc,,
nacl/bindings/__pycache__/randombytes.cpython-37.pyc,,
nacl/bindings/__pycache__/sodium_core.cpython-37.pyc,,
nacl/bindings/__pycache__/utils.cpython-37.pyc,,
nacl/bindings/crypto_aead.py,sha256=DE5zdi09GeHZxvmrhHtxVuTqF61y1cs8trTGh_6uP8Q,17335
nacl/bindings/crypto_box.py,sha256=hbHJetr9id5OvkbJwJoeqRQAhqSIGwWC2aXRAF5oPE4,9708
nacl/bindings/crypto_generichash.py,sha256=-e4b4DaopLBQHhEjLSjEoumy5fOs4QdTb-hou1S34C4,8010
nacl/bindings/crypto_hash.py,sha256=7Xp4mpXr4cpn-hAOU66KlYVUCVHP6deT0v_eW4UZZXo,2243
nacl/bindings/crypto_kx.py,sha256=2Gjxu5c7IKAwW2MOJa9zEn1EgpIVQ0tbZQs33REZb38,6937
nacl/bindings/crypto_pwhash.py,sha256=lWhEFKmXzFhKnzzxtWDwozs0CseZDkGgTJaI4YQ5rak,16898
nacl/bindings/crypto_scalarmult.py,sha256=VA2khmlUrnR24KK0CAdDw2dQ0jiYkku9-_NA-f1p21c,1803
nacl/bindings/crypto_secretbox.py,sha256=luvzB3lwBwXxKm63e9nA2neGtOXeeG8R9SyWEckIqdI,2864
nacl/bindings/crypto_secretstream.py,sha256=gdKinW10jP3CZ51hanE40s6e39rz8iuajdXTSBSKVcM,10474
nacl/bindings/crypto_shorthash.py,sha256=eVUE8byB1RjI0AoHib5BdZSSLtSqtdIcHgPCPWf2OZM,2189
nacl/bindings/crypto_sign.py,sha256=uA0RdHM4vsBDNhph2f7fcuI_9K8vvW-4hNHjajTIVU0,9641
nacl/bindings/randombytes.py,sha256=eThts6s-9xBXOl3GNzT57fV1dZUhzPjjAmAVIUHfcrc,988
nacl/bindings/sodium_core.py,sha256=52z0K7y6Ge6IlXcysWDVN7UdYcTOij6v0Cb0OLo8_Qc,1079
nacl/bindings/utils.py,sha256=jOKsDbsjxN9v_HI8DOib72chyU3byqbynXxbiV909-g,4420
nacl/encoding.py,sha256=tOiyIQVVpGU6A4Lzr0tMuqomhc_Aj0V_c1t56a-ZtPw,1928
nacl/exceptions.py,sha256=SG0BNtXnzmppI9in6xMTSizh1ryfgUIvIVMQv_A0bs8,1858
nacl/hash.py,sha256=4DKlmqpWOZJLhzTPk7_JSGXQ32lJULsS3AzJCGsibus,5928
nacl/hashlib.py,sha256=gMxOu-lIlKYr3ywSCjsJRBksYgpU2dvXgaAEfQz7PEg,3909
nacl/public.py,sha256=-nwQof5ov-wSSdvvoXh-FavTtjfpRnYykZkatNKyLd0,13442
nacl/pwhash/__init__.py,sha256=CN0mP6yteSYp3ui-DyWR1vjULNrXVN_gQ72CmTPoao0,2695
nacl/pwhash/__pycache__/__init__.cpython-37.pyc,,
nacl/pwhash/__pycache__/_argon2.cpython-37.pyc,,
nacl/pwhash/__pycache__/argon2i.cpython-37.pyc,,
nacl/pwhash/__pycache__/argon2id.cpython-37.pyc,,
nacl/pwhash/__pycache__/scrypt.cpython-37.pyc,,
nacl/pwhash/_argon2.py,sha256=Eu3-juLws3_v1gNy5aeSVPEwuRVFdGOrfeF0wPH9VHA,1878
nacl/pwhash/argon2i.py,sha256=EpheK0UHJvZYca_EMhhOcX5GXaOr0xCjFDTIgmSCSDo,4598
nacl/pwhash/argon2id.py,sha256=IqNm5RQNEd1Z9F-bEWT-_Y9noU26QoTR5YdWONg1uuI,4610
nacl/pwhash/scrypt.py,sha256=F9iUKbzZUMG2ZXuuk70p4KXI_nItue3VA39zmwOESE8,6025
nacl/secret.py,sha256=jf4WuUjnnXTekZ2elGgQozZl6zGzxGY_0Nw0fwehUlg,5430
nacl/signing.py,sha256=ZwA1l31ZgOIw_sAjiUPkzEo07uYYi8SE7Ni0G_R8ksQ,7302
nacl/utils.py,sha256=hhmIriBM7Bwyh3beTrqVqDDucai5gXlSliAMVrxIHPI,1691

View file

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.31.1)
Root-Is-Purelib: false
Tag: cp34-abi3-manylinux1_x86_64

View file

@ -0,0 +1,2 @@
_sodium
nacl

View file

@ -0,0 +1,181 @@
Metadata-Version: 2.1
Name: SQLAlchemy
Version: 1.3.11
Summary: Database Abstraction Library
Home-page: http://www.sqlalchemy.org
Author: Mike Bayer
Author-email: mike_mp@zzzcomputing.com
License: MIT
Project-URL: Documentation, https://docs.sqlalchemy.org
Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/
Description: SQLAlchemy
==========
The Python SQL Toolkit and Object Relational Mapper
Introduction
-------------
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper
that gives application developers the full power and
flexibility of SQL. SQLAlchemy provides a full suite
of well known enterprise-level persistence patterns,
designed for efficient and high-performing database
access, adapted into a simple and Pythonic domain
language.
Major SQLAlchemy features include:
* An industrial strength ORM, built
from the core on the identity map, unit of work,
and data mapper patterns. These patterns
allow transparent persistence of objects
using a declarative configuration system.
Domain models
can be constructed and manipulated naturally,
and changes are synchronized with the
current transaction automatically.
* A relationally-oriented query system, exposing
the full range of SQL's capabilities
explicitly, including joins, subqueries,
correlation, and most everything else,
in terms of the object model.
Writing queries with the ORM uses the same
techniques of relational composition you use
when writing SQL. While you can drop into
literal SQL at any time, it's virtually never
needed.
* A comprehensive and flexible system
of eager loading for related collections and objects.
Collections are cached within a session,
and can be loaded on individual access, all
at once using joins, or by query per collection
across the full result set.
* A Core SQL construction system and DBAPI
interaction layer. The SQLAlchemy Core is
separate from the ORM and is a full database
abstraction layer in its own right, and includes
an extensible Python-based SQL expression
language, schema metadata, connection pooling,
type coercion, and custom types.
* All primary and foreign key constraints are
assumed to be composite and natural. Surrogate
integer primary keys are of course still the
norm, but SQLAlchemy never assumes or hardcodes
to this model.
* Database introspection and generation. Database
schemas can be "reflected" in one step into
Python structures representing database metadata;
those same structures can then generate
CREATE statements right back out - all within
the Core, independent of the ORM.
SQLAlchemy's philosophy:
* SQL databases behave less and less like object
collections the more size and performance start to
matter; object collections behave less and less like
tables and rows the more abstraction starts to matter.
SQLAlchemy aims to accommodate both of these
principles.
* An ORM doesn't need to hide the "R". A relational
database provides rich, set-based functionality
that should be fully exposed. SQLAlchemy's
ORM provides an open-ended set of patterns
that allow a developer to construct a custom
mediation layer between a domain model and
a relational schema, turning the so-called
"object relational impedance" issue into
a distant memory.
* The developer, in all cases, makes all decisions
regarding the design, structure, and naming conventions
of both the object model as well as the relational
schema. SQLAlchemy only provides the means
to automate the execution of these decisions.
* With SQLAlchemy, there's no such thing as
"the ORM generated a bad query" - you
retain full control over the structure of
queries, including how joins are organized,
how subqueries and correlation is used, what
columns are requested. Everything SQLAlchemy
does is ultimately the result of a developer-
initiated decision.
* Don't use an ORM if the problem doesn't need one.
SQLAlchemy consists of a Core and separate ORM
component. The Core offers a full SQL expression
language that allows Pythonic construction
of SQL constructs that render directly to SQL
strings for a target database, returning
result sets that are essentially enhanced DBAPI
cursors.
* Transactions should be the norm. With SQLAlchemy's
ORM, nothing goes to permanent storage until
commit() is called. SQLAlchemy encourages applications
to create a consistent means of delineating
the start and end of a series of operations.
* Never render a literal value in a SQL statement.
Bound parameters are used to the greatest degree
possible, allowing query optimizers to cache
query plans effectively and making SQL injection
attacks a non-issue.
Documentation
-------------
Latest documentation is at:
http://www.sqlalchemy.org/docs/
Installation / Requirements
---------------------------
Full documentation for installation is at
`Installation <http://www.sqlalchemy.org/docs/intro.html#installation>`_.
Getting Help / Development / Bug reporting
------------------------------------------
Please refer to the `SQLAlchemy Community Guide <http://www.sqlalchemy.org/support.html>`_.
Code of Conduct
---------------
Above all, SQLAlchemy places great emphasis on polite, thoughtful, and
constructive communication between users and developers.
Please see our current Code of Conduct at
`Code of Conduct <http://www.sqlalchemy.org/codeofconduct.html>`_.
License
-------
SQLAlchemy is distributed under the `MIT license
<http://www.opensource.org/licenses/mit-license.php>`_.
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Database :: Front-Ends
Classifier: Operating System :: OS Independent
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
Provides-Extra: mssql
Provides-Extra: postgresql
Provides-Extra: postgresql_psycopg2binary
Provides-Extra: postgresql_psycopg2cffi
Provides-Extra: mssql_pyodbc
Provides-Extra: pymysql
Provides-Extra: oracle
Provides-Extra: mssql_pymssql
Provides-Extra: mysql
Provides-Extra: postgresql_pg8000

View file

@ -0,0 +1,847 @@
AUTHORS
CHANGES
LICENSE
MANIFEST.in
README.dialects.rst
README.rst
README.unittests.rst
setup.cfg
setup.py
tox.ini
doc/contents.html
doc/copyright.html
doc/errors.html
doc/genindex.html
doc/glossary.html
doc/index.html
doc/intro.html
doc/notfound.html
doc/search.html
doc/searchindex.js
doc/_images/sqla_arch_small.png
doc/_images/sqla_engine_arch.png
doc/_modules/index.html
doc/_modules/examples/adjacency_list/adjacency_list.html
doc/_modules/examples/association/basic_association.html
doc/_modules/examples/association/dict_of_sets_with_default.html
doc/_modules/examples/association/proxied_association.html
doc/_modules/examples/custom_attributes/active_column_defaults.html
doc/_modules/examples/custom_attributes/custom_management.html
doc/_modules/examples/custom_attributes/listen_for_events.html
doc/_modules/examples/dogpile_caching/advanced.html
doc/_modules/examples/dogpile_caching/caching_query.html
doc/_modules/examples/dogpile_caching/environment.html
doc/_modules/examples/dogpile_caching/fixture_data.html
doc/_modules/examples/dogpile_caching/helloworld.html
doc/_modules/examples/dogpile_caching/local_session_caching.html
doc/_modules/examples/dogpile_caching/model.html
doc/_modules/examples/dogpile_caching/relationship_caching.html
doc/_modules/examples/dynamic_dict/dynamic_dict.html
doc/_modules/examples/elementtree/adjacency_list.html
doc/_modules/examples/elementtree/optimized_al.html
doc/_modules/examples/elementtree/pickle_type.html
doc/_modules/examples/generic_associations/discriminator_on_association.html
doc/_modules/examples/generic_associations/generic_fk.html
doc/_modules/examples/generic_associations/table_per_association.html
doc/_modules/examples/generic_associations/table_per_related.html
doc/_modules/examples/graphs/directed_graph.html
doc/_modules/examples/inheritance/concrete.html
doc/_modules/examples/inheritance/joined.html
doc/_modules/examples/inheritance/single.html
doc/_modules/examples/join_conditions/cast.html
doc/_modules/examples/join_conditions/threeway.html
doc/_modules/examples/large_collection/large_collection.html
doc/_modules/examples/materialized_paths/materialized_paths.html
doc/_modules/examples/nested_sets/nested_sets.html
doc/_modules/examples/performance/__main__.html
doc/_modules/examples/performance/bulk_inserts.html
doc/_modules/examples/performance/bulk_updates.html
doc/_modules/examples/performance/large_resultsets.html
doc/_modules/examples/performance/short_selects.html
doc/_modules/examples/performance/single_inserts.html
doc/_modules/examples/postgis/postgis.html
doc/_modules/examples/sharding/attribute_shard.html
doc/_modules/examples/space_invaders/space_invaders.html
doc/_modules/examples/versioned_history/history_meta.html
doc/_modules/examples/versioned_history/test_versioning.html
doc/_modules/examples/versioned_rows/versioned_map.html
doc/_modules/examples/versioned_rows/versioned_rows.html
doc/_modules/examples/versioned_rows/versioned_rows_w_versionid.html
doc/_modules/examples/versioned_rows/versioned_update_old_row.html
doc/_modules/examples/vertical/dictlike-polymorphic.html
doc/_modules/examples/vertical/dictlike.html
doc/_static/basic.css
doc/_static/changelog.css
doc/_static/detectmobile.js
doc/_static/docs.css
doc/_static/doctools.js
doc/_static/documentation_options.js
doc/_static/dragons.png
doc/_static/file.png
doc/_static/init.js
doc/_static/jquery-3.4.1.js
doc/_static/jquery.js
doc/_static/language_data.js
doc/_static/minus.png
doc/_static/plus.png
doc/_static/pygments.css
doc/_static/searchtools.js
doc/_static/sphinx_paramlinks.css
doc/_static/underscore-1.3.1.js
doc/_static/underscore.js
doc/build/Makefile
doc/build/conf.py
doc/build/contents.rst
doc/build/copyright.rst
doc/build/corrections.py
doc/build/errors.rst
doc/build/glossary.rst
doc/build/index.rst
doc/build/intro.rst
doc/build/requirements.txt
doc/build/sqla_arch_small.png
doc/build/changelog/changelog_01.rst
doc/build/changelog/changelog_02.rst
doc/build/changelog/changelog_03.rst
doc/build/changelog/changelog_04.rst
doc/build/changelog/changelog_05.rst
doc/build/changelog/changelog_06.rst
doc/build/changelog/changelog_07.rst
doc/build/changelog/changelog_08.rst
doc/build/changelog/changelog_09.rst
doc/build/changelog/changelog_10.rst
doc/build/changelog/changelog_11.rst
doc/build/changelog/changelog_12.rst
doc/build/changelog/changelog_13.rst
doc/build/changelog/index.rst
doc/build/changelog/migration_04.rst
doc/build/changelog/migration_05.rst
doc/build/changelog/migration_06.rst
doc/build/changelog/migration_07.rst
doc/build/changelog/migration_08.rst
doc/build/changelog/migration_09.rst
doc/build/changelog/migration_10.rst
doc/build/changelog/migration_11.rst
doc/build/changelog/migration_12.rst
doc/build/changelog/migration_13.rst
doc/build/changelog/unreleased_10/4065.rst
doc/build/changelog/unreleased_10/README.txt
doc/build/changelog/unreleased_11/README.txt
doc/build/changelog/unreleased_12/README.txt
doc/build/changelog/unreleased_13/README.txt
doc/build/core/api_basics.rst
doc/build/core/compiler.rst
doc/build/core/connections.rst
doc/build/core/constraints.rst
doc/build/core/custom_types.rst
doc/build/core/ddl.rst
doc/build/core/defaults.rst
doc/build/core/dml.rst
doc/build/core/engines.rst
doc/build/core/engines_connections.rst
doc/build/core/event.rst
doc/build/core/events.rst
doc/build/core/exceptions.rst
doc/build/core/expression_api.rst
doc/build/core/functions.rst
doc/build/core/index.rst
doc/build/core/inspection.rst
doc/build/core/interfaces.rst
doc/build/core/internals.rst
doc/build/core/metadata.rst
doc/build/core/pooling.rst
doc/build/core/reflection.rst
doc/build/core/schema.rst
doc/build/core/selectable.rst
doc/build/core/serializer.rst
doc/build/core/sqla_engine_arch.png
doc/build/core/sqlelement.rst
doc/build/core/tutorial.rst
doc/build/core/type_api.rst
doc/build/core/type_basics.rst
doc/build/core/types.rst
doc/build/core/visitors.rst
doc/build/dialects/firebird.rst
doc/build/dialects/index.rst
doc/build/dialects/mssql.rst
doc/build/dialects/mysql.rst
doc/build/dialects/oracle.rst
doc/build/dialects/postgresql.rst
doc/build/dialects/sqlite.rst
doc/build/dialects/sybase.rst
doc/build/faq/connections.rst
doc/build/faq/index.rst
doc/build/faq/metadata_schema.rst
doc/build/faq/ormconfiguration.rst
doc/build/faq/performance.rst
doc/build/faq/sessions.rst
doc/build/faq/sqlexpressions.rst
doc/build/orm/backref.rst
doc/build/orm/basic_relationships.rst
doc/build/orm/cascades.rst
doc/build/orm/classical.rst
doc/build/orm/collections.rst
doc/build/orm/composites.rst
doc/build/orm/constructors.rst
doc/build/orm/contextual.rst
doc/build/orm/deprecated.rst
doc/build/orm/events.rst
doc/build/orm/examples.rst
doc/build/orm/exceptions.rst
doc/build/orm/extending.rst
doc/build/orm/index.rst
doc/build/orm/inheritance.rst
doc/build/orm/inheritance_loading.rst
doc/build/orm/internals.rst
doc/build/orm/join_conditions.rst
doc/build/orm/loading.rst
doc/build/orm/loading_columns.rst
doc/build/orm/loading_objects.rst
doc/build/orm/loading_relationships.rst
doc/build/orm/mapped_attributes.rst
doc/build/orm/mapped_sql_expr.rst
doc/build/orm/mapper_config.rst
doc/build/orm/mapping_api.rst
doc/build/orm/mapping_columns.rst
doc/build/orm/mapping_styles.rst
doc/build/orm/nonstandard_mappings.rst
doc/build/orm/persistence_techniques.rst
doc/build/orm/query.rst
doc/build/orm/relationship_api.rst
doc/build/orm/relationship_persistence.rst
doc/build/orm/relationships.rst
doc/build/orm/scalar_mapping.rst
doc/build/orm/self_referential.rst
doc/build/orm/session.rst
doc/build/orm/session_api.rst
doc/build/orm/session_basics.rst
doc/build/orm/session_events.rst
doc/build/orm/session_state_management.rst
doc/build/orm/session_transaction.rst
doc/build/orm/tutorial.rst
doc/build/orm/versioning.rst
doc/build/orm/extensions/associationproxy.rst
doc/build/orm/extensions/automap.rst
doc/build/orm/extensions/baked.rst
doc/build/orm/extensions/horizontal_shard.rst
doc/build/orm/extensions/hybrid.rst
doc/build/orm/extensions/index.rst
doc/build/orm/extensions/indexable.rst
doc/build/orm/extensions/instrumentation.rst
doc/build/orm/extensions/mutable.rst
doc/build/orm/extensions/orderinglist.rst
doc/build/orm/extensions/declarative/api.rst
doc/build/orm/extensions/declarative/basic_use.rst
doc/build/orm/extensions/declarative/index.rst
doc/build/orm/extensions/declarative/inheritance.rst
doc/build/orm/extensions/declarative/mixins.rst
doc/build/orm/extensions/declarative/relationships.rst
doc/build/orm/extensions/declarative/table_config.rst
doc/build/texinputs/Makefile
doc/build/texinputs/sphinx.sty
doc/changelog/changelog_01.html
doc/changelog/changelog_02.html
doc/changelog/changelog_03.html
doc/changelog/changelog_04.html
doc/changelog/changelog_05.html
doc/changelog/changelog_06.html
doc/changelog/changelog_07.html
doc/changelog/changelog_08.html
doc/changelog/changelog_09.html
doc/changelog/changelog_10.html
doc/changelog/changelog_11.html
doc/changelog/changelog_12.html
doc/changelog/changelog_13.html
doc/changelog/index.html
doc/changelog/migration_04.html
doc/changelog/migration_05.html
doc/changelog/migration_06.html
doc/changelog/migration_07.html
doc/changelog/migration_08.html
doc/changelog/migration_09.html
doc/changelog/migration_10.html
doc/changelog/migration_11.html
doc/changelog/migration_12.html
doc/changelog/migration_13.html
doc/core/api_basics.html
doc/core/compiler.html
doc/core/connections.html
doc/core/constraints.html
doc/core/custom_types.html
doc/core/ddl.html
doc/core/defaults.html
doc/core/dml.html
doc/core/engines.html
doc/core/engines_connections.html
doc/core/event.html
doc/core/events.html
doc/core/exceptions.html
doc/core/expression_api.html
doc/core/functions.html
doc/core/index.html
doc/core/inspection.html
doc/core/interfaces.html
doc/core/internals.html
doc/core/metadata.html
doc/core/pooling.html
doc/core/reflection.html
doc/core/schema.html
doc/core/selectable.html
doc/core/serializer.html
doc/core/sqlelement.html
doc/core/tutorial.html
doc/core/type_api.html
doc/core/type_basics.html
doc/core/types.html
doc/core/visitors.html
doc/dialects/firebird.html
doc/dialects/index.html
doc/dialects/mssql.html
doc/dialects/mysql.html
doc/dialects/oracle.html
doc/dialects/postgresql.html
doc/dialects/sqlite.html
doc/dialects/sybase.html
doc/faq/connections.html
doc/faq/index.html
doc/faq/metadata_schema.html
doc/faq/ormconfiguration.html
doc/faq/performance.html
doc/faq/sessions.html
doc/faq/sqlexpressions.html
doc/orm/backref.html
doc/orm/basic_relationships.html
doc/orm/cascades.html
doc/orm/classical.html
doc/orm/collections.html
doc/orm/composites.html
doc/orm/constructors.html
doc/orm/contextual.html
doc/orm/deprecated.html
doc/orm/events.html
doc/orm/examples.html
doc/orm/exceptions.html
doc/orm/extending.html
doc/orm/index.html
doc/orm/inheritance.html
doc/orm/inheritance_loading.html
doc/orm/internals.html
doc/orm/join_conditions.html
doc/orm/loading.html
doc/orm/loading_columns.html
doc/orm/loading_objects.html
doc/orm/loading_relationships.html
doc/orm/mapped_attributes.html
doc/orm/mapped_sql_expr.html
doc/orm/mapper_config.html
doc/orm/mapping_api.html
doc/orm/mapping_columns.html
doc/orm/mapping_styles.html
doc/orm/nonstandard_mappings.html
doc/orm/persistence_techniques.html
doc/orm/query.html
doc/orm/relationship_api.html
doc/orm/relationship_persistence.html
doc/orm/relationships.html
doc/orm/scalar_mapping.html
doc/orm/self_referential.html
doc/orm/session.html
doc/orm/session_api.html
doc/orm/session_basics.html
doc/orm/session_events.html
doc/orm/session_state_management.html
doc/orm/session_transaction.html
doc/orm/tutorial.html
doc/orm/versioning.html
doc/orm/extensions/associationproxy.html
doc/orm/extensions/automap.html
doc/orm/extensions/baked.html
doc/orm/extensions/horizontal_shard.html
doc/orm/extensions/hybrid.html
doc/orm/extensions/index.html
doc/orm/extensions/indexable.html
doc/orm/extensions/instrumentation.html
doc/orm/extensions/mutable.html
doc/orm/extensions/orderinglist.html
doc/orm/extensions/declarative/api.html
doc/orm/extensions/declarative/basic_use.html
doc/orm/extensions/declarative/index.html
doc/orm/extensions/declarative/inheritance.html
doc/orm/extensions/declarative/mixins.html
doc/orm/extensions/declarative/relationships.html
doc/orm/extensions/declarative/table_config.html
examples/__init__.py
examples/adjacency_list/__init__.py
examples/adjacency_list/adjacency_list.py
examples/association/__init__.py
examples/association/basic_association.py
examples/association/dict_of_sets_with_default.py
examples/association/proxied_association.py
examples/custom_attributes/__init__.py
examples/custom_attributes/active_column_defaults.py
examples/custom_attributes/custom_management.py
examples/custom_attributes/listen_for_events.py
examples/dogpile_caching/__init__.py
examples/dogpile_caching/advanced.py
examples/dogpile_caching/caching_query.py
examples/dogpile_caching/environment.py
examples/dogpile_caching/fixture_data.py
examples/dogpile_caching/helloworld.py
examples/dogpile_caching/local_session_caching.py
examples/dogpile_caching/model.py
examples/dogpile_caching/relationship_caching.py
examples/dynamic_dict/__init__.py
examples/dynamic_dict/dynamic_dict.py
examples/elementtree/__init__.py
examples/elementtree/adjacency_list.py
examples/elementtree/optimized_al.py
examples/elementtree/pickle_type.py
examples/elementtree/test.xml
examples/elementtree/test2.xml
examples/elementtree/test3.xml
examples/generic_associations/__init__.py
examples/generic_associations/discriminator_on_association.py
examples/generic_associations/generic_fk.py
examples/generic_associations/table_per_association.py
examples/generic_associations/table_per_related.py
examples/graphs/__init__.py
examples/graphs/directed_graph.py
examples/inheritance/__init__.py
examples/inheritance/concrete.py
examples/inheritance/joined.py
examples/inheritance/single.py
examples/join_conditions/__init__.py
examples/join_conditions/cast.py
examples/join_conditions/threeway.py
examples/large_collection/__init__.py
examples/large_collection/large_collection.py
examples/materialized_paths/__init__.py
examples/materialized_paths/materialized_paths.py
examples/nested_sets/__init__.py
examples/nested_sets/nested_sets.py
examples/performance/__init__.py
examples/performance/__main__.py
examples/performance/bulk_inserts.py
examples/performance/bulk_updates.py
examples/performance/large_resultsets.py
examples/performance/short_selects.py
examples/performance/single_inserts.py
examples/postgis/__init__.py
examples/postgis/postgis.py
examples/sharding/__init__.py
examples/sharding/attribute_shard.py
examples/space_invaders/__init__.py
examples/space_invaders/space_invaders.py
examples/versioned_history/__init__.py
examples/versioned_history/history_meta.py
examples/versioned_history/test_versioning.py
examples/versioned_rows/__init__.py
examples/versioned_rows/versioned_map.py
examples/versioned_rows/versioned_rows.py
examples/versioned_rows/versioned_rows_w_versionid.py
examples/versioned_rows/versioned_update_old_row.py
examples/vertical/__init__.py
examples/vertical/dictlike-polymorphic.py
examples/vertical/dictlike.py
lib/SQLAlchemy.egg-info/PKG-INFO
lib/SQLAlchemy.egg-info/SOURCES.txt
lib/SQLAlchemy.egg-info/dependency_links.txt
lib/SQLAlchemy.egg-info/requires.txt
lib/SQLAlchemy.egg-info/top_level.txt
lib/sqlalchemy/__init__.py
lib/sqlalchemy/events.py
lib/sqlalchemy/exc.py
lib/sqlalchemy/inspection.py
lib/sqlalchemy/interfaces.py
lib/sqlalchemy/log.py
lib/sqlalchemy/processors.py
lib/sqlalchemy/schema.py
lib/sqlalchemy/types.py
lib/sqlalchemy/cextension/processors.c
lib/sqlalchemy/cextension/resultproxy.c
lib/sqlalchemy/cextension/utils.c
lib/sqlalchemy/connectors/__init__.py
lib/sqlalchemy/connectors/mxodbc.py
lib/sqlalchemy/connectors/pyodbc.py
lib/sqlalchemy/connectors/zxJDBC.py
lib/sqlalchemy/databases/__init__.py
lib/sqlalchemy/dialects/__init__.py
lib/sqlalchemy/dialects/type_migration_guidelines.txt
lib/sqlalchemy/dialects/firebird/__init__.py
lib/sqlalchemy/dialects/firebird/base.py
lib/sqlalchemy/dialects/firebird/fdb.py
lib/sqlalchemy/dialects/firebird/kinterbasdb.py
lib/sqlalchemy/dialects/mssql/__init__.py
lib/sqlalchemy/dialects/mssql/adodbapi.py
lib/sqlalchemy/dialects/mssql/base.py
lib/sqlalchemy/dialects/mssql/information_schema.py
lib/sqlalchemy/dialects/mssql/mxodbc.py
lib/sqlalchemy/dialects/mssql/pymssql.py
lib/sqlalchemy/dialects/mssql/pyodbc.py
lib/sqlalchemy/dialects/mssql/zxjdbc.py
lib/sqlalchemy/dialects/mysql/__init__.py
lib/sqlalchemy/dialects/mysql/base.py
lib/sqlalchemy/dialects/mysql/cymysql.py
lib/sqlalchemy/dialects/mysql/dml.py
lib/sqlalchemy/dialects/mysql/enumerated.py
lib/sqlalchemy/dialects/mysql/gaerdbms.py
lib/sqlalchemy/dialects/mysql/json.py
lib/sqlalchemy/dialects/mysql/mysqlconnector.py
lib/sqlalchemy/dialects/mysql/mysqldb.py
lib/sqlalchemy/dialects/mysql/oursql.py
lib/sqlalchemy/dialects/mysql/pymysql.py
lib/sqlalchemy/dialects/mysql/pyodbc.py
lib/sqlalchemy/dialects/mysql/reflection.py
lib/sqlalchemy/dialects/mysql/types.py
lib/sqlalchemy/dialects/mysql/zxjdbc.py
lib/sqlalchemy/dialects/oracle/__init__.py
lib/sqlalchemy/dialects/oracle/base.py
lib/sqlalchemy/dialects/oracle/cx_oracle.py
lib/sqlalchemy/dialects/oracle/zxjdbc.py
lib/sqlalchemy/dialects/postgresql/__init__.py
lib/sqlalchemy/dialects/postgresql/array.py
lib/sqlalchemy/dialects/postgresql/base.py
lib/sqlalchemy/dialects/postgresql/dml.py
lib/sqlalchemy/dialects/postgresql/ext.py
lib/sqlalchemy/dialects/postgresql/hstore.py
lib/sqlalchemy/dialects/postgresql/json.py
lib/sqlalchemy/dialects/postgresql/pg8000.py
lib/sqlalchemy/dialects/postgresql/psycopg2.py
lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py
lib/sqlalchemy/dialects/postgresql/pygresql.py
lib/sqlalchemy/dialects/postgresql/pypostgresql.py
lib/sqlalchemy/dialects/postgresql/ranges.py
lib/sqlalchemy/dialects/postgresql/zxjdbc.py
lib/sqlalchemy/dialects/sqlite/__init__.py
lib/sqlalchemy/dialects/sqlite/base.py
lib/sqlalchemy/dialects/sqlite/json.py
lib/sqlalchemy/dialects/sqlite/pysqlcipher.py
lib/sqlalchemy/dialects/sqlite/pysqlite.py
lib/sqlalchemy/dialects/sybase/__init__.py
lib/sqlalchemy/dialects/sybase/base.py
lib/sqlalchemy/dialects/sybase/mxodbc.py
lib/sqlalchemy/dialects/sybase/pyodbc.py
lib/sqlalchemy/dialects/sybase/pysybase.py
lib/sqlalchemy/engine/__init__.py
lib/sqlalchemy/engine/base.py
lib/sqlalchemy/engine/default.py
lib/sqlalchemy/engine/interfaces.py
lib/sqlalchemy/engine/reflection.py
lib/sqlalchemy/engine/result.py
lib/sqlalchemy/engine/strategies.py
lib/sqlalchemy/engine/threadlocal.py
lib/sqlalchemy/engine/url.py
lib/sqlalchemy/engine/util.py
lib/sqlalchemy/event/__init__.py
lib/sqlalchemy/event/api.py
lib/sqlalchemy/event/attr.py
lib/sqlalchemy/event/base.py
lib/sqlalchemy/event/legacy.py
lib/sqlalchemy/event/registry.py
lib/sqlalchemy/ext/__init__.py
lib/sqlalchemy/ext/associationproxy.py
lib/sqlalchemy/ext/automap.py
lib/sqlalchemy/ext/baked.py
lib/sqlalchemy/ext/compiler.py
lib/sqlalchemy/ext/horizontal_shard.py
lib/sqlalchemy/ext/hybrid.py
lib/sqlalchemy/ext/indexable.py
lib/sqlalchemy/ext/instrumentation.py
lib/sqlalchemy/ext/mutable.py
lib/sqlalchemy/ext/orderinglist.py
lib/sqlalchemy/ext/serializer.py
lib/sqlalchemy/ext/declarative/__init__.py
lib/sqlalchemy/ext/declarative/api.py
lib/sqlalchemy/ext/declarative/base.py
lib/sqlalchemy/ext/declarative/clsregistry.py
lib/sqlalchemy/orm/__init__.py
lib/sqlalchemy/orm/attributes.py
lib/sqlalchemy/orm/base.py
lib/sqlalchemy/orm/collections.py
lib/sqlalchemy/orm/dependency.py
lib/sqlalchemy/orm/deprecated_interfaces.py
lib/sqlalchemy/orm/descriptor_props.py
lib/sqlalchemy/orm/dynamic.py
lib/sqlalchemy/orm/evaluator.py
lib/sqlalchemy/orm/events.py
lib/sqlalchemy/orm/exc.py
lib/sqlalchemy/orm/identity.py
lib/sqlalchemy/orm/instrumentation.py
lib/sqlalchemy/orm/interfaces.py
lib/sqlalchemy/orm/loading.py
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/orm/path_registry.py
lib/sqlalchemy/orm/persistence.py
lib/sqlalchemy/orm/properties.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/relationships.py
lib/sqlalchemy/orm/scoping.py
lib/sqlalchemy/orm/session.py
lib/sqlalchemy/orm/state.py
lib/sqlalchemy/orm/strategies.py
lib/sqlalchemy/orm/strategy_options.py
lib/sqlalchemy/orm/sync.py
lib/sqlalchemy/orm/unitofwork.py
lib/sqlalchemy/orm/util.py
lib/sqlalchemy/pool/__init__.py
lib/sqlalchemy/pool/base.py
lib/sqlalchemy/pool/dbapi_proxy.py
lib/sqlalchemy/pool/impl.py
lib/sqlalchemy/sql/__init__.py
lib/sqlalchemy/sql/annotation.py
lib/sqlalchemy/sql/base.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/sql/crud.py
lib/sqlalchemy/sql/ddl.py
lib/sqlalchemy/sql/default_comparator.py
lib/sqlalchemy/sql/dml.py
lib/sqlalchemy/sql/elements.py
lib/sqlalchemy/sql/expression.py
lib/sqlalchemy/sql/functions.py
lib/sqlalchemy/sql/naming.py
lib/sqlalchemy/sql/operators.py
lib/sqlalchemy/sql/schema.py
lib/sqlalchemy/sql/selectable.py
lib/sqlalchemy/sql/sqltypes.py
lib/sqlalchemy/sql/type_api.py
lib/sqlalchemy/sql/util.py
lib/sqlalchemy/sql/visitors.py
lib/sqlalchemy/testing/__init__.py
lib/sqlalchemy/testing/assertions.py
lib/sqlalchemy/testing/assertsql.py
lib/sqlalchemy/testing/config.py
lib/sqlalchemy/testing/engines.py
lib/sqlalchemy/testing/entities.py
lib/sqlalchemy/testing/exclusions.py
lib/sqlalchemy/testing/fixtures.py
lib/sqlalchemy/testing/mock.py
lib/sqlalchemy/testing/pickleable.py
lib/sqlalchemy/testing/profiling.py
lib/sqlalchemy/testing/provision.py
lib/sqlalchemy/testing/replay_fixture.py
lib/sqlalchemy/testing/requirements.py
lib/sqlalchemy/testing/schema.py
lib/sqlalchemy/testing/util.py
lib/sqlalchemy/testing/warnings.py
lib/sqlalchemy/testing/plugin/__init__.py
lib/sqlalchemy/testing/plugin/bootstrap.py
lib/sqlalchemy/testing/plugin/plugin_base.py
lib/sqlalchemy/testing/plugin/pytestplugin.py
lib/sqlalchemy/testing/suite/__init__.py
lib/sqlalchemy/testing/suite/test_cte.py
lib/sqlalchemy/testing/suite/test_ddl.py
lib/sqlalchemy/testing/suite/test_dialect.py
lib/sqlalchemy/testing/suite/test_insert.py
lib/sqlalchemy/testing/suite/test_reflection.py
lib/sqlalchemy/testing/suite/test_results.py
lib/sqlalchemy/testing/suite/test_select.py
lib/sqlalchemy/testing/suite/test_sequence.py
lib/sqlalchemy/testing/suite/test_types.py
lib/sqlalchemy/testing/suite/test_update_delete.py
lib/sqlalchemy/util/__init__.py
lib/sqlalchemy/util/_collections.py
lib/sqlalchemy/util/compat.py
lib/sqlalchemy/util/deprecations.py
lib/sqlalchemy/util/langhelpers.py
lib/sqlalchemy/util/queue.py
lib/sqlalchemy/util/topological.py
test/__init__.py
test/binary_data_one.dat
test/binary_data_two.dat
test/conftest.py
test/requirements.py
test/aaa_profiling/__init__.py
test/aaa_profiling/test_compiler.py
test/aaa_profiling/test_memusage.py
test/aaa_profiling/test_misc.py
test/aaa_profiling/test_orm.py
test/aaa_profiling/test_pool.py
test/aaa_profiling/test_resultset.py
test/aaa_profiling/test_zoomark.py
test/aaa_profiling/test_zoomark_orm.py
test/base/__init__.py
test/base/test_dependency.py
test/base/test_events.py
test/base/test_except.py
test/base/test_inspect.py
test/base/test_tutorials.py
test/base/test_utils.py
test/dialect/__init__.py
test/dialect/test_all.py
test/dialect/test_firebird.py
test/dialect/test_mxodbc.py
test/dialect/test_pyodbc.py
test/dialect/test_sqlite.py
test/dialect/test_suite.py
test/dialect/test_sybase.py
test/dialect/mssql/__init__.py
test/dialect/mssql/test_compiler.py
test/dialect/mssql/test_engine.py
test/dialect/mssql/test_query.py
test/dialect/mssql/test_reflection.py
test/dialect/mssql/test_types.py
test/dialect/mysql/__init__.py
test/dialect/mysql/test_compiler.py
test/dialect/mysql/test_dialect.py
test/dialect/mysql/test_for_update.py
test/dialect/mysql/test_on_duplicate.py
test/dialect/mysql/test_query.py
test/dialect/mysql/test_reflection.py
test/dialect/mysql/test_types.py
test/dialect/oracle/__init__.py
test/dialect/oracle/test_compiler.py
test/dialect/oracle/test_dialect.py
test/dialect/oracle/test_reflection.py
test/dialect/oracle/test_types.py
test/dialect/postgresql/__init__.py
test/dialect/postgresql/test_compiler.py
test/dialect/postgresql/test_dialect.py
test/dialect/postgresql/test_on_conflict.py
test/dialect/postgresql/test_query.py
test/dialect/postgresql/test_reflection.py
test/dialect/postgresql/test_types.py
test/engine/__init__.py
test/engine/test_bind.py
test/engine/test_ddlevents.py
test/engine/test_deprecations.py
test/engine/test_execute.py
test/engine/test_logging.py
test/engine/test_parseconnect.py
test/engine/test_pool.py
test/engine/test_processors.py
test/engine/test_reconnect.py
test/engine/test_reflection.py
test/engine/test_transaction.py
test/ext/__init__.py
test/ext/test_associationproxy.py
test/ext/test_automap.py
test/ext/test_baked.py
test/ext/test_compiler.py
test/ext/test_deprecations.py
test/ext/test_extendedattr.py
test/ext/test_horizontal_shard.py
test/ext/test_hybrid.py
test/ext/test_indexable.py
test/ext/test_mutable.py
test/ext/test_orderinglist.py
test/ext/test_serializer.py
test/ext/declarative/__init__.py
test/ext/declarative/test_basic.py
test/ext/declarative/test_clsregistry.py
test/ext/declarative/test_concurrency.py
test/ext/declarative/test_inheritance.py
test/ext/declarative/test_mixin.py
test/ext/declarative/test_reflection.py
test/orm/__init__.py
test/orm/_fixtures.py
test/orm/test_ac_relationships.py
test/orm/test_association.py
test/orm/test_assorted_eager.py
test/orm/test_attributes.py
test/orm/test_backref_mutations.py
test/orm/test_bind.py
test/orm/test_bulk.py
test/orm/test_bundle.py
test/orm/test_cascade.py
test/orm/test_collection.py
test/orm/test_compile.py
test/orm/test_composites.py
test/orm/test_cycles.py
test/orm/test_default_strategies.py
test/orm/test_defaults.py
test/orm/test_deferred.py
test/orm/test_deprecations.py
test/orm/test_descriptor.py
test/orm/test_dynamic.py
test/orm/test_eager_relations.py
test/orm/test_evaluator.py
test/orm/test_events.py
test/orm/test_expire.py
test/orm/test_froms.py
test/orm/test_generative.py
test/orm/test_hasparent.py
test/orm/test_immediate_load.py
test/orm/test_inspect.py
test/orm/test_instrumentation.py
test/orm/test_joins.py
test/orm/test_lazy_relations.py
test/orm/test_load_on_fks.py
test/orm/test_loading.py
test/orm/test_lockmode.py
test/orm/test_manytomany.py
test/orm/test_mapper.py
test/orm/test_merge.py
test/orm/test_naturalpks.py
test/orm/test_of_type.py
test/orm/test_onetoone.py
test/orm/test_options.py
test/orm/test_pickled.py
test/orm/test_query.py
test/orm/test_rel_fn.py
test/orm/test_relationships.py
test/orm/test_scoping.py
test/orm/test_selectable.py
test/orm/test_selectin_relations.py
test/orm/test_session.py
test/orm/test_subquery_relations.py
test/orm/test_sync.py
test/orm/test_transaction.py
test/orm/test_unitofwork.py
test/orm/test_unitofworkv2.py
test/orm/test_update_delete.py
test/orm/test_utils.py
test/orm/test_validators.py
test/orm/test_versioning.py
test/orm/inheritance/__init__.py
test/orm/inheritance/_poly_fixtures.py
test/orm/inheritance/test_abc_inheritance.py
test/orm/inheritance/test_abc_polymorphic.py
test/orm/inheritance/test_assorted_poly.py
test/orm/inheritance/test_basic.py
test/orm/inheritance/test_concrete.py
test/orm/inheritance/test_magazine.py
test/orm/inheritance/test_manytomany.py
test/orm/inheritance/test_poly_linked_list.py
test/orm/inheritance/test_poly_loading.py
test/orm/inheritance/test_poly_persistence.py
test/orm/inheritance/test_polymorphic_rel.py
test/orm/inheritance/test_productspec.py
test/orm/inheritance/test_relationship.py
test/orm/inheritance/test_selects.py
test/orm/inheritance/test_single.py
test/orm/inheritance/test_with_poly.py
test/perf/invalidate_stresstest.py
test/perf/orm2010.py
test/sql/__init__.py
test/sql/test_case_statement.py
test/sql/test_compiler.py
test/sql/test_computed.py
test/sql/test_constraints.py
test/sql/test_cte.py
test/sql/test_ddlemit.py
test/sql/test_defaults.py
test/sql/test_delete.py
test/sql/test_deprecations.py
test/sql/test_functions.py
test/sql/test_generative.py
test/sql/test_insert.py
test/sql/test_insert_exec.py
test/sql/test_inspect.py
test/sql/test_join_rewriting.py
test/sql/test_labels.py
test/sql/test_lateral.py
test/sql/test_metadata.py
test/sql/test_operators.py
test/sql/test_query.py
test/sql/test_quote.py
test/sql/test_resultset.py
test/sql/test_returning.py
test/sql/test_rowcount.py
test/sql/test_selectable.py
test/sql/test_tablesample.py
test/sql/test_text.py
test/sql/test_type_expressions.py
test/sql/test_types.py
test/sql/test_unicode.py
test/sql/test_update.py
test/sql/test_utils.py

View file

@ -0,0 +1,394 @@
../sqlalchemy/__init__.py
../sqlalchemy/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/__pycache__/events.cpython-37.pyc
../sqlalchemy/__pycache__/exc.cpython-37.pyc
../sqlalchemy/__pycache__/inspection.cpython-37.pyc
../sqlalchemy/__pycache__/interfaces.cpython-37.pyc
../sqlalchemy/__pycache__/log.cpython-37.pyc
../sqlalchemy/__pycache__/processors.cpython-37.pyc
../sqlalchemy/__pycache__/schema.cpython-37.pyc
../sqlalchemy/__pycache__/types.cpython-37.pyc
../sqlalchemy/connectors/__init__.py
../sqlalchemy/connectors/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/connectors/__pycache__/mxodbc.cpython-37.pyc
../sqlalchemy/connectors/__pycache__/pyodbc.cpython-37.pyc
../sqlalchemy/connectors/__pycache__/zxJDBC.cpython-37.pyc
../sqlalchemy/connectors/mxodbc.py
../sqlalchemy/connectors/pyodbc.py
../sqlalchemy/connectors/zxJDBC.py
../sqlalchemy/cprocessors.cpython-37m-x86_64-linux-gnu.so
../sqlalchemy/cresultproxy.cpython-37m-x86_64-linux-gnu.so
../sqlalchemy/cutils.cpython-37m-x86_64-linux-gnu.so
../sqlalchemy/databases/__init__.py
../sqlalchemy/databases/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/__init__.py
../sqlalchemy/dialects/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/firebird/__init__.py
../sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/firebird/__pycache__/base.cpython-37.pyc
../sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-37.pyc
../sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-37.pyc
../sqlalchemy/dialects/firebird/base.py
../sqlalchemy/dialects/firebird/fdb.py
../sqlalchemy/dialects/firebird/kinterbasdb.py
../sqlalchemy/dialects/mssql/__init__.py
../sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-37.pyc
../sqlalchemy/dialects/mssql/__pycache__/base.cpython-37.pyc
../sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-37.pyc
../sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-37.pyc
../sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-37.pyc
../sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-37.pyc
../sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-37.pyc
../sqlalchemy/dialects/mssql/adodbapi.py
../sqlalchemy/dialects/mssql/base.py
../sqlalchemy/dialects/mssql/information_schema.py
../sqlalchemy/dialects/mssql/mxodbc.py
../sqlalchemy/dialects/mssql/pymssql.py
../sqlalchemy/dialects/mssql/pyodbc.py
../sqlalchemy/dialects/mssql/zxjdbc.py
../sqlalchemy/dialects/mysql/__init__.py
../sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/base.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/dml.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/json.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/types.cpython-37.pyc
../sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-37.pyc
../sqlalchemy/dialects/mysql/base.py
../sqlalchemy/dialects/mysql/cymysql.py
../sqlalchemy/dialects/mysql/dml.py
../sqlalchemy/dialects/mysql/enumerated.py
../sqlalchemy/dialects/mysql/gaerdbms.py
../sqlalchemy/dialects/mysql/json.py
../sqlalchemy/dialects/mysql/mysqlconnector.py
../sqlalchemy/dialects/mysql/mysqldb.py
../sqlalchemy/dialects/mysql/oursql.py
../sqlalchemy/dialects/mysql/pymysql.py
../sqlalchemy/dialects/mysql/pyodbc.py
../sqlalchemy/dialects/mysql/reflection.py
../sqlalchemy/dialects/mysql/types.py
../sqlalchemy/dialects/mysql/zxjdbc.py
../sqlalchemy/dialects/oracle/__init__.py
../sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/oracle/__pycache__/base.cpython-37.pyc
../sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-37.pyc
../sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-37.pyc
../sqlalchemy/dialects/oracle/base.py
../sqlalchemy/dialects/oracle/cx_oracle.py
../sqlalchemy/dialects/oracle/zxjdbc.py
../sqlalchemy/dialects/postgresql/__init__.py
../sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/array.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/base.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/json.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-37.pyc
../sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-37.pyc
../sqlalchemy/dialects/postgresql/array.py
../sqlalchemy/dialects/postgresql/base.py
../sqlalchemy/dialects/postgresql/dml.py
../sqlalchemy/dialects/postgresql/ext.py
../sqlalchemy/dialects/postgresql/hstore.py
../sqlalchemy/dialects/postgresql/json.py
../sqlalchemy/dialects/postgresql/pg8000.py
../sqlalchemy/dialects/postgresql/psycopg2.py
../sqlalchemy/dialects/postgresql/psycopg2cffi.py
../sqlalchemy/dialects/postgresql/pygresql.py
../sqlalchemy/dialects/postgresql/pypostgresql.py
../sqlalchemy/dialects/postgresql/ranges.py
../sqlalchemy/dialects/postgresql/zxjdbc.py
../sqlalchemy/dialects/sqlite/__init__.py
../sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/sqlite/__pycache__/base.cpython-37.pyc
../sqlalchemy/dialects/sqlite/__pycache__/json.cpython-37.pyc
../sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-37.pyc
../sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-37.pyc
../sqlalchemy/dialects/sqlite/base.py
../sqlalchemy/dialects/sqlite/json.py
../sqlalchemy/dialects/sqlite/pysqlcipher.py
../sqlalchemy/dialects/sqlite/pysqlite.py
../sqlalchemy/dialects/sybase/__init__.py
../sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/dialects/sybase/__pycache__/base.cpython-37.pyc
../sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-37.pyc
../sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-37.pyc
../sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-37.pyc
../sqlalchemy/dialects/sybase/base.py
../sqlalchemy/dialects/sybase/mxodbc.py
../sqlalchemy/dialects/sybase/pyodbc.py
../sqlalchemy/dialects/sybase/pysybase.py
../sqlalchemy/engine/__init__.py
../sqlalchemy/engine/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/engine/__pycache__/base.cpython-37.pyc
../sqlalchemy/engine/__pycache__/default.cpython-37.pyc
../sqlalchemy/engine/__pycache__/interfaces.cpython-37.pyc
../sqlalchemy/engine/__pycache__/reflection.cpython-37.pyc
../sqlalchemy/engine/__pycache__/result.cpython-37.pyc
../sqlalchemy/engine/__pycache__/strategies.cpython-37.pyc
../sqlalchemy/engine/__pycache__/threadlocal.cpython-37.pyc
../sqlalchemy/engine/__pycache__/url.cpython-37.pyc
../sqlalchemy/engine/__pycache__/util.cpython-37.pyc
../sqlalchemy/engine/base.py
../sqlalchemy/engine/default.py
../sqlalchemy/engine/interfaces.py
../sqlalchemy/engine/reflection.py
../sqlalchemy/engine/result.py
../sqlalchemy/engine/strategies.py
../sqlalchemy/engine/threadlocal.py
../sqlalchemy/engine/url.py
../sqlalchemy/engine/util.py
../sqlalchemy/event/__init__.py
../sqlalchemy/event/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/event/__pycache__/api.cpython-37.pyc
../sqlalchemy/event/__pycache__/attr.cpython-37.pyc
../sqlalchemy/event/__pycache__/base.cpython-37.pyc
../sqlalchemy/event/__pycache__/legacy.cpython-37.pyc
../sqlalchemy/event/__pycache__/registry.cpython-37.pyc
../sqlalchemy/event/api.py
../sqlalchemy/event/attr.py
../sqlalchemy/event/base.py
../sqlalchemy/event/legacy.py
../sqlalchemy/event/registry.py
../sqlalchemy/events.py
../sqlalchemy/exc.py
../sqlalchemy/ext/__init__.py
../sqlalchemy/ext/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/ext/__pycache__/associationproxy.cpython-37.pyc
../sqlalchemy/ext/__pycache__/automap.cpython-37.pyc
../sqlalchemy/ext/__pycache__/baked.cpython-37.pyc
../sqlalchemy/ext/__pycache__/compiler.cpython-37.pyc
../sqlalchemy/ext/__pycache__/horizontal_shard.cpython-37.pyc
../sqlalchemy/ext/__pycache__/hybrid.cpython-37.pyc
../sqlalchemy/ext/__pycache__/indexable.cpython-37.pyc
../sqlalchemy/ext/__pycache__/instrumentation.cpython-37.pyc
../sqlalchemy/ext/__pycache__/mutable.cpython-37.pyc
../sqlalchemy/ext/__pycache__/orderinglist.cpython-37.pyc
../sqlalchemy/ext/__pycache__/serializer.cpython-37.pyc
../sqlalchemy/ext/associationproxy.py
../sqlalchemy/ext/automap.py
../sqlalchemy/ext/baked.py
../sqlalchemy/ext/compiler.py
../sqlalchemy/ext/declarative/__init__.py
../sqlalchemy/ext/declarative/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/ext/declarative/__pycache__/api.cpython-37.pyc
../sqlalchemy/ext/declarative/__pycache__/base.cpython-37.pyc
../sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-37.pyc
../sqlalchemy/ext/declarative/api.py
../sqlalchemy/ext/declarative/base.py
../sqlalchemy/ext/declarative/clsregistry.py
../sqlalchemy/ext/horizontal_shard.py
../sqlalchemy/ext/hybrid.py
../sqlalchemy/ext/indexable.py
../sqlalchemy/ext/instrumentation.py
../sqlalchemy/ext/mutable.py
../sqlalchemy/ext/orderinglist.py
../sqlalchemy/ext/serializer.py
../sqlalchemy/inspection.py
../sqlalchemy/interfaces.py
../sqlalchemy/log.py
../sqlalchemy/orm/__init__.py
../sqlalchemy/orm/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/orm/__pycache__/attributes.cpython-37.pyc
../sqlalchemy/orm/__pycache__/base.cpython-37.pyc
../sqlalchemy/orm/__pycache__/collections.cpython-37.pyc
../sqlalchemy/orm/__pycache__/dependency.cpython-37.pyc
../sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-37.pyc
../sqlalchemy/orm/__pycache__/descriptor_props.cpython-37.pyc
../sqlalchemy/orm/__pycache__/dynamic.cpython-37.pyc
../sqlalchemy/orm/__pycache__/evaluator.cpython-37.pyc
../sqlalchemy/orm/__pycache__/events.cpython-37.pyc
../sqlalchemy/orm/__pycache__/exc.cpython-37.pyc
../sqlalchemy/orm/__pycache__/identity.cpython-37.pyc
../sqlalchemy/orm/__pycache__/instrumentation.cpython-37.pyc
../sqlalchemy/orm/__pycache__/interfaces.cpython-37.pyc
../sqlalchemy/orm/__pycache__/loading.cpython-37.pyc
../sqlalchemy/orm/__pycache__/mapper.cpython-37.pyc
../sqlalchemy/orm/__pycache__/path_registry.cpython-37.pyc
../sqlalchemy/orm/__pycache__/persistence.cpython-37.pyc
../sqlalchemy/orm/__pycache__/properties.cpython-37.pyc
../sqlalchemy/orm/__pycache__/query.cpython-37.pyc
../sqlalchemy/orm/__pycache__/relationships.cpython-37.pyc
../sqlalchemy/orm/__pycache__/scoping.cpython-37.pyc
../sqlalchemy/orm/__pycache__/session.cpython-37.pyc
../sqlalchemy/orm/__pycache__/state.cpython-37.pyc
../sqlalchemy/orm/__pycache__/strategies.cpython-37.pyc
../sqlalchemy/orm/__pycache__/strategy_options.cpython-37.pyc
../sqlalchemy/orm/__pycache__/sync.cpython-37.pyc
../sqlalchemy/orm/__pycache__/unitofwork.cpython-37.pyc
../sqlalchemy/orm/__pycache__/util.cpython-37.pyc
../sqlalchemy/orm/attributes.py
../sqlalchemy/orm/base.py
../sqlalchemy/orm/collections.py
../sqlalchemy/orm/dependency.py
../sqlalchemy/orm/deprecated_interfaces.py
../sqlalchemy/orm/descriptor_props.py
../sqlalchemy/orm/dynamic.py
../sqlalchemy/orm/evaluator.py
../sqlalchemy/orm/events.py
../sqlalchemy/orm/exc.py
../sqlalchemy/orm/identity.py
../sqlalchemy/orm/instrumentation.py
../sqlalchemy/orm/interfaces.py
../sqlalchemy/orm/loading.py
../sqlalchemy/orm/mapper.py
../sqlalchemy/orm/path_registry.py
../sqlalchemy/orm/persistence.py
../sqlalchemy/orm/properties.py
../sqlalchemy/orm/query.py
../sqlalchemy/orm/relationships.py
../sqlalchemy/orm/scoping.py
../sqlalchemy/orm/session.py
../sqlalchemy/orm/state.py
../sqlalchemy/orm/strategies.py
../sqlalchemy/orm/strategy_options.py
../sqlalchemy/orm/sync.py
../sqlalchemy/orm/unitofwork.py
../sqlalchemy/orm/util.py
../sqlalchemy/pool/__init__.py
../sqlalchemy/pool/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/pool/__pycache__/base.cpython-37.pyc
../sqlalchemy/pool/__pycache__/dbapi_proxy.cpython-37.pyc
../sqlalchemy/pool/__pycache__/impl.cpython-37.pyc
../sqlalchemy/pool/base.py
../sqlalchemy/pool/dbapi_proxy.py
../sqlalchemy/pool/impl.py
../sqlalchemy/processors.py
../sqlalchemy/schema.py
../sqlalchemy/sql/__init__.py
../sqlalchemy/sql/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/sql/__pycache__/annotation.cpython-37.pyc
../sqlalchemy/sql/__pycache__/base.cpython-37.pyc
../sqlalchemy/sql/__pycache__/compiler.cpython-37.pyc
../sqlalchemy/sql/__pycache__/crud.cpython-37.pyc
../sqlalchemy/sql/__pycache__/ddl.cpython-37.pyc
../sqlalchemy/sql/__pycache__/default_comparator.cpython-37.pyc
../sqlalchemy/sql/__pycache__/dml.cpython-37.pyc
../sqlalchemy/sql/__pycache__/elements.cpython-37.pyc
../sqlalchemy/sql/__pycache__/expression.cpython-37.pyc
../sqlalchemy/sql/__pycache__/functions.cpython-37.pyc
../sqlalchemy/sql/__pycache__/naming.cpython-37.pyc
../sqlalchemy/sql/__pycache__/operators.cpython-37.pyc
../sqlalchemy/sql/__pycache__/schema.cpython-37.pyc
../sqlalchemy/sql/__pycache__/selectable.cpython-37.pyc
../sqlalchemy/sql/__pycache__/sqltypes.cpython-37.pyc
../sqlalchemy/sql/__pycache__/type_api.cpython-37.pyc
../sqlalchemy/sql/__pycache__/util.cpython-37.pyc
../sqlalchemy/sql/__pycache__/visitors.cpython-37.pyc
../sqlalchemy/sql/annotation.py
../sqlalchemy/sql/base.py
../sqlalchemy/sql/compiler.py
../sqlalchemy/sql/crud.py
../sqlalchemy/sql/ddl.py
../sqlalchemy/sql/default_comparator.py
../sqlalchemy/sql/dml.py
../sqlalchemy/sql/elements.py
../sqlalchemy/sql/expression.py
../sqlalchemy/sql/functions.py
../sqlalchemy/sql/naming.py
../sqlalchemy/sql/operators.py
../sqlalchemy/sql/schema.py
../sqlalchemy/sql/selectable.py
../sqlalchemy/sql/sqltypes.py
../sqlalchemy/sql/type_api.py
../sqlalchemy/sql/util.py
../sqlalchemy/sql/visitors.py
../sqlalchemy/testing/__init__.py
../sqlalchemy/testing/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/testing/__pycache__/assertions.cpython-37.pyc
../sqlalchemy/testing/__pycache__/assertsql.cpython-37.pyc
../sqlalchemy/testing/__pycache__/config.cpython-37.pyc
../sqlalchemy/testing/__pycache__/engines.cpython-37.pyc
../sqlalchemy/testing/__pycache__/entities.cpython-37.pyc
../sqlalchemy/testing/__pycache__/exclusions.cpython-37.pyc
../sqlalchemy/testing/__pycache__/fixtures.cpython-37.pyc
../sqlalchemy/testing/__pycache__/mock.cpython-37.pyc
../sqlalchemy/testing/__pycache__/pickleable.cpython-37.pyc
../sqlalchemy/testing/__pycache__/profiling.cpython-37.pyc
../sqlalchemy/testing/__pycache__/provision.cpython-37.pyc
../sqlalchemy/testing/__pycache__/replay_fixture.cpython-37.pyc
../sqlalchemy/testing/__pycache__/requirements.cpython-37.pyc
../sqlalchemy/testing/__pycache__/schema.cpython-37.pyc
../sqlalchemy/testing/__pycache__/util.cpython-37.pyc
../sqlalchemy/testing/__pycache__/warnings.cpython-37.pyc
../sqlalchemy/testing/assertions.py
../sqlalchemy/testing/assertsql.py
../sqlalchemy/testing/config.py
../sqlalchemy/testing/engines.py
../sqlalchemy/testing/entities.py
../sqlalchemy/testing/exclusions.py
../sqlalchemy/testing/fixtures.py
../sqlalchemy/testing/mock.py
../sqlalchemy/testing/pickleable.py
../sqlalchemy/testing/plugin/__init__.py
../sqlalchemy/testing/plugin/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-37.pyc
../sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-37.pyc
../sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-37.pyc
../sqlalchemy/testing/plugin/bootstrap.py
../sqlalchemy/testing/plugin/plugin_base.py
../sqlalchemy/testing/plugin/pytestplugin.py
../sqlalchemy/testing/profiling.py
../sqlalchemy/testing/provision.py
../sqlalchemy/testing/replay_fixture.py
../sqlalchemy/testing/requirements.py
../sqlalchemy/testing/schema.py
../sqlalchemy/testing/suite/__init__.py
../sqlalchemy/testing/suite/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_cte.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_insert.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_results.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_select.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_types.cpython-37.pyc
../sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-37.pyc
../sqlalchemy/testing/suite/test_cte.py
../sqlalchemy/testing/suite/test_ddl.py
../sqlalchemy/testing/suite/test_dialect.py
../sqlalchemy/testing/suite/test_insert.py
../sqlalchemy/testing/suite/test_reflection.py
../sqlalchemy/testing/suite/test_results.py
../sqlalchemy/testing/suite/test_select.py
../sqlalchemy/testing/suite/test_sequence.py
../sqlalchemy/testing/suite/test_types.py
../sqlalchemy/testing/suite/test_update_delete.py
../sqlalchemy/testing/util.py
../sqlalchemy/testing/warnings.py
../sqlalchemy/types.py
../sqlalchemy/util/__init__.py
../sqlalchemy/util/__pycache__/__init__.cpython-37.pyc
../sqlalchemy/util/__pycache__/_collections.cpython-37.pyc
../sqlalchemy/util/__pycache__/compat.cpython-37.pyc
../sqlalchemy/util/__pycache__/deprecations.cpython-37.pyc
../sqlalchemy/util/__pycache__/langhelpers.cpython-37.pyc
../sqlalchemy/util/__pycache__/queue.cpython-37.pyc
../sqlalchemy/util/__pycache__/topological.cpython-37.pyc
../sqlalchemy/util/_collections.py
../sqlalchemy/util/compat.py
../sqlalchemy/util/deprecations.py
../sqlalchemy/util/langhelpers.py
../sqlalchemy/util/queue.py
../sqlalchemy/util/topological.py
PKG-INFO
SOURCES.txt
dependency_links.txt
requires.txt
top_level.txt

View file

@ -0,0 +1,30 @@
[mssql]
pyodbc
[mssql_pymssql]
pymssql
[mssql_pyodbc]
pyodbc
[mysql]
mysqlclient
[oracle]
cx_oracle
[postgresql]
psycopg2
[postgresql_pg8000]
pg8000
[postgresql_psycopg2binary]
psycopg2-binary
[postgresql_psycopg2cffi]
psycopg2cffi
[pymysql]
pymysql

View file

@ -0,0 +1 @@
pip

View file

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2013-2019 Nikolay Kim and Andrew Svetlov
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View file

@ -0,0 +1,433 @@
Metadata-Version: 2.1
Name: aiohttp
Version: 3.5.4
Summary: Async http client/server framework (asyncio)
Home-page: https://github.com/aio-libs/aiohttp
Author: Nikolay Kim
Author-email: fafhrd91@gmail.com
Maintainer: Nikolay Kim <fafhrd91@gmail.com>, Andrew Svetlov <andrew.svetlov@gmail.com>
Maintainer-email: aio-libs@googlegroups.com
License: Apache 2
Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby
Project-URL: CI: AppVeyor, https://ci.appveyor.com/project/aio-libs/aiohttp
Project-URL: CI: Circle, https://circleci.com/gh/aio-libs/aiohttp
Project-URL: CI: Shippable, https://app.shippable.com/github/aio-libs/aiohttp
Project-URL: CI: Travis, https://travis-ci.com/aio-libs/aiohttp
Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp
Project-URL: Docs: RTD, https://docs.aiohttp.org
Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues
Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp
Platform: UNKNOWN
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Development Status :: 5 - Production/Stable
Classifier: Operating System :: POSIX
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: Microsoft :: Windows
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Framework :: AsyncIO
Requires-Python: >=3.5.3
Requires-Dist: attrs (>=17.3.0)
Requires-Dist: chardet (<4.0,>=2.0)
Requires-Dist: multidict (<5.0,>=4.0)
Requires-Dist: async-timeout (<4.0,>=3.0)
Requires-Dist: yarl (<2.0,>=1.0)
Requires-Dist: idna-ssl (>=1.0) ; python_version < "3.7"
Requires-Dist: typing-extensions (>=3.6.5) ; python_version < "3.7"
Provides-Extra: speedups
Requires-Dist: aiodns ; extra == 'speedups'
Requires-Dist: brotlipy ; extra == 'speedups'
Requires-Dist: cchardet ; extra == 'speedups'
==================================
Async http client/server framework
==================================
.. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/_static/aiohttp-icon-128x128.png
:height: 64px
:width: 64px
:alt: aiohttp logo
|
.. image:: https://travis-ci.com/aio-libs/aiohttp.svg?branch=master
:target: https://travis-ci.com/aio-libs/aiohttp
:align: right
:alt: Travis status for master branch
.. image:: https://ci.appveyor.com/api/projects/status/tnddy9k6pphl8w7k/branch/master?svg=true
:target: https://ci.appveyor.com/project/aio-libs/aiohttp
:align: right
:alt: AppVeyor status for master branch
.. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg
:target: https://codecov.io/gh/aio-libs/aiohttp
:alt: codecov.io status for master branch
.. image:: https://badge.fury.io/py/aiohttp.svg
:target: https://pypi.org/project/aiohttp
:alt: Latest PyPI package version
.. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest
:target: https://docs.aiohttp.org/
:alt: Latest Read The Docs
.. image:: https://badges.gitter.im/Join%20Chat.svg
:target: https://gitter.im/aio-libs/Lobby
:alt: Chat on Gitter
Key Features
============
- Supports both client and server side of HTTP protocol.
- Supports both client and server Web-Sockets out-of-the-box and avoids
Callback Hell.
- Provides Web-server with middlewares and pluggable routing.
Getting started
===============
Client
------
To get something from the web:
.. code-block:: python
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://python.org')
print(html)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Server
------
An example using a simple server:
.. code-block:: python
# examples/server_simple.py
from aiohttp import web
async def handle(request):
name = request.match_info.get('name', "Anonymous")
text = "Hello, " + name
return web.Response(text=text)
async def wshandle(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.type == web.WSMsgType.text:
await ws.send_str("Hello, {}".format(msg.data))
elif msg.type == web.WSMsgType.binary:
await ws.send_bytes(msg.data)
elif msg.type == web.WSMsgType.close:
break
return ws
app = web.Application()
app.add_routes([web.get('/', handle),
web.get('/echo', wshandle),
web.get('/{name}', handle)])
web.run_app(app)
Documentation
=============
https://aiohttp.readthedocs.io/
Demos
=====
https://github.com/aio-libs/aiohttp-demos
External links
==============
* `Third party libraries
<http://aiohttp.readthedocs.io/en/latest/third_party.html>`_
* `Built with aiohttp
<http://aiohttp.readthedocs.io/en/latest/built_with.html>`_
* `Powered by aiohttp
<http://aiohttp.readthedocs.io/en/latest/powered_by.html>`_
Feel free to make a Pull Request for adding your link to these pages!
Communication channels
======================
*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs
Feel free to post your questions and ideas here.
*gitter chat* https://gitter.im/aio-libs/Lobby
We support `Stack Overflow
<https://stackoverflow.com/questions/tagged/aiohttp>`_.
Please add *aiohttp* tag to your question there.
Requirements
============
- Python >= 3.5.3
- async-timeout_
- attrs_
- chardet_
- multidict_
- yarl_
Optionally you may install the cChardet_ and aiodns_ libraries (highly
recommended for sake of speed).
.. _chardet: https://pypi.python.org/pypi/chardet
.. _aiodns: https://pypi.python.org/pypi/aiodns
.. _attrs: https://github.com/python-attrs/attrs
.. _multidict: https://pypi.python.org/pypi/multidict
.. _yarl: https://pypi.python.org/pypi/yarl
.. _async-timeout: https://pypi.python.org/pypi/async_timeout
.. _cChardet: https://pypi.python.org/pypi/cchardet
License
=======
``aiohttp`` is offered under the Apache 2 license.
Keepsafe
========
The aiohttp community would like to thank Keepsafe
(https://www.getkeepsafe.com) for its support in the early days of
the project.
Source code
===========
The latest developer version is available in a GitHub repository:
https://github.com/aio-libs/aiohttp
Benchmarks
==========
If you are interested in efficiency, the AsyncIO community maintains a
list of benchmarks on the official wiki:
https://github.com/python/asyncio/wiki/Benchmarks
=========
Changelog
=========
..
You should *NOT* be adding new change log entries to this file, this
file is managed by towncrier. You *may* edit previous change logs to
fix problems like typo corrections or such.
To add a new change log entry, please see
https://pip.pypa.io/en/latest/development/#adding-a-news-entry
we named the news folder "changes".
WARNING: Don't drop the next directive!
.. towncrier release notes start
3.5.4 (2019-01-12)
==================
Bugfixes
--------
- Fix stream ``.read()`` / ``.readany()`` / ``.iter_any()`` which used to return a
partial content only in case of compressed content
`#3525 <https://github.com/aio-libs/aiohttp/issues/3525>`_
3.5.3 (2019-01-10)
==================
Bugfixes
--------
- Fix type stubs for ``aiohttp.web.run_app(access_log=True)`` and fix edge case of ``access_log=True`` and the event loop being in debug mode.
`#3504 <https://github.com/aio-libs/aiohttp/issues/3504>`_
- Fix ``aiohttp.ClientTimeout`` type annotations to accept ``None`` for fields
`#3511 <https://github.com/aio-libs/aiohttp/issues/3511>`_
- Send custom per-request cookies even if session jar is empty
`#3515 <https://github.com/aio-libs/aiohttp/issues/3515>`_
- Restore Linux binary wheels publishing on PyPI
----
3.5.2 (2019-01-08)
==================
Features
--------
- ``FileResponse`` from ``web_fileresponse.py`` uses a ``ThreadPoolExecutor`` to work with files asynchronously.
I/O based payloads from ``payload.py`` uses a ``ThreadPoolExecutor`` to work with I/O objects asynchronously.
`#3313 <https://github.com/aio-libs/aiohttp/issues/3313>`_
- Internal Server Errors in plain text if the browser does not support HTML.
`#3483 <https://github.com/aio-libs/aiohttp/issues/3483>`_
Bugfixes
--------
- Preserve MultipartWriter parts headers on write.
Refactor the way how ``Payload.headers`` are handled. Payload instances now always
have headers and Content-Type defined.
Fix Payload Content-Disposition header reset after initial creation.
`#3035 <https://github.com/aio-libs/aiohttp/issues/3035>`_
- Log suppressed exceptions in ``GunicornWebWorker``.
`#3464 <https://github.com/aio-libs/aiohttp/issues/3464>`_
- Remove wildcard imports.
`#3468 <https://github.com/aio-libs/aiohttp/issues/3468>`_
- Use the same task for app initialization and web server handling in gunicorn workers.
It allows to use Python3.7 context vars smoothly.
`#3471 <https://github.com/aio-libs/aiohttp/issues/3471>`_
- Fix handling of chunked+gzipped response when first chunk does not give uncompressed data
`#3477 <https://github.com/aio-libs/aiohttp/issues/3477>`_
- Replace ``collections.MutableMapping`` with ``collections.abc.MutableMapping`` to avoid a deprecation warning.
`#3480 <https://github.com/aio-libs/aiohttp/issues/3480>`_
- ``Payload.size`` type annotation changed from `Optional[float]` to `Optional[int]`.
`#3484 <https://github.com/aio-libs/aiohttp/issues/3484>`_
- Ignore done tasks when cancels pending activities on ``web.run_app`` finalization.
`#3497 <https://github.com/aio-libs/aiohttp/issues/3497>`_
Improved Documentation
----------------------
- Add documentation for ``aiohttp.web.HTTPException``.
`#3490 <https://github.com/aio-libs/aiohttp/issues/3490>`_
Misc
----
- `#3487 <https://github.com/aio-libs/aiohttp/issues/3487>`_
----
3.5.1 (2018-12-24)
====================
- Fix a regression about ``ClientSession._requote_redirect_url`` modification in debug
mode.
3.5.0 (2018-12-22)
====================
Features
--------
- The library type annotations are checked in strict mode now.
- Add support for setting cookies for individual request (`#2387 <https://github.com/aio-libs/aiohttp/pull/2387>`_)
- Application.add_domain implementation (`#2809 <https://github.com/aio-libs/aiohttp/pull/2809>`_)
- The default ``app`` in the request returned by ``test_utils.make_mocked_request``
can now have objects assigned to it and retrieved using the ``[]`` operator. (`#3174 <https://github.com/aio-libs/aiohttp/pull/3174>`_)
- Make ``request.url`` accessible when transport is closed. (`#3177 <https://github.com/aio-libs/aiohttp/pull/3177>`_)
- Add ``zlib_executor_size`` argument to ``Response`` constructor to allow compression to run in a background executor to avoid blocking the main thread and potentially triggering health check failures. (`#3205 <https://github.com/aio-libs/aiohttp/pull/3205>`_)
- Enable users to set `ClientTimeout` in `aiohttp.request` (`#3213 <https://github.com/aio-libs/aiohttp/pull/3213>`_)
- Don't raise a warning if ``NETRC`` environment variable is not set and ``~/.netrc`` file
doesn't exist. (`#3267 <https://github.com/aio-libs/aiohttp/pull/3267>`_)
- Add default logging handler to web.run_app
If the `Application.debug` flag is set and the default logger `aiohttp.access` is used, access logs will now be output using a `stderr` `StreamHandler` if no handlers are attached. Furthermore, if the default logger has no log level set, the log level will be set to `DEBUG`. (`#3324 <https://github.com/aio-libs/aiohttp/pull/3324>`_)
- Add method argument to ``session.ws_connect()``.
Sometimes server API requires a different HTTP method for WebSocket connection establishment.
For example, ``Docker exec`` needs POST. (`#3378 <https://github.com/aio-libs/aiohttp/pull/3378>`_)
- Create a task per request handling. (`#3406 <https://github.com/aio-libs/aiohttp/pull/3406>`_)
Bugfixes
--------
- Enable passing `access_log_class` via `handler_args` (`#3158 <https://github.com/aio-libs/aiohttp/pull/3158>`_)
- Return empty bytes with end-of-chunk marker in empty stream reader. (`#3186 <https://github.com/aio-libs/aiohttp/pull/3186>`_)
- Accept ``CIMultiDictProxy`` instances for ``headers`` argument in ``web.Response``
constructor. (`#3207 <https://github.com/aio-libs/aiohttp/pull/3207>`_)
- Don't uppercase HTTP method in parser (`#3233 <https://github.com/aio-libs/aiohttp/pull/3233>`_)
- Make method match regexp RFC-7230 compliant (`#3235 <https://github.com/aio-libs/aiohttp/pull/3235>`_)
- Add ``app.pre_frozen`` state to properly handle startup signals in sub-applications. (`#3237 <https://github.com/aio-libs/aiohttp/pull/3237>`_)
- Enhanced parsing and validation of helpers.BasicAuth.decode. (`#3239 <https://github.com/aio-libs/aiohttp/pull/3239>`_)
- Change imports from collections module in preparation for 3.8. (`#3258 <https://github.com/aio-libs/aiohttp/pull/3258>`_)
- Ensure Host header is added first to ClientRequest to better replicate browser (`#3265 <https://github.com/aio-libs/aiohttp/pull/3265>`_)
- Fix forward compatibility with Python 3.8: importing ABCs directly from the collections module will not be supported anymore. (`#3273 <https://github.com/aio-libs/aiohttp/pull/3273>`_)
- Keep the query string by `normalize_path_middleware`. (`#3278 <https://github.com/aio-libs/aiohttp/pull/3278>`_)
- Fix missing parameter ``raise_for_status`` for aiohttp.request() (`#3290 <https://github.com/aio-libs/aiohttp/pull/3290>`_)
- Bracket IPv6 addresses in the HOST header (`#3304 <https://github.com/aio-libs/aiohttp/pull/3304>`_)
- Fix default message for server ping and pong frames. (`#3308 <https://github.com/aio-libs/aiohttp/pull/3308>`_)
- Fix tests/test_connector.py typo and tests/autobahn/server.py duplicate loop def. (`#3337 <https://github.com/aio-libs/aiohttp/pull/3337>`_)
- Fix false-negative indicator end_of_HTTP_chunk in StreamReader.readchunk function (`#3361 <https://github.com/aio-libs/aiohttp/pull/3361>`_)
- Release HTTP response before raising status exception (`#3364 <https://github.com/aio-libs/aiohttp/pull/3364>`_)
- Fix task cancellation when ``sendfile()`` syscall is used by static file handling. (`#3383 <https://github.com/aio-libs/aiohttp/pull/3383>`_)
- Fix stack trace for ``asyncio.TimeoutError`` which was not logged, when it is caught
in the handler. (`#3414 <https://github.com/aio-libs/aiohttp/pull/3414>`_)
Improved Documentation
----------------------
- Improve documentation of ``Application.make_handler`` parameters. (`#3152 <https://github.com/aio-libs/aiohttp/pull/3152>`_)
- Fix BaseRequest.raw_headers doc. (`#3215 <https://github.com/aio-libs/aiohttp/pull/3215>`_)
- Fix typo in TypeError exception reason in ``web.Application._handle`` (`#3229 <https://github.com/aio-libs/aiohttp/pull/3229>`_)
- Make server access log format placeholder %b documentation reflect
behavior and docstring. (`#3307 <https://github.com/aio-libs/aiohttp/pull/3307>`_)
Deprecations and Removals
-------------------------
- Deprecate modification of ``session.requote_redirect_url`` (`#2278 <https://github.com/aio-libs/aiohttp/pull/2278>`_)
- Deprecate ``stream.unread_data()`` (`#3260 <https://github.com/aio-libs/aiohttp/pull/3260>`_)
- Deprecated use of boolean in ``resp.enable_compression()`` (`#3318 <https://github.com/aio-libs/aiohttp/pull/3318>`_)
- Encourage creation of aiohttp public objects inside a coroutine (`#3331 <https://github.com/aio-libs/aiohttp/pull/3331>`_)
- Drop dead ``Connection.detach()`` and ``Connection.writer``. Both methods were broken
for more than 2 years. (`#3358 <https://github.com/aio-libs/aiohttp/pull/3358>`_)
- Deprecate ``app.loop``, ``request.loop``, ``client.loop`` and ``connector.loop`` properties. (`#3374 <https://github.com/aio-libs/aiohttp/pull/3374>`_)
- Deprecate explicit debug argument. Use asyncio debug mode instead. (`#3381 <https://github.com/aio-libs/aiohttp/pull/3381>`_)
- Deprecate body parameter in HTTPException (and derived classes) constructor. (`#3385 <https://github.com/aio-libs/aiohttp/pull/3385>`_)
- Deprecate bare connector close, use ``async with connector:`` and ``await connector.close()`` instead. (`#3417 <https://github.com/aio-libs/aiohttp/pull/3417>`_)
- Deprecate obsolete ``read_timeout`` and ``conn_timeout`` in ``ClientSession`` constructor. (`#3438 <https://github.com/aio-libs/aiohttp/pull/3438>`_)
Misc
----
- #3341, #3351

View file

@ -0,0 +1,124 @@
aiohttp-3.5.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
aiohttp-3.5.4.dist-info/LICENSE.txt,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332
aiohttp-3.5.4.dist-info/METADATA,sha256=vpBjLbRZ9Tbi4DEj6aDUlGbj-HJPHa8Wihktdh4Z9U0,16950
aiohttp-3.5.4.dist-info/RECORD,,
aiohttp-3.5.4.dist-info/WHEEL,sha256=0XRAUr92PGDyTl_2nDyFZS1y0mC0Tb6FBjKSU09tHPA,109
aiohttp-3.5.4.dist-info/top_level.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8
aiohttp/__init__.py,sha256=GdkiBfeUQa38wScKQYLH4mRL-20MqARHC0ljV6Naf8w,4948
aiohttp/__pycache__/__init__.cpython-37.pyc,,
aiohttp/__pycache__/abc.cpython-37.pyc,,
aiohttp/__pycache__/base_protocol.cpython-37.pyc,,
aiohttp/__pycache__/client.cpython-37.pyc,,
aiohttp/__pycache__/client_exceptions.cpython-37.pyc,,
aiohttp/__pycache__/client_proto.cpython-37.pyc,,
aiohttp/__pycache__/client_reqrep.cpython-37.pyc,,
aiohttp/__pycache__/client_ws.cpython-37.pyc,,
aiohttp/__pycache__/connector.cpython-37.pyc,,
aiohttp/__pycache__/cookiejar.cpython-37.pyc,,
aiohttp/__pycache__/formdata.cpython-37.pyc,,
aiohttp/__pycache__/frozenlist.cpython-37.pyc,,
aiohttp/__pycache__/hdrs.cpython-37.pyc,,
aiohttp/__pycache__/helpers.cpython-37.pyc,,
aiohttp/__pycache__/http.cpython-37.pyc,,
aiohttp/__pycache__/http_exceptions.cpython-37.pyc,,
aiohttp/__pycache__/http_parser.cpython-37.pyc,,
aiohttp/__pycache__/http_websocket.cpython-37.pyc,,
aiohttp/__pycache__/http_writer.cpython-37.pyc,,
aiohttp/__pycache__/locks.cpython-37.pyc,,
aiohttp/__pycache__/log.cpython-37.pyc,,
aiohttp/__pycache__/multipart.cpython-37.pyc,,
aiohttp/__pycache__/payload.cpython-37.pyc,,
aiohttp/__pycache__/payload_streamer.cpython-37.pyc,,
aiohttp/__pycache__/pytest_plugin.cpython-37.pyc,,
aiohttp/__pycache__/resolver.cpython-37.pyc,,
aiohttp/__pycache__/signals.cpython-37.pyc,,
aiohttp/__pycache__/streams.cpython-37.pyc,,
aiohttp/__pycache__/tcp_helpers.cpython-37.pyc,,
aiohttp/__pycache__/test_utils.cpython-37.pyc,,
aiohttp/__pycache__/tracing.cpython-37.pyc,,
aiohttp/__pycache__/typedefs.cpython-37.pyc,,
aiohttp/__pycache__/web.cpython-37.pyc,,
aiohttp/__pycache__/web_app.cpython-37.pyc,,
aiohttp/__pycache__/web_exceptions.cpython-37.pyc,,
aiohttp/__pycache__/web_fileresponse.cpython-37.pyc,,
aiohttp/__pycache__/web_log.cpython-37.pyc,,
aiohttp/__pycache__/web_middlewares.cpython-37.pyc,,
aiohttp/__pycache__/web_protocol.cpython-37.pyc,,
aiohttp/__pycache__/web_request.cpython-37.pyc,,
aiohttp/__pycache__/web_response.cpython-37.pyc,,
aiohttp/__pycache__/web_routedef.cpython-37.pyc,,
aiohttp/__pycache__/web_runner.cpython-37.pyc,,
aiohttp/__pycache__/web_server.cpython-37.pyc,,
aiohttp/__pycache__/web_urldispatcher.cpython-37.pyc,,
aiohttp/__pycache__/web_ws.cpython-37.pyc,,
aiohttp/__pycache__/worker.cpython-37.pyc,,
aiohttp/_cparser.pxd,sha256=tgw30SL6kQSczzGMlMhx2Cuhf_O8P8ZPimVCb85xILc,3959
aiohttp/_find_header.c,sha256=lWc5w3UZiVd3ni60DuFDSSPzsaQUhAQcERDGBOqeML8,189932
aiohttp/_find_header.h,sha256=5oOgQ85nF6V7rpU8NhyE5vyGkTo1Cgf1GIYrtxSTzQI,170
aiohttp/_find_header.pxd,sha256=0GfwFCPN2zxEKTO1_MA5sYq2UfzsG8kcV3aTqvwlz3g,68
aiohttp/_frozenlist.c,sha256=y98wE-b4rxP9GCcT-WCx5Pt_WU3RBrs-w-QeKZ7XE34,287338
aiohttp/_frozenlist.cpython-37m-x86_64-linux-gnu.so,sha256=N43hZAJdoc0SQZnsQ72IIh3ODDDEZR8dcHArr6Wb0G4,310748
aiohttp/_frozenlist.pyx,sha256=BD8LcERExsWdo4qzuuQ84f-L_pHVzkUQO0lEAOe3Fog,2605
aiohttp/_headers.pxi,sha256=XgJL5FQRwL4uZQfegYShPclsErUlvG_xuMHs7dp_2-o,2027
aiohttp/_helpers.c,sha256=QhGjJ2v5NuDgkX23Bmcs7HpowupE1tz1im8PuZdISbI,207048
aiohttp/_helpers.cpython-37m-x86_64-linux-gnu.so,sha256=lobzEWAei1Lkxx1SFiFVHXm4eNxgIDJi03yEUfzZ3RM,213821
aiohttp/_helpers.pyi,sha256=mJRb5YdG8DxYbPfVddGRGmi93qqaJM30L1qFpgSKQuA,204
aiohttp/_helpers.pyx,sha256=XeLbNft5X_4ifi8QB8i6TyrRuayijMSO3IDHeSA89uM,1049
aiohttp/_http_parser.c,sha256=WIyFvlOUcAmTRpBPeFl57lbj9hkQfuMWNTPDzOku-cc,994097
aiohttp/_http_parser.cpython-37m-x86_64-linux-gnu.so,sha256=eRzfo0GowqCsVVxG_7s2qOmR4XiMUE1jKtqS5JMpqq8,1558531
aiohttp/_http_parser.pyx,sha256=qAeXR88_UXU2ontoLIq7hg7M2KHjY982iJeH_u7aXXs,28672
aiohttp/_http_writer.c,sha256=YyFijS8A3erHfOa8hb95PHfnZJnxEnLdHHkVME0o8bE,205820
aiohttp/_http_writer.cpython-37m-x86_64-linux-gnu.so,sha256=CqASRWdGlkowylQgw8FMYyGT5BL48qc_zhRAxRcFhzo,204055
aiohttp/_http_writer.pyx,sha256=vnanyXytNqyi6oqxELg5ARJ8LhtB8mDGxNfz6DdvH6E,4193
aiohttp/_websocket.c,sha256=uMC3H3T9yqN7fsOcYC0gLNfcrk3QkV199WLaHoshW0U,135134
aiohttp/_websocket.cpython-37m-x86_64-linux-gnu.so,sha256=LdzRUpovLfMOVKb6IezQvaZFTMvT7X8awC2bz3MZKt8,104661
aiohttp/_websocket.pyx,sha256=tJfygcVwKF_Xb6Pg48a6t50YO2xY4Rg0Wj7LcJJMi-U,1559
aiohttp/abc.py,sha256=lsf2bz-9KtqLhtI-e-tmgp3ynziMypYyEHvwOnFg7lQ,5392
aiohttp/base_protocol.py,sha256=kv6AbDw8ZQOyB9Hm2bOaPZyXcAbUUwFOO2lbAmArpfw,2644
aiohttp/client.py,sha256=hXh0WgGqhl80gVDlkuzgrHVaCxxkg_A9_mrhOkdSb-s,42549
aiohttp/client_exceptions.py,sha256=3e7SWwDXDhUO5npOhwgdL6K8tXMTdVyv58rjQboY4Yo,7547
aiohttp/client_proto.py,sha256=l1bLzhVx8hHOuS8nBPH6wNU15S-P6z_OMtpx_tPRi54,8001
aiohttp/client_reqrep.py,sha256=LUhjuCGyJs55LcH_Sr3AMcAhS1XlcCPM73rc8C3_GV0,35793
aiohttp/client_ws.py,sha256=AQlj-peBA0mGyra1t38sWlfV28MEM0SAATRXp1TsF9I,10694
aiohttp/connector.py,sha256=AORmJFz8WLuAjca5O582FKCC74f6emuXdZfhWzvPpx4,39556
aiohttp/cookiejar.py,sha256=ghkcBC9JhqKFz3InpJ4l2_stXLVv6qORX1303vepQUI,11268
aiohttp/formdata.py,sha256=VZCo9kmDb50lQUcRMDfAH3d5lnRxBq_AX38ge8vFI00,5807
aiohttp/frozenlist.py,sha256=I4zR368wRHXp402Z3f5lhd5i48b6A66MhHncW1JGkb4,1781
aiohttp/frozenlist.pyi,sha256=fkQEKqDR6nOjXDx2cXvfCcetoMQQdzjXs2uoA7uVaP4,1431
aiohttp/hdrs.py,sha256=iaXnHXOR_Dx0rvVkvmIZhc-7Egf2ByuSDI9tqskS0kQ,3449
aiohttp/helpers.py,sha256=q_AZMU7hOJBvtTklhQpwa1DTH3uR5h2ZA0vLlsVGSQs,22633
aiohttp/http.py,sha256=mYXbwDI8bF9D1RShF0EGtVTx7OgIyksbmKR4b_4RgBo,1385
aiohttp/http_exceptions.py,sha256=yb2XryY_kktgiADcYn1nS0Dm-RVhhy0J6R0qfg-JyWo,2358
aiohttp/http_parser.py,sha256=v9csKsBv-rmOir1ikRBcDJDAaPMsFen1HoP8_Viz6xE,27912
aiohttp/http_websocket.py,sha256=GpysCWVOOQyRzvLSq0IHhVG0goWSnv5Rmwf91uUwowI,24594
aiohttp/http_writer.py,sha256=XhGCqy_lzdLyxIzjQ_ufPFfJKTTWx1sb6YZWvrOFUPA,5239
aiohttp/locks.py,sha256=l-cW8wUbIkHaovghT7gpY8Yp5Vlo-u2G7_CR5xQqEQ8,1234
aiohttp/log.py,sha256=kOWU6EcyBQESISm27vc8dVEz_h9zxozLa5WCya1RzhQ,325
aiohttp/multipart.py,sha256=h76ZKaEdP2moxWK0qNydR7zYMgGMoyqkkRssTmrtx1A,32277
aiohttp/payload.py,sha256=QjzdcLJ89GGqFSN_SdMgEvw_Id4UEXZ9mL_2fAGF4gk,14027
aiohttp/payload_streamer.py,sha256=ZNWaWwAxOIricwfjH4-YrkCqehowVizM6fJ_JVDR480,2103
aiohttp/py.typed,sha256=E84IaZyFwfLqvXjOVW4LS6WH7QOaKEFpNh9TFyzHNQc,6
aiohttp/pytest_plugin.py,sha256=8KOUt8KXu_3NkPQ8DYwgqKfdAvVZ--zHnm0EQiKFPkI,10332
aiohttp/resolver.py,sha256=pRF91jOjTNuCll5TMRjTe1OxnGZK4wjAggYLgvzXkGQ,3626
aiohttp/signals.py,sha256=_ge2XQXBDWHoyCI4E-nXC-sOEJGVrJm0zYGHH0E5woQ,948
aiohttp/signals.pyi,sha256=mrEA9Ve08W22L_yI8_F7PkdQUjid_VsL3o9tcC0Ud0E,325
aiohttp/streams.py,sha256=i1Q7_RzolpEQ63AkalkeeSHsMPOaHAfjnwlxvRmYi-k,20371
aiohttp/tcp_helpers.py,sha256=1WVYM2C-HZQpgcksTyadRsl2_WeuXh_ECUxCcwji5d8,1631
aiohttp/test_utils.py,sha256=0a0034sQM72grdRxjTnYpHtkUvMwstshfc9jVPXsZ1U,20525
aiohttp/tracing.py,sha256=yfOJWzRQgRdDcdjsDLqPul3anYyVFhztDeyoM01oIq8,12662
aiohttp/typedefs.py,sha256=6HXEWJNZGUuNewFQUjSkCzKP8rQVZSKqfdNnIgofZWs,1259
aiohttp/web.py,sha256=2edP5uK2BU6wTXAWzGp2lgYq_CyU3vzLaQa0I_Ehg_0,15121
aiohttp/web_app.py,sha256=vKuHVhH9d-Qg5Pg1A8MbaZPeJttkSsghpuo2JYvUJks,17212
aiohttp/web_exceptions.py,sha256=-CQI325lMa9W-1WeJ2RlHApOOQ74ctHd6OyeKG_EyT4,10079
aiohttp/web_fileresponse.py,sha256=0Oln1kTqD80EhftG2jqVbsuSLr0Gbjpuk4T3D06fFjk,12712
aiohttp/web_log.py,sha256=J33FXqV36hWcyk8YfFNXDj3SI40uoOQzEX2Fhni7bzc,8269
aiohttp/web_middlewares.py,sha256=BY05dLo9rsRZttRmjDUHEokiHQLzW_ffENZL9q-Grf4,4188
aiohttp/web_protocol.py,sha256=q0zEVHMSLdmUw_KdI6zVeOj_k3lLZWMj4PJHo8h9c54,21394
aiohttp/web_request.py,sha256=M8ARRuEso-V7G675-xWY-lqLBGDmBVRGPujaufKZGuo,25234
aiohttp/web_response.py,sha256=nmldFBqLLaCECoaYUw54-2BVHB6Xz6XgGMK0O5ymrjo,25511
aiohttp/web_routedef.py,sha256=jQ8Y0hDHYuMBTtsuo17qjkQLBMoacbkh4zaUdwSJJ8s,6077
aiohttp/web_runner.py,sha256=_LUDpAc6vDOWfNJ-DBj3NZPtID0gBPH6JeMXtGSt4OU,10088
aiohttp/web_server.py,sha256=527MjryEIqWArFHMJlEABg3TcZgYtyJIFHY19Yvf3AI,2165
aiohttp/web_urldispatcher.py,sha256=x-O0Tqxn6xqMdQ5Qrg0hxIli-DbOfxLEDpgX_j_FGQU,38788
aiohttp/web_ws.py,sha256=7UpGsVFZw_YtpJOWPLeDnGmL6PtirxAkc8r-pGUQbt0,17082
aiohttp/worker.py,sha256=hekSLWLEJVrHrIrZ3dQga7Jzgtx_Cf3ZW7Zfd1J1G3A,8178

View file

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.32.3)
Root-Is-Purelib: false
Tag: cp37-cp37m-manylinux1_x86_64

View file

@ -0,0 +1 @@
aiohttp

View file

@ -0,0 +1,216 @@
__version__ = '3.5.4'
from typing import Tuple # noqa
from . import hdrs
from .client import (
BaseConnector,
ClientConnectionError,
ClientConnectorCertificateError,
ClientConnectorError,
ClientConnectorSSLError,
ClientError,
ClientHttpProxyError,
ClientOSError,
ClientPayloadError,
ClientProxyConnectionError,
ClientResponse,
ClientRequest,
ClientResponseError,
ClientSSLError,
ClientSession,
ClientTimeout,
ClientWebSocketResponse,
ContentTypeError,
Fingerprint,
InvalidURL,
RequestInfo,
ServerConnectionError,
ServerDisconnectedError,
ServerFingerprintMismatch,
ServerTimeoutError,
TCPConnector,
UnixConnector,
WSServerHandshakeError,
request
)
from .cookiejar import CookieJar, DummyCookieJar
from .formdata import FormData
from .helpers import BasicAuth, ChainMapProxy
from .http import (
HttpVersion,
HttpVersion10,
HttpVersion11,
WSMsgType,
WSCloseCode,
WSMessage,
WebSocketError
)
from .multipart import (
BadContentDispositionHeader,
BadContentDispositionParam,
BodyPartReader,
MultipartReader,
MultipartWriter,
content_disposition_filename,
parse_content_disposition
)
from .payload import (
AsyncIterablePayload,
BufferedReaderPayload,
BytesIOPayload,
BytesPayload,
IOBasePayload,
JsonPayload,
PAYLOAD_REGISTRY,
Payload,
StringIOPayload,
StringPayload,
TextIOPayload,
get_payload,
payload_type
)
from .payload_streamer import streamer
from .resolver import AsyncResolver, DefaultResolver, ThreadedResolver
from .signals import Signal
from .streams import (
DataQueue,
EMPTY_PAYLOAD,
EofStream,
FlowControlDataQueue,
StreamReader
)
from .tracing import (
TraceConfig,
TraceConnectionCreateEndParams,
TraceConnectionCreateStartParams,
TraceConnectionQueuedEndParams,
TraceConnectionQueuedStartParams,
TraceConnectionReuseconnParams,
TraceDnsCacheHitParams,
TraceDnsCacheMissParams,
TraceDnsResolveHostEndParams,
TraceDnsResolveHostStartParams,
TraceRequestChunkSentParams,
TraceRequestEndParams,
TraceRequestExceptionParams,
TraceRequestRedirectParams,
TraceRequestStartParams,
TraceResponseChunkReceivedParams
)
__all__ = (
'hdrs',
# client
'BaseConnector',
'ClientConnectionError',
'ClientConnectorCertificateError',
'ClientConnectorError',
'ClientConnectorSSLError',
'ClientError',
'ClientHttpProxyError',
'ClientOSError',
'ClientPayloadError',
'ClientProxyConnectionError',
'ClientResponse',
'ClientRequest',
'ClientResponseError',
'ClientSSLError',
'ClientSession',
'ClientTimeout',
'ClientWebSocketResponse',
'ContentTypeError',
'Fingerprint',
'InvalidURL',
'RequestInfo',
'ServerConnectionError',
'ServerDisconnectedError',
'ServerFingerprintMismatch',
'ServerTimeoutError',
'TCPConnector',
'UnixConnector',
'WSServerHandshakeError',
'request',
# cookiejar
'CookieJar',
'DummyCookieJar',
# formdata
'FormData',
# helpers
'BasicAuth',
'ChainMapProxy',
# http
'HttpVersion',
'HttpVersion10',
'HttpVersion11',
'WSMsgType',
'WSCloseCode',
'WSMessage',
'WebSocketError',
# multipart
'BadContentDispositionHeader',
'BadContentDispositionParam',
'BodyPartReader',
'MultipartReader',
'MultipartWriter',
'content_disposition_filename',
'parse_content_disposition',
# payload
'AsyncIterablePayload',
'BufferedReaderPayload',
'BytesIOPayload',
'BytesPayload',
'IOBasePayload',
'JsonPayload',
'PAYLOAD_REGISTRY',
'Payload',
'StringIOPayload',
'StringPayload',
'TextIOPayload',
'get_payload',
'payload_type',
# payload_streamer
'streamer',
# resolver
'AsyncResolver',
'DefaultResolver',
'ThreadedResolver',
# signals
'Signal',
'DataQueue',
'EMPTY_PAYLOAD',
'EofStream',
'FlowControlDataQueue',
'StreamReader',
# tracing
'TraceConfig',
'TraceConnectionCreateEndParams',
'TraceConnectionCreateStartParams',
'TraceConnectionQueuedEndParams',
'TraceConnectionQueuedStartParams',
'TraceConnectionReuseconnParams',
'TraceDnsCacheHitParams',
'TraceDnsCacheMissParams',
'TraceDnsResolveHostEndParams',
'TraceDnsResolveHostStartParams',
'TraceRequestChunkSentParams',
'TraceRequestEndParams',
'TraceRequestExceptionParams',
'TraceRequestRedirectParams',
'TraceRequestStartParams',
'TraceResponseChunkReceivedParams',
) # type: Tuple[str, ...]
try:
from .worker import GunicornWebWorker, GunicornUVLoopWebWorker # noqa
__all__ += ('GunicornWebWorker', 'GunicornUVLoopWebWorker')
except ImportError: # pragma: no cover
pass

View file

@ -0,0 +1,140 @@
from libc.stdint cimport uint16_t, uint32_t, uint64_t
cdef extern from "../vendor/http-parser/http_parser.h":
ctypedef int (*http_data_cb) (http_parser*,
const char *at,
size_t length) except -1
ctypedef int (*http_cb) (http_parser*) except -1
struct http_parser:
unsigned int type
unsigned int flags
unsigned int state
unsigned int header_state
unsigned int index
uint32_t nread
uint64_t content_length
unsigned short http_major
unsigned short http_minor
unsigned int status_code
unsigned int method
unsigned int http_errno
unsigned int upgrade
void *data
struct http_parser_settings:
http_cb on_message_begin
http_data_cb on_url
http_data_cb on_status
http_data_cb on_header_field
http_data_cb on_header_value
http_cb on_headers_complete
http_data_cb on_body
http_cb on_message_complete
http_cb on_chunk_header
http_cb on_chunk_complete
enum http_parser_type:
HTTP_REQUEST,
HTTP_RESPONSE,
HTTP_BOTH
enum http_errno:
HPE_OK,
HPE_CB_message_begin,
HPE_CB_url,
HPE_CB_header_field,
HPE_CB_header_value,
HPE_CB_headers_complete,
HPE_CB_body,
HPE_CB_message_complete,
HPE_CB_status,
HPE_CB_chunk_header,
HPE_CB_chunk_complete,
HPE_INVALID_EOF_STATE,
HPE_HEADER_OVERFLOW,
HPE_CLOSED_CONNECTION,
HPE_INVALID_VERSION,
HPE_INVALID_STATUS,
HPE_INVALID_METHOD,
HPE_INVALID_URL,
HPE_INVALID_HOST,
HPE_INVALID_PORT,
HPE_INVALID_PATH,
HPE_INVALID_QUERY_STRING,
HPE_INVALID_FRAGMENT,
HPE_LF_EXPECTED,
HPE_INVALID_HEADER_TOKEN,
HPE_INVALID_CONTENT_LENGTH,
HPE_INVALID_CHUNK_SIZE,
HPE_INVALID_CONSTANT,
HPE_INVALID_INTERNAL_STATE,
HPE_STRICT,
HPE_PAUSED,
HPE_UNKNOWN
enum flags:
F_CHUNKED,
F_CONNECTION_KEEP_ALIVE,
F_CONNECTION_CLOSE,
F_CONNECTION_UPGRADE,
F_TRAILING,
F_UPGRADE,
F_SKIPBODY,
F_CONTENTLENGTH
enum http_method:
DELETE, GET, HEAD, POST, PUT, CONNECT, OPTIONS, TRACE, COPY,
LOCK, MKCOL, MOVE, PROPFIND, PROPPATCH, SEARCH, UNLOCK, BIND,
REBIND, UNBIND, ACL, REPORT, MKACTIVITY, CHECKOUT, MERGE,
MSEARCH, NOTIFY, SUBSCRIBE, UNSUBSCRIBE, PATCH, PURGE, MKCALENDAR,
LINK, UNLINK
void http_parser_init(http_parser *parser, http_parser_type type)
size_t http_parser_execute(http_parser *parser,
const http_parser_settings *settings,
const char *data,
size_t len)
int http_should_keep_alive(const http_parser *parser)
void http_parser_settings_init(http_parser_settings *settings)
const char *http_errno_name(http_errno err)
const char *http_errno_description(http_errno err)
const char *http_method_str(http_method m)
# URL Parser
enum http_parser_url_fields:
UF_SCHEMA = 0,
UF_HOST = 1,
UF_PORT = 2,
UF_PATH = 3,
UF_QUERY = 4,
UF_FRAGMENT = 5,
UF_USERINFO = 6,
UF_MAX = 7
struct http_parser_url_field_data:
uint16_t off
uint16_t len
struct http_parser_url:
uint16_t field_set
uint16_t port
http_parser_url_field_data[<int>UF_MAX] field_data
void http_parser_url_init(http_parser_url *u)
int http_parser_parse_url(const char *buf,
size_t buflen,
int is_connect,
http_parser_url *u)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,14 @@
#ifndef _FIND_HEADERS_H
#define _FIND_HEADERS_H
#ifdef __cplusplus
extern "C" {
#endif
int find_header(const char *str, int size);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,2 @@
cdef extern from "_find_header.h":
int find_header(char *, int)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,108 @@
from collections.abc import MutableSequence
cdef class FrozenList:
cdef readonly bint frozen
cdef list _items
def __init__(self, items=None):
self.frozen = False
if items is not None:
items = list(items)
else:
items = []
self._items = items
cdef object _check_frozen(self):
if self.frozen:
raise RuntimeError("Cannot modify frozen list.")
cdef inline object _fast_len(self):
return len(self._items)
def freeze(self):
self.frozen = True
def __getitem__(self, index):
return self._items[index]
def __setitem__(self, index, value):
self._check_frozen()
self._items[index] = value
def __delitem__(self, index):
self._check_frozen()
del self._items[index]
def __len__(self):
return self._fast_len()
def __iter__(self):
return self._items.__iter__()
def __reversed__(self):
return self._items.__reversed__()
def __richcmp__(self, other, op):
if op == 0: # <
return list(self) < other
if op == 1: # <=
return list(self) <= other
if op == 2: # ==
return list(self) == other
if op == 3: # !=
return list(self) != other
if op == 4: # >
return list(self) > other
if op == 5: # =>
return list(self) >= other
def insert(self, pos, item):
self._check_frozen()
self._items.insert(pos, item)
def __contains__(self, item):
return item in self._items
def __iadd__(self, items):
self._check_frozen()
self._items += list(items)
return self
def index(self, item):
return self._items.index(item)
def remove(self, item):
self._check_frozen()
self._items.remove(item)
def clear(self):
self._check_frozen()
self._items.clear()
def extend(self, items):
self._check_frozen()
self._items += list(items)
def reverse(self):
self._check_frozen()
self._items.reverse()
def pop(self, index=-1):
self._check_frozen()
return self._items.pop(index)
def append(self, item):
self._check_frozen()
return self._items.append(item)
def count(self, item):
return self._items.count(item)
def __repr__(self):
return '<FrozenList(frozen={}, {!r})>'.format(self.frozen,
self._items)
MutableSequence.register(FrozenList)

View file

@ -0,0 +1,84 @@
# The file is autogenerated from aiohttp/hdrs.py
# Run ./tools/gen.py to update it after the origin changing.
from . import hdrs
cdef tuple headers = (
hdrs.ACCEPT,
hdrs.ACCEPT_CHARSET,
hdrs.ACCEPT_ENCODING,
hdrs.ACCEPT_LANGUAGE,
hdrs.ACCEPT_RANGES,
hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS,
hdrs.ACCESS_CONTROL_ALLOW_HEADERS,
hdrs.ACCESS_CONTROL_ALLOW_METHODS,
hdrs.ACCESS_CONTROL_ALLOW_ORIGIN,
hdrs.ACCESS_CONTROL_EXPOSE_HEADERS,
hdrs.ACCESS_CONTROL_MAX_AGE,
hdrs.ACCESS_CONTROL_REQUEST_HEADERS,
hdrs.ACCESS_CONTROL_REQUEST_METHOD,
hdrs.AGE,
hdrs.ALLOW,
hdrs.AUTHORIZATION,
hdrs.CACHE_CONTROL,
hdrs.CONNECTION,
hdrs.CONTENT_DISPOSITION,
hdrs.CONTENT_ENCODING,
hdrs.CONTENT_LANGUAGE,
hdrs.CONTENT_LENGTH,
hdrs.CONTENT_LOCATION,
hdrs.CONTENT_MD5,
hdrs.CONTENT_RANGE,
hdrs.CONTENT_TRANSFER_ENCODING,
hdrs.CONTENT_TYPE,
hdrs.COOKIE,
hdrs.DATE,
hdrs.DESTINATION,
hdrs.DIGEST,
hdrs.ETAG,
hdrs.EXPECT,
hdrs.EXPIRES,
hdrs.FORWARDED,
hdrs.FROM,
hdrs.HOST,
hdrs.IF_MATCH,
hdrs.IF_MODIFIED_SINCE,
hdrs.IF_NONE_MATCH,
hdrs.IF_RANGE,
hdrs.IF_UNMODIFIED_SINCE,
hdrs.KEEP_ALIVE,
hdrs.LAST_EVENT_ID,
hdrs.LAST_MODIFIED,
hdrs.LINK,
hdrs.LOCATION,
hdrs.MAX_FORWARDS,
hdrs.ORIGIN,
hdrs.PRAGMA,
hdrs.PROXY_AUTHENTICATE,
hdrs.PROXY_AUTHORIZATION,
hdrs.RANGE,
hdrs.REFERER,
hdrs.RETRY_AFTER,
hdrs.SEC_WEBSOCKET_ACCEPT,
hdrs.SEC_WEBSOCKET_EXTENSIONS,
hdrs.SEC_WEBSOCKET_KEY,
hdrs.SEC_WEBSOCKET_KEY1,
hdrs.SEC_WEBSOCKET_PROTOCOL,
hdrs.SEC_WEBSOCKET_VERSION,
hdrs.SERVER,
hdrs.SET_COOKIE,
hdrs.TE,
hdrs.TRAILER,
hdrs.TRANSFER_ENCODING,
hdrs.UPGRADE,
hdrs.URI,
hdrs.USER_AGENT,
hdrs.VARY,
hdrs.VIA,
hdrs.WANT_DIGEST,
hdrs.WARNING,
hdrs.WEBSOCKET,
hdrs.WWW_AUTHENTICATE,
hdrs.X_FORWARDED_FOR,
hdrs.X_FORWARDED_HOST,
hdrs.X_FORWARDED_PROTO,
)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
from typing import Any
class reify:
def __init__(self, wrapped: Any) -> None: ...
def __get__(self, inst: Any, owner: Any) -> Any: ...
def __set__(self, inst: Any, value: Any) -> None: ...

View file

@ -0,0 +1,35 @@
cdef class reify:
"""Use as a class method decorator. It operates almost exactly like
the Python `@property` decorator, but it puts the result of the
method it decorates into the instance dict after the first call,
effectively replacing the function it decorates with an instance
variable. It is, in Python parlance, a data descriptor.
"""
cdef object wrapped
cdef object name
def __init__(self, wrapped):
self.wrapped = wrapped
self.name = wrapped.__name__
@property
def __doc__(self):
return self.wrapped.__doc__
def __get__(self, inst, owner):
try:
try:
return inst._cache[self.name]
except KeyError:
val = self.wrapped(inst)
inst._cache[self.name] = val
return val
except AttributeError:
if inst is None:
return self
raise
def __set__(self, inst, value):
raise AttributeError("reified property is read-only")

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,845 @@
#cython: language_level=3
#
# Based on https://github.com/MagicStack/httptools
#
from __future__ import absolute_import, print_function
from cpython.mem cimport PyMem_Malloc, PyMem_Free
from libc.string cimport memcpy
from cpython cimport (PyObject_GetBuffer, PyBuffer_Release, PyBUF_SIMPLE,
Py_buffer, PyBytes_AsString, PyBytes_AsStringAndSize)
from multidict import (CIMultiDict as _CIMultiDict,
CIMultiDictProxy as _CIMultiDictProxy)
from yarl import URL as _URL
from aiohttp import hdrs
from .http_exceptions import (
BadHttpMessage, BadStatusLine, InvalidHeader, LineTooLong, InvalidURLError,
PayloadEncodingError, ContentLengthError, TransferEncodingError)
from .http_writer import (HttpVersion as _HttpVersion,
HttpVersion10 as _HttpVersion10,
HttpVersion11 as _HttpVersion11)
from .http_parser import DeflateBuffer as _DeflateBuffer
from .streams import (EMPTY_PAYLOAD as _EMPTY_PAYLOAD,
StreamReader as _StreamReader)
cimport cython
from aiohttp cimport _cparser as cparser
include "_headers.pxi"
from aiohttp cimport _find_header
DEF DEFAULT_FREELIST_SIZE = 250
cdef extern from "Python.h":
int PyByteArray_Resize(object, Py_ssize_t) except -1
Py_ssize_t PyByteArray_Size(object) except -1
char* PyByteArray_AsString(object)
__all__ = ('HttpRequestParser', 'HttpResponseParser',
'RawRequestMessage', 'RawResponseMessage')
cdef object URL = _URL
cdef object URL_build = URL.build
cdef object CIMultiDict = _CIMultiDict
cdef object CIMultiDictProxy = _CIMultiDictProxy
cdef object HttpVersion = _HttpVersion
cdef object HttpVersion10 = _HttpVersion10
cdef object HttpVersion11 = _HttpVersion11
cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1
cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING
cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD
cdef object StreamReader = _StreamReader
cdef object DeflateBuffer = _DeflateBuffer
cdef inline object extend(object buf, const char* at, size_t length):
cdef Py_ssize_t s
cdef char* ptr
s = PyByteArray_Size(buf)
PyByteArray_Resize(buf, s + length)
ptr = PyByteArray_AsString(buf)
memcpy(ptr + s, at, length)
DEF METHODS_COUNT = 34;
cdef list _http_method = []
for i in range(METHODS_COUNT):
_http_method.append(
cparser.http_method_str(<cparser.http_method> i).decode('ascii'))
cdef inline str http_method_str(int i):
if i < METHODS_COUNT:
return <str>_http_method[i]
else:
return "<unknown>"
cdef inline object find_header(bytes raw_header):
cdef Py_ssize_t size
cdef char *buf
cdef int idx
PyBytes_AsStringAndSize(raw_header, &buf, &size)
idx = _find_header.find_header(buf, size)
if idx == -1:
return raw_header.decode('utf-8', 'surrogateescape')
return headers[idx]
@cython.freelist(DEFAULT_FREELIST_SIZE)
cdef class RawRequestMessage:
cdef readonly str method
cdef readonly str path
cdef readonly object version # HttpVersion
cdef readonly object headers # CIMultiDict
cdef readonly object raw_headers # tuple
cdef readonly object should_close
cdef readonly object compression
cdef readonly object upgrade
cdef readonly object chunked
cdef readonly object url # yarl.URL
def __init__(self, method, path, version, headers, raw_headers,
should_close, compression, upgrade, chunked, url):
self.method = method
self.path = path
self.version = version
self.headers = headers
self.raw_headers = raw_headers
self.should_close = should_close
self.compression = compression
self.upgrade = upgrade
self.chunked = chunked
self.url = url
def __repr__(self):
info = []
info.append(("method", self.method))
info.append(("path", self.path))
info.append(("version", self.version))
info.append(("headers", self.headers))
info.append(("raw_headers", self.raw_headers))
info.append(("should_close", self.should_close))
info.append(("compression", self.compression))
info.append(("upgrade", self.upgrade))
info.append(("chunked", self.chunked))
info.append(("url", self.url))
sinfo = ', '.join(name + '=' + repr(val) for name, val in info)
return '<RawRequestMessage(' + sinfo + ')>'
def _replace(self, **dct):
cdef RawRequestMessage ret
ret = _new_request_message(self.method,
self.path,
self.version,
self.headers,
self.raw_headers,
self.should_close,
self.compression,
self.upgrade,
self.chunked,
self.url)
if "method" in dct:
ret.method = dct["method"]
if "path" in dct:
ret.path = dct["path"]
if "version" in dct:
ret.version = dct["version"]
if "headers" in dct:
ret.headers = dct["headers"]
if "raw_headers" in dct:
ret.raw_headers = dct["raw_headers"]
if "should_close" in dct:
ret.should_close = dct["should_close"]
if "compression" in dct:
ret.compression = dct["compression"]
if "upgrade" in dct:
ret.upgrade = dct["upgrade"]
if "chunked" in dct:
ret.chunked = dct["chunked"]
if "url" in dct:
ret.url = dct["url"]
return ret
cdef _new_request_message(str method,
str path,
object version,
object headers,
object raw_headers,
bint should_close,
object compression,
bint upgrade,
bint chunked,
object url):
cdef RawRequestMessage ret
ret = RawRequestMessage.__new__(RawRequestMessage)
ret.method = method
ret.path = path
ret.version = version
ret.headers = headers
ret.raw_headers = raw_headers
ret.should_close = should_close
ret.compression = compression
ret.upgrade = upgrade
ret.chunked = chunked
ret.url = url
return ret
@cython.freelist(DEFAULT_FREELIST_SIZE)
cdef class RawResponseMessage:
cdef readonly object version # HttpVersion
cdef readonly int code
cdef readonly str reason
cdef readonly object headers # CIMultiDict
cdef readonly object raw_headers # tuple
cdef readonly object should_close
cdef readonly object compression
cdef readonly object upgrade
cdef readonly object chunked
def __init__(self, version, code, reason, headers, raw_headers,
should_close, compression, upgrade, chunked):
self.version = version
self.code = code
self.reason = reason
self.headers = headers
self.raw_headers = raw_headers
self.should_close = should_close
self.compression = compression
self.upgrade = upgrade
self.chunked = chunked
def __repr__(self):
info = []
info.append(("version", self.version))
info.append(("code", self.code))
info.append(("reason", self.reason))
info.append(("headers", self.headers))
info.append(("raw_headers", self.raw_headers))
info.append(("should_close", self.should_close))
info.append(("compression", self.compression))
info.append(("upgrade", self.upgrade))
info.append(("chunked", self.chunked))
sinfo = ', '.join(name + '=' + repr(val) for name, val in info)
return '<RawResponseMessage(' + sinfo + ')>'
cdef _new_response_message(object version,
int code,
str reason,
object headers,
object raw_headers,
bint should_close,
object compression,
bint upgrade,
bint chunked):
cdef RawResponseMessage ret
ret = RawResponseMessage.__new__(RawResponseMessage)
ret.version = version
ret.code = code
ret.reason = reason
ret.headers = headers
ret.raw_headers = raw_headers
ret.should_close = should_close
ret.compression = compression
ret.upgrade = upgrade
ret.chunked = chunked
return ret
@cython.internal
cdef class HttpParser:
cdef:
cparser.http_parser* _cparser
cparser.http_parser_settings* _csettings
bytearray _raw_name
bytearray _raw_value
bint _has_value
object _protocol
object _loop
object _timer
size_t _max_line_size
size_t _max_field_size
size_t _max_headers
bint _response_with_body
bint _started
object _url
bytearray _buf
str _path
str _reason
object _headers
list _raw_headers
bint _upgraded
list _messages
object _payload
bint _payload_error
object _payload_exception
object _last_error
bint _auto_decompress
str _content_encoding
Py_buffer py_buf
def __cinit__(self):
self._cparser = <cparser.http_parser*> \
PyMem_Malloc(sizeof(cparser.http_parser))
if self._cparser is NULL:
raise MemoryError()
self._csettings = <cparser.http_parser_settings*> \
PyMem_Malloc(sizeof(cparser.http_parser_settings))
if self._csettings is NULL:
raise MemoryError()
def __dealloc__(self):
PyMem_Free(self._cparser)
PyMem_Free(self._csettings)
cdef _init(self, cparser.http_parser_type mode,
object protocol, object loop, object timer=None,
size_t max_line_size=8190, size_t max_headers=32768,
size_t max_field_size=8190, payload_exception=None,
bint response_with_body=True, bint auto_decompress=True):
cparser.http_parser_init(self._cparser, mode)
self._cparser.data = <void*>self
self._cparser.content_length = 0
cparser.http_parser_settings_init(self._csettings)
self._protocol = protocol
self._loop = loop
self._timer = timer
self._buf = bytearray()
self._payload = None
self._payload_error = 0
self._payload_exception = payload_exception
self._messages = []
self._raw_name = bytearray()
self._raw_value = bytearray()
self._has_value = False
self._max_line_size = max_line_size
self._max_headers = max_headers
self._max_field_size = max_field_size
self._response_with_body = response_with_body
self._upgraded = False
self._auto_decompress = auto_decompress
self._content_encoding = None
self._csettings.on_url = cb_on_url
self._csettings.on_status = cb_on_status
self._csettings.on_header_field = cb_on_header_field
self._csettings.on_header_value = cb_on_header_value
self._csettings.on_headers_complete = cb_on_headers_complete
self._csettings.on_body = cb_on_body
self._csettings.on_message_begin = cb_on_message_begin
self._csettings.on_message_complete = cb_on_message_complete
self._csettings.on_chunk_header = cb_on_chunk_header
self._csettings.on_chunk_complete = cb_on_chunk_complete
self._last_error = None
cdef _process_header(self):
if self._raw_name:
raw_name = bytes(self._raw_name)
raw_value = bytes(self._raw_value)
name = find_header(raw_name)
value = raw_value.decode('utf-8', 'surrogateescape')
self._headers.add(name, value)
if name is CONTENT_ENCODING:
self._content_encoding = value
PyByteArray_Resize(self._raw_name, 0)
PyByteArray_Resize(self._raw_value, 0)
self._has_value = False
self._raw_headers.append((raw_name, raw_value))
cdef _on_header_field(self, char* at, size_t length):
cdef Py_ssize_t size
cdef char *buf
if self._has_value:
self._process_header()
size = PyByteArray_Size(self._raw_name)
PyByteArray_Resize(self._raw_name, size + length)
buf = PyByteArray_AsString(self._raw_name)
memcpy(buf + size, at, length)
cdef _on_header_value(self, char* at, size_t length):
cdef Py_ssize_t size
cdef char *buf
size = PyByteArray_Size(self._raw_value)
PyByteArray_Resize(self._raw_value, size + length)
buf = PyByteArray_AsString(self._raw_value)
memcpy(buf + size, at, length)
self._has_value = True
cdef _on_headers_complete(self):
self._process_header()
method = http_method_str(self._cparser.method)
should_close = not cparser.http_should_keep_alive(self._cparser)
upgrade = self._cparser.upgrade
chunked = self._cparser.flags & cparser.F_CHUNKED
raw_headers = tuple(self._raw_headers)
headers = CIMultiDictProxy(self._headers)
if upgrade or self._cparser.method == 5: # cparser.CONNECT:
self._upgraded = True
# do not support old websocket spec
if SEC_WEBSOCKET_KEY1 in headers:
raise InvalidHeader(SEC_WEBSOCKET_KEY1)
encoding = None
enc = self._content_encoding
if enc is not None:
self._content_encoding = None
enc = enc.lower()
if enc in ('gzip', 'deflate', 'br'):
encoding = enc
if self._cparser.type == cparser.HTTP_REQUEST:
msg = _new_request_message(
method, self._path,
self.http_version(), headers, raw_headers,
should_close, encoding, upgrade, chunked, self._url)
else:
msg = _new_response_message(
self.http_version(), self._cparser.status_code, self._reason,
headers, raw_headers, should_close, encoding,
upgrade, chunked)
if (self._cparser.content_length > 0 or chunked or
self._cparser.method == 5): # CONNECT: 5
payload = StreamReader(
self._protocol, timer=self._timer, loop=self._loop)
else:
payload = EMPTY_PAYLOAD
self._payload = payload
if encoding is not None and self._auto_decompress:
self._payload = DeflateBuffer(payload, encoding)
if not self._response_with_body:
payload = EMPTY_PAYLOAD
self._messages.append((msg, payload))
cdef _on_message_complete(self):
self._payload.feed_eof()
self._payload = None
cdef _on_chunk_header(self):
self._payload.begin_http_chunk_receiving()
cdef _on_chunk_complete(self):
self._payload.end_http_chunk_receiving()
cdef object _on_status_complete(self):
pass
cdef inline http_version(self):
cdef cparser.http_parser* parser = self._cparser
if parser.http_major == 1:
if parser.http_minor == 0:
return HttpVersion10
elif parser.http_minor == 1:
return HttpVersion11
return HttpVersion(parser.http_major, parser.http_minor)
### Public API ###
def feed_eof(self):
cdef bytes desc
if self._payload is not None:
if self._cparser.flags & cparser.F_CHUNKED:
raise TransferEncodingError(
"Not enough data for satisfy transfer length header.")
elif self._cparser.flags & cparser.F_CONTENTLENGTH:
raise ContentLengthError(
"Not enough data for satisfy content length header.")
elif self._cparser.http_errno != cparser.HPE_OK:
desc = cparser.http_errno_description(
<cparser.http_errno> self._cparser.http_errno)
raise PayloadEncodingError(desc.decode('latin-1'))
else:
self._payload.feed_eof()
elif self._started:
self._on_headers_complete()
if self._messages:
return self._messages[-1][0]
def feed_data(self, data):
cdef:
size_t data_len
size_t nb
PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE)
data_len = <size_t>self.py_buf.len
nb = cparser.http_parser_execute(
self._cparser,
self._csettings,
<char*>self.py_buf.buf,
data_len)
PyBuffer_Release(&self.py_buf)
# i am not sure about cparser.HPE_INVALID_METHOD,
# seems get err for valid request
# test_client_functional.py::test_post_data_with_bytesio_file
if (self._cparser.http_errno != cparser.HPE_OK and
(self._cparser.http_errno != cparser.HPE_INVALID_METHOD or
self._cparser.method == 0)):
if self._payload_error == 0:
if self._last_error is not None:
ex = self._last_error
self._last_error = None
else:
ex = parser_error_from_errno(
<cparser.http_errno> self._cparser.http_errno)
self._payload = None
raise ex
if self._messages:
messages = self._messages
self._messages = []
else:
messages = ()
if self._upgraded:
return messages, True, data[nb:]
else:
return messages, False, b''
cdef class HttpRequestParser(HttpParser):
def __init__(self, protocol, loop, timer=None,
size_t max_line_size=8190, size_t max_headers=32768,
size_t max_field_size=8190, payload_exception=None,
bint response_with_body=True, bint read_until_eof=False):
self._init(cparser.HTTP_REQUEST, protocol, loop, timer,
max_line_size, max_headers, max_field_size,
payload_exception, response_with_body)
cdef object _on_status_complete(self):
cdef Py_buffer py_buf
if not self._buf:
return
self._path = self._buf.decode('utf-8', 'surrogateescape')
if self._cparser.method == 5: # CONNECT
self._url = URL(self._path)
else:
PyObject_GetBuffer(self._buf, &py_buf, PyBUF_SIMPLE)
try:
self._url = _parse_url(<char*>py_buf.buf,
py_buf.len)
finally:
PyBuffer_Release(&py_buf)
PyByteArray_Resize(self._buf, 0)
cdef class HttpResponseParser(HttpParser):
def __init__(self, protocol, loop, timer=None,
size_t max_line_size=8190, size_t max_headers=32768,
size_t max_field_size=8190, payload_exception=None,
bint response_with_body=True, bint read_until_eof=False,
bint auto_decompress=True):
self._init(cparser.HTTP_RESPONSE, protocol, loop, timer,
max_line_size, max_headers, max_field_size,
payload_exception, response_with_body, auto_decompress)
cdef object _on_status_complete(self):
if self._buf:
self._reason = self._buf.decode('utf-8', 'surrogateescape')
PyByteArray_Resize(self._buf, 0)
cdef int cb_on_message_begin(cparser.http_parser* parser) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
pyparser._started = True
pyparser._headers = CIMultiDict()
pyparser._raw_headers = []
PyByteArray_Resize(pyparser._buf, 0)
pyparser._path = None
pyparser._reason = None
return 0
cdef int cb_on_url(cparser.http_parser* parser,
const char *at, size_t length) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
try:
if length > pyparser._max_line_size:
raise LineTooLong(
'Status line is too long', pyparser._max_line_size, length)
extend(pyparser._buf, at, length)
except BaseException as ex:
pyparser._last_error = ex
return -1
else:
return 0
cdef int cb_on_status(cparser.http_parser* parser,
const char *at, size_t length) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
cdef str reason
try:
if length > pyparser._max_line_size:
raise LineTooLong(
'Status line is too long', pyparser._max_line_size, length)
extend(pyparser._buf, at, length)
except BaseException as ex:
pyparser._last_error = ex
return -1
else:
return 0
cdef int cb_on_header_field(cparser.http_parser* parser,
const char *at, size_t length) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
cdef Py_ssize_t size
try:
pyparser._on_status_complete()
size = len(pyparser._raw_name) + length
if size > pyparser._max_field_size:
raise LineTooLong(
'Header name is too long', pyparser._max_field_size, size)
pyparser._on_header_field(at, length)
except BaseException as ex:
pyparser._last_error = ex
return -1
else:
return 0
cdef int cb_on_header_value(cparser.http_parser* parser,
const char *at, size_t length) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
cdef Py_ssize_t size
try:
size = len(pyparser._raw_value) + length
if size > pyparser._max_field_size:
raise LineTooLong(
'Header value is too long', pyparser._max_field_size, size)
pyparser._on_header_value(at, length)
except BaseException as ex:
pyparser._last_error = ex
return -1
else:
return 0
cdef int cb_on_headers_complete(cparser.http_parser* parser) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
try:
pyparser._on_status_complete()
pyparser._on_headers_complete()
except BaseException as exc:
pyparser._last_error = exc
return -1
else:
if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT
return 2
else:
return 0
cdef int cb_on_body(cparser.http_parser* parser,
const char *at, size_t length) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
cdef bytes body = at[:length]
try:
pyparser._payload.feed_data(body, length)
except BaseException as exc:
if pyparser._payload_exception is not None:
pyparser._payload.set_exception(pyparser._payload_exception(str(exc)))
else:
pyparser._payload.set_exception(exc)
pyparser._payload_error = 1
return -1
else:
return 0
cdef int cb_on_message_complete(cparser.http_parser* parser) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
try:
pyparser._started = False
pyparser._on_message_complete()
except BaseException as exc:
pyparser._last_error = exc
return -1
else:
return 0
cdef int cb_on_chunk_header(cparser.http_parser* parser) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
try:
pyparser._on_chunk_header()
except BaseException as exc:
pyparser._last_error = exc
return -1
else:
return 0
cdef int cb_on_chunk_complete(cparser.http_parser* parser) except -1:
cdef HttpParser pyparser = <HttpParser>parser.data
try:
pyparser._on_chunk_complete()
except BaseException as exc:
pyparser._last_error = exc
return -1
else:
return 0
cdef parser_error_from_errno(cparser.http_errno errno):
cdef bytes desc = cparser.http_errno_description(errno)
if errno in (cparser.HPE_CB_message_begin,
cparser.HPE_CB_url,
cparser.HPE_CB_header_field,
cparser.HPE_CB_header_value,
cparser.HPE_CB_headers_complete,
cparser.HPE_CB_body,
cparser.HPE_CB_message_complete,
cparser.HPE_CB_status,
cparser.HPE_CB_chunk_header,
cparser.HPE_CB_chunk_complete):
cls = BadHttpMessage
elif errno == cparser.HPE_INVALID_STATUS:
cls = BadStatusLine
elif errno == cparser.HPE_INVALID_METHOD:
cls = BadStatusLine
elif errno == cparser.HPE_INVALID_URL:
cls = InvalidURLError
else:
cls = BadHttpMessage
return cls(desc.decode('latin-1'))
def parse_url(url):
cdef:
Py_buffer py_buf
char* buf_data
PyObject_GetBuffer(url, &py_buf, PyBUF_SIMPLE)
try:
buf_data = <char*>py_buf.buf
return _parse_url(buf_data, py_buf.len)
finally:
PyBuffer_Release(&py_buf)
cdef _parse_url(char* buf_data, size_t length):
cdef:
cparser.http_parser_url* parsed
int res
str schema = None
str host = None
object port = None
str path = None
str query = None
str fragment = None
str user = None
str password = None
str userinfo = None
object result = None
int off
int ln
parsed = <cparser.http_parser_url*> \
PyMem_Malloc(sizeof(cparser.http_parser_url))
if parsed is NULL:
raise MemoryError()
cparser.http_parser_url_init(parsed)
try:
res = cparser.http_parser_parse_url(buf_data, length, 0, parsed)
if res == 0:
if parsed.field_set & (1 << cparser.UF_SCHEMA):
off = parsed.field_data[<int>cparser.UF_SCHEMA].off
ln = parsed.field_data[<int>cparser.UF_SCHEMA].len
schema = buf_data[off:off+ln].decode('utf-8', 'surrogateescape')
else:
schema = ''
if parsed.field_set & (1 << cparser.UF_HOST):
off = parsed.field_data[<int>cparser.UF_HOST].off
ln = parsed.field_data[<int>cparser.UF_HOST].len
host = buf_data[off:off+ln].decode('utf-8', 'surrogateescape')
else:
host = ''
if parsed.field_set & (1 << cparser.UF_PORT):
port = parsed.port
if parsed.field_set & (1 << cparser.UF_PATH):
off = parsed.field_data[<int>cparser.UF_PATH].off
ln = parsed.field_data[<int>cparser.UF_PATH].len
path = buf_data[off:off+ln].decode('utf-8', 'surrogateescape')
else:
path = ''
if parsed.field_set & (1 << cparser.UF_QUERY):
off = parsed.field_data[<int>cparser.UF_QUERY].off
ln = parsed.field_data[<int>cparser.UF_QUERY].len
query = buf_data[off:off+ln].decode('utf-8', 'surrogateescape')
else:
query = ''
if parsed.field_set & (1 << cparser.UF_FRAGMENT):
off = parsed.field_data[<int>cparser.UF_FRAGMENT].off
ln = parsed.field_data[<int>cparser.UF_FRAGMENT].len
fragment = buf_data[off:off+ln].decode('utf-8', 'surrogateescape')
else:
fragment = ''
if parsed.field_set & (1 << cparser.UF_USERINFO):
off = parsed.field_data[<int>cparser.UF_USERINFO].off
ln = parsed.field_data[<int>cparser.UF_USERINFO].len
userinfo = buf_data[off:off+ln].decode('utf-8', 'surrogateescape')
user, sep, password = userinfo.partition(':')
return URL_build(scheme=schema,
user=user, password=password, host=host, port=port,
path=path, query=query, fragment=fragment)
else:
raise InvalidURLError("invalid url {!r}".format(buf_data))
finally:
PyMem_Free(parsed)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,152 @@
from libc.stdint cimport uint8_t, uint64_t
from libc.string cimport memcpy
from cpython.exc cimport PyErr_NoMemory
from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
from cpython.bytes cimport PyBytes_FromStringAndSize
from cpython.object cimport PyObject_Str
from multidict import istr
DEF BUF_SIZE = 16 * 1024 # 16KiB
cdef char BUFFER[BUF_SIZE]
cdef object _istr = istr
# ----------------- writer ---------------------------
cdef struct Writer:
char *buf
Py_ssize_t size
Py_ssize_t pos
cdef inline void _init_writer(Writer* writer):
writer.buf = &BUFFER[0]
writer.size = BUF_SIZE
writer.pos = 0
cdef inline void _release_writer(Writer* writer):
if writer.buf != BUFFER:
PyMem_Free(writer.buf)
cdef inline int _write_byte(Writer* writer, uint8_t ch):
cdef char * buf
cdef Py_ssize_t size
if writer.pos == writer.size:
# reallocate
size = writer.size + BUF_SIZE
if writer.buf == BUFFER:
buf = <char*>PyMem_Malloc(size)
if buf == NULL:
PyErr_NoMemory()
return -1
memcpy(buf, writer.buf, writer.size)
else:
buf = <char*>PyMem_Realloc(writer.buf, size)
if buf == NULL:
PyErr_NoMemory()
return -1
writer.buf = buf
writer.size = size
writer.buf[writer.pos] = <char>ch
writer.pos += 1
return 0
cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol):
cdef uint64_t utf = <uint64_t> symbol
if utf < 0x80:
return _write_byte(writer, <uint8_t>utf)
elif utf < 0x800:
if _write_byte(writer, <uint8_t>(0xc0 | (utf >> 6))) < 0:
return -1
return _write_byte(writer, <uint8_t>(0x80 | (utf & 0x3f)))
elif 0xD800 <= utf <= 0xDFFF:
# surogate pair, ignored
return 0
elif utf < 0x10000:
if _write_byte(writer, <uint8_t>(0xe0 | (utf >> 12))) < 0:
return -1
if _write_byte(writer, <uint8_t>(0x80 | ((utf >> 6) & 0x3f))) < 0:
return -1
return _write_byte(writer, <uint8_t>(0x80 | (utf & 0x3f)))
elif utf > 0x10FFFF:
# symbol is too large
return 0
else:
if _write_byte(writer, <uint8_t>(0xf0 | (utf >> 18))) < 0:
return -1
if _write_byte(writer,
<uint8_t>(0x80 | ((utf >> 12) & 0x3f))) < 0:
return -1
if _write_byte(writer,
<uint8_t>(0x80 | ((utf >> 6) & 0x3f))) < 0:
return -1
return _write_byte(writer, <uint8_t>(0x80 | (utf & 0x3f)))
cdef inline int _write_str(Writer* writer, str s):
cdef Py_UCS4 ch
for ch in s:
if _write_utf8(writer, ch) < 0:
return -1
# --------------- _serialize_headers ----------------------
cdef str to_str(object s):
typ = type(s)
if typ is str:
return <str>s
elif typ is _istr:
return PyObject_Str(s)
elif not isinstance(s, str):
raise TypeError("Cannot serialize non-str key {!r}".format(s))
else:
return str(s)
def _serialize_headers(str status_line, headers):
cdef Writer writer
cdef object key
cdef object val
cdef bytes ret
_init_writer(&writer)
try:
if _write_str(&writer, status_line) < 0:
raise
if _write_byte(&writer, '\r') < 0:
raise
if _write_byte(&writer, '\n') < 0:
raise
for key, val in headers.items():
if _write_str(&writer, to_str(key)) < 0:
raise
if _write_byte(&writer, ':') < 0:
raise
if _write_byte(&writer, ' ') < 0:
raise
if _write_str(&writer, to_str(val)) < 0:
raise
if _write_byte(&writer, '\r') < 0:
raise
if _write_byte(&writer, '\n') < 0:
raise
if _write_byte(&writer, '\r') < 0:
raise
if _write_byte(&writer, '\n') < 0:
raise
return PyBytes_FromStringAndSize(writer.buf, writer.pos)
finally:
_release_writer(&writer)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,54 @@
from cpython cimport PyBytes_AsString
#from cpython cimport PyByteArray_AsString # cython still not exports that
cdef extern from "Python.h":
char* PyByteArray_AsString(bytearray ba) except NULL
from libc.stdint cimport uint32_t, uint64_t, uintmax_t
def _websocket_mask_cython(object mask, object data):
"""Note, this function mutates its `data` argument
"""
cdef:
Py_ssize_t data_len, i
# bit operations on signed integers are implementation-specific
unsigned char * in_buf
const unsigned char * mask_buf
uint32_t uint32_msk
uint64_t uint64_msk
assert len(mask) == 4
if not isinstance(mask, bytes):
mask = bytes(mask)
if isinstance(data, bytearray):
data = <bytearray>data
else:
data = bytearray(data)
data_len = len(data)
in_buf = <unsigned char*>PyByteArray_AsString(data)
mask_buf = <const unsigned char*>PyBytes_AsString(mask)
uint32_msk = (<uint32_t*>mask_buf)[0]
# TODO: align in_data ptr to achieve even faster speeds
# does it need in python ?! malloc() always aligns to sizeof(long) bytes
if sizeof(size_t) >= 8:
uint64_msk = uint32_msk
uint64_msk = (uint64_msk << 32) | uint32_msk
while data_len >= 8:
(<uint64_t*>in_buf)[0] ^= uint64_msk
in_buf += 8
data_len -= 8
while data_len >= 4:
(<uint32_t*>in_buf)[0] ^= uint32_msk
in_buf += 4
data_len -= 4
for i in range(0, data_len):
in_buf[i] ^= mask_buf[i]

View file

@ -0,0 +1,208 @@
import asyncio
import logging
from abc import ABC, abstractmethod
from collections.abc import Sized
from http.cookies import BaseCookie, Morsel # noqa
from typing import (
TYPE_CHECKING,
Any,
Awaitable,
Callable,
Dict,
Generator,
Iterable,
List,
Optional,
Tuple,
)
from multidict import CIMultiDict # noqa
from yarl import URL
from .helpers import get_running_loop
from .typedefs import LooseCookies
if TYPE_CHECKING: # pragma: no cover
from .web_request import BaseRequest, Request
from .web_response import StreamResponse
from .web_app import Application
from .web_exceptions import HTTPException
else:
BaseRequest = Request = Application = StreamResponse = None
HTTPException = None
class AbstractRouter(ABC):
def __init__(self) -> None:
self._frozen = False
def post_init(self, app: Application) -> None:
"""Post init stage.
Not an abstract method for sake of backward compatibility,
but if the router wants to be aware of the application
it can override this.
"""
@property
def frozen(self) -> bool:
return self._frozen
def freeze(self) -> None:
"""Freeze router."""
self._frozen = True
@abstractmethod
async def resolve(self, request: Request) -> 'AbstractMatchInfo':
"""Return MATCH_INFO for given request"""
class AbstractMatchInfo(ABC):
@property # pragma: no branch
@abstractmethod
def handler(self) -> Callable[[Request], Awaitable[StreamResponse]]:
"""Execute matched request handler"""
@property
@abstractmethod
def expect_handler(self) -> Callable[[Request], Awaitable[None]]:
"""Expect handler for 100-continue processing"""
@property # pragma: no branch
@abstractmethod
def http_exception(self) -> Optional[HTTPException]:
"""HTTPException instance raised on router's resolving, or None"""
@abstractmethod # pragma: no branch
def get_info(self) -> Dict[str, Any]:
"""Return a dict with additional info useful for introspection"""
@property # pragma: no branch
@abstractmethod
def apps(self) -> Tuple[Application, ...]:
"""Stack of nested applications.
Top level application is left-most element.
"""
@abstractmethod
def add_app(self, app: Application) -> None:
"""Add application to the nested apps stack."""
@abstractmethod
def freeze(self) -> None:
"""Freeze the match info.
The method is called after route resolution.
After the call .add_app() is forbidden.
"""
class AbstractView(ABC):
"""Abstract class based view."""
def __init__(self, request: Request) -> None:
self._request = request
@property
def request(self) -> Request:
"""Request instance."""
return self._request
@abstractmethod
def __await__(self) -> Generator[Any, None, StreamResponse]:
"""Execute the view handler."""
class AbstractResolver(ABC):
"""Abstract DNS resolver."""
@abstractmethod
async def resolve(self, host: str,
port: int, family: int) -> List[Dict[str, Any]]:
"""Return IP address for given hostname"""
@abstractmethod
async def close(self) -> None:
"""Release resolver"""
if TYPE_CHECKING: # pragma: no cover
IterableBase = Iterable[Morsel[str]]
else:
IterableBase = Iterable
class AbstractCookieJar(Sized, IterableBase):
"""Abstract Cookie Jar."""
def __init__(self, *,
loop: Optional[asyncio.AbstractEventLoop]=None) -> None:
self._loop = get_running_loop(loop)
@abstractmethod
def clear(self) -> None:
"""Clear all cookies."""
@abstractmethod
def update_cookies(self,
cookies: LooseCookies,
response_url: URL=URL()) -> None:
"""Update cookies."""
@abstractmethod
def filter_cookies(self, request_url: URL) -> 'BaseCookie[str]':
"""Return the jar's cookies filtered by their attributes."""
class AbstractStreamWriter(ABC):
"""Abstract stream writer."""
buffer_size = 0
output_size = 0
length = 0 # type: Optional[int]
@abstractmethod
async def write(self, chunk: bytes) -> None:
"""Write chunk into stream."""
@abstractmethod
async def write_eof(self, chunk: bytes=b'') -> None:
"""Write last chunk."""
@abstractmethod
async def drain(self) -> None:
"""Flush the write buffer."""
@abstractmethod
def enable_compression(self, encoding: str='deflate') -> None:
"""Enable HTTP body compression"""
@abstractmethod
def enable_chunking(self) -> None:
"""Enable HTTP chunked mode"""
@abstractmethod
async def write_headers(self, status_line: str,
headers: 'CIMultiDict[str]') -> None:
"""Write HTTP headers"""
class AbstractAccessLogger(ABC):
"""Abstract writer to access log."""
def __init__(self, logger: logging.Logger, log_format: str) -> None:
self.logger = logger
self.log_format = log_format
@abstractmethod
def log(self,
request: BaseRequest,
response: StreamResponse,
time: float) -> None:
"""Emit log to logger."""

View file

@ -0,0 +1,81 @@
import asyncio
from typing import Optional, cast
from .tcp_helpers import tcp_nodelay
class BaseProtocol(asyncio.Protocol):
__slots__ = ('_loop', '_paused', '_drain_waiter',
'_connection_lost', 'transport')
def __init__(self, loop: asyncio.AbstractEventLoop) -> None:
self._loop = loop # type: asyncio.AbstractEventLoop
self._paused = False
self._drain_waiter = None # type: Optional[asyncio.Future[None]]
self._connection_lost = False
self._reading_paused = False
self.transport = None # type: Optional[asyncio.Transport]
def pause_writing(self) -> None:
assert not self._paused
self._paused = True
def resume_writing(self) -> None:
assert self._paused
self._paused = False
waiter = self._drain_waiter
if waiter is not None:
self._drain_waiter = None
if not waiter.done():
waiter.set_result(None)
def pause_reading(self) -> None:
if not self._reading_paused and self.transport is not None:
try:
self.transport.pause_reading()
except (AttributeError, NotImplementedError, RuntimeError):
pass
self._reading_paused = True
def resume_reading(self) -> None:
if self._reading_paused and self.transport is not None:
try:
self.transport.resume_reading()
except (AttributeError, NotImplementedError, RuntimeError):
pass
self._reading_paused = False
def connection_made(self, transport: asyncio.BaseTransport) -> None:
tr = cast(asyncio.Transport, transport)
tcp_nodelay(tr, True)
self.transport = tr
def connection_lost(self, exc: Optional[BaseException]) -> None:
self._connection_lost = True
# Wake up the writer if currently paused.
self.transport = None
if not self._paused:
return
waiter = self._drain_waiter
if waiter is None:
return
self._drain_waiter = None
if waiter.done():
return
if exc is None:
waiter.set_result(None)
else:
waiter.set_exception(exc)
async def _drain_helper(self) -> None:
if self._connection_lost:
raise ConnectionResetError('Connection lost')
if not self._paused:
return
waiter = self._drain_waiter
assert waiter is None or waiter.cancelled()
waiter = self._loop.create_future()
self._drain_waiter = waiter
await waiter

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,268 @@
"""HTTP related errors."""
import asyncio
import warnings
from typing import TYPE_CHECKING, Any, Optional, Tuple, Union
from .typedefs import _CIMultiDict
try:
import ssl
SSLContext = ssl.SSLContext
except ImportError: # pragma: no cover
ssl = SSLContext = None # type: ignore
if TYPE_CHECKING: # pragma: no cover
from .client_reqrep import (RequestInfo, ClientResponse, ConnectionKey, # noqa
Fingerprint)
else:
RequestInfo = ClientResponse = ConnectionKey = None
__all__ = (
'ClientError',
'ClientConnectionError',
'ClientOSError', 'ClientConnectorError', 'ClientProxyConnectionError',
'ClientSSLError',
'ClientConnectorSSLError', 'ClientConnectorCertificateError',
'ServerConnectionError', 'ServerTimeoutError', 'ServerDisconnectedError',
'ServerFingerprintMismatch',
'ClientResponseError', 'ClientHttpProxyError',
'WSServerHandshakeError', 'ContentTypeError',
'ClientPayloadError', 'InvalidURL')
class ClientError(Exception):
"""Base class for client connection errors."""
class ClientResponseError(ClientError):
"""Connection error during reading response.
request_info: instance of RequestInfo
"""
def __init__(self, request_info: RequestInfo,
history: Tuple[ClientResponse, ...], *,
code: Optional[int]=None,
status: Optional[int]=None,
message: str='',
headers: Optional[_CIMultiDict]=None) -> None:
self.request_info = request_info
if code is not None:
if status is not None:
raise ValueError(
"Both code and status arguments are provided; "
"code is deprecated, use status instead")
warnings.warn("code argument is deprecated, use status instead",
DeprecationWarning,
stacklevel=2)
if status is not None:
self.status = status
elif code is not None:
self.status = code
else:
self.status = 0
self.message = message
self.headers = headers
self.history = history
super().__init__("%s, message='%s'" % (self.status, message))
@property
def code(self) -> int:
warnings.warn("code property is deprecated, use status instead",
DeprecationWarning,
stacklevel=2)
return self.status
@code.setter
def code(self, value: int) -> None:
warnings.warn("code property is deprecated, use status instead",
DeprecationWarning,
stacklevel=2)
self.status = value
class ContentTypeError(ClientResponseError):
"""ContentType found is not valid."""
class WSServerHandshakeError(ClientResponseError):
"""websocket server handshake error."""
class ClientHttpProxyError(ClientResponseError):
"""HTTP proxy error.
Raised in :class:`aiohttp.connector.TCPConnector` if
proxy responds with status other than ``200 OK``
on ``CONNECT`` request.
"""
class TooManyRedirects(ClientResponseError):
"""Client was redirected too many times."""
class ClientConnectionError(ClientError):
"""Base class for client socket errors."""
class ClientOSError(ClientConnectionError, OSError):
"""OSError error."""
class ClientConnectorError(ClientOSError):
"""Client connector error.
Raised in :class:`aiohttp.connector.TCPConnector` if
connection to proxy can not be established.
"""
def __init__(self, connection_key: ConnectionKey,
os_error: OSError) -> None:
self._conn_key = connection_key
self._os_error = os_error
super().__init__(os_error.errno, os_error.strerror)
@property
def os_error(self) -> OSError:
return self._os_error
@property
def host(self) -> str:
return self._conn_key.host
@property
def port(self) -> Optional[int]:
return self._conn_key.port
@property
def ssl(self) -> Union[SSLContext, None, bool, 'Fingerprint']:
return self._conn_key.ssl
def __str__(self) -> str:
return ('Cannot connect to host {0.host}:{0.port} ssl:{0.ssl} [{1}]'
.format(self, self.strerror))
class ClientProxyConnectionError(ClientConnectorError):
"""Proxy connection error.
Raised in :class:`aiohttp.connector.TCPConnector` if
connection to proxy can not be established.
"""
class ServerConnectionError(ClientConnectionError):
"""Server connection errors."""
class ServerDisconnectedError(ServerConnectionError):
"""Server disconnected."""
def __init__(self, message: Optional[str]=None) -> None:
self.message = message
class ServerTimeoutError(ServerConnectionError, asyncio.TimeoutError):
"""Server timeout error."""
class ServerFingerprintMismatch(ServerConnectionError):
"""SSL certificate does not match expected fingerprint."""
def __init__(self, expected: bytes, got: bytes,
host: str, port: int) -> None:
self.expected = expected
self.got = got
self.host = host
self.port = port
def __repr__(self) -> str:
return '<{} expected={} got={} host={} port={}>'.format(
self.__class__.__name__, self.expected, self.got,
self.host, self.port)
class ClientPayloadError(ClientError):
"""Response payload error."""
class InvalidURL(ClientError, ValueError):
"""Invalid URL.
URL used for fetching is malformed, e.g. it doesn't contains host
part."""
# Derive from ValueError for backward compatibility
def __init__(self, url: Any) -> None:
# The type of url is not yarl.URL because the exception can be raised
# on URL(url) call
super().__init__(url)
@property
def url(self) -> Any:
return self.args[0]
def __repr__(self) -> str:
return '<{} {}>'.format(self.__class__.__name__, self.url)
class ClientSSLError(ClientConnectorError):
"""Base error for ssl.*Errors."""
if ssl is not None:
cert_errors = (ssl.CertificateError,)
cert_errors_bases = (ClientSSLError, ssl.CertificateError,)
ssl_errors = (ssl.SSLError,)
ssl_error_bases = (ClientSSLError, ssl.SSLError)
else: # pragma: no cover
cert_errors = tuple()
cert_errors_bases = (ClientSSLError, ValueError,)
ssl_errors = tuple()
ssl_error_bases = (ClientSSLError,)
class ClientConnectorSSLError(*ssl_error_bases): # type: ignore
"""Response ssl error."""
class ClientConnectorCertificateError(*cert_errors_bases): # type: ignore
"""Response certificate error."""
def __init__(self, connection_key:
ConnectionKey, certificate_error: Exception) -> None:
self._conn_key = connection_key
self._certificate_error = certificate_error
@property
def certificate_error(self) -> Exception:
return self._certificate_error
@property
def host(self) -> str:
return self._conn_key.host
@property
def port(self) -> Optional[int]:
return self._conn_key.port
@property
def ssl(self) -> bool:
return self._conn_key.is_ssl
def __str__(self) -> str:
return ('Cannot connect to host {0.host}:{0.port} ssl:{0.ssl} '
'[{0.certificate_error.__class__.__name__}: '
'{0.certificate_error.args}]'.format(self))

View file

@ -0,0 +1,237 @@
import asyncio
from contextlib import suppress
from typing import Any, Optional, Tuple
from .base_protocol import BaseProtocol
from .client_exceptions import (
ClientOSError,
ClientPayloadError,
ServerDisconnectedError,
ServerTimeoutError,
)
from .helpers import BaseTimerContext
from .http import HttpResponseParser, RawResponseMessage
from .streams import EMPTY_PAYLOAD, DataQueue, StreamReader
class ResponseHandler(BaseProtocol,
DataQueue[Tuple[RawResponseMessage, StreamReader]]):
"""Helper class to adapt between Protocol and StreamReader."""
def __init__(self,
loop: asyncio.AbstractEventLoop) -> None:
BaseProtocol.__init__(self, loop=loop)
DataQueue.__init__(self, loop)
self._should_close = False
self._payload = None
self._skip_payload = False
self._payload_parser = None
self._timer = None
self._tail = b''
self._upgraded = False
self._parser = None # type: Optional[HttpResponseParser]
self._read_timeout = None # type: Optional[float]
self._read_timeout_handle = None # type: Optional[asyncio.TimerHandle]
@property
def upgraded(self) -> bool:
return self._upgraded
@property
def should_close(self) -> bool:
if (self._payload is not None and
not self._payload.is_eof() or self._upgraded):
return True
return (self._should_close or self._upgraded or
self.exception() is not None or
self._payload_parser is not None or
len(self) > 0 or bool(self._tail))
def force_close(self) -> None:
self._should_close = True
def close(self) -> None:
transport = self.transport
if transport is not None:
transport.close()
self.transport = None
self._payload = None
self._drop_timeout()
def is_connected(self) -> bool:
return self.transport is not None
def connection_lost(self, exc: Optional[BaseException]) -> None:
self._drop_timeout()
if self._payload_parser is not None:
with suppress(Exception):
self._payload_parser.feed_eof()
uncompleted = None
if self._parser is not None:
try:
uncompleted = self._parser.feed_eof()
except Exception:
if self._payload is not None:
self._payload.set_exception(
ClientPayloadError(
'Response payload is not completed'))
if not self.is_eof():
if isinstance(exc, OSError):
exc = ClientOSError(*exc.args)
if exc is None:
exc = ServerDisconnectedError(uncompleted)
# assigns self._should_close to True as side effect,
# we do it anyway below
self.set_exception(exc)
self._should_close = True
self._parser = None
self._payload = None
self._payload_parser = None
self._reading_paused = False
super().connection_lost(exc)
def eof_received(self) -> None:
# should call parser.feed_eof() most likely
self._drop_timeout()
def pause_reading(self) -> None:
super().pause_reading()
self._drop_timeout()
def resume_reading(self) -> None:
super().resume_reading()
self._reschedule_timeout()
def set_exception(self, exc: BaseException) -> None:
self._should_close = True
self._drop_timeout()
super().set_exception(exc)
def set_parser(self, parser: Any, payload: Any) -> None:
# TODO: actual types are:
# parser: WebSocketReader
# payload: FlowControlDataQueue
# but they are not generi enough
# Need an ABC for both types
self._payload = payload
self._payload_parser = parser
self._drop_timeout()
if self._tail:
data, self._tail = self._tail, b''
self.data_received(data)
def set_response_params(self, *, timer: BaseTimerContext=None,
skip_payload: bool=False,
read_until_eof: bool=False,
auto_decompress: bool=True,
read_timeout: Optional[float]=None) -> None:
self._skip_payload = skip_payload
self._read_timeout = read_timeout
self._reschedule_timeout()
self._parser = HttpResponseParser(
self, self._loop, timer=timer,
payload_exception=ClientPayloadError,
read_until_eof=read_until_eof,
auto_decompress=auto_decompress)
if self._tail:
data, self._tail = self._tail, b''
self.data_received(data)
def _drop_timeout(self) -> None:
if self._read_timeout_handle is not None:
self._read_timeout_handle.cancel()
self._read_timeout_handle = None
def _reschedule_timeout(self) -> None:
timeout = self._read_timeout
if self._read_timeout_handle is not None:
self._read_timeout_handle.cancel()
if timeout:
self._read_timeout_handle = self._loop.call_later(
timeout, self._on_read_timeout)
else:
self._read_timeout_handle = None
def _on_read_timeout(self) -> None:
exc = ServerTimeoutError("Timeout on reading data from socket")
self.set_exception(exc)
if self._payload is not None:
self._payload.set_exception(exc)
def data_received(self, data: bytes) -> None:
if not data:
return
# custom payload parser
if self._payload_parser is not None:
eof, tail = self._payload_parser.feed_data(data)
if eof:
self._payload = None
self._payload_parser = None
if tail:
self.data_received(tail)
return
else:
if self._upgraded or self._parser is None:
# i.e. websocket connection, websocket parser is not set yet
self._tail += data
else:
# parse http messages
try:
messages, upgraded, tail = self._parser.feed_data(data)
except BaseException as exc:
if self.transport is not None:
# connection.release() could be called BEFORE
# data_received(), the transport is already
# closed in this case
self.transport.close()
# should_close is True after the call
self.set_exception(exc)
return
self._upgraded = upgraded
payload = None
for message, payload in messages:
if message.should_close:
self._should_close = True
self._payload = payload
if self._skip_payload or message.code in (204, 304):
self.feed_data((message, EMPTY_PAYLOAD), 0) # type: ignore # noqa
else:
self.feed_data((message, payload), 0)
if payload is not None:
# new message(s) was processed
# register timeout handler unsubscribing
# either on end-of-stream or immediately for
# EMPTY_PAYLOAD
if payload is not EMPTY_PAYLOAD:
payload.on_eof(self._drop_timeout)
else:
self._drop_timeout()
if tail:
if upgraded:
self.data_received(tail)
else:
self._tail = tail

Some files were not shown because too many files have changed in this diff Show more