diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..896ad8c46427d05ff4064d8110b34540a2887023
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,337 @@
+
+# Created by https://www.toptal.com/developers/gitignore/api/vim,python,emacs,visualstudiocode,pycharm
+# Edit at https://www.toptal.com/developers/gitignore?templates=vim,python,emacs,visualstudiocode,pycharm
+
+### Emacs ###
+# -*- mode: gitignore; -*-
+*~
+\#*\#
+/.emacs.desktop
+/.emacs.desktop.lock
+*.elc
+auto-save-list
+tramp
+.\#*
+
+# Org-mode
+.org-id-locations
+*_archive
+
+# flymake-mode
+*_flymake.*
+
+# eshell files
+/eshell/history
+/eshell/lastdir
+
+# elpa packages
+/elpa/
+
+# reftex files
+*.rel
+
+# AUCTeX auto folder
+/auto/
+
+# cask packages
+.cask/
+dist/
+
+# Flycheck
+flycheck_*.el
+
+# server auth directory
+/server/
+
+# projectiles files
+.projectile
+
+# directory configuration
+.dir-locals.el
+
+# network security
+/network-security.data
+
+
+### PyCharm ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### PyCharm Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+# https://plugins.jetbrains.com/plugin/7973-sonarlint
+.idea/**/sonarlint/
+
+# SonarQube Plugin
+# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
+.idea/**/sonarIssues.xml
+
+# Markdown Navigator plugin
+# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
+.idea/**/markdown-navigator.xml
+.idea/**/markdown-navigator-enh.xml
+.idea/**/markdown-navigator/
+
+# Cache file creation bug
+# See https://youtrack.jetbrains.com/issue/JBR-2257
+.idea/$CACHE_FILE$
+
+# CodeStream plugin
+# https://plugins.jetbrains.com/plugin/12206-codestream
+.idea/codestream.xml
+
+### Python ###
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+### Vim ###
+# Swap
+[._]*.s[a-v][a-z]
+!*.svg  # comment out if you don't need vector files
+[._]*.sw[a-p]
+[._]s[a-rt-v][a-z]
+[._]ss[a-gi-z]
+[._]sw[a-p]
+
+# Session
+Session.vim
+Sessionx.vim
+
+# Temporary
+.netrwhist
+# Auto-generated tag files
+tags
+# Persistent undo
+[._]*.un~
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.code-workspace
+
+# Local History for Visual Studio Code
+.history/
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+# End of https://www.toptal.com/developers/gitignore/api/vim,python,emacs,visualstudiocode,pycharm
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index af234d000cb7f2c2a88359140dd3f503d38677a1..bc4681b1ab0054128d1bbe461531d9b2cb276569 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,9 @@
 stages:
 - test
+- build
+
+variables:
+  DOCKER_REGISTRY: harbor.uio.no
 
 # Run tests on all branches
 test:
@@ -7,4 +11,26 @@ test:
   image: python:3.9
   script:
     - pip install gitlint
