pax_global_header00006660000000000000000000000064146611702170014517gustar00rootroot0000000000000052 comment=9cde7fdb57be62eb527cc2c25633048a90430a43 meejah-txtorcon-0058423/000077500000000000000000000000001466117021700150155ustar00rootroot00000000000000meejah-txtorcon-0058423/.coveragerc000066400000000000000000000000701466117021700171330ustar00rootroot00000000000000[paths] source = txtorcon [run] source = ./txtorconmeejah-txtorcon-0058423/.github/000077500000000000000000000000001466117021700163555ustar00rootroot00000000000000meejah-txtorcon-0058423/.github/workflows/000077500000000000000000000000001466117021700204125ustar00rootroot00000000000000meejah-txtorcon-0058423/.github/workflows/flake8.yaml000066400000000000000000000007361466117021700224560ustar00rootroot00000000000000name: flake8 on: push: branches: [ main ] pull_request: branches: [ main ] jobs: testing: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip tox tox-gh-actions - name: Test run: | python --version python -m tox -e flake8 meejah-txtorcon-0058423/.github/workflows/python3.yaml000066400000000000000000000016601466117021700227050ustar00rootroot00000000000000name: python3 on: push: branches: [ main ] pull_request: branches: [ main ] jobs: testing: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.8", "3.9", "3.10"] twisted-version: [tx18, tx19, tx20, tx21, tx22, tx23, tx24] include: - python-version: "3.11" twisted-version: "tx24" - python-version: "3.12" twisted-version: "tx24" steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip tox tox-gh-actions - name: Unit-Test run: | python -m tox -e py3-${{ matrix.twisted-version }} - name: Coveralls uses: coverallsapp/github-action@master with: github-token: ${{ secrets.GITHUB_TOKEN }} meejah-txtorcon-0058423/.github/workflows/readme_render.yaml000066400000000000000000000007541466117021700241000ustar00rootroot00000000000000name: README render on: push: branches: [ main ] pull_request: branches: [ main ] jobs: testing: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip tox tox-gh-actions - name: Test run: | python --version python -m tox -e readme_render meejah-txtorcon-0058423/.gitignore000066400000000000000000000003201466117021700170000ustar00rootroot00000000000000dockerbase-wheezy/ _trial_temp/ build/ dist/ txtorcon.egg-info/ *.pyo *.pyc *.swp *.swo *~ announcements/ annotated_coverage/ twisted/plugins/dropin.cache docs/_build .coverage .tox venv/ venv_tox_*/ PRIVATE*meejah-txtorcon-0058423/.readthedocs.yaml000066400000000000000000000003071466117021700202440ustar00rootroot00000000000000version: 2 build: os: ubuntu-22.04 tools: python: "3.11" apt_packages: - libgeoip-dev sphinx: configuration: docs/conf.py python: install: - requirements: doc-requirements.txt meejah-txtorcon-0058423/Dockerfile000066400000000000000000000014271466117021700170130ustar00rootroot00000000000000FROM dockerbase-jessie ADD docker-apt-tor /etc/apt/sources.list.d/tor.list ADD docker-backports /etc/apt/sources.list.d/backports.list ADD tor-deb-signing-key /root/tor-deb-signing-key ##RUN apt-get update ##RUN `awk '/BEGIN_INSTALL/,/END_INSTALL/' ./README.rst | /bin/grep apt-get | /bin/grep -v development` ## above fails when run via Docker RUN apt-key add /root/tor-deb-signing-key RUN apt-get update && apt-get install -y python-pip python-virtualenv python-dev tor RUN pip install twisted ipaddress service-identity # can we do this during build-time somehow? # RUN pip install --editable /txtorcon ## we make our code available via a "container volume" (-v option to run) ## at /txtorcon # this one just tells you to rtfm (use run.py) CMD ["/txtorcon/integration/no_testcase"] meejah-txtorcon-0058423/INSTALL000066400000000000000000000017501466117021700160510ustar00rootroot00000000000000 See README for more information. To just install this as quickly as possible, using a Debian or Ubuntu system, run the following as root: apt-get install python-setuptools python-twisted python-ipaddress graphviz python setup.py install It's recommended to use a virtualenv (see below), but on OSX (and assuming homebrew is installed): brew install geoip pip install -r requirements.txt pip install -r dev-requirements.txt Or, instead of installing locally, simply: export PYTHONPATH=. If you want to take slightly more time, but only install temporarily, use virtualenv: apt-get install python-setuptools python-pip mkdir tmp virtualenv tmp/txtorcon_env cd tmp/txtorcon_env source bin/activate pip install --editable . # this will download from internets: (Or you can type "make virtualenv" which creates tmp/txtorcon_env, up to the "activate" step above) Now, this should work (where "work" means "prints nothing"): python -c "import txtorcon" meejah-txtorcon-0058423/LICENSE000066400000000000000000000020401466117021700160160ustar00rootroot00000000000000Copyright (c) 2012, 2013 meejah Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. meejah-txtorcon-0058423/MANIFEST.in000066400000000000000000000011401466117021700165470ustar00rootroot00000000000000include Makefile include README.rst include INSTALL include TODO include LICENSE include meejah.asc include scripts/*.py include docs/Makefile include docs/apilinks_sphinxext.py include docs/conf.py include docs/*.rst include docs/_static/* exclude docs/_static/*~ include docs/_themes/* exclude docs/_themes/*~ include docs/_themes/alabaster/* exclude docs/_themes/alabaster/*~ exclude docs/_themes/alabaster/*.pyc include docs/_themes/alabaster/static/* exclude docs/_themes/alabaster/static/*~ include examples/* exclude examples/*~ include requirements.txt include dev-requirements.txt include test/*.py meejah-txtorcon-0058423/Makefile000066400000000000000000000104321466117021700164550ustar00rootroot00000000000000.PHONY: test html counts coverage sdist clean install doc integration diagrams default: test VERSION = 24.8.0 test: PYTHONPATH=. trial --reporter=text test tox: tox -i http://localhost:3141/root/pypi diagrams: automat-visualize --image-directory ./diagrams --image-type png txtorcon diagrams: automat-visualize --image-directory ./diagrams --image-type png txtorcon # see also http://docs.docker.io/en/latest/use/baseimages/ dockerbase-wheezy: @echo 'Building a minimal "wheezy" system.' @echo "This may take a while...and will consume about 240MB when done." debootstrap wheezy dockerbase-wheezy dockerbase-wheezy-image: dockerbase-wheezy @echo 'Importing dockerbase-wheezy into docker' tar -C dockerbase-wheezy -c . | docker import - dockerbase-wheezy docker run dockerbase-wheezy cat /etc/issue # see also http://docs.docker.io/en/latest/use/baseimages/ dockerbase-jessie: @echo 'Building a minimal "jessie" system.' @echo "This may take a while...and will consume about 240MB when done." debootstrap jessie dockerbase-jessie dockerbase-jessie-image: dockerbase-jessie @echo 'Importing dockerbase-jessie into docker' tar -C dockerbase-jessie -c . | docker import - dockerbase-jessie docker run dockerbase-jessie cat /etc/issue txtorcon-tester: Dockerfile dockerbase-jessie-image @echo "Creating a Docker.io container" docker build --rm -q -t txtorcon-tester ./ integration: ## txtorcon-tester python integration/run.py install: sudo apt-get install python-setuptools python-twisted python-ipaddress graphviz python setup.py install doc: docs/*.rst cd docs && make html -cp dist/txtorcon-${VERSION}.tar.gz docs/_build/html coverage: PYTHONPATH=. coverage run --source=txtorcon `which trial` test cuv graph htmlcoverage: coverage run --source=txtorcon `which trial` test coverage report --show-missing coverage html # creates htmlcov/ sensible-browser htmlcov/index.html # dang, this is a little annoying. maybe add a shell-script which # looks for "coverage" or "python-coverage"?? coverage-debian: python-coverage run --source=txtorcon `which trial` test python-coverage -a -d annotated_coverage python-coverage report pep8: txtorcon/*.py test/*.py examples/*.py pycodestyle --ignore=E501 $^ pep8count: pycodestyle --ignore=E501,E265 $^ | wc -l pyflakes: pyflakes txtorcon/ examples/ test/ pyflakescount: pyflakes txtorcon/ examples/ | wc -l clean: -rm twisted/plugins/dropin.cache -rm -rf _trial_temp -rm -rf build -rm -rf dist -rm -rf html -rm MANIFEST -rm `find . -name \*.py[co]` -cd docs && make clean -rm -rf dockerbase-jessie -docker rmi txtorcon-tester -docker rmi dockerbase-jessie counts: ohcount -s txtorcon/*.py test-release: dist ./scripts/test-release.sh $(shell pwd) ${VERSION} dist: dist/txtorcon-${VERSION}-py3-none-any.whl dist/txtorcon-${VERSION}.tar.gz dist-sigs: dist/txtorcon-${VERSION}-py3-none-any.whl.asc dist/txtorcon-${VERSION}.tar.gz.asc sdist: setup.py python setup.py check python setup.py sdist dist/txtorcon-${VERSION}-py3-none-any.whl: python setup.py check python setup.py bdist_wheel dist/txtorcon-${VERSION}-py3-none-any.whl.asc: dist/txtorcon-${VERSION}-py3-none-any.whl gpg --verify dist/txtorcon-${VERSION}-py3-none-any.whl.asc || gpg --pinentry loopback --no-version --detach-sign --armor --local-user meejah@meejah.ca dist/txtorcon-${VERSION}-py3-none-any.whl dist/txtorcon-${VERSION}.tar.gz: sdist dist/txtorcon-${VERSION}.tar.gz.asc: dist/txtorcon-${VERSION}.tar.gz gpg --verify dist/txtorcon-${VERSION}.tar.gz.asc || gpg --pinentry loopback --no-version --detach-sign --armor --local-user meejah@meejah.ca dist/txtorcon-${VERSION}.tar.gz release: twine upload --username __token__ --password `cat PRIVATE-release-token` -r pypi -c "txtorcon v${VERSION} tarball" dist/txtorcon-${VERSION}.tar.gz dist/txtorcon-${VERSION}.tar.gz.asc twine upload --username __token__ --password `cat PRIVATE-release-token` -r pypi -c "txtorcon v${VERSION} wheel" dist/txtorcon-${VERSION}-py3-none-any.whl dist/txtorcon-${VERSION}-py3-none-any.whl.asc venv: python -m venv venv ./venv/bin/pip install -r requirements.txt ./venv/bin/pip install -r dev-requirements.txt @echo "created venv" @echo "python examples/monitor.py" html: docs/*.rst cd docs && make html html-server: html twistd -n web --path docs/_build/html --port tcp:9999:interface=localhost meejah-txtorcon-0058423/README.rst000066400000000000000000000103701466117021700165050ustar00rootroot00000000000000 .. _NOTE: see docs/index.rst for the starting-point .. _ALSO: https://txtorcon.readthedocs.org for rendered docs .. image:: https://github.com/meejah/txtorcon/actions/workflows/python3.yaml/badge.svg :target: https://github.com/meejah/txtorcon/actions :alt: github-actions .. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png?branch=main :target: https://coveralls.io/github/meejah/txtorcon?branch=main :alt: coveralls .. image:: https://codecov.io/github/meejah/txtorcon/coverage.svg?branch=main :target: https://codecov.io/github/meejah/txtorcon?branch=main :alt: codecov .. image:: https://readthedocs.org/projects/txtorcon/badge/?version=stable :target: https://txtorcon.readthedocs.io/en/stable :alt: ReadTheDocs .. image:: https://readthedocs.org/projects/txtorcon/badge/?version=latest :target: https://txtorcon.readthedocs.io/en/latest :alt: ReadTheDocs txtorcon ======== - **docs**: https://txtorcon.readthedocs.org or http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/ - **code**: https://github.com/meejah/txtorcon - ``torsocks git clone git://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon.git`` - MIT-licensed; - Python 3.8+, PyPy 7.3.7+; - depends on `Twisted`_, `Automat `_ Ten Thousand Feet ----------------- txtorcon is an implementation of the `control-spec `_ for `Tor `_ using the `Twisted`_ networking library for `Python `_. This is useful for writing utilities to control or make use of Tor in event-based Python programs. If your Twisted program supports endpoints (like ``twistd`` does) your server or client can make use of Tor immediately, with no code changes. Start your own Tor or connect to one and get live stream, circuit, relay updates; read and change config; monitor events; build circuits; create onion services; etcetera (`ReadTheDocs `_). Some Possibly Motivational Example Code --------------------------------------- `download `_ .. code:: python from twisted.internet.task import react from twisted.internet.defer import inlineCallbacks, ensureDeferred from twisted.internet.endpoints import UNIXClientEndpoint import treq import txtorcon async def main(reactor): tor = await txtorcon.connect( reactor, UNIXClientEndpoint(reactor, "/var/run/tor/control") ) print("Connected to Tor version {}".format(tor.version)) url = u'https://www.torproject.org:443' print(u"Downloading {}".format(repr(url))) resp = await treq.get(url, agent=tor.web_agent()) print(u" {} bytes".format(resp.length)) data = await resp.text() print(u"Got {} bytes:\n{}\n[...]{}".format( len(data), data[:120], data[-120:], )) print(u"Creating a circuit") state = await tor.create_state() circ = await state.build_circuit() await circ.when_built() print(u" path: {}".format(" -> ".join([r.ip for r in circ.path]))) print(u"Downloading meejah's public key via above circuit...") config = await tor.get_config() resp = await treq.get( u'https://meejah.ca/meejah.asc', agent=circ.web_agent(reactor, config.socks_endpoint(reactor)), ) data = await resp.text() print(data) @react def _main(reactor): return ensureDeferred(main(reactor)) Try It Now On Debian/Ubuntu --------------------------- For example, serve some files via an onion service (*aka* hidden service): .. code-block:: shell-session $ sudo apt-get install --install-suggests python3-txtorcon $ twistd -n web --port "onion:80" --path ~/public_html Read More --------- All the documentation starts `in docs/index.rst `_. Also hosted at `txtorcon.rtfd.org `_. You'll want to start with `the introductions `_ (`hosted at RTD `_). .. _Twisted: https://twistedmatrix.com/trac meejah-txtorcon-0058423/TODO000066400000000000000000000126241466117021700155120ustar00rootroot00000000000000 . strip OKs off the end of responses in TorControlProtocol -- should simplify the rest, and testing. See FIXME in at least torinfo.py:89 or so . look at get_info versus get_info_raw for entry_guards: parse keywords needs to be more smarterer . looks like ~41 hours to do full scan of 850321 combinations, at 3.5 seconds per combo and 20 outstanding requests (i.e. 20 in parallel at 3.5 seconds each). . should handle the case when routers are added/delete in exit-scanning thing. Maybe/probably add an IRouterListener that has callbacks for new and removed routers? . need test for authentication (and other) bootstrap errors -- does the Deferred from build_tor_connection get the errbacks properly? . If I want to depend on sphinx-contrib's programoutput then I can add this to README to get live results from the tests/coverage things: .. command-output:: make test :ellipsis: 0,-5 :shell: :nostderr: .. command-output:: make coverage :ellipsis: 0,-5 :shell: :nostderr: This also needs a couple changes to doc, in Makefile: test: cd .. && make test coverage: cd .. && make coverage and to conf.py, adding to extensions: 'sphinxcontrib.programoutput' . if we're going with "attribute-style access for everything" then also basically everything should be audited for this: . TorControlProtocol needs some things marked read-only? . TorState.set_attacher . put the nginx config for the hidden service somewhere in git; need to remember to change the redirect for "-latest" if releasing a new version... . Looking briefly at "chutney" (tor test-network setup thing) it seems to me an improvement on the templates would be: use txtor.TorConfig in a mode that allows one to set objects by keys (including hidden services, lists-of-strings, etc) and somewhere else is code which can start Tor based on a TorConfig -- *after* it connects, it does validation on the TorConfig by going through all the now-valid Parser objects asking them to validate the options. Then, instead of templates which "inherit" from each other and have an environment to set up, you have Python types (following Builder pattern) which represent the Tors you want to set up so you have a Relay class that has a subclass Authority whith the bonus it can override anything in Relay. They'd all implement a method in something like ITorConfigBuilder that asks it to return a config give a Node object (for example, FIXME: look up Builder again). For example: class ITorConfigBuilder(Interface): def build_config_for(self, node): """return a TorConfig object for the given Node instance""" class Relay: implements(ITorConfigBuilder) def build_config_for(self, node): config = txtor.TorConfig() config.SocksPort = 0 config.OrPort = node.or_port config.Address = node.ip config.DirPort = node.dir_port return config class Authority(Relay): implements(ITorConfigBuilder) def build_config_for(self, node): config = super(self, Relay).build_config_for(node) config.AuthoritativeDirectory 1 config.V3AuthoritativeDirectory 1 config.ContactInfo = '%d@test.test' % node.number config.ExitPolicy = 'reject *:*' return config . double-double check that i have a utest covering the case of multi-line 650 in the midst of a multi-line response OR re-verify that this can never happen -- the FSM is right now accumulating in only one buffer I believe (after simplifying in commit a62dfe0a1511eae717788732de54269920206015) . should support CIRC_MINOR event, too (in TorState) . $B56F17701DC248F8C42150942BDF7A7FAD6C6FC6~Thaolia is in one of my circuits, but not showing up in ns/all (nor via ns/id/XX). talked about it in #tor a little, but no conclusion. also tried starting up a separate Tor and that one also failed to find the key. (And possibly triggered my main Tor failing to COOKIE authenticate -- probably had the cookie file overwritten?) - it seems that streams aren't getting set up right if there is exactly one right now in tor? via telnet (url changed): getinfo stream-status 250-stream-status=123 SUCCEEDED 496 www.example.com:6667 250 OK fixed, but is this the same for circuits? Probably but hard to have precisely one circuit (still, should utest + fix) . ICircuitListener and IStreamListener are pretty complicated interfaces; might be better to make a simpler interface that is more like "pull" Observer pattern with "stateChanged(newstate, **kwargs)" or something and an interface on TorController to listen for newly created streams and circuits. Could still provide the complicated-interface via a multiplex that implemented IStreamListener and fanned out to the complicated states. This would ease live for clients merely wanting to know, e.g., when there are new circuits (or streams). (Instead, or as a stopgap, I've provided StreamListenerMixin and CircuitListenerMixin with empty default methods). . need to interrogate Tor for its bootstrap state when connection, as per control-spec.txt (e.g. post_boostrap callback shouldn't be issued until both the TorController are up and running AND Tor is fully bootstrapped, if we connected while it was still starting up). What to do if Tor starts bootstrapping (again) while we're running? meejah-txtorcon-0058423/debian/000077500000000000000000000000001466117021700162375ustar00rootroot00000000000000meejah-txtorcon-0058423/debian/changelog000066400000000000000000000002261466117021700201110ustar00rootroot00000000000000txtorcon (0.5) UNRELEASED; urgency=low * Initial release. (Closes: #None) -- Michele Orrù Tue, 17 Jul 2012 18:39:46 +0200 meejah-txtorcon-0058423/debian/compat000066400000000000000000000000021466117021700174350ustar00rootroot000000000000007 meejah-txtorcon-0058423/debian/control000066400000000000000000000017041466117021700176440ustar00rootroot00000000000000Source: txtorcon Maintainer: meejah Section: python Priority: optional Build-Depends: python-support (>=0.6) Standards-Version: 3.8.4 XS-Python-Version: >= 2.6 Package: python-txtorcon Architecture: all Homepage: http://github.com/meejah/txtorcon Description: Twisted-based asynchronous Tor control protocol implementation The main abstraction of this library is txtorcon.TorControlProtocol which presents an asynchronous API to speak the Tor client protocol in Python. txtorcon also provides abstractions to track and get updates about Tor's state (txtorcon.TorState) and current configuration (including writing it to Tor or disk) in txtorcon.TorConfig, along with helpers to asynchronously launch slave instances of Tor including Twisted endpoint support. Depends: ${misc:Depends}, ${python:Depends}, python-twisted (>= 11.1.0), python-geoip, python-ipaddr (>=2.1.10) XB-Python-Version: ${python:Versions} Provides: ${python:Provides} meejah-txtorcon-0058423/debian/copyright000066400000000000000000000023341466117021700201740ustar00rootroot00000000000000This package was debianized by Michele Orrù on Mon, 16 Jul 2012 08:23:33 +0200, It was downloaded from http://github.com/meejah/txtorcon Copyright (c) 2012 meejah Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. meejah-txtorcon-0058423/debian/files000066400000000000000000000000541466117021700172630ustar00rootroot00000000000000python-txtorcon_0.5_all.deb python optional meejah-txtorcon-0058423/debian/rules000077500000000000000000000010011466117021700173070ustar00rootroot00000000000000#!/usr/bin/make -f # This file was automatically generated by stdeb 0.6.0 at # Sun, 17 Jun 2012 11:40:22 +0200 # Unset the environment variables set by dpkg-buildpackage. (This is # necessary because distutils is brittle with compiler/linker flags # set. Specifically, packages using f2py will break without this.) unexport CPPFLAGS unexport CFLAGS unexport CXXFLAGS unexport FFLAGS unexport LDFLAGS #exports specified using stdeb Setup-Env-Vars: export DH_OPTIONS=--buildsystem=python_distutils %: dh $@ meejah-txtorcon-0058423/dev-requirements.txt000066400000000000000000000002551466117021700210570ustar00rootroot00000000000000tox coverage<5.0 cuvner setuptools>=0.8.0 Sphinx repoze.sphinx.autointerface>=0.4 coveralls codecov wheel twine pyflakes pycodestyle ipaddress>=1.0.16 geoip readme_renderer meejah-txtorcon-0058423/doc-requirements.txt000066400000000000000000000003721466117021700210460ustar00rootroot00000000000000GeoIP>=1.2.9 Twisted[tls]>=15.5.0 zope.interface>=3.6.1 automat cryptography tox coverage<5.0 cuvner setuptools>=0.8.0 Sphinx repoze.sphinx.autointerface>=0.4 coveralls codecov wheel twine pyflakes pycodestyle ipaddress>=1.0.16 geoip readme_renderer meejah-txtorcon-0058423/docs-requirements.txt000066400000000000000000000004421466117021700212270ustar00rootroot00000000000000## see also dev-requirements.txt to build ## hmm, travis-ci doesn't like this since we need a GeoIP-dev package ##GeoIP>=1.2.9 Twisted[tls]>=11.1.0 ipaddress>=1.0.16 zope.interface>=3.6.1 setuptools>=0.8.0 Sphinx repoze.sphinx.autointerface>=0.4 coveralls wheel twine pyflakes pep8 automat meejah-txtorcon-0058423/docs/000077500000000000000000000000001466117021700157455ustar00rootroot00000000000000meejah-txtorcon-0058423/docs/Makefile000066400000000000000000000107551466117021700174150ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/txtor.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/txtor.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/txtor" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/txtor" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." meejah-txtorcon-0058423/docs/_static/000077500000000000000000000000001466117021700173735ustar00rootroot00000000000000meejah-txtorcon-0058423/docs/_static/avatar.png000066400000000000000000000467561466117021700214010ustar00rootroot00000000000000PNG  IHDRW,gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs B(xLIDATxy|$y}ߪh\3`)rHDJ")d:l9ıl'Yo*k7DvN|ȗ,ɢ,(K$ER$k8}]UGu7c }>`zs?Zp]W !$"D 0B\S\Zf)JcYւZBCXԃA8F^&UAA]]XL& ~w^&H $|՟e ht:IL22N  1-FzOe I )L%HiBTHe&I9*ղ1Ցd(J $K BA  bK˘+XE]]lb`H$ ⺮DzLj5ByeYדm{AdIdpp4ͪZZ?5L$S(IA X@Cec0 )  kJ%Gt:aVE|)Q"aql۾$YRqG j5bXRVIrԭ%EL& hȋ Tަx *W&/|>M[5J)fi$兿l\72߾J`z>;oBz$N#dp=*Ǖr2/w3Dg?L`y=4Y ZJ9/7fɨXt 4Fl\(90 0${MAŽԼO   d3Alb0!ˡry2mF!q!Ѯ7DBYIHT>tIRx0çgHI|d1cmyޜuOut.4kk<&?[.uTJ@E$7I) ryfLu/?IJ1iRNd$ T_?;8 PJy6( 1 o` a DH! HCb4g%J]r" AEJٶ]i1g7麖 |)!1b3q9D"| yMk'7r/Ź= psE#ڶqw| y;"n8ҡ9Q<>\9͂,۶ H)g]ź2R4* X?&0$檕}C=*lZ3~CDD`@¯(Rp#^uLPnB[0Rs(8GCXQIpz·݀7¹3p*"|M{( A X&d2_JyURrQeret;(")>)Uj'Dȝ7!뢔J%RB9-A vKY;폙>|~kϿa]lk# TlT4(1W40Fre֮"}#|`0is"=`d`KvPv yED ܱ se3nwo.rs8) oKf0щr 2ƾ1d]u xc2=|/Ul`Qq׍a^R,]\RL7FD87@e#G*x #0uQB7oc(3۵-+kN@H i_Ey?ZJçEF”J%cdQFt@`~o!1 sD529ѿ+_wRGkK~+oS %khs3Cp禉3o=E9O|ui IkD8DzpTU# Kf{>Z~ARHgΞh5e\G~HjgP.\SKJaտ3^ڇ}巉_5(߾q넹XPw?*P5JQ?&9<P:I}_yRU%O u'K];ԕq৿Iq.UF?}J8w? ߠoK j.gC.^뾝1Ƒ&RL"a&8RG4֘T8a"΂8Z {ig_ې^&QD8Hm}xw_$kxéZ#,~}ԏhp1%3(ͻ` yrB-ku[/q#Kujq]Z"M8 40N_+<J#Hó889v0+4GE+Xr;n727ֳ~W#Fӯ~seӨeY ØL^XQJb&ϑ!Lm$D[ (T$M暝Q[7DEd2Xx ci1#(_!ME-,k~)cgH?X7֘m-}oEZ{q8z1W }EEZk)Q(( 8N oʉI łZV*F4MF^}*Lӏc })oܵܢ j:6ӐHͰ^ c*N˲*~=$BpGx՜2!]?!U#?;>SDwT*E44ͅGv=e+/;Z<"V$ٻZS:Iϑ{r.l^K?B=V}$}ws0iDk=.JhR8j} @&PuGI؇Ou(r40uKSc4B=ts0)U.ml{'!*s9$- P"šN0r(;0L̶bZQ]S:d:KHGcծ J/~G="JЀ2 *okb*G4PGpAt8,!G&6U0$gٰ^P%$p{p.\L9(9~"ib4ʼnwO=r"3~wTx0ru]rx|NN *ӹ"ur_Y&"hG6Ǒ+1ZMx"FC`i@Mi MalQ"^";Oo/Fm(G+63^{JRrȿ~׿OQ XOۗ-~wŹn[ &}ky#C:>:'OQ0j lR2DChbc z:d} #BYe*Wt\Ѕه?JgŒWV"R^9@mӴ[D"z D[ϐ+x)yo(ex7/&@ɿϏzPoО0vqŚ?ǫ7}00ZZ0Z0[vuQ]̲Z6P<`Lnnr9m]*U w6КjT0hGn^|n2M;khkNk rmX֐{M_w0Q}|IQ=KfJWwzQ.( ! YhiZӊa5kִb47LتfѠqlޟ;R/nw"%3(W$ j~+!p A$0d aAp(2ع%;V~H(e۸=~46`3۴tHA̓#]) %Q p o(7K%lv 8h'Qe\J˘/>^,T, Y\ٌ~6j_GA{.2زaܞܮ~mWT$Qc3~B6Cǀ1dxdMg0-9p(#BiE(cî[}~gt~hMaakZi_Q|>?,RD碋`򶿓TerL- T|2<FZ)}>`!,WCQ%zjI#%"'^I`[Xߎڌ^qU+0?77KQ.GYHj*Y.eP$KNj!=4h5V5MQ^*GJ';(ut %vFWڕ%1[֭ڴ'LS\#C"d(\ы."*W*G:o$<:W@l .:QKjU% 8ZQ#ːpC%-=lQR`X&i%gy|]Ds{ßd 3}2 4IzuEЮ4J:(Ѕ7DmF{_FfX&2kYk+50s+ ]+`VࢱGZx$p>R#/5 H  lRd7|=W>m}`(4T쏹N1^ۅFˡ=OTwYt".Z_RyxQ&mboB "K!0, BQEٵBh]MC&%e\pnBZv^/L[J% ¼2ZkU({CQIH JzfQ{BPH  2%S&&RA  ̚uشm+V^?{4NF7h4?n)M,RJ"ȼ9B !#!߭{Na lFh´0 Jq4VC ڣ=C Ȋ0E"466Һjk֭}ZZZW@)КxgNpkEHWA,uM%]67_!'ݷLx>`b-fعc1@r@N/ZSW+oUmn]>zEJ(E(OkUGJnȢF!AMͬlkUhln&asBON<6q>3O-\ӌ)%Oԟܯ;1@'ȍwݍ1Kz8uw$Uc{bJ̚8(@kA =KM4LcS 446d1qch̭'yv= tgMtdy_dw }BXA b6t "Lf( 8zԢKlieIU=vV0H8+iikcEk+ &!,2Bexء,YZ)ZV硟"[nHMRd29 *@o%ZFWbB>O!'ˑsryB۶)J%S f2euIôE $f}P__O$&`sM $o~'Oc.bڍ|;n$"P(.uuuq@\;6kDkE0>ʺMp ץ8sR!{5Ro'~?7͛Yq {OB$O~+t9~$JQ߼|ꗸ=%/!q{K@/_{oDΏxִG~?ELkS .b )%A xs]ؼ\6H&B;4l=49BDxs_dۦmCghY/*To9/bK*K%F5-cJPP,1Lsg8sKԓ"^'eyaT:5fjNy)h[ODMs8nQC!V@{atxǼ \Q^h|f`8^NĩN.He)g! hlMѹW\Sbh\F&9 gWO sFO2D8" +t!OgvR\o0K=?{;$R*qFRr.N+~֚X A425ѥ"2 G=%7x;?+ژ! Ai AE{e RD隺W?r "Q+\WQr |t&O2%0ʐHgIery],>i<4XRYZk2yN?BۊFfQJ.BD:K0z8~zIf%]V*|rcqM׵au+m-cQ|N#]e[?!=IR՛q{۾R:X ZssCͺ(ƛO|3okSͥHKa[CAC$P6'\態/G"V! 碔e(b0f8&͓.$Q SoH8D( v`uY|vJ~_`E}K!ԊBO]GpOln ͓HeN7wp$TL@q|i#FzaQH9nX5m6X_G(MwRIAX Iҟjۛ~KZ`Zqw_H))9R\({GJ9оM 7[SAl05p'P2s\A)!MD*rQdf̴gC1 zK޿:\sWs9`"aHm^իJUaW6Wi7sJWm5XOB4V?YB@8eYUI 0I !ĺ$p(u98O}@04kEAwi@PYf`p(Ė"4Q,xٟptC V޲@ <ۿQ݉,)R픪O2eV{孪:Wk/6'R~X -7,:EףqwZcY`&%~Nypuvw_D : Ok!&uQ}` GҬh?i:p]U:r†`+xq 5l߼x,B2c8qDJIoŲzUۤ+sol Na=stb/!L>YT Mf}%62 ?bkͣg>>^zTq W9xʝlZkVlx,BkCrQCi!1)Hf  ɔ:ʗkZ]\S Ia i_aC!nݵVIЀ!%?޲~Zk"غaۇ5d3)N?4aȰWT" '="'0ܩ)o]cv Ab|oVB&vMqU5g<ҙ̼DJ-imۤf!YU4\8fx6LK>;=I^*9v ALpt:=*yq*PZS`N2SkM4f;( !FTgN0sWʠ~,FcƤ6'$D:ɉw^vG'!玼C&14+j֢#@$RJUE)Z t5=ps2\<zbhz_yO.#&<0MxiGDž uuĬ\EIJ#c=5IcX֔k$P)禌՛sK@'saxeS -pn;+ !l=?uouX8wdBxNH$m{u_*QҴH!ɤ 9or8%赺))&i=}XD/7ΦSˍDža+w]^\ '`Wf-8ȸAQWW8:R(t(ޠJu]4р5muƲ,Z@ 0T (6P J){Z!1k*B)8ě߻r\%▊sǃy٫+}]o~UaQ˲Dcc#RIsJׇ3:~(@ A:1L & VG]]EsqlZA̲0JsH^!}\)L A6C!p]RR u\G=7;Zk\ǹc\Z-h8N)td<!H<ߒ}c<̡. =ejBPH& )\"Oot]M{T2|!H%Ȥ&zb2|7ͱ1x*:%; g!ܯR)VAg׺!.S$2f <:/R|s])VSJqI6Slq:dEDƴfSxGuc,*}Z*B˦tqJچ7JpɹtZu$0-!"1+ViEPPگ1 렴2-X4WM\ϥ4L!ݝ~B|.K>]R+nΞ<2 B0<_6:\< AeLS_#14)%'cΞ:: 7'<Q { !ȦSv_W*V b+AjϤ~/#Ρ=ie/?rmhSy<,R!Q{|FKgK:14+38Rm7"R v-{iZ۹OhiS>%E1r7F.>*(,\>;cxM!NȏRǵNgxI qQoQ,u;[粃T00 dKװKɦg_e뎛0 cԀѹQq-~uڟ}iȡ&Vgۮ[\J RȦAףX7ILI[r)!9Uk{>LFQܕzT0"BFBP`ɔRocÖ8PFω%$J֫cmO}t+@d^B<#]wO>>!,AB᨟yX~36nNmo;4 !  yʣǃRP(­ヌ;nȁ7yĥӳfI)qJ%N8O^>:Δ fWQ`Λm uwՙsq_oum|%HUX NH&<'>E#b$XbsST"X=w. }'XٶzN)%pI<'Xn3j֚x7m{B4 ,zy|ٲ-7[r,a4ZC}c ݗRr1x{G1-lPQo]gez7N:RX-*ARȥ $ ֚UдbBEXrÃyǜ;uw:Xkhm.Cb M45uZZW%،iZl V.KB\6ù8t9NG#F۴@`z6TbJKkg`({pDX}>Ƌ T*ٜ=yJdܴ,㍬][vҶz=֔2;:1$I p~ݝ8N 9Ĩ z Q`ab#uK k$R*7Tz>*uÃ}zuV^F|HVG@o`Kk*֚h]=-!gҔl{CcZQP4An w;/%])BJ"у{I%/1j~vbu_3tE `hT/%M37>}8Ѵlu ax6P d/OH% Bn>z5&gRsv}M(zIjC JZk ͬYyRBF{ǡϐJ oDwgk+w$PxB 5HR4E!sK얍ZBdeH&.Cd3)vaVJagZkn|]<'&%G0LoËZڨMf\p<%iŨۯr`߫$ɦS,ReaCj|+KO7GȧS *k*du[\W_7!#Bin[Csݺ<Ϥȅ9{mϟ$N`sRJqÝs#?`,i4azy"2* J) qZ<֭̆7qrW,JDsG>EaZ{śśظ~9{c{_sGRkc~XlơH?-Ԉ@%u~灇u1MbҴ8yoRe'J)ZV0gU_c3ʙư}'%O\:w.:;a&wӼ  ھݷ[k]fkI4s|Dkͦn_5Vo1i!'~>E:1cv+~'<?;0MS%eG46}oA Dbu~ӼY\´[}Ur~!>_iżmLJgS V^R |)wp؁ڪfPJohce\z #D"1B(u`77~?폣pG>E ^>eq͗NZ,cf.s%?o]Jmɏ_|h}p=1 )u>{}(M<}  jV 쓬޴7޾Q=e`K{-RH4ƞ{>D8[p1ZViMoXX&e8k[wgvOpclq5XuH!o  Zk~g(]PE?cZJI6n}zǽJZe7 BaNs,HxB=>ײ6\kT9n!AپVﺅš.LYG@.|#gY\:_~k|YRw I) "44}znuhji% -HƐuq4ǜ-d,dhtg_~oPo'yWYPiX XXq+k6ҴH$描F^{vH:5 2hurSľ>\*9N1a"1Wܶ41-0hiV߷ 402V;bTLi)@E.:…:{D}4hXƚ-;XF7mH,^%eQup6B #2!4s%tEXtdate:create2012-03-02T14:03:56-07:00%tEXtdate:modify2012-03-02T14:03:56-07:00׽] IENDB`meejah-txtorcon-0058423/docs/_static/haiku.css000066400000000000000000000147151466117021700212160ustar00rootroot00000000000000/* custom stuff I put in FIXME where is it "supposed" to go? */ div.admonition-todo { border: 1px solid red; background-color: #Fdd; } div.admonition-todo p.admonition-title { margin: 0; color: red; text-transform: lowercase; } p.admonition-title { font-size: 120%; font-weight: bold; } dl.class>dt, dl.interface>dt, dl.function>dt, dl.staticmethod>dt { font-size: 150%; background-color:#ddd; } dl.method>dt { background-color: #eee; border-bottom: 2px solid #ddd; } dl.method:hover { background-color:#ffd; } /** end custom */ html { margin: 0px; padding: 0px; background: #FFF url(bg-page.png) top left repeat-x; } body { line-height: 1.5; margin: auto; padding: 0px; font-family: "DejaVu Sans", Arial, Helvetica, sans-serif; min-width: 59em; max-width: 70em; color: #333333; } div.footer { padding: 8px; font-size: 11px; text-align: center; letter-spacing: 0.5px; } /* link colors and text decoration */ a:link { font-weight: bold; text-decoration: none; color: #dc3c01; } a:visited { font-weight: bold; text-decoration: none; color: #892601; } a:hover, a:active { text-decoration: underline; color: #ff4500; } /* Some headers act as anchors, don't give them a hover effect */ h1 a:hover, a:active { text-decoration: none; color: #0c3762; } h2 a:hover, a:active { text-decoration: none; color: #0c3762; } h3 a:hover, a:active { text-decoration: none; color: #0c3762; } h4 a:hover, a:active { text-decoration: none; color: #0c3762; } a.headerlink { color: #a7ce38; padding-left: 5px; } a.headerlink:hover { color: #a7ce38; } /* basic text elements */ div.content { margin-top: 20px; margin-left: 40px; margin-right: 40px; margin-bottom: 50px; font-size: 0.9em; } /* heading and navigation */ div.header { position: relative; left: 0px; top: 0px; height: 85px; /* background: #eeeeee; */ padding: 0 40px; } div.header h1 { font-size: 1.6em; font-weight: normal; letter-spacing: 1px; color: #0c3762; border: 0; margin: 0; padding-top: 15px; } div.header h1 a { font-weight: normal; color: #0c3762; } div.header h2 { font-size: 1.3em; font-weight: normal; letter-spacing: 1px; text-transform: uppercase; color: #aaa; border: 0; margin-top: -3px; padding: 0; } div.header img.rightlogo { float: right; } div.title { font-size: 1.3em; font-weight: bold; color: #0c3762; border-bottom: dotted thin #e0e0e0; margin-bottom: 25px; } div.topnav { /* background: #e0e0e0; */ } div.topnav p { margin-top: 0; margin-left: 40px; margin-right: 40px; margin-bottom: 0px; text-align: right; font-size: 0.8em; } div.bottomnav { background: #eeeeee; } div.bottomnav p { margin-right: 40px; text-align: right; font-size: 0.8em; } a.uplink { font-weight: normal; } /* contents box */ table.index { margin: 0px 0px 30px 30px; padding: 1px; border-width: 1px; border-style: dotted; border-color: #e0e0e0; } table.index tr.heading { background-color: #e0e0e0; text-align: center; font-weight: bold; font-size: 1.1em; } table.index tr.index { background-color: #eeeeee; } table.index td { padding: 5px 20px; } table.index a:link, table.index a:visited { font-weight: normal; text-decoration: none; color: #dc3c01; } table.index a:hover, table.index a:active { text-decoration: underline; color: #ff4500; } /* Haiku User Guide styles and layout */ /* Rounded corner boxes */ /* Common declarations */ div.admonition { -webkit-border-radius: 10px; -khtml-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; border-style: dotted; border-width: thin; border-color: #dcdcdc; padding: 10px 15px 10px 15px; margin-bottom: 15px; margin-top: 15px; } div.note { padding: 10px 15px 10px 80px; background: #e4ffde url(alert_info_32.png) 15px 15px no-repeat; min-height: 42px; } div.warning { padding: 10px 15px 10px 80px; background: #fffbc6 url(alert_warning_32.png) 15px 15px no-repeat; min-height: 42px; } div.seealso { background: #e4ffde; } /* More layout and styles */ h1 { font-size: 1.3em; font-weight: bold; color: #0c3762; border-bottom: dotted thin #e0e0e0; margin-top: 30px; } h2 { font-size: 1.2em; font-weight: normal; color: #0c3762; border-bottom: dotted thin #e0e0e0; margin-top: 30px; } h3 { font-size: 1.1em; font-weight: normal; color: #0c3762; margin-top: 30px; } h4 { font-size: 1.0em; font-weight: normal; color: #0c3762; margin-top: 30px; } p { text-align: justify; } p.last { margin-bottom: 0; } ol { padding-left: 20px; } ul { padding-left: 5px; margin-top: 3px; } li { line-height: 1.3; } div.content ul > li { -moz-background-clip:border; -moz-background-inline-policy:continuous; -moz-background-origin:padding; background: transparent url(bullet_orange.png) no-repeat scroll left 0.45em; list-style-image: none; list-style-type: none; padding: 0 0 0 1.666em; margin-bottom: 3px; } td { vertical-align: top; } tt { background-color: #e2e2e2; font-size: 1.0em; font-family: monospace; } pre { border-color: #0c3762; border-style: dotted; border-width: thin; margin: 0 0 12px 0; padding: 0.8em; background-color: #f0f0f0; } hr { border-top: 1px solid #ccc; border-bottom: 0; border-right: 0; border-left: 0; margin-bottom: 10px; margin-top: 20px; } /* printer only pretty stuff */ @media print { .noprint { display: none; } /* for acronyms we want their definitions inlined at print time */ acronym[title]:after { font-size: small; content: " (" attr(title) ")"; font-style: italic; } /* and not have mozilla dotted underline */ acronym { border: none; } div.topnav, div.bottomnav, div.header, table.index { display: none; } div.content { margin: 0px; padding: 0px; } html { background: #FFF; } } .viewcode-back { font-family: "DejaVu Sans", Arial, Helvetica, sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; margin: -1px -12px; padding: 0 12px; } meejah-txtorcon-0058423/docs/_static/logo.png000066400000000000000000000417661466117021700210570ustar00rootroot00000000000000PNG  IHDR<qbKGD pHYs 4tIME '"< IDATxwxTLO B7QQ,(EE^^ꇀ^J" H9c3sr2iyɔs޳ʻ޵ګ\RJ2lx)e60Lf_ku'Yr>p//mo%!R9xέxDu6R-f8,/\kuqS8Q $N(( c^FDG1? 0|^B?1+gsaCD! 7R|> <Rb۟ͻ1naCJޝ-W~_ZŻ: 8.ph0y#q_C"1N0HRl\2 ) }WaH !SPϓB]懆AbiI,8+SߤQ\p#lhI?ep$ BHQg|y1(+@B )x Cq!8qZ"v ۀXP ! F%>BkRqq<3>|H0͈e+dX*oK<.4g23ʘ#JKļtFC&HTl?'rZ* L`Р:c)X+d=RDODXnzR>s{\ x@˲9R>:! !,KxeIY2CmE`=`/m*r<y`}6`h0u\+`@kmN2:+Hb`w:xŽ@,*, ].|bhDiD`QԩX8hסm8zeb.0/.t\ۣ㵇 > ̏XJygJS]v dRENgO8,a` | |`wZI +/+hU. \XwLmCFp@,? irt'Hc DI1/?Ѽ4RP27p3 0$݉VCD$?G ?k_Wx(C= 4+ zfa\i [HTU]Ƚ߁Aw;{*Zx a%bf(0էPj7{<͌_ ۩Dס|=T EY )S)*ө/[T | ƃX:<ɦST@iY)>wsBmM2%e'Ta``(FP2Q ¦4/>{VmZ!5Oe,'g;?%4lҌ1cfutkx$!3pQ7)90eXbM@kd@^#@} H#h(53"؆6OޭSPdb/}>e1`P!BJK.rr(,,~l6m~KFGq)!şF,Ι*FN:*T@o{ 2 [!"-X+d-Ru,`rK9շQ{ΩPisŦM[G@qpU&Ȓ-s#]a3Lz:5)6j^Js_@אR˶*< F3`Xg侑i ([ ,XJf+ ٸq 4')%իVԩtkC50٩Hb"{֮w@$*oHvhPMjBT,zZ"GCo5-Vˣ:#Nk<͸\ RCbV.䙧$/[`H$=}"I熽n$O#xA}$Jq  XeTy( K CpBU?x|@XŇ6͛5qsi!M3SE,_ˠal'!1Eӧ  ygܻl|4>w8ם%[犲- x Ax بh6&ˀ^\$@=Drj[xn enjPXuuj\wlEAkTOPM(  kh>η9Zu R4[$ Wǔ)Ҩq- !|-na^|QZZFÆչ2ݏٿϦYf/z%[QzUdxp F C6=)%,/Oj ,'%PcfjU_ 8`/rr>xirCx*2fהr k`yHJJ`t!"8X^z=歛J^qoF݉/8Փ.Nӧ Kj0K]u n`;'^P]Iڰ^{f,-0]z `9&=n._ࢋƮ MZlʕP[(ˇ; +M*JS< j}< A^HF-d IZiVJXX63e\zy_bf?HAAaun~[O`ԧ_[4Y]́wB‘ճ˿ A W.^VL~2g i8~c Ui*xP'| (m'^焓.dٲݧ!h i k U5td: $ŵQ.E(JJg EZZx{a蘨&R" @pE8^#gv|5>RnTė#˽,Ml= wFE):SFs՚n?,C_OWM\ʂ| >:֯ G{Pd":1ZC)&qԤk~~UZj:QF3tԀ+$D%D}Z#X C'9PEYaTsϫ!J`Պ|% v#~f]d#C!뮿Ϲ;~zq۵ 5;q/0\t'pU9.+B(eUF^gTFYݡM舿b]ً!+[aPEBeb/< >Z22Y0 C?&`t1?L4MUyGf8Ϋ]4;t.J acG%;`&"9+Fiv&Iejb Q@QW Gkb_S \}o2TT ݊;_1tM wy-,I ʕ| :*rr)2Ooѓ"PҺ\*'^iǠfhmp}kt'D"$"h\`\߮Guň+D Xv$GݓOG<ː5pOp͵^'~]p&Uq().aȰy)..QK+ xX;nRC֊Y(zeqWeECGP0X4d9M:bƪvp?P=c1I\5s{FNz, .wTY+C|e&^F劵upf̘ gi3g-6hс)-܊7H&ohҡ#HB$:0^˝ىb$¢ѥ!:-t\ +75Rj{A[SII LYԕr~.c\F}&0K2¼({۷TN8VF&e4IUGiQfIb?p$* Ym:QBklbI[507rͨbX(k[gkU:N׻5'kH-.b{/PX%"Ixv09M[ѬN;_CE+#XueًDNw J=JF,G A8r Y#m\ߊزNAbnYrtty h߮%o^O 7>=w]˻d+…е -C9ڐ'9b XR4!\dC*qzKBQp zl`oJDdN"Yc.|CVbI[~z{=ćnP쀲6vvX1Vc͐"J_%鯩[o>B]fjqqg+!-qq0ayUl3X-5K 0˷/eiс{KaՄr>r^NW` (}U (I_gJu1l- 5GڊFX*⦆"j Яo7ϜVwK'di̚9}vӌƝtm#Peg"5-Ī Զjhފݮ`3ž|ui_jc}F%H>׍X${^rqf ۫Z.ξiz1-KV˲nbQQ@"IHn@p$"r&??5V{njM .['%$Q[<Э$%%TAz9|>>y;ᦇ' êx(jܲ8,,M|()*-sH$.@ IDATmu&x;; *JXlaq@[",kT∭bYXk=0\ gRu=bۡq +ҋλcҭ +W#/z6(5x[g},;sT!?Ǝt>Y=pܬfH^^bSt^d%Bt'[ne[(Ьݥ]_HC# Z*sNeРf0f%dgNn[oSNݻ T@{YԬEi_z_G<Uu6ZMִI/y+A4YC`9JR2G|U,(5Vkb@r jDC*Nvݷ| ]CH3DFgc^檫ng!R {AŵLh~(-h;˷/$9F0vpr45wArdirQ)Sl*s` *KIFNPrgwϛ%{up8.ڱ)>/_CAf oԄYYq_8"FT~'[Mf'S,b·YC'(7gnز9P-_[bMG\UeɾR4Hԥ䚈|j׮%fPl,Yɼy+P5fj4uҰs$tNJ߽a&-.l6d+OsðKDP rEM OY_FJ\ ^,,_ŽZzy&JZɑUuy 7uB ](u"]%}:]ŐF?rvcՎL렾5p2@;쎌lRI{0 1tE.9~eЫ!FDw4i^nTӐ.^^O^mBvƵJ 2\!8I_{{-c}o_/M+f˗^K3~u9(vv:٠p{y78y T^THN*$ZP'/(\C7iet~u؞s/UoTK(P@F\'];\kԆNnG0G&/BTҗi~(C2Z3Th!?/:7USqZBVU^S5^L(eEO]>w3;](!j箜VOjgX BD{O_9БбXB~J.VPL4ӻ+'~H)S[`-ۥA?˹KN: j,cFZ}Q\.ްZn;U$НXЀɺ+݄'y YhӚvVD@49$''*9P[?kM}mߨ~DB *ncuWfb}l>P1U3}5!:詶[C_Dh |}4Rݬ*^G ]Kב|_̲bU\IIq _t.GHft*^oҟ8XB󁮐ϠA85j =uUDvVf tԉ~~ q,Y2[YR-:AݼN{g l) *SOX=Wg_F,u4e7oxKT,wL@Fxu@] "2zؑGyGή$J^,kjUɓ'3vXnݚ[owy'wqǩJff27nPާK/DCtKVz3N@ +|kjofV#y%6Ai|r-:.;? SHWzeŃ%6B,$%E}deewsT9Q;饔oDj~ͮ]McqCh>@\Ӎȭ!kItG@=4M0bhg:,=<Dv074bY*g_OL]^1ULYXVeffi43Z*i߾%ե\IϽ17;>, vra'5qD ԛ0{luힿsD;d&5ufg<.RJ R$CѮJqSŨ#LQ^Uv1~6lJ8XokEO(+!%U뗿kl2eַOW>5ҢBlބ'~mv(Z45Lܢ~~sKsq .d…-VI AUjXNiJ̎hM!_T˷/Z<RB}d.h9[!Z$X`L`㭬jJ]g MOnC;c8C #{,]]*\ |7YIyu/!>[P]ԭJ\ηفf"nr$O'=I/ς3-̉ibļJ:xI5uk,. Rq_Le/X1 \6x5xH}k/[+:u*jL}zO b$qL,lZPMEG5qBuKߚ-d.4Sq̫~c4B2< $SIeKS*!h[;j/㺰NGR ñK`*#εmƝ}ejw3EzCcd:X||[mPg3}<ډEbbz4oֈbэ{﹞:uR26M5C(`Bb]ˑU'&ɗ  K&-!,R 7"F7$KΚu끛Y|j/vi9ϷbM8;tjJ\aT)(͖2/#Itvkԩs+~gpBez0` 2sGp7гޞqx-?3-1_4g BSɾ4uI%ɛ% W6m[ ."O4OŖ PEK'D%\ոbB)=\ӑ4 ]} 2U%JIݬLƏ)%'Я?a.<^7m۴vdɛqľTzPnAVu;45BkmH$_o7 ݾM5# 5{$A4bP~lTNr̆ C'c3H#b/ N'1^5e 6nڊ0 ;C`xHxSBP9y 7ko-%+;Ӯ] .9np3},RZp5R[CDJ : uI !ImXCR$0Q뢯_$IXۭU2,KtbSۭK'TٵרtΥ3 }+{vi f\pIOW?~V]zb;g&OFqѠA=ڷkM[OЛbYQ5$$ܠ/4$a\& -A/ ۏp#H[6݊/Dw (TT2+G X"=!ǑWT`bZNx d% =˖;z`ݚ|5ѝ x}^ҹ-EEŬZ^ Au׉qM6d6"JItj Rb.n?I2T(N-+.Rz-+{fzڱBx|~ڷ"==%KVRn9aSErPɻ@,-muĉ.Ã'ɟJZ TI]^ *"zc͛6[n`ߑm|WLq&]r>2\FvXfYĠаIH"TkTl?X͂hѼ1y[v+p݊˭Pezun'A鍄 ;@?tx] a НDqQQ^8XX|3fe/"YBdAFųTY{Mb 60Ruf^r/LFT{=5ɢ{N[`ƌ̘9뮻!,`.|> 6mq [@Z>1ypެ mHinDRIO & e's)%ɏ+be앆j}$]SWBdҌ5YԂ*c>V%0S_%aͬ=v)df3f7leltiWnchܥMLLwҬY#~f̍kt!ci<@AlɍVTLi Cvg)þd&-|b֓H~@ 4gW6汴,,Q[-ƍ[ČY1rY.BvڱǬ\sCu57,]KVrE+:xBРQ#ƌ@N6>ZR?+%KWRW"@7֭X灷ԯM4Xm߃O ^%K dM){MYٌ[naB,-xX iWp}My Pj^Wm%{'=$[_]ȰqDGhP?^zr֠cyؾ}'p)6v%$@&dfӳG'.\R';?!T;ctږKW!$IuΤz__/B.o9_,|iCQ"ln/WTPmoG,1ҌWRE'*P\:z蘫6־\4oֈ&~@#W=4oq,={vbQP#̙ѩS~q1w8roW^}%ϳݑO0$܏?1`i_N$?7q;LgӘ>c#F'yhղ +VLu ն^7Nhu&0lh%BIlQ|iHD,8Y/#*@Ex>RKbuKBJW&z2vd(̹C17y7xIIIf̘yL13κ0xڷ?c9r7L&))<;wgOlݖKaaq< l~~01UWXSSnaښ( "ۣ$˛܆dsqSQ$ETԣ;fAcŋVЀھۧ+r)~\q|fIzy9.[6oKIIIS>fOA+W匳梑g3li :*Z4o̦[)--߼wVKܠާtb Ee{Xc 7NeՎ%uNF#9˴*a txN@ib & i]u#/'zY1vKADF^r KϑGvg7ӻ9|5{; iƔ)3yrM$ QT=C~6uikYw*[QPNq T#-Y*{<4qں9wFZjXX}Sl@M_LtVJpjѝ1UXvpa. \noLm}D.F5?ҧ뤳]bv`UB-ni8V^p}UgLѦgc\.z9ݤ'p< ԖM"醠n 삡uHD-h9~g,U}"> 2Y XK&"#\Ec6x ȰWQӆKrd}U ,;#̓TjVE¶}ӡ=5B}?FԴ|*2m^)CxwSv͗@MzYnQJml젒;vW/wKX,n(csKx:}`աfiBJd2-Ot5䥜y(P\"|l؂x*吱R>DTR9]v9kXaʬ0*W,B՞X+舣; ʭPu>7NƲR,"b&7<]Y}muZ(Pa`U\.W0ܼyI/^zZ& IENDB`meejah-txtorcon-0058423/docs/_static/logo.svg000066400000000000000000000670211466117021700210620ustar00rootroot00000000000000 image/svg+xml meejah-txtorcon-0058423/docs/_themes/000077500000000000000000000000001466117021700173715ustar00rootroot00000000000000meejah-txtorcon-0058423/docs/_themes/README000066400000000000000000000002161466117021700202500ustar00rootroot00000000000000This is the "alabaster" theme that I've hacked upon a little. All the HTML mistakes are mine :) See https://github.com/bitprophet/alabaster meejah-txtorcon-0058423/docs/_themes/alabaster/000077500000000000000000000000001466117021700213275ustar00rootroot00000000000000meejah-txtorcon-0058423/docs/_themes/alabaster/__init__.py000066400000000000000000000007261466117021700234450ustar00rootroot00000000000000import os from alabaster import _version as version def get_path(): """ Shortcut for users whose theme is next to their conf.py. """ # Theme directory is defined as our parent directory return os.path.abspath(os.path.dirname(os.path.dirname(__file__))) def update_context(app, pagename, templatename, context, doctree): context['alabaster_version'] = version.__version__ def setup(app): app.connect('html-page-context', update_context) meejah-txtorcon-0058423/docs/_themes/alabaster/_version.py000066400000000000000000000001201466117021700235160ustar00rootroot00000000000000__version_info__ = (0, 6, 0) __version__ = '.'.join(map(str, __version_info__)) meejah-txtorcon-0058423/docs/_themes/alabaster/about.html000066400000000000000000000034641466117021700233360ustar00rootroot00000000000000{% if theme_logo %}

