txtorcon-20.0.0/0000755000175000017500000000000013641001342014147 5ustar meejahmeejah00000000000000txtorcon-20.0.0/INSTALL0000644000175000017500000000221613304042766015214 0ustar meejahmeejah00000000000000 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 python setup.py build mkdir tmp virtualenv --never-download --extra-search-dir=/usr/lib/python2.7/dist-packages/ tmp/txtorcon_env cd tmp/txtorcon_env source bin/activate pip install Twisted ipaddress pygeoip # this will download from internets: export PYTHONPATH=../../build/lib.linux-x86_64-2.7/ (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" txtorcon-20.0.0/LICENSE0000644000175000017500000000204013304042766015163 0ustar meejahmeejah00000000000000Copyright (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. txtorcon-20.0.0/MANIFEST.in0000644000175000017500000000114013304042766015714 0ustar meejahmeejah00000000000000include 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 txtorcon-20.0.0/Makefile0000644000175000017500000001054013640527145015624 0ustar meejahmeejah00000000000000.PHONY: test html counts coverage sdist clean install doc integration diagrams default: test VERSION = 20.0.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}-py2.py3-none-any.whl dist/txtorcon-${VERSION}.tar.gz dist-sigs: dist/txtorcon-${VERSION}-py2.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}-py2.py3-none-any.whl: python setup.py check python setup.py bdist_wheel --universal dist/txtorcon-${VERSION}-py2.py3-none-any.whl.asc: dist/txtorcon-${VERSION}-py2.py3-none-any.whl gpg --verify dist/txtorcon-${VERSION}-py2.py3-none-any.whl.asc || gpg --pinentry loopback --no-version --detach-sign --armor --local-user meejah@meejah.ca dist/txtorcon-${VERSION}-py2.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 -r pypi -c "txtorcon v${VERSION} tarball" dist/txtorcon-${VERSION}.tar.gz dist/txtorcon-${VERSION}.tar.gz.asc twine upload -r pypi -c "txtorcon v${VERSION} wheel" dist/txtorcon-${VERSION}-py2.py3-none-any.whl dist/txtorcon-${VERSION}-py2.py3-none-any.whl.asc venv: virtualenv --never-download --extra-search-dir=/usr/lib/python2.7/dist-packages/ venv @echo "created venv" @echo "see INSTALL for more information; to use:" @echo ". ./venv/bin/activate" @echo "pip install -r requirements.txt" @echo "pip install -r dev-requirements.txt" @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 txtorcon-20.0.0/PKG-INFO0000644000175000017500000001534413641001342015253 0ustar meejahmeejah00000000000000Metadata-Version: 2.1 Name: txtorcon Version: 20.0.0 Summary: Twisted-based Tor controller client, with state-tracking and configuration abstractions. https://txtorcon.readthedocs.org https://github.com/meejah/txtorcon Home-page: https://github.com/meejah/txtorcon Author: meejah Author-email: meejah@meejah.ca License: MIT Description: .. _NOTE: see docs/index.rst for the starting-point .. _ALSO: https://txtorcon.readthedocs.org for rendered docs .. image:: https://travis-ci.org/meejah/txtorcon.png?branch=master :target: https://www.travis-ci.org/meejah/txtorcon :alt: travis .. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png :target: https://coveralls.io/r/meejah/txtorcon :alt: coveralls .. image:: http://codecov.io/github/meejah/txtorcon/coverage.svg?branch=master :target: http://codecov.io/github/meejah/txtorcon?branch=master :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 .. image:: https://landscape.io/github/meejah/txtorcon/master/landscape.svg?style=flat :target: https://landscape.io/github/meejah/txtorcon/master :alt: Code Health txtorcon ======== - **docs**: https://txtorcon.readthedocs.org or http://timaq4ygg2iegci7.onion - **code**: https://github.com/meejah/txtorcon - ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git`` - MIT-licensed; - Python 2.7, PyPy 5.0.0+, Python 3.5+; - depends on `Twisted`_, `Automat `_, (and the `ipaddress `_ backport for non Python 3) 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 `_ (also `python2 style `_) .. 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 Keywords: python,twisted,tor,tor controller Platform: UNKNOWN Classifier: Framework :: Twisted Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Natural Language :: English Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: Unix Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Internet :: Proxy Servers Classifier: Topic :: Internet Classifier: Topic :: Security Provides-Extra: dev txtorcon-20.0.0/README.rst0000644000175000017500000001066413640525672015665 0ustar meejahmeejah00000000000000 .. _NOTE: see docs/index.rst for the starting-point .. _ALSO: https://txtorcon.readthedocs.org for rendered docs .. image:: https://travis-ci.org/meejah/txtorcon.png?branch=master :target: https://www.travis-ci.org/meejah/txtorcon :alt: travis .. image:: https://coveralls.io/repos/meejah/txtorcon/badge.png :target: https://coveralls.io/r/meejah/txtorcon :alt: coveralls .. image:: http://codecov.io/github/meejah/txtorcon/coverage.svg?branch=master :target: http://codecov.io/github/meejah/txtorcon?branch=master :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 .. image:: https://landscape.io/github/meejah/txtorcon/master/landscape.svg?style=flat :target: https://landscape.io/github/meejah/txtorcon/master :alt: Code Health txtorcon ======== - **docs**: https://txtorcon.readthedocs.org or http://timaq4ygg2iegci7.onion - **code**: https://github.com/meejah/txtorcon - ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git`` - MIT-licensed; - Python 2.7, PyPy 5.0.0+, Python 3.5+; - depends on `Twisted`_, `Automat `_, (and the `ipaddress `_ backport for non Python 3) 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 `_ (also `python2 style `_) .. 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 txtorcon-20.0.0/TODO0000644000175000017500000001262413304042766014657 0ustar meejahmeejah00000000000000 . 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? txtorcon-20.0.0/dev-requirements.txt0000644000175000017500000000026213640530132020212 0ustar meejahmeejah00000000000000tox coverage<5.0 cuvner setuptools>=0.8.0 Sphinx repoze.sphinx.autointerface>=0.4 coveralls codecov wheel twine pyflakes pycodestyle mock ipaddress>=1.0.16 geoip readme_renderer txtorcon-20.0.0/docs/0000755000175000017500000000000013641001342015077 5ustar meejahmeejah00000000000000txtorcon-20.0.0/docs/Makefile0000644000175000017500000001075513304042766016562 0ustar meejahmeejah00000000000000# 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." txtorcon-20.0.0/docs/_static/0000755000175000017500000000000013641001342016525 5ustar meejahmeejah00000000000000txtorcon-20.0.0/docs/_static/avatar.png0000644000175000017500000004675613304042766020546 0ustar meejahmeejah00000000000000PNG  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`txtorcon-20.0.0/docs/_static/haiku.css0000644000175000017500000001471513304042766020363 0ustar meejahmeejah00000000000000/* 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; } txtorcon-20.0.0/docs/_static/logo.png0000644000175000017500000004176613304042766020224 0ustar meejahmeejah00000000000000PNG  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`txtorcon-20.0.0/docs/_static/logo.svg0000644000175000017500000006702113304042766020227 0ustar meejahmeejah00000000000000 image/svg+xml txtorcon-20.0.0/docs/_themes/0000755000175000017500000000000013641001342016523 5ustar meejahmeejah00000000000000txtorcon-20.0.0/docs/_themes/README0000644000175000017500000000021613304042766017415 0ustar meejahmeejah00000000000000This is the "alabaster" theme that I've hacked upon a little. All the HTML mistakes are mine :) See https://github.com/bitprophet/alabaster txtorcon-20.0.0/docs/_themes/alabaster/0000755000175000017500000000000013641001342020461 5ustar meejahmeejah00000000000000txtorcon-20.0.0/docs/_themes/alabaster/__init__.py0000644000175000017500000000072613304042766022612 0ustar meejahmeejah00000000000000import 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) txtorcon-20.0.0/docs/_themes/alabaster/_version.py0000644000175000017500000000012013304042766022663 0ustar meejahmeejah00000000000000__version_info__ = (0, 6, 0) __version__ = '.'.join(map(str, __version_info__)) txtorcon-20.0.0/docs/_themes/alabaster/about.html0000644000175000017500000000346413304042766022503 0ustar meejahmeejah00000000000000{% 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 %} txtorcon-20.0.0/docs/_themes/alabaster/donate.html0000644000175000017500000000047213304042766022637 0ustar meejahmeejah00000000000000{% if theme_gittip_user %}