-    - gitlint --commits origin/master..HEAD
+    - gitlint --commits `git rev-list --max-parents=0 HEAD`..HEAD
+    - pip install poetry
+    - poetry install --no-interaction --no-ansi
+    - poetry run coverage run --branch --source='.' -m unittest
+    - poetry run coverage xml
+    - poetry run coverage report
+  artifacts:
+    reports:
+      cobertura: coverage.xml
+
+# When new changes are pushed, this step will login to harbor, and run the
+# update-harbor-image.sh script to build, tag and push a new docker image.
+build:
+  stage: build
+  image: harbor.uio.no/library/docker.io-docker:dind
+  services:
+    - docker:dind
+  script:
+    - apk add --no-cache git
+    - git --version
+    - printf '%s' "$CI_HARBOR_TOKEN" | docker login -u "$CI_HARBOR_USERNAME" --password-stdin "$DOCKER_REGISTRY"
+    - sh ./update-harbor-image.sh
+    - docker logout
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..7dfb8b137b00437e467e04c3fc901885634aac42
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,51 @@
+# `python-base` sets up all our shared environment variables
+FROM harbor.uio.no/library/docker.io-python:3.9-slim as python-base
+
+    # python
+ENV PYTHONUNBUFFERED=1 \
+    # prevents python creating .pyc files
+    PYTHONDONTWRITEBYTECODE=1 \
+    \
+    # paths
+    # this is where our requirements + virtual environment will live
+    PYSETUP_PATH="/opt/pysetup" \
+    VENV_PATH="/opt/pysetup/.venv"
+
+# prepend poetry and venv to path
+ENV PATH="${POETRY_HOME}/bin:${VENV_PATH}/bin:${PATH}"
+
+# `builder-base` stage is used to build deps + create our virtual environment
+FROM python-base as builder-base
+
+RUN export DEBIAN_FRONTEND=noninteractive \
+    && apt-get update \
+    && apt-get install -y --no-install-recommends git
+
+ARG POETRY_VERSION=1.1.9
+ARG GET_POETRY_SHA256=e973b3badb95a916bfe250c22eeb7253130fd87312afa326eb02b8bdcea8f4a7
+
+ENV PIP_NO_CACHE_DIR=off \
+    PIP_DISABLE_PIP_VERSION_CHECK=on \
+    PIP_DEFAULT_TIMEOUT=100 \
+    \
+    # poetry
+    # https://python-poetry.org/docs/configuration/#using-environment-variables
+    POETRY_VERSION=${POETRY_VERSION} \
+    # make poetry install to this location
+    POETRY_HOME="/opt/poetry" \
+    # make poetry create the virtual environment in the project's root
+    # it gets named `.venv`
+    POETRY_VIRTUALENVS_IN_PROJECT=true
+
+ENV PATH="${POETRY_HOME}/bin:${VENV_PATH}/bin:${PATH}"
+
+WORKDIR ${PYSETUP_PATH}
+
+RUN python3 -c "from urllib.request import urlretrieve; urlretrieve('https://github.com/python-poetry/poetry/raw/${POETRY_VERSION}/get-poetry.py', 'get-poetry.py')" \
+    && printf '%s get-poetry.py' "${GET_POETRY_SHA256}" >get-poetry.py.sha256 \
+    && sha256sum --check get-poetry.py.sha256 \
+    && python get-poetry.py --version "${POETRY_VERSION}" --yes --no-modify-path
+
+COPY poetry.lock pyproject.toml ./
+
+RUN poetry install --no-dev --no-interaction --no-ansi
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..a1c1a72e9ce8336a02f6241ad7efe0397437752b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,37 @@
+# Document Dealer deals documents
+
+Document Dealer collects documents from DFØs document service, and presents the
+documents for the requestors in-line. The requestors visits DD by clicking an
+URL in e.g. Tableau.
+
+## Example usage:
+
+Run Document Dealer:
+```
+$ poetry shell
+$ poetry install
+$ cp config.example.yaml config.yaml
+$ vim config.yaml
+$ DOCUMENT_DEALER_CONFIG=config.yaml uvicorn document_dealer.main:app --reload
+```
+
+Collect a document:
+
+```
+$ xdg-open 'http://127.0.0.1:8000/document?firm=72&doc_id=6bdf3104-88e3-4707-9398-9f4175b58939&doc_type=INNGFAKTVEDL&revision=0'
+```
+
+## Running tests:
+```
+$ coverage run -m unittest
+```
+
+## Pipelines:
+
+Gitlab has now been setup to build and push new docker images to harbor, for new commits on master and for new tags/releases.
+
+You can still build docker images locally with the update-harbor-image.sh script (mentioned below).
+
+But if you want the script to also push the built images to harbor, you now have to set the CI environment variable to some value when you run it, like this:
+
+`CI=true update-harbor-image.sh`
diff --git a/config.example.yaml b/config.example.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..305d8390ff14f0542a04567a09a91065bfc7542f
--- /dev/null
+++ b/config.example.yaml
@@ -0,0 +1,9 @@
+instance_config:
+  72:
+    url: http://example.com
+    headers:
+      X-Gravitee-Api-Key: a-b-c-d
+    credentials:
+      Username: ws-<firm>
+      Password: a-b-c-d
+      Client: 72
diff --git a/document_dealer/__init__.py b/document_dealer/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..f3eb6a1fd1bce74d7feca2f19bca2fa60e0456be
--- /dev/null
+++ b/document_dealer/__init__.py
@@ -0,0 +1,3 @@
+__version__ = "0.1.0"
+
+from . import utils
diff --git a/document_dealer/config.py b/document_dealer/config.py
new file mode 100644
index 0000000000000000000000000000000000000000..0628053ce12fc1646f064922a4a4e5b7b1b39029
--- /dev/null
+++ b/document_dealer/config.py
@@ -0,0 +1,46 @@
+import typing
+import os
+
+import pydantic
+import yaml
+
+import document_dealer
+
+
+class NoConfigException(Exception):
+    pass
+
+
+class SoapCredentials(pydantic.BaseModel):
+    Username: str
+    Password: str
+    Client: str
+
+    class Config:
+        alias_generator = lambda s: s.lower()
+        allow_population_by_field_name = True
+
+
+class InstanceConfig(pydantic.BaseModel):
+    url: pydantic.HttpUrl
+    headers: typing.Dict[str, str] = {}
+    credentials: SoapCredentials
+
+
+class Config(pydantic.BaseModel):
+    instance_config: typing.Dict[typing.Union[str, int], InstanceConfig]
+
+
+def get_config(file=None):
+    if file:
+        filename = file
+    elif os.environ.get("DOCUMENT_DEALER_CONFIG"):
+        filename = os.environ.get("DOCUMENT_DEALER_CONFIG")
+    else:
+        raise NoConfigException
+
+    config_file = yaml.load(
+        document_dealer.utils.load_file(filename), Loader=yaml.FullLoader
+    )
+
+    return Config(**config_file)
diff --git a/document_dealer/document_client.py b/document_dealer/document_client.py
new file mode 100644
index 0000000000000000000000000000000000000000..8988624afeb09bf689fe4569e6af851b6b5ff022
--- /dev/null
+++ b/document_dealer/document_client.py
@@ -0,0 +1,40 @@
+import base64
+import os
+import mimetypes
+
+import requests
+import zeep
+
+
+class DocumentClient:
+    def __init__(self, config):
+        self.config = config
+        self.session = requests.Session()
+        self.session.headers.update(config.headers)
+        self.transport = zeep.transports.Transport(session=self.session)
+        self.client = zeep.Client(
+            os.path.join(
+                os.path.dirname(__file__), "..", "wsdl", "DocArchiveV201409.wsdl"
+            ),
+            transport=self.transport,
+        )
+        self.service = self.client.create_service(
+            "{http://services.agresso.com/DocArchiveService/DocArchiveV201409}DocArchiveV201409Soap",
+            self.config.url,
+        )
+
+    def get_document(self, firm: str, doc_id: str, doc_type: str, revision: int):
+        reply = self.service.GetDocumentRevision(
+            credentials=self.config.credentials.dict(),
+            request={
+                "DocId": doc_id,
+                "DocType": doc_type,
+                "RevisionNo": revision,
+                "PageNo": 0,
+            },
+        )
+        return (
+            base64.b64decode(reply["Revision"]["FileContent"]),
+            reply["Revision"]["FileName"],
+            *mimetypes.guess_type(reply["Revision"]["FileName"]),
+        )
diff --git a/document_dealer/main.py b/document_dealer/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..632265b1fb6346a6134472a127932f145752a30d
--- /dev/null
+++ b/document_dealer/main.py
@@ -0,0 +1,24 @@
+import fastapi
+
+from .document_client import DocumentClient
+from .config import get_config
+
+app = fastapi.FastAPI()
+
+config = get_config()
+
+
+@app.get("/document")
+async def get_document(firm: str, doc_id: str, doc_type: str, revision: int):
+    client = DocumentClient(config.instance_config.get(firm))
+    document, filename, mime_type, encoding = client.get_document(
+        firm, doc_id, doc_type, revision
+    )
+
+    headers = {"Content-Disposition": f'inline; filename="{ filename }"'}
+    if encoding:
+        headers.update({"Content-Encoding": encoding})
+
+    return fastapi.responses.Response(
+        content=document, media_type=mime_type, headers=headers
+    )
diff --git a/document_dealer/utils.py b/document_dealer/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..12823402bfcbb733665509317f1ba29d72f45f8d
--- /dev/null
+++ b/document_dealer/utils.py
@@ -0,0 +1,3 @@
+def load_file(filename):
+    with open(filename, "r") as f:
+        return f.read()
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000000000000000000000000000000000000..e97b4dbf09ced699c11429776d5d83ef33588dc9
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,641 @@
+[[package]]
+name = "asgiref"
+version = "3.4.1"
+description = "ASGI specs, helper code, and adapters"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
+
+[[package]]
+name = "attrs"
+version = "21.2.0"
+description = "Classes Without Boilerplate"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.extras]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
+
+[[package]]
+name = "black"
+version = "21.9b0"
+description = "The uncompromising code formatter."
+category = "dev"
+optional = false
+python-versions = ">=3.6.2"
+
+[package.dependencies]
+click = ">=7.1.2"
+mypy-extensions = ">=0.4.3"
+pathspec = ">=0.9.0,<1"
+platformdirs = ">=2"
+regex = ">=2020.1.8"
+tomli = ">=0.2.6,<2.0.0"
+typing-extensions = [
+    {version = ">=3.10.0.0", markers = "python_version < \"3.10\""},
+    {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""},
+]
+
+[package.extras]
+colorama = ["colorama (>=0.4.3)"]
+d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"]
+jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
+python2 = ["typed-ast (>=1.4.2)"]
+uvloop = ["uvloop (>=0.15.2)"]
+
+[[package]]
+name = "cached-property"
+version = "1.5.2"
+description = "A decorator for caching properties in classes."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "certifi"
+version = "2021.5.30"
+description = "Python package for providing Mozilla's CA Bundle."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "charset-normalizer"
+version = "2.0.6"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+category = "main"
+optional = false
+python-versions = ">=3.5.0"
+
+[package.extras]
+unicode_backport = ["unicodedata2"]
+
+[[package]]
+name = "click"
+version = "8.0.1"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[[package]]
+name = "colorama"
+version = "0.4.4"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "coverage"
+version = "6.0"
+description = "Code coverage measurement for Python"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+toml = ["tomli"]
+
+[[package]]
+name = "fastapi"
+version = "0.68.1"
+description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0"
+starlette = "0.14.2"
+
+[package.extras]
+all = ["requests (>=2.24.0,<3.0.0)", "aiofiles (>=0.5.0,<0.6.0)", "jinja2 (>=2.11.2,<3.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<2.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "graphene (>=2.1.8,<3.0.0)", "ujson (>=4.0.1,<5.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)"]
+dev = ["python-jose[cryptography] (>=3.3.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "graphene (>=2.1.8,<3.0.0)"]
+doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=7.1.9,<8.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.2.0)", "typer-cli (>=0.0.12,<0.0.13)", "pyyaml (>=5.3.1,<6.0.0)"]
+test = ["pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<3.0.0)", "pytest-asyncio (>=0.14.0,<0.15.0)", "mypy (==0.812)", "flake8 (>=3.8.3,<4.0.0)", "black (==20.8b1)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.15.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<1.4.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.4.0)", "orjson (>=3.2.1,<4.0.0)", "ujson (>=4.0.1,<5.0.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "aiofiles (>=0.5.0,<0.6.0)", "flask (>=1.1.2,<2.0.0)"]
+
+[[package]]
+name = "h11"
+version = "0.12.0"
+description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "idna"
+version = "3.2"
+description = "Internationalized Domain Names in Applications (IDNA)"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "isodate"
+version = "0.6.0"
+description = "An ISO 8601 date/time/duration parser and formatter"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+name = "lxml"
+version = "4.6.3"
+description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*"
+
+[package.extras]
+cssselect = ["cssselect (>=0.7)"]
+html5 = ["html5lib"]
+htmlsoup = ["beautifulsoup4"]
+source = ["Cython (>=0.29.7)"]
+
+[[package]]
+name = "mypy-extensions"
+version = "0.4.3"
+description = "Experimental type system extensions for programs checked with the mypy typechecker."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pathspec"
+version = "0.9.0"
+description = "Utility library for gitignore style pattern matching of file paths."
+category = "dev"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+
+[[package]]
+name = "platformdirs"
+version = "2.4.0"
+description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"]
+test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
+
+[[package]]
+name = "pydantic"
+version = "1.8.2"
+description = "Data validation and settings management using python 3.6 type hinting"
+category = "main"
+optional = false
+python-versions = ">=3.6.1"
+
+[package.dependencies]
+typing-extensions = ">=3.7.4.3"
+
+[package.extras]
+dotenv = ["python-dotenv (>=0.10.4)"]
+email = ["email-validator (>=1.0.3)"]
+
+[[package]]
+name = "pytz"
+version = "2021.1"
+description = "World timezone definitions, modern and historical"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pyyaml"
+version = "5.4.1"
+description = "YAML parser and emitter for Python"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+
+[[package]]
+name = "regex"
+version = "2021.9.24"
+description = "Alternative regular expression module, to replace re."
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "requests"
+version = "2.26.0"
+description = "Python HTTP for Humans."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
+idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
+urllib3 = ">=1.21.1,<1.27"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
+use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
+
+[[package]]
+name = "requests-file"
+version = "1.5.1"
+description = "File transport adapter for Requests"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+requests = ">=1.0.0"
+six = "*"
+
+[[package]]
+name = "requests-toolbelt"
+version = "0.9.1"
+description = "A utility belt for advanced users of python-requests"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+requests = ">=2.0.1,<3.0.0"
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "starlette"
+version = "0.14.2"
+description = "The little ASGI library that shines."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+full = ["aiofiles", "graphene", "itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"]
+
+[[package]]
+name = "tomli"
+version = "1.2.1"
+description = "A lil' TOML parser"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "typing-extensions"
+version = "3.10.0.2"
+description = "Backported and Experimental Type Hints for Python 3.5+"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "urllib3"
+version = "1.26.7"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+
+[package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+
+[[package]]
+name = "uvicorn"
+version = "0.15.0"
+description = "The lightning-fast ASGI server."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+asgiref = ">=3.4.0"
+click = ">=7.0"
+h11 = ">=0.8"
+
+[package.extras]
+standard = ["websockets (>=9.1)", "httptools (>=0.2.0,<0.3.0)", "watchgod (>=0.6)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "colorama (>=0.4)"]
+
+[[package]]
+name = "zeep"
+version = "4.1.0"
+description = "A modern/fast Python SOAP client based on lxml / requests"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+attrs = ">=17.2.0"
+cached-property = ">=1.3.0"
+isodate = ">=0.5.4"
+lxml = ">=4.6.0"
+platformdirs = ">=1.4.0"
+pytz = "*"
+requests = ">=2.7.0"
+requests-file = ">=1.5.1"
+requests-toolbelt = ">=0.7.1"
+
+[package.extras]
+async = ["httpx"]
+docs = ["sphinx (>=1.4.0)"]
+test = ["coverage[toml] (==5.2.1)", "freezegun (==0.3.15)", "mock (==2.0.0)", "pretend (==1.0.9)", "pytest-cov (==2.8.1)", "pytest-httpx", "pytest-asyncio", "pytest (==6.0.1)", "requests-mock (>=0.7.0)", "isort (==5.3.2)", "flake8 (==3.8.3)", "flake8-blind-except (==0.1.1)", "flake8-debugger (==3.2.1)", "flake8-imports (==0.1.1)"]
+xmlsec = ["xmlsec (>=0.6.1)"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.9"
+content-hash = "2ba576a49d292150f221e8a20c9db372255fa8d92c31d68ac610593cddc39ef9"
+
+[metadata.files]
+asgiref = [
+    {file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"},
+    {file = "asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9"},
+]
+attrs = [
+    {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
+    {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
+]
+black = [
+    {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"},
+    {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"},
+]
+cached-property = [
+    {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
+    {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
+]
+certifi = [
+    {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"},
+    {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"},
+]
+charset-normalizer = [
+    {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"},
+    {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"},
+]
+click = [
+    {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"},
+    {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"},
+]
+colorama = [
+    {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
+    {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+]
+coverage = [
+    {file = "coverage-6.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:3dfb23cc180b674a11a559183dff9655beb9da03088f3fe3c4f3a6d200c86f05"},
+    {file = "coverage-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5dd5ae0a9cd55d71f1335c331e9625382239b8cede818fb62d8d2702336dbf8"},
+    {file = "coverage-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8426fec5ad5a6e8217921716b504e9b6e1166dc147e8443b4855e329db686282"},
+    {file = "coverage-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aa5d4d43fa18cc9d0c6e02a83de0b9729b5451a9066574bd276481474f0a53ab"},
+    {file = "coverage-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78dd3eeb8f5ff26d2113c41836bac04a9ea91be54c346826b54a373133c8c53"},
+    {file = "coverage-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:581fddd2f883379bd5af51da9233e0396b6519f3d3eeae4fb88867473be6d56e"},
+    {file = "coverage-6.0-cp310-cp310-win32.whl", hash = "sha256:43bada49697a62ffa0283c7f01bbc76aac562c37d4bb6c45d56dd008d841194e"},
+    {file = "coverage-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa816e97cfe1f691423078dffa39a18106c176f28008db017b3ce3e947c34aa5"},
+    {file = "coverage-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5c191e01b23e760338f19d8ba2470c0dad44c8b45e41ac043b2db84efc62f695"},
+    {file = "coverage-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274a612f67f931307706b60700f1e4cf80e1d79dff6c282fc9301e4565e78724"},
+    {file = "coverage-6.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9dbfcbc56d8de5580483cf2caff6a59c64d3e88836cbe5fb5c20c05c29a8808"},
+    {file = "coverage-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e63490e8a6675cee7a71393ee074586f7eeaf0e9341afd006c5d6f7eec7c16d7"},
+    {file = "coverage-6.0-cp36-cp36m-win32.whl", hash = "sha256:72f8c99f1527c5a8ee77c890ea810e26b39fd0b4c2dffc062e20a05b2cca60ef"},
+    {file = "coverage-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:88f1810eb942e7063d051d87aaaa113eb5fd5a7fd2cda03a972de57695b8bb1a"},
+    {file = "coverage-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:befb5ffa9faabef6dadc42622c73de168001425258f0b7e402a2934574e7a04b"},
+    {file = "coverage-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7dbda34e8e26bd86606ba8a9c13ccb114802e01758a3d0a75652ffc59a573220"},
+    {file = "coverage-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b4ee5815c776dfa3958ba71c7cd4cdd8eb40d79358a18352feb19562fe4408c4"},
+    {file = "coverage-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d82cbef1220703ce56822be7fbddb40736fc1a928ac893472df8aff7421ae0aa"},
+    {file = "coverage-6.0-cp37-cp37m-win32.whl", hash = "sha256:d795a2c92fe8cb31f6e9cd627ee4f39b64eb66bf47d89d8fcf7cb3d17031c887"},
+    {file = "coverage-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6e216e4021c934246c308fd3e0d739d9fa8a3f4ea414f584ab90ef9c1592f282"},
+    {file = "coverage-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8305e14112efb74d0b5fec4df6e41cafde615c2392a7e51c84013cafe945842c"},
+    {file = "coverage-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4865dc4a7a566147cbdc2b2f033a6cccc99a7dcc89995137765c384f6c73110b"},
+    {file = "coverage-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:25df2bc53a954ba2ccf230fa274d1de341f6aa633d857d75e5731365f7181749"},
+    {file = "coverage-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:08fd55d2e00dac4c18a2fa26281076035ec86e764acdc198b9185ce749ada58f"},
+    {file = "coverage-6.0-cp38-cp38-win32.whl", hash = "sha256:11ce082eb0f7c2bbfe96f6c8bcc3a339daac57de4dc0f3186069ec5c58da911c"},
+    {file = "coverage-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:7844a8c6a0fee401edbf578713c2473e020759267c40261b294036f9d3eb6a2d"},
+    {file = "coverage-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bea681309bdd88dd1283a8ba834632c43da376d9bce05820826090aad80c0126"},
+    {file = "coverage-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e735ab8547d8a1fe8e58dd765d6f27ac539b395f52160d767b7189f379f9be7a"},
+    {file = "coverage-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7593a49300489d064ebb6c58539f52cbbc4a2e6a4385de5e92cae1563f88a425"},
+    {file = "coverage-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adb0f4c3c8ba8104378518a1954cbf3d891a22c13fd0e0bf135391835f44f288"},
+    {file = "coverage-6.0-cp39-cp39-win32.whl", hash = "sha256:8da0c4a26a831b392deaba5fdd0cd7838d173b47ce2ec3d0f37be630cb09ef6e"},
+    {file = "coverage-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:7af2f8e7bb54ace984de790e897f858e88068d8fbc46c9490b7c19c59cf51822"},
+    {file = "coverage-6.0-pp36-none-any.whl", hash = "sha256:82b58d37c47d93a171be9b5744bcc96a0012cbf53d5622b29a49e6be2097edd7"},
+    {file = "coverage-6.0-pp37-none-any.whl", hash = "sha256:fff04bfefb879edcf616f1ce5ea6f4a693b5976bdc5e163f8464f349c25b59f0"},
+    {file = "coverage-6.0.tar.gz", hash = "sha256:17983f6ccc47f4864fd16d20ff677782b23d1207bf222d10e4d676e4636b0872"},
+]
+fastapi = [
+    {file = "fastapi-0.68.1-py3-none-any.whl", hash = "sha256:94d2820906c36b9b8303796fb7271337ec89c74223229e3cfcf056b5a7d59e23"},
+    {file = "fastapi-0.68.1.tar.gz", hash = "sha256:644bb815bae326575c4b2842469fb83053a4b974b82fa792ff9283d17fbbd99d"},
+]
+h11 = [
+    {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"},
+    {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"},
+]
+idna = [
+    {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"},
+    {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"},
+]
+isodate = [
+    {file = "isodate-0.6.0-py2.py3-none-any.whl", hash = "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81"},
+    {file = "isodate-0.6.0.tar.gz", hash = "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8"},
+]
+lxml = [
+    {file = "lxml-4.6.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2"},
+    {file = "lxml-4.6.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f"},
+    {file = "lxml-4.6.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d"},
+    {file = "lxml-4.6.3-cp27-cp27m-win32.whl", hash = "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106"},
+    {file = "lxml-4.6.3-cp27-cp27m-win_amd64.whl", hash = "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee"},
+    {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f"},
+    {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4"},
+    {file = "lxml-4.6.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51"},
+    {file = "lxml-4.6.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586"},
+    {file = "lxml-4.6.3-cp35-cp35m-win32.whl", hash = "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2"},
+    {file = "lxml-4.6.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4"},
+    {file = "lxml-4.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4"},
+    {file = "lxml-4.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3"},
+    {file = "lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d"},
+    {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec"},
+    {file = "lxml-4.6.3-cp36-cp36m-win32.whl", hash = "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04"},
+    {file = "lxml-4.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a"},
+    {file = "lxml-4.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654"},
+    {file = "lxml-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0"},
+    {file = "lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3"},
+    {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2"},
+    {file = "lxml-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade"},
+    {file = "lxml-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b"},
+    {file = "lxml-4.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa"},
+    {file = "lxml-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a"},
+    {file = "lxml-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927"},
+    {file = "lxml-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791"},
+    {file = "lxml-4.6.3-cp38-cp38-win32.whl", hash = "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28"},
+    {file = "lxml-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7"},
+    {file = "lxml-4.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0"},
+    {file = "lxml-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1"},
+    {file = "lxml-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23"},
+    {file = "lxml-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969"},
+    {file = "lxml-4.6.3-cp39-cp39-win32.whl", hash = "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f"},
+    {file = "lxml-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83"},
+    {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"},
+]
+mypy-extensions = [
+    {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
+    {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
+]
+pathspec = [
+    {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
+    {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
+]
+platformdirs = [
+    {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"},
+    {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"},
+]
+pydantic = [
+    {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"},
+    {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"},
+    {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"},
+    {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"},
+    {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"},
+    {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"},
+    {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"},
+    {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"},
+    {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"},
+    {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"},
+    {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"},
+    {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"},
+    {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"},
+    {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"},
+    {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"},
+    {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"},
+    {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"},
+    {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"},
+    {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"},
+    {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"},
+    {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"},
+    {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"},
+]
+pytz = [
+    {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"},
+    {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"},
+]
+pyyaml = [
+    {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"},
+    {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"},
+    {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"},
+    {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"},
+    {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"},
+    {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"},
+    {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"},
+    {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"},
+    {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"},
+    {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"},
+    {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"},
+    {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"},
+    {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"},
+    {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"},
+    {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"},
+]
+regex = [
+    {file = "regex-2021.9.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0628ed7d6334e8f896f882a5c1240de8c4d9b0dd7c7fb8e9f4692f5684b7d656"},
+    {file = "regex-2021.9.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3baf3eaa41044d4ced2463fd5d23bf7bd4b03d68739c6c99a59ce1f95599a673"},
+    {file = "regex-2021.9.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c000635fd78400a558bd7a3c2981bb2a430005ebaa909d31e6e300719739a949"},
+    {file = "regex-2021.9.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:295bc8a13554a25ad31e44c4bedabd3c3e28bba027e4feeb9bb157647a2344a7"},
+    {file = "regex-2021.9.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0e3f59d3c772f2c3baaef2db425e6fc4149d35a052d874bb95ccfca10a1b9f4"},
+    {file = "regex-2021.9.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aea4006b73b555fc5bdb650a8b92cf486d678afa168cf9b38402bb60bf0f9c18"},
+    {file = "regex-2021.9.24-cp310-cp310-win32.whl", hash = "sha256:09eb62654030f39f3ba46bc6726bea464069c29d00a9709e28c9ee9623a8da4a"},
+    {file = "regex-2021.9.24-cp310-cp310-win_amd64.whl", hash = "sha256:8d80087320632457aefc73f686f66139801959bf5b066b4419b92be85be3543c"},
+    {file = "regex-2021.9.24-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7e3536f305f42ad6d31fc86636c54c7dafce8d634e56fef790fbacb59d499dd5"},
+    {file = "regex-2021.9.24-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31f35a984caffb75f00a86852951a337540b44e4a22171354fb760cefa09346"},
+    {file = "regex-2021.9.24-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7cb25adba814d5f419733fe565f3289d6fa629ab9e0b78f6dff5fa94ab0456"},
+    {file = "regex-2021.9.24-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:85c61bee5957e2d7be390392feac7e1d7abd3a49cbaed0c8cee1541b784c8561"},
+    {file = "regex-2021.9.24-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c94722bf403b8da744b7d0bb87e1f2529383003ceec92e754f768ef9323f69ad"},
+    {file = "regex-2021.9.24-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6adc1bd68f81968c9d249aab8c09cdc2cbe384bf2d2cb7f190f56875000cdc72"},
+    {file = "regex-2021.9.24-cp36-cp36m-win32.whl", hash = "sha256:2054dea683f1bda3a804fcfdb0c1c74821acb968093d0be16233873190d459e3"},
+    {file = "regex-2021.9.24-cp36-cp36m-win_amd64.whl", hash = "sha256:7783d89bd5413d183a38761fbc68279b984b9afcfbb39fa89d91f63763fbfb90"},
+    {file = "regex-2021.9.24-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b15dc34273aefe522df25096d5d087abc626e388a28a28ac75a4404bb7668736"},
+    {file = "regex-2021.9.24-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10a7a9cbe30bd90b7d9a1b4749ef20e13a3528e4215a2852be35784b6bd070f0"},
+    {file = "regex-2021.9.24-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb9f5844db480e2ef9fce3a72e71122dd010ab7b2920f777966ba25f7eb63819"},
+    {file = "regex-2021.9.24-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:17310b181902e0bb42b29c700e2c2346b8d81f26e900b1328f642e225c88bce1"},
+    {file = "regex-2021.9.24-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bba1f6df4eafe79db2ecf38835c2626dbd47911e0516f6962c806f83e7a99ae"},
+    {file = "regex-2021.9.24-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:821e10b73e0898544807a0692a276e539e5bafe0a055506a6882814b6a02c3ec"},
+    {file = "regex-2021.9.24-cp37-cp37m-win32.whl", hash = "sha256:9c371dd326289d85906c27ec2bc1dcdedd9d0be12b543d16e37bad35754bde48"},
+    {file = "regex-2021.9.24-cp37-cp37m-win_amd64.whl", hash = "sha256:1e8d1898d4fb817120a5f684363b30108d7b0b46c7261264b100d14ec90a70e7"},
+    {file = "regex-2021.9.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a5c2250c0a74428fd5507ae8853706fdde0f23bfb62ee1ec9418eeacf216078"},
+    {file = "regex-2021.9.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8aec4b4da165c4a64ea80443c16e49e3b15df0f56c124ac5f2f8708a65a0eddc"},
+    {file = "regex-2021.9.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:650c4f1fc4273f4e783e1d8e8b51a3e2311c2488ba0fcae6425b1e2c248a189d"},
+    {file = "regex-2021.9.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2cdb3789736f91d0b3333ac54d12a7e4f9efbc98f53cb905d3496259a893a8b3"},
+    {file = "regex-2021.9.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e61100200fa6ab7c99b61476f9f9653962ae71b931391d0264acfb4d9527d9c"},
+    {file = "regex-2021.9.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8c268e78d175798cd71d29114b0a1f1391c7d011995267d3b62319ec1a4ecaa1"},
+    {file = "regex-2021.9.24-cp38-cp38-win32.whl", hash = "sha256:658e3477676009083422042c4bac2bdad77b696e932a3de001c42cc046f8eda2"},
+    {file = "regex-2021.9.24-cp38-cp38-win_amd64.whl", hash = "sha256:a731552729ee8ae9c546fb1c651c97bf5f759018fdd40d0e9b4d129e1e3a44c8"},
+    {file = "regex-2021.9.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86f9931eb92e521809d4b64ec8514f18faa8e11e97d6c2d1afa1bcf6c20a8eab"},
+    {file = "regex-2021.9.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcbbc9cfa147d55a577d285fd479b43103188855074552708df7acc31a476dd9"},
+    {file = "regex-2021.9.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29385c4dbb3f8b3a55ce13de6a97a3d21bd00de66acd7cdfc0b49cb2f08c906c"},
+    {file = "regex-2021.9.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c50a6379763c733562b1fee877372234d271e5c78cd13ade5f25978aa06744db"},
+    {file = "regex-2021.9.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f74b6d8f59f3cfb8237e25c532b11f794b96f5c89a6f4a25857d85f84fbef11"},
+    {file = "regex-2021.9.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c4d83d21d23dd854ffbc8154cf293f4e43ba630aa9bd2539c899343d7f59da3"},
+    {file = "regex-2021.9.24-cp39-cp39-win32.whl", hash = "sha256:95e89a8558c8c48626dcffdf9c8abac26b7c251d352688e7ab9baf351e1c7da6"},
+    {file = "regex-2021.9.24-cp39-cp39-win_amd64.whl", hash = "sha256:835962f432bce92dc9bf22903d46c50003c8d11b1dc64084c8fae63bca98564a"},
+    {file = "regex-2021.9.24.tar.gz", hash = "sha256:6266fde576e12357b25096351aac2b4b880b0066263e7bc7a9a1b4307991bb0e"},
+]
+requests = [
+    {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"},
+    {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"},
+]
+requests-file = [
+    {file = "requests-file-1.5.1.tar.gz", hash = "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e"},
+    {file = "requests_file-1.5.1-py2.py3-none-any.whl", hash = "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953"},
+]
+requests-toolbelt = [
+    {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"},
+    {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"},
+]
+six = [
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+starlette = [
+    {file = "starlette-0.14.2-py3-none-any.whl", hash = "sha256:3c8e48e52736b3161e34c9f0e8153b4f32ec5d8995a3ee1d59410d92f75162ed"},
+    {file = "starlette-0.14.2.tar.gz", hash = "sha256:7d49f4a27f8742262ef1470608c59ddbc66baf37c148e938c7038e6bc7a998aa"},
+]
+tomli = [
+    {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"},
+    {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"},
+]
+typing-extensions = [
+    {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
+    {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
+    {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
+]
+urllib3 = [
+    {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"},
+    {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"},
+]
+uvicorn = [
+    {file = "uvicorn-0.15.0-py3-none-any.whl", hash = "sha256:17f898c64c71a2640514d4089da2689e5db1ce5d4086c2d53699bf99513421c1"},
+    {file = "uvicorn-0.15.0.tar.gz", hash = "sha256:d9a3c0dd1ca86728d3e235182683b4cf94cd53a867c288eaeca80ee781b2caff"},
+]
+zeep = [
+    {file = "zeep-4.1.0-py2.py3-none-any.whl", hash = "sha256:81c491092b71f5b276de8c63dfd452be3f322622c48a54f3a497cf913bdfb2f4"},
+    {file = "zeep-4.1.0.tar.gz", hash = "sha256:5867f2eadd6b028d9751f4155af590d3aaf9280e3a0ed5e15a53343921c956e5"},
+]
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..94dbe62444a3709fb13ac9b2ae404ff798f2041f
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,20 @@
+[tool.poetry]
+name = "document-dealer"
+version = "0.1.0"
+description = "Document dealer deals documents from DFØs document service"
+authors = ["Jo Sama <jo.sama@usit.uio.no>"]
+
+[tool.poetry.dependencies]
+python = "^3.9"
+zeep = "^4.1.0"
+fastapi = "^0.68.1"
+uvicorn = "^0.15.0"
+PyYAML = "^5.4.1"
+
+[tool.poetry.dev-dependencies]
+black = "^21.9b0"
+coverage = "^6.0"
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/fixtures/config.yaml b/tests/fixtures/config.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7c010de312336343b55ec2354891e25e43d7ce1b
--- /dev/null
+++ b/tests/fixtures/config.yaml
@@ -0,0 +1,9 @@
+instance_config:
+  uio:
+    url: "http://example.com"
+    headers:
+      X-Gravitee-Api-Key: "a-b-c-d"
+    credentials:
+      Username: "user"
+      Password: "pass"
+      Client: "firm"
diff --git a/tests/test_config.py b/tests/test_config.py
new file mode 100644
index 0000000000000000000000000000000000000000..182c55a2604385bbfb27800b572d69b3ceb7735f
--- /dev/null
+++ b/tests/test_config.py
@@ -0,0 +1,15 @@
+import unittest
+
+from document_dealer import config
+
+import yaml
+
+
+class Test(unittest.TestCase):
+    def test_get_config(self):
+        with open("config.example.yaml") as f:
+            config_fixture = config.Config(**yaml.load(f.read(), Loader=yaml.FullLoader))
+
+        c = config.get_config(file="config.example.yaml")
+
+        self.assertEqual(c, config_fixture)
diff --git a/update-harbor-image.sh b/update-harbor-image.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a0b5452048c69321b030fb766df20936114d2b60
--- /dev/null
+++ b/update-harbor-image.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+slugify() {
+  # Turn all non-ascii non-alphanumeric characters to -, then lowercase.
+  # e.g. 'feature/FOO-123_blæh_blah' -> 'feature-foo-123-bl-h-blah'
+  printf %s "$1" |
+    LC_ALL=C sed -E 's/[^[:alnum:]]+/-/g' |
+    tr '[:upper:]' '[:lower:]'
+}
+
+set -x
+export BUILDAH_FORMAT=docker
+export DOCKER_BUILDKIT=1
+IMAGE_PREFIX=${IMAGE_PREFIX:-harbor.uio.no/bott-int}
+
+# Handle running the script locally, and on gitlab (otherwise, gitlab would get head as the branch name):
+if [ -n "$CI_COMMIT_REF_NAME" ]; then
+  git_branch=$CI_COMMIT_REF_NAME
+  git_sha=$CI_COMMIT_SHORT_SHA
+else
+  git_branch=$(git rev-parse --abbrev-ref HEAD) &&
+  git_sha=$(git rev-parse --short HEAD) || exit
+fi
+
+app_name=document-dealer
+container=$IMAGE_PREFIX/$app_name
+image_tag=$container:$(slugify "$git_branch")-$git_sha
+
+if command -v podman > /dev/null 2>&1; then
+  docker() { podman "$@"; }
+  printf 'Will build using podman\n'
+elif command -v docker > /dev/null 2>&1; then
+  printf 'Will build using docker\n'
+else
+  printf >&2 'Missing podman or docker CLI tools\n'
+  exit 1
+fi
+
+printf 'Generating .dockerignore\n'
+git ls-files | awk 'BEGIN{print ".*\n*"} {print "!"$0}' > .dockerignore
+
+printf 'Building %s\n' "$image_tag"
+docker build -t "$image_tag" . --no-cache|| exit
+
+printf 'Pushing %s\n' "$image_tag"
+if [ "$CI" ]; then
+  docker push "$image_tag" || exit
+fi
+
+if [ "$git_branch" = master ]; then
+  printf 'On master branch, setting %s as %s:latest\n' "$image_tag" "$container"
+  docker tag "$image_tag" "$container:latest"
+  if [ "$CI" ]; then
+    docker push "$container:latest"
+  fi
+fi
+
+#Tag with git tag if present
+vers_tag=$(git tag --sort=-taggerdate --points-at=HEAD | sed 1q)
+if [ -z "$vers_tag" ]; then
+  printf "No git tag or release found."
+else
+  # else, if tag is found, build the tagged version
+  printf 'Setting %s as %s:%s\n' "$image_tag" "$container" "$vers_tag"
+  docker tag "$image_tag" "$container:$vers_tag"
+  if [ "$CI" ]; then
+    docker push "$container:$vers_tag"
+  fi
+  printf "Release version: <%s>" "$vers_tag"
+fi
diff --git a/wsdl/DocArchiveV201409.wsdl b/wsdl/DocArchiveV201409.wsdl
new file mode 100644
index 0000000000000000000000000000000000000000..0d68eb02c036972408e3100a1797d1695351eb5b
--- /dev/null
+++ b/wsdl/DocArchiveV201409.wsdl
@@ -0,0 +1 @@
+<wsdl:definitions targetNamespace="http://services.agresso.com/DocArchiveService/DocArchiveV201409" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://services.agresso.com/DocArchiveService/DocArchiveV201409" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"><wsdl:documentation>Document Archive web service, version 201409</wsdl:documentation><wsdl:types><s:schema elementFormDefault="qualified" targetNamespace="http://services.agresso.com/DocArchiveService/DocArchiveV201409"><s:element name="GetDocumentTypes"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="request" type="tns:DocumentTypeRequest"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:complexType name="DocumentTypeRequest"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="DocType" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Key" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="KeyId" type="s:string"/></s:sequence></s:complexType><s:complexType name="WSCredentials"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Client" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string"/></s:sequence></s:complexType><s:element name="GetDocumentTypesResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="GetDocumentTypesResult" type="tns:DocumentTypeResponse"/></s:sequence></s:complexType></s:element><s:complexType name="DocumentTypeResponse"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="Response" type="tns:Response"/><s:element minOccurs="0" maxOccurs="1" name="DocTypes" type="tns:ArrayOfDocumentType"/></s:sequence></s:complexType><s:complexType name="Response"><s:sequence><s:element minOccurs="1" maxOccurs="1" name="Status" type="s:int"/><s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Source" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Version" type="s:string"/></s:sequence></s:complexType><s:complexType name="ArrayOfDocumentType"><s:sequence><s:element minOccurs="0" maxOccurs="unbounded" name="DocumentType" nillable="true" type="tns:DocumentType"/></s:sequence></s:complexType><s:complexType name="DocumentType"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="Description" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocType" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocKey" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocKeyId" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocSystemId" type="s:string"/><s:element minOccurs="1" maxOccurs="1" name="MaxKB" type="s:int"/><s:element minOccurs="1" maxOccurs="1" name="Priority" type="s:int"/><s:element minOccurs="0" maxOccurs="1" name="Indexes" type="tns:ArrayOfIndex"/></s:sequence></s:complexType><s:complexType name="ArrayOfIndex"><s:sequence><s:element minOccurs="0" maxOccurs="unbounded" name="Index" nillable="true" type="tns:Index"/></s:sequence></s:complexType><s:complexType name="Index"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="Description" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="AttributeId" type="s:string"/><s:element minOccurs="1" maxOccurs="1" name="DataLength" type="s:int"/><s:element minOccurs="0" maxOccurs="1" name="DataType" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DefaultValue" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocKeyFlag" type="s:string"/><s:element minOccurs="1" maxOccurs="1" name="IndexKeyFlag" type="s:boolean"/><s:element minOccurs="1" maxOccurs="1" name="SequenceNo" type="s:int"/></s:sequence></s:complexType><s:element name="GetDocumentProperties"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="request" type="tns:DocumentPropertiesRequest"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:complexType name="DocumentPropertiesRequest"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="DocId" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocType" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Status" type="s:string"/><s:element minOccurs="1" maxOccurs="1" name="GetIndexValues" type="s:boolean"/><s:element minOccurs="0" maxOccurs="1" name="IndexValues" type="tns:ArrayOfString"/></s:sequence></s:complexType><s:complexType name="ArrayOfString"><s:sequence><s:element minOccurs="0" maxOccurs="unbounded" name="string" nillable="true" type="s:string"/></s:sequence></s:complexType><s:element name="GetDocumentPropertiesResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="GetDocumentPropertiesResult" type="tns:DocumentPropertiesResponse"/></s:sequence></s:complexType></s:element><s:complexType name="DocumentPropertiesResponse"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="Response" type="tns:Response"/><s:element minOccurs="0" maxOccurs="1" name="Properties" type="tns:ArrayOfDocumentProperties"/></s:sequence></s:complexType><s:complexType name="ArrayOfDocumentProperties"><s:sequence><s:element minOccurs="0" maxOccurs="unbounded" name="DocumentProperties" nillable="true" type="tns:DocumentProperties"/></s:sequence></s:complexType><s:complexType name="DocumentProperties"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="DocId" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocType" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="MimeType" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Description" type="s:string"/><s:element minOccurs="1" maxOccurs="1" name="LastRevision" type="s:int"/><s:element minOccurs="1" maxOccurs="1" name="LastUpdate" type="s:dateTime"/><s:element minOccurs="0" maxOccurs="1" name="IndexValues" type="tns:ArrayOfString"/></s:sequence></s:complexType><s:element name="GetDocumentRevision"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="request" type="tns:DocumentRequest"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:complexType name="DocumentRequest"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="DocId" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocType" type="s:string"/><s:element minOccurs="1" maxOccurs="1" name="RevisionNo" type="s:long"/><s:element minOccurs="1" maxOccurs="1" name="PageNo" type="s:long"/></s:sequence></s:complexType><s:element name="GetDocumentRevisionResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="GetDocumentRevisionResult" type="tns:DocumentRevisionResponse"/></s:sequence></s:complexType></s:element><s:complexType name="DocumentRevisionResponse"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="Response" type="tns:Response"/><s:element minOccurs="0" maxOccurs="1" name="Revision" type="tns:DocumentRevision"/></s:sequence></s:complexType><s:complexType name="DocumentRevision"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="DocId" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocType" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="IndexValues" type="tns:ArrayOfString"/><s:element minOccurs="1" maxOccurs="1" name="RevisionNo" type="s:int"/><s:element minOccurs="0" maxOccurs="1" name="Comments" type="s:string"/><s:element minOccurs="1" maxOccurs="1" name="RevisionDate" type="s:dateTime"/><s:element minOccurs="0" maxOccurs="1" name="FileName" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="Description" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="FileContent" type="s:string"/></s:sequence></s:complexType><s:element name="AddDocument"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="newDocument" type="tns:DocumentRevision"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:element name="AddDocumentResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="AddDocumentResult" type="tns:DocumentPropertiesResponse"/></s:sequence></s:complexType></s:element><s:element name="CheckIn"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="request" type="tns:DocumentRevision"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:element name="CheckInResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="CheckInResult" type="tns:Response"/></s:sequence></s:complexType></s:element><s:element name="CheckOut"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="request" type="tns:DocumentRequest"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:element name="CheckOutResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="CheckOutResult" type="tns:DocumentRevisionResponse"/></s:sequence></s:complexType></s:element><s:element name="CancelCheckOut"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="request" type="tns:DocumentRequest"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:element name="CancelCheckOutResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="CancelCheckOutResult" type="tns:Response"/></s:sequence></s:complexType></s:element><s:element name="AddDocumentLink"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="request" type="tns:DocumentPropertiesRequest"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:element name="AddDocumentLinkResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="AddDocumentLinkResult" type="tns:Response"/></s:sequence></s:complexType></s:element><s:element name="SetAdditionalIndexes"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="request" type="tns:AdditionalIndexesRequest"/><s:element minOccurs="0" maxOccurs="1" name="credentials" type="tns:WSCredentials"/></s:sequence></s:complexType></s:element><s:complexType name="AdditionalIndexesRequest"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="DocId" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="DocType" type="s:string"/><s:element minOccurs="0" maxOccurs="1" name="IndexesValues" type="tns:ArrayOfIndexValue"/></s:sequence></s:complexType><s:complexType name="ArrayOfIndexValue"><s:sequence><s:element minOccurs="0" maxOccurs="unbounded" name="IndexValue" nillable="true" type="tns:IndexValue"/></s:sequence></s:complexType><s:complexType name="IndexValue"><s:sequence><s:element minOccurs="0" maxOccurs="1" name="Value" type="s:string"/><s:element minOccurs="1" maxOccurs="1" name="SequenceNo" type="s:int"/></s:sequence></s:complexType><s:element name="SetAdditionalIndexesResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="SetAdditionalIndexesResult" type="tns:Response"/></s:sequence></s:complexType></s:element><s:element name="About"><s:complexType/></s:element><s:element name="AboutResponse"><s:complexType><s:sequence><s:element minOccurs="0" maxOccurs="1" name="AboutResult" type="s:string"/></s:sequence></s:complexType></s:element></s:schema></wsdl:types><wsdl:message name="GetDocumentTypesSoapIn"><wsdl:part name="parameters" element="tns:GetDocumentTypes"/></wsdl:message><wsdl:message name="GetDocumentTypesSoapOut"><wsdl:part name="parameters" element="tns:GetDocumentTypesResponse"/></wsdl:message><wsdl:message name="GetDocumentPropertiesSoapIn"><wsdl:part name="parameters" element="tns:GetDocumentProperties"/></wsdl:message><wsdl:message name="GetDocumentPropertiesSoapOut"><wsdl:part name="parameters" element="tns:GetDocumentPropertiesResponse"/></wsdl:message><wsdl:message name="GetDocumentRevisionSoapIn"><wsdl:part name="parameters" element="tns:GetDocumentRevision"/></wsdl:message><wsdl:message name="GetDocumentRevisionSoapOut"><wsdl:part name="parameters" element="tns:GetDocumentRevisionResponse"/></wsdl:message><wsdl:message name="AddDocumentSoapIn"><wsdl:part name="parameters" element="tns:AddDocument"/></wsdl:message><wsdl:message name="AddDocumentSoapOut"><wsdl:part name="parameters" element="tns:AddDocumentResponse"/></wsdl:message><wsdl:message name="CheckInSoapIn"><wsdl:part name="parameters" element="tns:CheckIn"/></wsdl:message><wsdl:message name="CheckInSoapOut"><wsdl:part name="parameters" element="tns:CheckInResponse"/></wsdl:message><wsdl:message name="CheckOutSoapIn"><wsdl:part name="parameters" element="tns:CheckOut"/></wsdl:message><wsdl:message name="CheckOutSoapOut"><wsdl:part name="parameters" element="tns:CheckOutResponse"/></wsdl:message><wsdl:message name="CancelCheckOutSoapIn"><wsdl:part name="parameters" element="tns:CancelCheckOut"/></wsdl:message><wsdl:message name="CancelCheckOutSoapOut"><wsdl:part name="parameters" element="tns:CancelCheckOutResponse"/></wsdl:message><wsdl:message name="AddDocumentLinkSoapIn"><wsdl:part name="parameters" element="tns:AddDocumentLink"/></wsdl:message><wsdl:message name="AddDocumentLinkSoapOut"><wsdl:part name="parameters" element="tns:AddDocumentLinkResponse"/></wsdl:message><wsdl:message name="SetAdditionalIndexesSoapIn"><wsdl:part name="parameters" element="tns:SetAdditionalIndexes"/></wsdl:message><wsdl:message name="SetAdditionalIndexesSoapOut"><wsdl:part name="parameters" element="tns:SetAdditionalIndexesResponse"/></wsdl:message><wsdl:message name="AboutSoapIn"><wsdl:part name="parameters" element="tns:About"/></wsdl:message><wsdl:message name="AboutSoapOut"><wsdl:part name="parameters" element="tns:AboutResponse"/></wsdl:message><wsdl:portType name="DocArchiveV201409Soap"><wsdl:operation name="GetDocumentTypes"><wsdl:documentation>Get document types</wsdl:documentation><wsdl:input message="tns:GetDocumentTypesSoapIn"/><wsdl:output message="tns:GetDocumentTypesSoapOut"/></wsdl:operation><wsdl:operation name="GetDocumentProperties"><wsdl:documentation>Get properties for one or more documents</wsdl:documentation><wsdl:input message="tns:GetDocumentPropertiesSoapIn"/><wsdl:output message="tns:GetDocumentPropertiesSoapOut"/></wsdl:operation><wsdl:operation name="GetDocumentRevision"><wsdl:documentation>Get document content based on id and type</wsdl:documentation><wsdl:input message="tns:GetDocumentRevisionSoapIn"/><wsdl:output message="tns:GetDocumentRevisionSoapOut"/></wsdl:operation><wsdl:operation name="AddDocument"><wsdl:documentation>Add new document to the archive</wsdl:documentation><wsdl:input message="tns:AddDocumentSoapIn"/><wsdl:output message="tns:AddDocumentSoapOut"/></wsdl:operation><wsdl:operation name="CheckIn"><wsdl:documentation>Check in document</wsdl:documentation><wsdl:input message="tns:CheckInSoapIn"/><wsdl:output message="tns:CheckInSoapOut"/></wsdl:operation><wsdl:operation name="CheckOut"><wsdl:documentation>Check out document for editing</wsdl:documentation><wsdl:input message="tns:CheckOutSoapIn"/><wsdl:output message="tns:CheckOutSoapOut"/></wsdl:operation><wsdl:operation name="CancelCheckOut"><wsdl:documentation>Cancel checkout</wsdl:documentation><wsdl:input message="tns:CancelCheckOutSoapIn"/><wsdl:output message="tns:CancelCheckOutSoapOut"/></wsdl:operation><wsdl:operation name="AddDocumentLink"><wsdl:documentation>Add document link - attach document to new key item</wsdl:documentation><wsdl:input message="tns:AddDocumentLinkSoapIn"/><wsdl:output message="tns:AddDocumentLinkSoapOut"/></wsdl:operation><wsdl:operation name="SetAdditionalIndexes"><wsdl:documentation>Set values of additional indexes on an existing document.</wsdl:documentation><wsdl:input message="tns:SetAdditionalIndexesSoapIn"/><wsdl:output message="tns:SetAdditionalIndexesSoapOut"/></wsdl:operation><wsdl:operation name="About"><wsdl:documentation>Diagnostics method that checks for presence of nessecary components and database connection</wsdl:documentation><wsdl:input message="tns:AboutSoapIn"/><wsdl:output message="tns:AboutSoapOut"/></wsdl:operation></wsdl:portType><wsdl:binding name="DocArchiveV201409Soap" type="tns:DocArchiveV201409Soap"><soap:binding transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="GetDocumentTypes"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/GetDocumentTypes" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="GetDocumentProperties"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/GetDocumentProperties" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="GetDocumentRevision"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/GetDocumentRevision" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="AddDocument"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/AddDocument" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="CheckIn"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/CheckIn" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="CheckOut"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/CheckOut" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="CancelCheckOut"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/CancelCheckOut" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="AddDocumentLink"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/AddDocumentLink" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="SetAdditionalIndexes"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/SetAdditionalIndexes" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation><wsdl:operation name="About"><soap:operation soapAction="http://services.agresso.com/DocArchiveService/DocArchiveV201409/About" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="DocArchiveV201409"><wsdl:documentation>Document Archive web service, version 201409</wsdl:documentation><wsdl:port name="DocArchiveV201409Soap" binding="tns:DocArchiveV201409Soap"><soap:address location="http://agr-bott-utv02.sfso.no/AgrBOTT_Utv02_WS/service.svc"/></wsdl:port></wsdl:service></wsdl:definitions>
\ No newline at end of file