{{ project }}

{% endif %}

{% else %}

{{ project }}

{% endif %} {% if theme_description %}

{{ theme_description }}

{% endif %} {% if theme_github_button|lower == 'true' %}

{% endif %}

{% if theme_travis_button|lower != 'false' %} {% if theme_travis_button|lower == 'true' %} {% set path = theme_github_user + '/' + theme_github_repo %} {% else %} {% set path = theme_travis_button %} {% endif %} https://secure.travis-ci.org/{{ path }}.png?branch=master {% endif %} {% if theme_coveralls_button|lower != 'false' %} {% if theme_coveralls_button|lower == 'true' %} {% set path = theme_github_user + '/' + theme_github_repo %} {% else %} {% set path = theme_coveralls_button %} {% endif %} code coverage {% endif %} {% if theme_flattr_uri != '' %} {% set path = theme_flattr_uri %}

{% endif %} meejah-txtorcon-0058423/docs/_themes/alabaster/donate.html000066400000000000000000000004721466117021700234720ustar00rootroot00000000000000{% if theme_gittip_user %}

Donate

Consider supporting the authors on Gittip:

{% endif %} meejah-txtorcon-0058423/docs/_themes/alabaster/layout.html000066400000000000000000000051541466117021700235370ustar00rootroot00000000000000{%- extends "basic/layout.html" %} {%- block extrahead %} {{ super() }} {% if theme_touch_icon %} {% endif %} {% endblock %} {%- block relbar2 %}{% endblock %} {%- block header %} {% if theme_logo %} {% else %}