Donate

Consider supporting the authors on Gittip:

{% endif %} txtorcon-20.0.0/docs/_themes/alabaster/layout.html0000644000175000017500000000515413304042766022704 0ustar meejahmeejah00000000000000{%- 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 %} txtorcon-20.0.0/docs/_themes/alabaster/navigation.html0000644000175000017500000000042713304042766023524 0ustar meejahmeejah00000000000000

Navigation

{{ toctree(includehidden=theme_sidebar_includehidden) }} {% if theme_extra_nav_links %}
    {% for text, uri in theme_extra_nav_links.items() %}
  • {{ text }}
  • {% endfor %}
{% endif %} txtorcon-20.0.0/docs/_themes/alabaster/static/0000755000175000017500000000000013641001342021750 5ustar meejahmeejah00000000000000txtorcon-20.0.0/docs/_themes/alabaster/static/alabaster.css_t0000644000175000017500000002547513304042766024773 0ustar meejahmeejah00000000000000{% 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; } txtorcon-20.0.0/docs/_themes/alabaster/static/pygments.css0000644000175000017500000000621713304042766024351 0ustar meejahmeejah00000000000000.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%}txtorcon-20.0.0/docs/_themes/alabaster/support.py0000644000175000017500000001146413304042766022570 0ustar meejahmeejah00000000000000from 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' } txtorcon-20.0.0/docs/_themes/alabaster/theme.conf0000644000175000017500000000163713304042766022454 0ustar meejahmeejah00000000000000[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 = txtorcon-20.0.0/docs/apilinks_sphinxext.py0000644000175000017500000000313613304042766021413 0ustar meejahmeejah00000000000000''' 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