{{ project }}

{% endif %} {% endblock %} {%- block footer %} {% if theme_github_banner|lower == 'true' %} Fork me on GitHub {% endif %} {% if theme_analytics_id %} {% endif %} {%- endblock %} meejah-txtorcon-0058423/docs/_themes/alabaster/navigation.html000066400000000000000000000004271466117021700243570ustar00rootroot00000000000000

Navigation

{{ toctree(includehidden=theme_sidebar_includehidden) }} {% if theme_extra_nav_links %}
    {% for text, uri in theme_extra_nav_links.items() %}
  • {{ text }}
  • {% endfor %}
{% endif %} meejah-txtorcon-0058423/docs/_themes/alabaster/static/000077500000000000000000000000001466117021700226165ustar00rootroot00000000000000meejah-txtorcon-0058423/docs/_themes/alabaster/static/alabaster.css_t000066400000000000000000000254751466117021700256260ustar00rootroot00000000000000{% set page_width = '80%' %} {% set sidebar_width = '25%' %} {% set theme_sidebar_header = theme_sidebar_header or theme_gray_1 %} {% set theme_sidebar_link = theme_sidebar_link or theme_gray_1 %} {% set theme_anchor_hover_fg = theme_anchor_hover_fg or theme_gray_1 %} {% set theme_note_bg = theme_note_bg or theme_gray_2 %} {% set theme_footnote_border = theme_footnote_border or theme_gray_2 %} {% set theme_pre_bg = theme_pre_bg or theme_gray_2 %} {% set theme_narrow_sidebar_link = theme_narrow_sidebar_link or theme_gray_3 %} {% set theme_sidebar_hr = theme_sidebar_hr or theme_gray_3 %} @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro'; font-size: 1.2em; background-color: white; color: #000; margin: 0; padding: 0; } div.document { width: {{ page_width }}; margin: 30px auto 0 auto; } .first-time { font-size: 110%; font-family: 'source sans pro', sans; background-color: #eeeeee; padding: .5em; margin-top: -.25em; margin-bottom: .5em; border: 0.33em solid #ddeedd; border-radius: 0.25em; box-shadow: 0px 1px 4px 1px #ccc; } .caution { font-size: 110%; font-family: 'source sans pro', sans; background-color: #eedddd; padding: .5em; margin-top: -.25em; margin-bottom: -.25em; border: 0.33em solid #ffeeee; border-radius: 0.25em; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 {{ sidebar_width }}; } div.sphinxsidebar { width: {{ sidebar_width }}; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: {{ theme_body_text }}; padding: 0 30px 0 30px; } div.footer { width: {{ page_width }}; margin: 20px auto 30px auto; font-size: 14px; color: {{ theme_footer_text }}; text-align: right; } div.footer a { color: {{ theme_footer_text }}; } div.related { display: none; } div.sphinxsidebar a { color: {{ theme_sidebar_link }}; text-decoration: none; border-bottom: 1px dotted {{ theme_sidebar_link_underscore }}; } div.sphinxsidebar a:hover { border-bottom: 1px solid {{ theme_sidebar_link_underscore }}; } div.sphinxsidebar span.pre { font-size: 75%; } div.sphinxsidebar { font-size: 14px; font-size: 1.5em; font-size: 1.3vw; line-height: 1.5; } div.sphinxsidebarwrapper { padding: 18px 10px; } body>p.logo { padding: 0; margin: -10px 0 0 0px; text-align: center; width: 70%; margin-left: 15%; display: none; } div.sphinxsidebarwrapper p.logo { padding: 0; margin: -10px 0 0 0px; text-align: center; width: 100%; } img.logo { width: 100%; } p.badges a { border-bottom: none; text-decoration: none; } h1.logo a { border-bottom: none; text-decoration: none; } div.sphinxsidebarwrapper h1.logo { margin-top: -10px; text-align: center; margin-bottom: 5px; text-align: {{ theme_logo_text_align }}; font-size: 2em; } div.sphinxsidebarwrapper h1.logo-name { margin-top: 0px; } div.sphinxsidebarwrapper p.blurb { margin-top: 0; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: 'Garamond', 'Georgia', serif; color: {{ theme_sidebar_header }}; font-size: 24px; font-weight: normal; margin: 0 0 5px 0; padding: 0; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: {{ theme_sidebar_link }}; } div.sphinxsidebar p.logo a, div.sphinxsidebar h3 a, div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a:hover { border: none; } div.sphinxsidebar p { color: {{ theme_sidebar_text }}; margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; color: {{ theme_sidebar_list }}; } div.sphinxsidebar ul li.toctree-l1 > a { font-size: 120%; } div.sphinxsidebar ul li.toctree-l2 > a { font-size: 110%; } div.sphinxsidebar input { border: 1px solid {{ theme_sidebar_search_button }}; font-family: 'Georgia', serif; font-size: 1em; } div.sphinxsidebar hr { border: none; height: 1px; color: {{ theme_sidebar_link_underscore }}; background: {{ theme_sidebar_link_underscore }}; text-align: left; margin-left: 0; width: 50%; } /* -- body styles ----------------------------------------------------------- */ a { color: {{ theme_link }}; text-decoration: underline; } a:hover { color: {{ theme_link_hover }}; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Source Sans Pro', sans-serif; margin: 30px 0px 10px 0px; padding: 0; } div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: {{ theme_anchor }}; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: {{ theme_anchor_hover_fg }}; background: {{ theme_anchor_hover_bg }}; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { margin: 20px 0px; padding: 10px 30px; } div.admonition tt.xref, div.admonition a tt { border-bottom: 1px solid #fafafa; } dd div.admonition { margin-left: -60px; padding-left: 60px; } div.admonition p.admonition-title { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight { background-color: white; } dt:target, .highlight { background: #FAF3E8; } .highlight pre { border-radius: 0.3em; border: 3px solid {{ theme_note_border }}; background: #002B36; /*solarized dark*/ } div.note { background-color: {{ theme_note_bg }}; border: 3px solid {{ theme_note_border }}; border-radius: 0.3em; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt { font-family: 'Source Code Pro', 'Consolas', monospace; } img.screenshot { } tt.descname, tt.descclassname { font-size: 0.95em; } tt.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid {{ theme_footnote_border }}; background: {{ theme_footnote_bg }}; font-size: 0.9em; } table.footnote + table.footnote { margin-top: -15px; border-top: none; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td.label { width: 0px; padding: 0.3em 0 0.3em 0.5em; } table.footnote td { padding: 0.3em 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } blockquote { margin: 0 0 0 30px; padding: 0; } ul, ol { margin: 10px 0 10px 30px; padding: 0; } pre { background: {{ theme_pre_bg }}; padding: 7px 30px; margin: 15px 0px; line-height: 1.3em; } dl pre, blockquote pre, li pre { margin-left: -60px; padding-left: 60px; } dl dl pre { margin-left: -90px; padding-left: 90px; } tt { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, a tt { background-color: #FBFBFB; border-bottom: 1px solid white; } a.reference { text-decoration: none; border-bottom: 1px dotted {{ theme_link }}; } a.reference:hover { border-bottom: 1px solid {{ theme_link_hover }}; } a.footnote-reference { text-decoration: none; font-size: 0.7em; vertical-align: top; border-bottom: 1px dotted {{ theme_link }}; } a.footnote-reference:hover { border-bottom: 1px solid {{ theme_link_hover }}; } a:hover tt { background: #EEE; } @media screen and (max-width: 870px) { div.sphinxsidebar { display: none; } body p.logo { display: block; } div.document { width: 100%; } div.documentwrapper { margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0; } div.bodywrapper { margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; } ul { margin-left: 0; } .document { width: auto; } .footer { width: auto; } .bodywrapper { margin: 0; } .footer { width: auto; } .github { display: none; } } @media screen and (max-width: 875px) { body { margin: 0; padding: 20px 30px; } div.documentwrapper { float: none; background: white; } div.sphinxsidebar { display: block; float: none; width: 102.5%; margin: 50px -30px -20px -30px; padding: 10px 20px; background: {{ theme_narrow_sidebar_bg }}; color: {{ theme_narrow_sidebar_fg }}; font-size: 1.5em; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, div.sphinxsidebar h3 a { color: white; } div.sphinxsidebar a { color: {{ theme_narrow_sidebar_link }}; } div.sphinxsidebar p.logo { display: none; } body p.logo { display: block; } div.document { width: 100%; margin: 0; } div.related { display: block; margin: 0; padding: 10px 0 20px 0; } div.related ul, div.related ul li { margin: 0; padding: 0; } div.footer { display: none; } div.bodywrapper { margin: 0; } div.body { min-height: 0; padding: 0; } .rtd_doc_footer { display: none; } .document { width: auto; } .footer { width: auto; } .footer { width: auto; } .github { display: none; } } /* misc. */ .revsys-inline { display: none!important; } /* Make nested-list/multi-paragraph items look better in Releases changelog * pages. Without this, docutils' magical list fuckery causes inconsistent * formatting between different release sub-lists. */ div#changelog > div.section > ul > li > p:only-child { margin-bottom: 0; } meejah-txtorcon-0058423/docs/_themes/alabaster/static/pygments.css000066400000000000000000000062171466117021700252040ustar00rootroot00000000000000.highlight{background-color:#073642;color:#93a1a1}.highlight .c{color:#586e75 !important;font-style:italic !important}.highlight .cm{color:#586e75 !important;font-style:italic !important}.highlight .cp{color:#586e75 !important;font-style:italic !important}.highlight .c1{color:#586e75 !important;font-style:italic !important}.highlight .cs{color:#586e75 !important;font-weight:bold !important;font-style:italic !important}.highlight .err{color:#dc322f !important;background:none !important}.highlight .k{color:#cb4b16 !important}.highlight .o{color:#93a1a1 !important;font-weight:bold !important}.highlight .p{color:#93a1a1 !important}.highlight .ow{color:#2aa198 !important;font-weight:bold !important}.highlight .gd{color:#93a1a1 !important;background-color:#372c34 !important;display:inline-block}.highlight .gd .x{color:#93a1a1 !important;background-color:#4d2d33 !important;display:inline-block}.highlight .ge{color:#93a1a1 !important;font-style:italic !important}.highlight .gr{color:#aa0000}.highlight .gh{color:#586e75 !important}.highlight .gi{color:#93a1a1 !important;background-color:#1a412b !important;display:inline-block}.highlight .gi .x{color:#93a1a1 !important;background-color:#355720 !important;display:inline-block}.highlight .go{color:#888888}.highlight .gp{color:#555555}.highlight .gs{color:#93a1a1 !important;font-weight:bold !important}.highlight .gu{color:#6c71c4 !important}.highlight .gt{color:#aa0000}.highlight .kc{color:#859900 !important;font-weight:bold !important}.highlight .kd{color:#268bd2 !important}.highlight .kp{color:#cb4b16 !important;font-weight:bold !important}.highlight .kr{color:#d33682 !important;font-weight:bold !important}.highlight .kt{color:#2aa198 !important}.highlight .n{color:#268bd2 !important}.highlight .na{color:#268bd2 !important}.highlight .nb{color:#859900 !important}.highlight .nc{color:#d33682 !important}.highlight .no{color:#b58900 !important}.highlight .ni{color:#800080}.highlight .nl{color:#859900 !important}.highlight .ne{color:#268bd2 !important;font-weight:bold !important}.highlight .nf{color:#268bd2 !important;font-weight:bold !important}.highlight .nn{color:#b58900 !important}.highlight .nt{color:#268bd2 !important;font-weight:bold !important}.highlight .nx{color:#b58900 !important}.highlight .bp{color:#999999}.highlight .vc{color:#008080}.highlight .vg{color:#268bd2 !important}.highlight .vi{color:#268bd2 !important}.highlight .nv{color:#268bd2 !important}.highlight .w{color:#bbbbbb}.highlight .mf{color:#2aa198 !important}.highlight .m{color:#2aa198 !important}.highlight .mh{color:#2aa198 !important}.highlight .mi{color:#2aa198 !important}.highlight .mo{color:#009999}.highlight .s{color:#2aa198 !important}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#2aa198 !important}.highlight .s2{color:#2aa198 !important}.highlight .se{color:#dc322f !important}.highlight .sh{color:#d14}.highlight .si{color:#268bd2 !important}.highlight .sx{color:#d14}.highlight .sr{color:#2aa198 !important}.highlight .s1{color:#2aa198 !important}.highlight .ss{color:#990073}.highlight .il{color:#009999}.highlight div .gd,.highlight div .gd .x,.highlight div .gi,.highlight div .gi .x{display:inline-block;width:100%}meejah-txtorcon-0058423/docs/_themes/alabaster/support.py000066400000000000000000000114641466117021700234230ustar00rootroot00000000000000from pygments.style import Style from pygments.token import Keyword, Name, Comment, String, Error, \ Number, Operator, Generic, Whitespace, Punctuation, Other, Literal # Originally based on FlaskyStyle which was based on 'tango'. class Alabaster(Style): background_color = "#f8f8f8" # doesn't seem to override CSS 'pre' styling? default_style = "" styles = { # No corresponding class for the following: #Text: "", # class: '' Whitespace: "underline #f8f8f8", # class: 'w' Error: "#a40000 border:#ef2929", # class: 'err' Other: "#000000", # class 'x' Comment: "italic #8f5902", # class: 'c' Comment.Preproc: "noitalic", # class: 'cp' Keyword: "bold #004461", # class: 'k' Keyword.Constant: "bold #004461", # class: 'kc' Keyword.Declaration: "bold #004461", # class: 'kd' Keyword.Namespace: "bold #004461", # class: 'kn' Keyword.Pseudo: "bold #004461", # class: 'kp' Keyword.Reserved: "bold #004461", # class: 'kr' Keyword.Type: "bold #004461", # class: 'kt' Operator: "#582800", # class: 'o' Operator.Word: "bold #004461", # class: 'ow' - like keywords Punctuation: "bold #000000", # class: 'p' # because special names such as Name.Class, Name.Function, etc. # are not recognized as such later in the parsing, we choose them # to look the same as ordinary variables. Name: "#000000", # class: 'n' Name.Attribute: "#c4a000", # class: 'na' - to be revised Name.Builtin: "#004461", # class: 'nb' Name.Builtin.Pseudo: "#3465a4", # class: 'bp' Name.Class: "#000000", # class: 'nc' - to be revised Name.Constant: "#000000", # class: 'no' - to be revised Name.Decorator: "#888", # class: 'nd' - to be revised Name.Entity: "#ce5c00", # class: 'ni' Name.Exception: "bold #cc0000", # class: 'ne' Name.Function: "#000000", # class: 'nf' Name.Property: "#000000", # class: 'py' Name.Label: "#f57900", # class: 'nl' Name.Namespace: "#000000", # class: 'nn' - to be revised Name.Other: "#000000", # class: 'nx' Name.Tag: "bold #004461", # class: 'nt' - like a keyword Name.Variable: "#000000", # class: 'nv' - to be revised Name.Variable.Class: "#000000", # class: 'vc' - to be revised Name.Variable.Global: "#000000", # class: 'vg' - to be revised Name.Variable.Instance: "#000000", # class: 'vi' - to be revised Number: "#990000", # class: 'm' Literal: "#000000", # class: 'l' Literal.Date: "#000000", # class: 'ld' String: "#4e9a06", # class: 's' String.Backtick: "#4e9a06", # class: 'sb' String.Char: "#4e9a06", # class: 'sc' String.Doc: "italic #8f5902", # class: 'sd' - like a comment String.Double: "#4e9a06", # class: 's2' String.Escape: "#4e9a06", # class: 'se' String.Heredoc: "#4e9a06", # class: 'sh' String.Interpol: "#4e9a06", # class: 'si' String.Other: "#4e9a06", # class: 'sx' String.Regex: "#4e9a06", # class: 'sr' String.Single: "#4e9a06", # class: 's1' String.Symbol: "#4e9a06", # class: 'ss' Generic: "#000000", # class: 'g' Generic.Deleted: "#a40000", # class: 'gd' Generic.Emph: "italic #000000", # class: 'ge' Generic.Error: "#ef2929", # class: 'gr' Generic.Heading: "bold #000080", # class: 'gh' Generic.Inserted: "#00A000", # class: 'gi' Generic.Output: "#888", # class: 'go' Generic.Prompt: "#745334", # class: 'gp' Generic.Strong: "bold #000000", # class: 'gs' Generic.Subheading: "bold #800080", # class: 'gu' Generic.Traceback: "bold #a40000", # class: 'gt' } meejah-txtorcon-0058423/docs/_themes/alabaster/theme.conf000066400000000000000000000016371466117021700233070ustar00rootroot00000000000000[theme] inherit = basic stylesheet = alabaster.css pygments_style = alabaster.support.Alabaster [options] logo = logo_name = false logo_text_align = left description = github_user = github_repo = github_button = true github_banner = false github_type = watch github_count = true travis_button = false coveralls_button = false flattr_uri = gittip_user = analytics_id = touch_icon = extra_nav_links = sidebar_includehidden = true show_powered_by = true gray_1 = #444 gray_2 = #EEE gray_3 = #AAA body_text = #3E4349 footer_text = #888 link = #004B6B link_hover = #6D4100 sidebar_header = sidebar_text = #555 sidebar_link = sidebar_link_underscore = #999 sidebar_search_button = #CCC sidebar_list = #000 sidebar_hr = anchor = #DDD anchor_hover_fg = anchor_hover_bg = #EAEAEA note_bg = note_border = #CCC footnote_bg = #FDFDFD footnote_border = pre_bg = narrow_sidebar_bg = #333 narrow_sidebar_fg = #FFF narrow_sidebar_link = meejah-txtorcon-0058423/docs/apilinks_sphinxext.py000066400000000000000000000031361466117021700222460ustar00rootroot00000000000000''' Sphinx/docutils extension to create links to pyDoctor documentation using a RestructuredText interpreted text role that looks like this: :api:`python_object_to_link_to