pax_global_header00006660000000000000000000000064126046062040014512gustar00rootroot0000000000000052 comment=edaaf38d0f0c8b0e761813a7bdf0e5b3ace201df flask-bcrypt-0.7.1/000077500000000000000000000000001260460620400141205ustar00rootroot00000000000000flask-bcrypt-0.7.1/.gitignore000066400000000000000000000001341260460620400161060ustar00rootroot00000000000000.* *.pyc *.egg-info *.orig _build/* bin/* build/* dist/* include/* lib/* src/* !.gitignore flask-bcrypt-0.7.1/.travis.yml000066400000000000000000000001751260460620400162340ustar00rootroot00000000000000language: python python: - 2.6 - 2.7 - 3.3 install: pip install flask && pip install nose script: python setup.py test flask-bcrypt-0.7.1/LICENSE000066400000000000000000000026601260460620400151310ustar00rootroot00000000000000Copyright (c) 2011 by Max Countryman. Some rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.flask-bcrypt-0.7.1/MANIFEST.in000066400000000000000000000000401260460620400156500ustar00rootroot00000000000000include README.markdown LICENSE flask-bcrypt-0.7.1/README.markdown000066400000000000000000000025111260460620400166200ustar00rootroot00000000000000# Flask-Bcrypt Flask-Bcrypt is a Flask extension that provides bcrypt hashing utilities for your application. Due to the recent increased prevelance of powerful hardware, such as modern GPUs, hashes have become increasingly easy to crack. A proactive solution to this is to use a hash that was designed to be "de-optimized". Bcrypt is such a hashing facility; unlike hashing algorithms such as MD5 and SHA1, which are optimized for speed, bcrypt is intentionally structured to be slow. For sensitive data that must be protected, such as passwords, bcrypt is an advisable choice. ## Installation Install the extension with one of the following commands: $ easy_install flask-bcrypt of alternatively if you have pip installed: $ pip install flask-bcrypt ## Usage To use the extension simply import the class wrapper and pass the Flask app object back to here. Do so like this: from flask import Flask from flask.ext.bcrypt import Bcrypt app = Flask(__name__) bcrypt = Bcrypt(app) Two primary hashing methods are now exposed by way of the bcrypt object. Use them like so: pw_hash = bcrypt.generate_password_hash('hunter2') bcrypt.check_password_hash(pw_hash, 'hunter2') # returns True ## Documentation The Sphinx-compiled documentation is available here: http://packages.python.org/Flask-Bcrypt/ flask-bcrypt-0.7.1/docs/000077500000000000000000000000001260460620400150505ustar00rootroot00000000000000flask-bcrypt-0.7.1/docs/Makefile000066400000000000000000000110061260460620400165060ustar00rootroot00000000000000# 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/Flask-Bcrypt.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Flask-Bcrypt.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/Flask-Bcrypt" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Flask-Bcrypt" @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." flask-bcrypt-0.7.1/docs/_themes/000077500000000000000000000000001260460620400164745ustar00rootroot00000000000000flask-bcrypt-0.7.1/docs/_themes/LICENSE000066400000000000000000000033751260460620400175110ustar00rootroot00000000000000Copyright (c) 2010 by Armin Ronacher. Some rights reserved. Redistribution and use in source and binary forms of the theme, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. We kindly ask you to only use these themes in an unmodified manner just for Flask and Flask-related products, not for unrelated projects. If you like the visual style and want to use it for your own projects, please consider making some larger changes to the themes (such as changing font faces, sizes, colors or margins). THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. flask-bcrypt-0.7.1/docs/_themes/README000066400000000000000000000021051260460620400173520ustar00rootroot00000000000000Flask Sphinx Styles =================== This repository contains sphinx styles for Flask and Flask related projects. To use this style in your Sphinx documentation, follow this guide: 1. put this folder as _themes into your docs folder. Alternatively you can also use git submodules to check out the contents there. 2. add this to your conf.py: sys.path.append(os.path.abspath('_themes')) html_theme_path = ['_themes'] html_theme = 'flask' The following themes exist: - 'flask' - the standard flask documentation theme for large projects - 'flask_small' - small one-page theme. Intended to be used by very small addon libraries for flask. The following options exist for the flask_small theme: [options] index_logo = '' filename of a picture in _static to be used as replacement for the h1 in the index.rst file. index_logo_height = 120px height of the index logo github_fork = '' repository name on github for the "fork me" badge flask-bcrypt-0.7.1/docs/_themes/flask/000077500000000000000000000000001260460620400175745ustar00rootroot00000000000000flask-bcrypt-0.7.1/docs/_themes/flask/layout.html000066400000000000000000000011061260460620400217750ustar00rootroot00000000000000{%- extends "basic/layout.html" %} {%- block extrahead %} {{ super() }} {% if theme_touch_icon %} {% endif %} {% endblock %} {%- block relbar2 %}{% endblock %} {%- block footer %} {%- endblock %} flask-bcrypt-0.7.1/docs/_themes/flask/relations.html000066400000000000000000000011161260460620400224610ustar00rootroot00000000000000

Related Topics

flask-bcrypt-0.7.1/docs/_themes/flask/static/000077500000000000000000000000001260460620400210635ustar00rootroot00000000000000flask-bcrypt-0.7.1/docs/_themes/flask/static/flasky.css_t000066400000000000000000000141311260460620400234110ustar00rootroot00000000000000/* * flasky.css_t * ~~~~~~~~~~~~ * * :copyright: Copyright 2010 by Armin Ronacher. * :license: Flask Design License, see LICENSE for details. */ {% set page_width = '940px' %} {% set sidebar_width = '220px' %} @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: 'Georgia', serif; font-size: 17px; background-color: white; color: #000; margin: 0; padding: 0; } div.document { width: {{ page_width }}; margin: 30px auto 0 auto; } 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: #3E4349; padding: 0 30px 0 30px; } img.floatingflask { padding: 0 0 10px 10px; float: right; } div.footer { width: {{ page_width }}; margin: 20px auto 30px auto; font-size: 14px; color: #888; text-align: right; } div.footer a { color: #888; } div.related { display: none; } div.sphinxsidebar a { color: #444; text-decoration: none; border-bottom: 1px dotted #999; } div.sphinxsidebar a:hover { border-bottom: 1px solid #999; } div.sphinxsidebar { font-size: 14px; line-height: 1.5; } div.sphinxsidebarwrapper { padding: 18px 10px; } div.sphinxsidebarwrapper p.logo { padding: 0 0 20px 0; margin: 0; text-align: center; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: 'Garamond', 'Georgia', serif; color: #444; font-size: 24px; font-weight: normal; margin: 0 0 5px 0; padding: 0; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: #444; } 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: #555; margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; color: #000; } div.sphinxsidebar input { border: 1px solid #ccc; font-family: 'Georgia', serif; font-size: 1em; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; 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: #ddd; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #eaeaea; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { background: #fafafa; margin: 20px -30px; padding: 10px 30px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } 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; } div.note { background-color: #eee; border: 1px solid #ccc; } 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: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.9em; } 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 #eee; background: #fdfdfd; 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: #eee; padding: 7px 30px; margin: 15px -30px; 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 #004B6B; } a.reference:hover { border-bottom: 1px solid #6D4100; } a.footnote-reference { text-decoration: none; font-size: 0.7em; vertical-align: top; border-bottom: 1px dotted #004B6B; } a.footnote-reference:hover { border-bottom: 1px solid #6D4100; } a:hover tt { background: #EEE; } flask-bcrypt-0.7.1/docs/_themes/flask/static/small_flask.css000066400000000000000000000017201260460620400240650ustar00rootroot00000000000000/* * small_flask.css_t * ~~~~~~~~~~~~~~~~~ * * :copyright: Copyright 2010 by Armin Ronacher. * :license: Flask Design License, see LICENSE for details. */ 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: #333; color: white; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, div.sphinxsidebar h3 a { color: white; } div.sphinxsidebar a { color: #aaa; } div.sphinxsidebar p.logo { display: none; } 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; } flask-bcrypt-0.7.1/docs/_themes/flask/theme.conf000066400000000000000000000001721260460620400215450ustar00rootroot00000000000000[theme] inherit = basic stylesheet = flasky.css pygments_style = flask_theme_support.FlaskyStyle [options] touch_icon = flask-bcrypt-0.7.1/docs/_themes/flask_small/000077500000000000000000000000001260460620400207645ustar00rootroot00000000000000flask-bcrypt-0.7.1/docs/_themes/flask_small/layout.html000066400000000000000000000012531260460620400231700ustar00rootroot00000000000000{% extends "basic/layout.html" %} {% block header %} {{ super() }} {% if pagename == 'index' %}
{% endif %} {% endblock %} {% block footer %} {% if pagename == 'index' %}
{% endif %} {% endblock %} {# do not display relbars #} {% block relbar1 %}{% endblock %} {% block relbar2 %} {% if theme_github_fork %} Fork me on GitHub {% endif %} {% endblock %} {% block sidebar1 %}{% endblock %} {% block sidebar2 %}{% endblock %} flask-bcrypt-0.7.1/docs/_themes/flask_small/static/000077500000000000000000000000001260460620400222535ustar00rootroot00000000000000flask-bcrypt-0.7.1/docs/_themes/flask_small/static/flasky.css_t000066400000000000000000000110011260460620400245720ustar00rootroot00000000000000/* * flasky.css_t * ~~~~~~~~~~~~ * * Sphinx stylesheet -- flasky theme based on nature theme. * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: 'Georgia', serif; font-size: 17px; color: #000; background: white; margin: 0; padding: 0; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 40px auto 0 auto; width: 700px; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 30px 30px; } img.floatingflask { padding: 0 0 10px 10px; float: right; } div.footer { text-align: right; color: #888; padding: 10px; font-size: 14px; width: 650px; margin: 0 auto 40px auto; } div.footer a { color: #888; text-decoration: underline; } div.related { line-height: 32px; color: #888; } div.related ul { padding: 0 0 0 10px; } div.related a { color: #444; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body { padding-bottom: 40px; /* saved for footer */ } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } {% if theme_index_logo %} div.indexwrapper h1 { text-indent: -999999px; background: url({{ theme_index_logo }}) no-repeat center center; height: {{ theme_index_logo_height }}; } {% endif %} 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: white; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #eaeaea; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { background: #fafafa; margin: 20px -30px; padding: 10px 30px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } 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; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt { font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.85em; } 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 #eee; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td { padding: 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } pre { padding: 0; margin: 15px -30px; padding: 8px; line-height: 1.3em; padding: 7px 30px; background: #eee; border-radius: 2px; -moz-border-radius: 2px; -webkit-border-radius: 2px; } dl pre { margin-left: -60px; padding-left: 60px; } tt { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, a tt { background-color: #FBFBFB; } a:hover tt { background: #EEE; } flask-bcrypt-0.7.1/docs/_themes/flask_small/theme.conf000066400000000000000000000002701260460620400227340ustar00rootroot00000000000000[theme] inherit = basic stylesheet = flasky.css nosidebar = true pygments_style = flask_theme_support.FlaskyStyle [options] index_logo = '' index_logo_height = 120px github_fork = '' flask-bcrypt-0.7.1/docs/_themes/flask_theme_support.py000066400000000000000000000114131260460620400231240ustar00rootroot00000000000000# flasky extensions. flasky pygments style based on tango style from pygments.style import Style from pygments.token import Keyword, Name, Comment, String, Error, \ Number, Operator, Generic, Whitespace, Punctuation, Other, Literal class FlaskyStyle(Style): background_color = "#f8f8f8" 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' } flask-bcrypt-0.7.1/docs/conf.py000066400000000000000000000161341260460620400163540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Flask-Bcrypt documentation build configuration file, created by # sphinx-quickstart on Wed Dec 14 21:28:26 2011. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.append(os.path.join(os.path.dirname(__file__), '_themes')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Flask-Bcrypt' copyright = u'2011, Max Countryman' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '0.5' # The full version, including alpha/beta/rc tags. release = '0.5' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- html_theme_options = {'github_fork': 'maxcountryman/flask-bcrypt', 'index_logo': False} # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'flask_small' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. html_theme_path = ['_themes'] # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'Flask-Bcryptdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Flask-Bcrypt.tex', u'Flask-Bcrypt Documentation', u'Max Countryman', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'flask-bcrypt', u'Flask-Bcrypt Documentation', [u'Max Countryman'], 1) ] flask-bcrypt-0.7.1/docs/docs.zip000066400000000000000000003340311260460620400165300ustar00rootroot00000000000000PK?M? .conf.py.un~UT ]N]Nux 1kA'K AB 8p6 ) cl&KfgΛYE:%l4FK%\'{IXƯ}ov߾i\QIP^0X\Ń?Go>'|%'5ֶcd}dw$hW_PUև[re 'v'&Ix2 bn3&DP?d~ۓsvBk]6M?vЍӒQ4לj@W7Q&EYEJ"Fg\fR%1GM&'>FeTPӝ<&%h ")g&( E_qc XxkmxxcgErCdݹT9޾l}&% UW8 <&wBXv4^W eL^/6E4g:U2{P=ŏ[+[phUU!lnN}v=QT*#[=Wb7PK?2\C.index.rst.un~UT ]N]Nux  ̝)S%{!˭Wh/#wXDS OSH)I-K,,KͩTLS/UH,KU(,P+.IIM*b& fbf`F ~/cX/@01 Hj `tx@B$X QSO)IRHI,N(+NM,.-J3mG!r\,yA(5F8 !Q(E!(tSqƄf(`yw4hqV-q& IJ 8#5m| PK 8?_build/UT \N]Nux PK ?_build/doctrees/UT ]N]Nux PK?F% N"_build/doctrees/environment.pickleUT ]N]Nux XyG^Xvvwv #CPӋ B @xmMwT=MiPwzx#މ5DhԨQ}zf~իW{b NzqY {w/fE!,Vinׯz>0ݏ <9kdۮ/ #S!4YQצ(mr#IM \69 (D` P"1a; VR^% βHD:N+ˤ{UT3ˤs.zN9!=GNb2;;cl s{`c?:čHyA Z|ܗy($J%-|erIE)R@%+xE:t< 0iB_=tS,5ZcXڐ _hLHaUs?t(2oi |*08c,l7jLJC?LSPC0&*WrȇHW ،-<׀ |Cwě?Lk "l¶#,\8A H&0 EGZ|L⨡" JZU]-P1+4붃J]xDi\,9|aDihAw, dvFص9v.\Ug.(mX؇Ù32ޙ.(]؁x=oKDtiwZW阔 _:bg,L38Q@ې5?2td̰0xu˸S>z1<*-XqP5e.䊸Prnkä9ˑ bGs}8aPj@ZM>g/N0 JYeݷ%guf7$Tx$y'#q$qNANERzcT|è{5..ݲit,qIV$9< dpB-ӿl8ep&[5f^ŤX)q@ %( 4H/t< h'2(^Ë$<k6MU+pScp 7S³ $J*x0I\<54бL( =]4 /dlw;fi%&Vޮmy|/ Y? j ^s|@~E s  ^v\RxWi(n [ 'P7yȋ21PWyJEH }OzPo+|U]eGNjg jolx\U͛ʍn 똳"Ǵӈg-om;||>;.TC;͵ v.#=Fu ê6MAaZt|TJU>܂y- "~>*VԲ|Np]R|CDߠmGC_l> qY'[fRt`j:Sn?4) >R3^~lh){&C"y| v_l46_i:D`)k_C"#z%|S74So"٩Sroǰrߛ|ߐr?|Ȑr?Iʒ4Δ{ϟ"%gHBҲs6WI'>86NkZox ,}sfJQYS,~_iB2J;YA{ߦ\l 5o>|/+v1?7n nPo 3X'&H6nz'Y_x=wt+?koY!~61_yX:P!О&Q_}v]SM*澵Pd'QG+MITI쓵\bqttR}¸Vt"DNrZmOw1~}-~q*KI 5|1鏫TH6CadՄOCr^%ʼn?ek7աCKirIg>>E8NrZ Q)JċЈ"n/FJPK?3]k$v_build/doctrees/index.doctreeUT ]N]Nux \ ENvBB$t aw#d!`B M,Dz3Sݛ.BPxx' /EQ9}UuOL.>vgիWj(˻o晧s|o㩀OLmYbhy|R'{;'LP(6g91Z3A0alzް+Y|ʆxY,:wr(OKY,NhrPWlrk0U3{3ʦXy^{J>@0="r1&S@8mrW«|^`oX£Śk)JzEűsA dtQAu;꼮8G] 벝<^p=k  _`*|/lJ15_)8mtbhHSfn@vKaiSW]Ø^#L_ŘTƻ6|MYv1$}|Y5py:x?2G}-)Rr45:Z`Lr >&mg>kI(,oV tWlxwc[J֬ds^ٲ;?Pđs N# %eVC'!lgXӻoӒ1|;=~ךHdEPGĿ9(̲u__Ljn{7:(`Q[m+5>\!O ?%T[o@NMЏY߄A`QXH?in0aM .XNN0cyPͶ Bw zfP)ӡ{NeNdxPYVgY-P$ɨʜW&EʗX-;(WR2 *{N5&(5|ܚFaAh'dj!D#ql xNT=OM՗??!|tC5n MIͲШ]*KeW􌶈0e&<ōrhnw:n!qշ`׸PTt`q3$F F'ŀ zNQ7&;04ep- =;? VnIJZ4@woؕjXFW}gQ]ykh)c6c*[Z}|h㯃w3p 7pR!w])F|{X; /QȎBM>._JlF7<<+Iznc');BNN٭whU.X3?@eY#8+;VW3؂2eC&)JZ^/lDO,*,۬ q8@(?#N <'W֮<3Zw~nMuв_u羀݁UA=UWII5@kOB2H-֚ [k2N}^hfX3|G3V:$tߜ4Z4$|6ZWnLɻ%v_zS !g@Ǎ(z<^_LJv75h;ά.3j9D1E zbB˄ l-#)o6nߠJVLozDdlL& >l>m M0iO6־MhiL yց!XuwQ b 3%{YR)HnK h^lBgaG ?gs%$b_i~b^̌c!m_0>@=anƋWVA@\H`&abh{&x!1VD`j|K,Vn0BС>EM!nԔ_]ICIBX3r.4q}$I?*F5ƋeǡzXA!OV3n(,Y jjhZCCsPoƮU$˰RΣY/`: l "S0 O~KNmiN>۸F2}2}7(OȆ844.+3n}шGq&JB'br CR|Vl?&zʦAG1D~^fњ &53<-Z̉9CueLǧc/-VyNtPWFai4 Y!ҀUtqdX=_KDyĻ.ѝ"Mzl022t mRF22W-./Mc$ YE #ܳ’xm;hxqD~c*l!@Eh-be=ӆQI)a #W_&[y,XdA=n6 I\ p³E׹))emĊ^Hð8U:,F БsK=0p!==+" G1% XP$ ߇ `m>@U*LM\x**K*wsD̍ĦF 'b,2rtG;t$3Nr9 v@yYya,ˍd6xg]RA/AqRy`&ćeHH8Ps701l{gk͢2i&iD |V#ī$AV`E!U]JJ.SJz(Ca{"UFl FҪבcaqiX) E^ Ko oT줐XMزw&IJ.}> vˊfGx i|j'F;2,y SCb=ɠbB|BxIӖ(T;ȨO)<~2r¬tY3j-J~(QQ?3vÛHqZ}sC/8?<]n"K|Q%ؼq^"=$nBh\- [ImJ7\Nj !nVxٛ636=kϰ<0]fV iVFBء[lE%lkt%T߱tYFO/ڤ( /Nz 7E(Js;Xа DX46nh6|l 댯x3&T|Czo)zkMN+q|Iߪ^=RXlwaFS"ᇊWk@K_lV'w0HQ,2keǪ־'yrE5OyZMTj4,=d.~l^j$[*R꽟J_v0Kt~dݫo<7E/dl.f3b`[NQ䀬$Iڥx qJѧx6hC0ĥ'k?Ӄ Ѧ.7?NПP7y OCOO')JkzJnȤt5lڬ6_t tLD>ſѣۭ&W<MƗY;!B}-)>q]&p^YxSLLI$j3f8'ȝSAkT]ۜ7&!In!!u?P#]RE8A؄H«Sc'=RcfHcg=S[)CN,WlH Mxp8h&}Heuk8J(i@IJbo-H1"C ̧!9q. ]BX@ ̯ !ump?86C]CTxWp1K+<ZzŃ& -X{-z ;=Ⱥ":r%5Q:طUZ}{:&s;[Ezx/iBTu9YR!*ynT|E^^$,V`xG! ;D]-/-Q8§ pWаXT;$^K zI''h܂G' ^зʰqƜ^O;iĔ'8fkwQl]wKvV* g&33̜HlL)C*"p;'V9AIĆX֋SS#YfLЃŒV L3հ)Fl7p &Y=@2N=,l"Ya#z32ggwz&e b9T9Eŀgƈ ޫ = w~=U/Ujj\75)qžAN++쏟cɉPZCt2frH=uw0\lCRR GP#9r͇97 /gM0K6VIa8Z#=t8H!m.N(Gz/;G8wb> >:1_DzA9yS%Bg!{*9M1DN%ϐm(1uxgh`Ns$g2꧗F\_ي^_@.,Էl㹈*^U\Ux.՘-i*ʆ˴4de $Jm}h4yϻZshŤylJag+̼\+d{@uE?۳Cz=rVՙd_%&M!|n&uh ϭcmbv2N%7kE]TnbC`нBGʳ.4dP+e]bo&(ާ'~RG 5BNhcVmyexgp5^Qn9%Μ)tuRmJseι^:Ʈ$o*iVBlFnsbowXU$])JQ-V*>@>T@XU XZ!m>bOLYM>DoIE<>iu.VJL3Daj|\oxO:̷Zyz&ILa $I"tIǴL@ؾ/$%&HpVcڍ~Ri>ݘN1p-DYٵIEӞą!Q= L6+r܇X8ڮ3Ij w|rؖ9|8YgH>K1y(8J%UAqX9*='7OJO(T:+ !/. HOF^ 4Is.>2x p 5~̾p2Cމ88-$Ou'VpV<d#odvnT={&8;4dB'cqZ5M}EphvXDOzm٬Ɋ [omF$t\wu3m 8#0k%fҬ3M<4^^n˦jle,|ֹ*&4\^%ՑnɦN- .eeHm\J*p[p5=]Op R"#׫qCzIN:NDoVEӺ}+6"BAhYa!!Gyw5mr; D+]@;]w^}*~<l@Yd"+[sSIJD\آH2H< QJf,OoS+K 4#n*DLaaû:n۹'( Mk=BL}Ƽ!One HD-+ (PkakK(Q1 WDL( ycyKQwS/"g$l7 +jMecӢF:Hy`⟋/E(Jndf$YF>.L+ 7suղ` w񈞕oIf wV8Lo|lJ""Qv=~KQ؊ֲDTe%nޥ'[-z"1~j;mOm~AػG ~%"~ݜBkN_`jIj!Z(? a!?iook\ Q7fK *MT"Ij F=|ae-^ƹ:qHu9nu2,DQHdpԗ UjCԦj >guۍף|KoǑԅn!{p` 7fNVZҬDLEL֚*EU{1**)W|6A +xr6Fs\G'rH]- F = e&H7Hn ntEA!u~PK ? _build/html/UT ]N]Nux PK?Dܭ_build/html/.buildinfoUT ]N]Nux %n Dr"c v3]8>f ?&[$x^$'G]TP#aɉemǬ xEJ'Cz }n功7( -/8p6t_rkw 0xЋf2/f"V~ǩn-w}P5΃Rfqcf?S?PK ?_build/html/_sources/UT ]N]Nux PK?r_build/html/_sources/index.txtUT ]N]Nux eTn0 +n@[ qxȡCѭ Zfb-hHr\GɎvFH>G>A~nگ? Z1^BVNaUB:! [5ME:1HN;k R=A`!pJJ@L ZMx wvՀ6{]HUߟ&~5 JR5#ȟ1)u0C*ԢV~{w;HKjVHJ$h]0KU.9Bos%͑ uY? ~6ؑZše𑴕D؈\\CAK Nއ&S C]*c蚍,yX[':."/3Yˮͽ nl.5sS v-W&3ȁE ϕ>&fFyLذ b7'u<͈;gGR3ߓbcRL ]"<wB,Jy\}M2gq9$E+3~b/%k~JbiMQXl(nSd%7y+Bݸ\B͕˃L\oR'N<H7v?dG0Pqq\bArl3]>˜7ZՒe=v=)u>pj^R[PK ?_build/html/_static/UT ]N]Nux PKe>KN _build/html/_static/basic.cssUT 5N]Nux Ymoܸ_"((ڦ@q4DJTH*IDS;j9!+UX2 ?`? gNUCFEV Жn_,ٱ{1|ECl:NS^#E)ӿן<8i_ǟ>B"B5f\yﮮ޽5i1g1r$kYs%+?i* SR^aqL5%^v8N4{JW57~!aMQ': 'kqP;U(*aa-m0g7; ʑo"]L0NeZ9HW|bHZ 8-=5^ uA 4GodW8ćЮ'KR@FIk(C\fU9;v!|X UBg :B_mggh+д="}J>/+v\<@Goz{WUwm4DZ&.֙M։˹P `בvTb=e9e)CC]:Jf5aNC5Zۓe_޳MP.G?/q!f;xcK3,CY`=He8ڄAĭ v/CW1AK !|Qd@ښk᯼lv>+Aξ`~IXeC1l1Lq!5Yvk/jvk7kkwkW&Ndb󩺰ۛ䒉f5uBYy`4SU>!T:7PAYʾC%ZN)_LT=ZI1QBk Ʉi3\L%E|I.v"sa4豵?AU0+݇?<](FgΜO&0iEgKWcbA1dCԔELh9iL+>"M;:8`j/mVl\!=.wOWQq5sMR@qܛ-Guj|ިi/~l:a6TShQ66ss_"1qyj&˂Uˠ=(ѐ;9Qs.#YL ;HC^Y[zW#.Ɨ=֬J:.N M[)e!EUv6FOk V.]mA,@:L),&>r32{ j "78V.'W֗Ѽ+BC!顆/z6?l1Jh-PF$604mN >Z{H, ]p~_[/*wC1w7W,ԏq`Wbli7(ʡVppՖu k!c DБ5J.Dٗ!FZl=L ij1bjM#bJ QTIq(#?Bvu!.\JKv%| fA28h1I/l+v]Ŏv .-|Fi+`rq}f9=7.y/5Q.'.!hP]2Ȕyb8\em 7(fIc˲IK'֔NKi"9yarD0 ׋*r0'LO&4)l1-K^MbKi$74bL+QPKe>>  _build/html/_static/doctools.jsUT 5N]Nux ]S9_8VA E+vP<#ۂ44.43ۤrt<`l7$2ɝ4;b#;}TpT*Bi & 5\xR|67dX-ݷ=2y"f*EhoWyʄf;>;N3VZP)M*EƔNbi$6r(3q̲ʌ $,K , QA22M9p9cjOIjE&I*@?+N?6P㨯@>+p2+V5lo[~ Pla"Yں|<\,Ց`*-~6kE!X~UͶ;}?:>O/Gݷg˳Wg'_^ `R4GC b.g'^ȥ}EI?#Ȥ`+MV %Rcu[]"])˟ kIc$-h_7%VuVT+[#a4շ#!K $$#Ó:b@)"/!)=?/ue. 9D ĦY684Q*>7D8AB6ZgM$VD$2ꊚS-{,F( oYlClGPv3 - &N5tH'ΆTG 9">DrEzG]=8s >]M4Lz ǥlp3K MIL 6-ne+X5(A!đcRSe3% P[ ϸy l<8[?u$ oiB~X̌lR-0d.=7$hӅcpJ 'qaqKtZ &-.0`.vM ䷺/z߅ۯ,՚Ods#Ao;wr{O{nkMo]cV9BupعLl] ;opBD ̠~ΏBIe_yNP2.0PFݰ\is Vb! G7ݺw>S|1K4&I&kcGL506&C]TEz^֐TȻھ`E8uྜ#JO/x)b)U95Ia􄨂Oǣ-m n/.m /Ύ/G'O~7˞I:m 53uk %Wf i} 5rOAS't܊D|`nR_gsLte^VKBÆ+A|w{uq1FA^wOlН0׮ fD;IJ._mcζU $ ͽMW d &;ɡaWn |  %0|8ӞtAFvwiv%~uzq Aϣjk#bnE9QPK e>+0_build/html/_static/file.pngUT 5N]Nux PNG  IHDRabKGD pHYs  tIME  )TIDAT8˭J@Ir('[ "&xYZ X0!i|_@tD] #xjv YNaEi(əy@D&`6PZk$)5%"z.NA#Aba`Vs_3c,2mj [klvy|!Iմy;v "߮a?A7`c^nk?Bg}TЙD# "RD1yER*6MJ3K_Ut8F~IENDB`PK?ψM7_build/html/_static/flasky.cssUT ]N-]Nux W_o6  Kmqթ X7`:eqDEwDd/LFb;jPʰ||c)WzZo=-T/Ȍכ1g\D2zcǽ"19E' -d'?!': \D\c#94Q ZVf (7A!qgl3lnV VW!6mG Wޯ4*T,TY`2RbޏJr 4c ð&S TtיGjm$އ3%ú1JN[JKfѥ&@w"M^,Eh/b5^9/(Hgjӱ370<3ڸ!G9*b#X O}8}:*V;qd *E`rIb-KߙE7(bq;^CκwOҩq;&$C|UlymF(kw9 LK9*R )x~Jtt[%L|0ca&V 2G, [IHOSBe c_h!uSem`EtQٹd;^,u~ {F}EJ*/Hv % vl2\92&k08VHc5ig}5{S7kr/ =!/ 4__build/html/_static/jquery.jsUT 5N]Nux :v۸ 7G!"%hM_ط3 ڔdRMR^"ߧ rel[P{0z9Ϝ(_ ?lU;gYTr9~㜫^/zqu/˫y~|r̜_"G߬Yf+8<S_ (?9ʊynU rxNDg߾-7UWX^oy+)^8X S:'3 MyF^ 9ND??9:znc}nƴkM˪/'tSKx}-RAr钥HkBEv-u^svBR2obD.mv,ȫx{|ͺ\>/+6~%|RI crYD|/ȫ]ݪE^\pB[~-1-eFD%,e憗Nro)*ՀX:Q"lҢtqjdQRhR$P @Ha   `.+8͂b8)b8b킙J6ٸSq۝`V.3]ɘn\[9WX!7ŞA`!)?(/PVl28 0PX*+;ʵ LnĻ gl v˽h]E>p(p4_J7j\ NP* x8]Y6Y,fAF$DY[-9,@2a+8Vͼ @\%^GGU<05@ԋ؁Mu}Aʰ77eFh'Puz*Ņu #J>w#MYJK.d#n)KAE Lhg 70܃=jsu.Z-Dm=( eEKJ- .c5`GY\4F;#:uTCDDNO1 :è]2v]ȀX:)AeQ ,?ͷDC%H֑'8ַHWj"ʯd'm7U0R08(hɩT4*QA# Mif9Ϩ1=+n.\bo|Rr0^1DUY~I8CM<9@j0נ8nUժ(k/ȁw= +d)@ҴlNpŒb7 ἑ~(bZcӫ\Ġ )ZjX$|'o̠Dh)|amiJn@G J`KZtsd|i_pkbqНV1n Swz;t4~hzԧ07%._^"~w\/]{~a.P888xūXg,5-;[2?w) B$)d,ބSGJj/cɻZ|UnFzT=r?ڃQJja a7 /'8S ֡& 0!z=O8t롍!%r=! '6 :+gRG`F:`U'M 88 |`\ tKwC3`cUF<2\!n)׸^p. ̨9厭|"(z4F_A󞌴ZZ{pի ~>Q;t>]}e.4.9cw8UcVYpe1/Tl Ҭ0)}"). l[n"fUB>0틒XIckvƸc UCsANUrIT_5 yŎj|ѝf>4G\91UFb|Qi2@w2;;1qT,̏_ 0 !^0AG=E;"@*ZU)+>U,y02N1# Nv-6CȭXU@\%##>6 f"Ij)#r=aZ@o^dK CukMB;[ !,Q[AncՂ*Y#*H T* P؇] ʖ@]zn',麵³T(B=ưX#k=`!n;~Wo9dt^RQ`DIAډ^*[LK"̾9dA A*]L~Bֈgav`b{̌q+Ǔ'C0>@?zBx907-M^.kF! Ϲ<5o5L+.نIl8%e_dA!H]yy ;FM#KQ~0]PN=!4Flw@  &tVz-,;[XasֳbnyVD$Θ;/_, ĖFu`_tIE $ՙew4P* Xak <^m05SC66X!ΎY0#|/HrZhrbl\M)M΁ hv×Fdn5a0EXCMcJf*(Zbpyp3z{P]/f,!γWeq /+_kh a5l#˒ ]p錁V-۪M!t:Ҽg(}ynXaoF&_q~>-gۣ4̩7M1Bogh#tf6c,巎dYuu9[80 26a7.5wdc BS6$\ QeyhoQNĒ&]cR:,Y$x*+ ƨeJ !OD Z{S<Љe& )5VQv{V1`].Z`s=nE!pɨ+J5u 1̡xlj%R~Nu>@?f%4 x'v18# (L?IY(L>(nXXgS?s/?{Ц2Id~@9m`cSFД(ݔQ} 8֝o,CKFz;Z68+nES[-NhEpo6#SnG.V9MٍzYͣLPP8h)`+orw;oVփ!0N|.3KBF :c1|AO4 >A)~2dD}NΙJ'O~2_tfXӰxˬ%0;{|5E#ʙ-AvJn$8nJX.Kl LU0t]5Ivih& q1ĩuV%KH9]fbӑU)?u$i\,!.E> ~)x,_kGXObT= AOhb('ս J|a@y0[_er+~`5~]0(3q 2$jJ㲗5h]t9rD(%ߟq G_OZ؊zIft1ɞ9$+%=7R sY$ YCJu9X$=vÒ {yRhXw˭kD];BKWk@?ԥ/ ?>`"~@n卯G鐄'_U"̈ `wn%)ʀ 8Att;ҡw*l;$Rr^6T)9~Fvjo՝m#8whuvuciwF0BBg,Iy `ǖgI&v:PL^@I (.l߻ ӳX P{ݺ[ݦtm7/86( 3 3Mh]DSj>VZs0ȬūCST]vOj*% u4d!FxtZr_yb0SݽHj3<k]w |(VuEHg爊iexbɰB1 $vS4FM*zy ^)eù yhO~!j­ƺAV]":۹1,V5řjO,XX%# -5W aJt6 ,zovc<My]S~N[D N͵@lJMCn1^Ptc*R׺dO-¤x&-mZY:;5?S1lɉ]L͞-f^ߢKmų2*ktQEy!:j۬JȤaXTK$/./ly %x/My`9Ӡ{ Sx(jheē\pUeۏ "j\COe%4{q3dy# j#kA_ WdIOdΑM.FES~WkhQilHNTU2=ȕhF.zJ $imOEBv{3KO(B$8 SSE@i|)Hx[::ղZLQummdSuk/' -m7M:&]ZAc%Vu j,o`aJP}*x,~ J| ]hƶ@:,qc"GQ09`Fc~x,Mfq ?H* /5[ʬNڦq_GlKojŀ;6zw{UbH^D8)~UywoPF~z"J &jglym2Uҋ:Y|9J#Vf@;ۻ ܣL T֏HK (D5^[Z/jAͩ߾({6KDY+Qp:?*%O}/ >C( [ݹ7M]]wƘJ!01N94RQ (gO1lD,g c8j}uvU(nZ XG8ّɍw8ygSeڊ=_Ice$Hrb|On+4ɢ,V~+ٌ Wk3VZ@剬Y~@CI k*c,r­aJv;79>1'bYuS5j6X0y}p"\02 #Vj ,LV[ݜ[?G|XѼNƩ 2SxO{[2 C)V+C=K X,}j˪Z]&V4f_ C+*Je"ElR{St?acQ0T bpt%o ԉRpDyߥ,zʇŇY2!le<8y6A#45'ͮE6tzR[3OVYRȑ]jw%L.kxf%z-b8q^T*)P:m(㬁|O߫CVYz a>}x <U|Fd[4[)%x5xɗU 9qe(jtok\R7''+%$ѪvK/p |G!=T&HF~QUYoK}qK7v/ǖ0[%Ui/.qǙ2N&KY[ҍzkڮ\Kr`3p֚^}8'gM/V;3r!1sEwXG@"t5m]/`vK &uEC]ge^;M8MHۀ:]LUe5Yog9(#?:e`gחKx@Ī-~൏%sɎu@-kc"CV^4=cVqr9|3-q-R 8Ə+*YS/y3%WXQjD zV/0]%SU=r/dpk Ǝ-ð*ڣ2/x rRwfq "קV/רx@ 4b%}U*H6w!M\"?Q;PI7~|e]9:gQʍ@ـNcĢp  RE3T<.NC,WKW*!l(.5P*%~w3P t'2E"?1?? {DEχBpv$Vąiu KQغDhGPԬ/H'=F4(#qH緽Q}3"?0RK}zeB! n}Kj[ 8`vuc(4Zjc RahLԯ9i+EqNd,=%g$l\:&!"qK2HC#RiR/#>qTV};:y~̗1 _nG Ԏ/ LMv;O%{5X &h2DEO*j Ipȗ .)$޽!7d<6nel0M0H>! K48MM^w$$nb %]l3vY}";Qf)%8f`UW$s_kΎb{mPĜȤe6cJ҆'GqRW_^ Qr1ccVݯ2YU"ڐ*!;V^;xiǃEZ{$2֗ r;PJ;TÄu 2bكI[#sgU'^Y˝(s#E\+ (^w w|͉YKA%̎3yUٙr!Q{&d@ \]o׈:8В2Zz H;'uJUTnV_jݨ~];5pB-5U b\85qERsP} S} lÿ LSA oNٓC4@s6@L"%̀@\åt &zma?. <+l%I87c O]D:ۮBs,vrm-nz WQsiېcv=r[2=WTIC  Ȧ YDž1#6SIU-ݩt -/7fy! =M5ATtc(.P>N# cebkBRBi7BXXLB.H: Fscn< fuDkZ D팪K9ޗiV)jq`ONg1e Nq[ps#ʔ]5($ne&nSCo㡮QHh``;`g2_s]̎a(VYķx8>6e[axkfg͌zh!/TLO`3Tj={+Ŭ๏!c~0^?x5O>Vw >Um/ jpu>vvV]Ecv80 ^=x)Wѓj<3$[QqrW),K+α6.{%{iYG՝؈/$o1&@Y], P n0Z2q4(8;L7{RmZFRkc-lt9v.,)&&'>>vЃ&&&p MJ#,ln/PV0wv,6&Ğ>B x~+ ,9qj-)g,F.$!>H[%'x5`K/B/O>PX}/`~s낥oilOx',`Um^ ;Zz%;Q< Gw2 `p|EA UUu!7,a;gR ~ǀ?\IvvLG>?x+Q#Bc f|Gyn1^)~#e(_ h)sYnf T_b23B|V_B.ɳ L` F T mec앎SvPpg`e2h`юA=}3=Fʼ4Y~, oJIAOiDcZ} 8,U@s "D  +n h,V[uՊ~ušԣ9t[6:WfBx+ID%ᰘJ(F]`8a{^Y<-Lm<Ll   7[G_Bzwf}V~PNWhk 6RбK _b7[ X>i:QZ.\:ѝ gg-.ᯐ_r,.%~RI 3 ۓK4(tBiJ޲&p%0%S ,}ǰ9D &}(Bcwlpq Q\lH/W$Fv8 %eur+Ox߿x|xWo(h>/ bmw;ھ#tsѹۋC| v9'VWsÇpVпzߏ'ꛊr!Bk0X`򡏁fR֬8)Is̕\ZYV Ez¸cuVM5!U-V0wW0߿c8~d+%#\)j/4@0%p)K%ܡgjh"IArQA.BМ)W9_d@]bgjN=R|nIp2?%/FkIϢܮ :(  %K]/J4\= ֒V{ŋ ј 9s5kXafc:KOɘ{(P-uKgfάow.}`UҬJw0 `/Ycx5x D]sPk/*zYk89 cI"&A@.AA@cA}O1/3X?D.G;quΎVc c)ŶӦd\0Ws{s>\- 3&\j'O,]4sr`9-;&5 KRtD$>O!a\]VAʜ coRRpu(+^`W0b^o=| * /ST ocT&xϬI;TL"p I}A h_J0qY|BsҖN*>["GgrnInԟᎏ@<_*;/&G ӬZ^V[AJ**&Vme*LjT<_ൕ֦VYm+ʆ:뼵Q`dŔ9,۶m+Uzmc}-ļuF*^O˫u*Vh58?=KOY;4E͘2U g qK){DR|Ls K0C0dY.6IXKc P' P_TU*T&@2#ta?p|ghld0#ጒԴR|M02<Ga!~B~&@iE9\epsW-6v]s'V X/mnCf*=hr ''?=g$Ek$Kע@1mϖbΝEM9̨LeFsZE;8qӟOo5O>jz1Ynꊋ"#Qcúv["Th)J"mևBv&ZQd0Y'_ H=_Ee8a [h,quc/ć{}ܚ O{wsifBI˭rGX7{i }m%)*<Ujh!*ؽ]ԓcJ"׋oGԱ:bR▕󬰲y;*grλ~x?%0Ap;MRёes߂c-FG7'=XAĩ}[cS, (_>E'(7E0ĺCáGk&6F:Г4& vA5|kqhkI)FyȺ t)Tf2xT-k3͆"zh_ ZV$tVus^֖ `S; Eq*O/ " L|Ƥn0Y=` GlU 8UzyW9~B#u X7G2>c {6|EƿDƯk,,Y},O|߿BsRq4x $bJIee^(5kƦ3˭JZ"Wf`i y?gMMݮ~rY(c$)Lޣ9RbJ}RJe.{f \mk5~L1 0ؗB @E[r΅< =>lb`̃jVe}6'$~ =)sW|3Rhk#cT[#/}*+ l֕Z->vR>/tS6{,8eY>sOaM =eoMru1tZ.'<!wҽ5̐ Sщh#'ZNꉎr\1xEky\;;5E)M %2&4=ᑌ<9(=;YwϵqG^`dcQf.Z0vrBY7P7WE2{A99 aJKd$n~jr4>y)f_{ꇬZWoPHG?r[_">cXo,;d}1 :Z -щUFGrh*G YG7;23eܤeEd~";xXg)qJ=ˣd&PaHL7N HtU 8"ų d`0إ ppbiTkU:u=ˇ\G$re$8 :zSF]SoUCJ~czϴAw kr+źC1wb4]hMrDe*+zHƝtKیQV6m;}?+9f'l\}0W2~!Rv+" ʈ:^AHl ;7 eS|} )wa:5i5@f{vliRSJS"c6YZ)Jq6啜2e~%'Yhqp8m%){Pc)] 3?`%<ڒڪIУCB*kdilɹ־vf9_ف(?'46Fih*r"2trr#v ,]^Z=%ME?!Qm'xm@ }ۿd{{f5Z3<356p`*WKGr/[ ? #4u[a58yo%"Ws-X&׺_ L2~ ^s_AF f{ޫlJE`He (7Lͥ再(!6YCp#و"{qVdَ6r?t:V%A5KI#(/Bd)8ѯ8k4¼TF\I toQ0V̆!,sWf|m͵~$V^Pl9X\UT[rj+tM0Luch-R-ϏnU֍=B̺9nxcw(CA?`!?2)1U̪.gU>O󬚬b>Q` VpΓ9=l NҿFbEYS]=zq78P[b e{L ~U skhJ&B(!Lg^7^wa83@ՊVO_?s윿?@p֨g:pk@B4>SWKG(4MJ_=oҾ.ǫr&/=5.FC@7dڈx{:QYn*qd >_W,x$8{F6= ]1rSuܬ:X_G%gHdep:ɮ\G[J' -d8QNu eSY]$6[Jc<*Y9?5’m9sTU"-Šg-&OmKWU헺M:Q6ɷ94 0тeѨ^AkeKu-PZs(\"_ ET@?3 /_v6RԌS^Xl,6 ڃ9B9{V%binXGVox`zsȍ-!a\1b՝Ae&j-$&صP2c;")='HFN̾`Ejscس/Tm[,ٷ&ɫ1 -?ҿQjcB{_?ZWJ_WMc!HĎQ6)m[%6Fuq"5ρ[Ǵ52IҭaM_ bOsagVn%j4L giZTzoC6jdP qT9#F1w䉊?Ri\7Q!\j\SUh`J[ZZkIm*E@DR" 7jvVO.sX!WIJD8C/a%MAeJo3eزOSɺ5 8^רA³wC<̪΀)o(qmSnG}ü*xUuBݶj,kv/ J foӚK* " .6~un|z ?o"k!^gsmm Ip X"0ѧZu1=ԉY .̂Y诿1i{}N$c*J Rd&O[[\)9j t~s2JغZY)VL,>.*0Hku:N}I˛RG=ZN}Le'0'l^9;}AzFs?_ˆ.3ia\Lק_ ,6Sfj\+ ޏ,K?a-G'"U0ELԉ$|pu$aRHRE%6i!I]Q0[OM%L۴TzQrq'h!yVFgʋxpEanR8ŊI]:7*$ie4~3(mXS8mgqQV4E;Ei%#gʸI1`YNI˪V y2 9+yz: ,Vb{E0C-nz@oj8)W>+Gz+b{wX\Ë<wbtseaгe1麌.QUyWEu@Z 9v\&IlMßJDc_RvH3ԽBVdvc.GJso0,"+2x+"1 D{x48Wƭ͸hpN-~s)Ax_9Ujwdi]cSڠNA+i3^Mi[Q؜b`*wѪ|H@F]tYМo-PUi0~K41RC(L<a\{a wWٷDcHiEGy.q_g~}GmFhXiiƉ_U~~[ co2ɐ{]::tH^qs Yւ:ASGLu8Sμw&@ǼrAB?4Ϻl:F_tv()2'.'~PP|Tٙ >5aWp.pf2G+u*yDz<gNZ9\ Wb!~[0 ߼A`yI+&^#9l][T8ԀPΚ'q]W̑5j?9Y4LKN˗ NH_ZrBF})簟xN`ΖCNĻD^de:g%θdhXt mc{R$kY^^0DB[gz$8Se[xM&6YrB9{o8$'D; G5uaǹS,6Ϫuuο `HrV D+I1j^bXfP*TZosΓQޮf}OE㫾Bcz^=W$#>{>E}7 `W/1iO䅲8ü-eo,y4SPhR9٪Qhvȓ$qO&PH#3/ɊGg lnlAȰdH=c w]hюFQ" bYBXo5&e*ely5J.'_YyӷY/KQרuRy˃-2 ȋCcuzʮC!.1ޝꐑHѨKoG EdT1NN YIV6mxYUw{ 6ΰ?Kfv)t(~큣r [˕v80q Jk>&3aHc#~*p)~8[ᐟQo%ҩ\=8ߴ3)Sa{j0#X> 5 `2y` JMqd7b);}ɚ)$&SxW3 w''lx>$œj1y '|@ѠB`E)8 1NOOAȧ`+~ˀ涣F^ySE0 8]x 2;C6ZUX$!Uܖ֌@bXFhWۜhVeatR}Ejɚ|$.?c8Ѝibwz^EKldܰ4bxY w U75pMGL[b^Lrf`2Nݥ %n׬_m]{^]vL,a!Onbp3҇F)T䞬:HtrɹwdtdB=O|Ȉbk_W|W0ߧzE] GZ<ħjM@S6bPh=SBRVHJPZQzN_,Uj2esF5:~HÚF)qٌˢl 6%&mǧ4.2OKXI)?c| YNcbx'M{,)1 \l؃o8{)S0S`Hұi'R|rBV,V FH¶rD3!h_q)J @QNUV!$/E= x"w#E|U- r5 V'Fϵ}O)>%v`J0|\ bp5 Dl'y;췾zPf #HV=(7ad( Gy&iomɑd8nãS ?;ǯWU\:x^d^Akx_.5ZQ9˖i4*bR_?'ۄ=Nڰž/5B[j N&[Cʘ#s 𲑁-i0f-?E0X `͖/R`p m6x8ZıcIK]50Z&AzUˠ'pɮ(YEoxWIynxIa0*랞 42\"x0P&ͨYSi &hK4PqI6.+oagӌ܅@lw E1.w' m2mLu'RT5|0(r[ר#_gdākSy]r .VPQLyR{(}G4cϦGmݎbi<)OUģ#S;־$-#S Xc=F *M+D)qІТquHg|Q$,-K~:cX}aΤ/fcBX6<'d$Tf(96C_Y;1{\ŎPDM|L `,{t@~-V 2O¯uP^539f@Q(l7q AiX+z U[5qK -Sry0V `1$;jeLE@Y.Ȗ9oh_-M힃]ЎL $ y CţRkKe ĎGh-_myIY%Yx9S֣ |T`ŌKxnued}}+xvۘDNc5Oݗ^[Zz:/=ϱސaLq^Zc0+:j`(~љ_yAhtzJ.ѐ2[!@Zौe#qACUvRq=-|U/B\ 5eT>0)|AvjL0Va>Pc_֮R3FtW1زCp\HSIz"?LDN5䢩`Q=xFg=A_{# Ҽo^TC >he)t9T"hF ~:3հL (R,0^kHj1vwT` ƠGKd|] =68sd^<Oy46LqUd%qzVq.}PLx]fqv;ܒ/屶_&y@ kM.î%16r}cXT2v2-ʁV%y2)nKk"ׅӋNpQ}KE6saAN {Ih^>62xRP]I0Ħr_nХ׸q&(֓"A'~//:߼]Mq= rDYNfw l>k@+A@CצOMcNf%^gdy4Pwׅ >(؉B"6rӦh.*J^'̠=-! Q-oĖys\yJืՓ[4%C P4RB"ul@A>4#5z\U[! =u/+?o(q. :Qr`L!w]lN=ouLEO\qm#f-DD=a{|"` pwLPG'dSǠ _.<P/|( wz=`כ)+4Ϊ>K Gp 5 H~~daF^eVW~IWx`_Vg } /^=ӫ֯ 8zo?Un:ں}PafW; >F|+~e^a8jg[,nFoL,)=%)"y֘w~x3΋"Ig6x5s&Ĉ;؂ha~`N6ړ]wV2__n^dK-)WU"g;eKwYP,=aTHEk.@]tJ7k=$ ;%QƞtWGyrw\+~@&KwJk_cV Æ5m, w]K[vXpAl$^;s@P&X !nw_*Yw@Ȑnd(yç^S-EI%V#Rؠ k^Akc;ia33oI9aB/Aިw6ه8r0L;)X܁KZ*%r̺Ԧ oYWjW>o4+'Qx߆ܷPu$ih,d%_jY-ϛ RŽSh7Zs}UYq/]Sd9kSf ;"6xĴ vȃ[T9LC=qlbܻ Q_~ U4'`ƅɀXyXDUED.oTGP" ~)5ڸyhNfҀL..gWhǪ\V B1t5Tv-ˆW WP}ϑr/ђDbyqg_CPKe>K_build/html/_static/minus.pngUT 5N]Nux  sb``p  $=(R@1afd5G(^~CfSGkDs~nnj^ ÷3ł<]C$.'?a;p5ɇD\X8V'4L6mF{ ?wd}||N-f}XjbBŽrr lC7GMgtsYPKe>aܿ_build/html/_static/plus.pngUT 5N]Nux  sb``p  $=(R@1afd5G(^~Cː9ǒ(QQ✟W̴@ O6x:p`EMn-[\X8V'49gWE^*|' j8 ]ao6 ~.PK?3`S\ _build/html/_static/pygments.cssUT ]N-]Nux W]o0}߯I BеZWRmώsI:vd;4ρ9 K7s?||%y o8"%dZU2}ϔP2zrc7Ӎ @}cPܱ 1Z)ipqKwчwѵ* 6zAZױN Mdi憸okt'dBPt"Eh3(|/J∬8k%,\b+QM䣆R+pbe&p &@VY[8m,(; 4g X@wuUq΋2G@EO7O\9M]oP]*߈Mࢲe^L놝Sr*Jd=F.V+/i-$mtZx֔AKd4b'zIOyWht".8  TB0}zOԺj}/1V ЉdsϭX?TEq6]iBh 4Pu(EtvTqgreCw0=KƝ\ j bi BtC:t*}wN*8Ϥ\M3ͥvhXeȕ;N'n*ɂ(6t|O@SJeJۮbtb=$9' |oq6{` zmD=66GXzPoaNZȰ|P&eL'7,ʰ~bOL{kiR* =]`Q<'L/[А%QͩeK,lК/l`ƣ4~r E7~Ɵb :Z4iرmY u YX^8"_build/html/_static/searchtools.jsUT 5N]Nux ;s6@tnI e+ernz͛N7)ȂC4JV.^o<Ivł>ag:*y>=_q!sJ--bӬ`z&شL'ZkK3q y3Ӈd>PŻ_=F"c*qv˟_̊ÝcZz&\YkLg,RYM0S >*s^:g7r!dGZfD1`&J#Z6eJ\L,P<D4+<2MѢ,0X*LOe:,˂8~5|@ *ő:2G)U49vnE;dJ>m/H%,tbԠ3z}'`?`>E9YQA(sRk ?`g}HEHoE-_,`08I{C= >ӾWkbUp$PTbb81*X|vϛ@:'?-țo3lG}/B*O\r'E0j1FAq3(`uIO*:1T1)+=w1XōpyC(t_5vi$fjRԲ' W=MaH.\@~l׏2_ V&1޻qU!cj X]a wp1lOGGSW ""9R2DQ$LJB ~@N}L91KCpIe2\v̞`#+#q1^F@a[ye2bEXAH7A\C=Je_ᑝyԸOs?4e"Ox,`~= "Q"ըM7bͲD-sLf""ɣʪ0%{+n^!jҧ7/MaN"iS6M-è)l vnȀ [Sp:Y_|͕z u`៵?(~5nmqJň+z5ϧbϛ˙EYkvC{† b~Nl)_XqZc]OP?hZChmK̊5;k[m]̚5-kS8#Kw&[VnUZfqn* 5USk*T9\B-Q=UjxuYn%Ե(b>kt'j ] ߝGZ߭|Ҝߓ3 -dqxlTTP${,{҆zkNBFc()I-YSwZ3l$퉮V2M/v5Z}Q5[aѸ:~&e"&=1-+jCI+8Zb_K/WJs]*r0@| 6Zr^fJt#4ТPa ht׬29go7 d2'8HIf#t>PObnLD% D,1[~W9{y0?ďpͭ! 1B?0upH dRBoClwFw7x=ODk;lB1eTxׯy"u,bOTYV:ߠ#w3cH4%]z֓:W{Coy o`fqxX_17v꒯r#X@ Dsi8~;/Jڞ_Ρ>ʜvjdZfiUrm3[UвyAvV.J< |r kװojPtJsu(/Jy \&+}ۺ 2.=F]I܄a&dy^`ۍ>iMD$dXEt#JoϾ?B.z2fa! V;k{)-R; =TUQ>qoc2nÙAFL uhhL:h%>j#ۧj @[953OfS*D9!T5R+F qS&,P=<+Hc3 U`9']f-G 5\!`s}"t`Ѣ fK3F1VmqHhpr51{y0 wE/Pt(kL{ØI ]C/!ͭҬ?ՆTڇb/^DWPB>aӯM$5\T&nÎ0W:FuJEa]-q2b>`̀cc] !8;T,4(VCq7sP쟷`ItY6/ց^.򪆅+8`<]8HzE蒄! k6UpD 4-!pMe 6maUqBi~R皞~n~nA?0kNxԢPvE1;+{M;Dl7J(( h&L%g"|WQ/8tiBe}J6 XDG`OҺQ[B>F(`IˢetxexP+RUhRkpMS'4&\EmG6#սKlAsiq*nq]_o" EQsA\ . lؠM{0tfuP ~GӯČW{PoܚLtL [ěI!lpHs1ϊ }^:BPyTsbXt -DHr4RPz["X|`>RK/fPjrȝ/q=ܙ@4j2IUܮz1aSx#nQhV%Syb LN7 MMPsuIWZ̽6;B ghҪ}G__u@y^'2P>Md< w?ū?]~_w~xyu^BDDV<- 6|`֞2{lb`~H'a] ՠQK}+2'ņ~ 4n!.EpjBv+޾~}q5=Q8D7/t{B6H`6NDžjx--۠Q !_build/html/_static/underscore.jsUT 5N]Nux n]_a MV"-/6ڤH Y5F3CE2$X=gn^MÙsh*RBRm2H>ݥnL4'HuE}ţCBF(N-{(X#BT"=K׳0w|5W墨A=M߁Dɿ߼p-M'N~A֑>`'Nx|~(R$.Hg*0Ci:IDB1lhx<ХX" YO> #1uqD#Qj[d_϶QۗA;ң(vĕ҄oҚ[l ؗ7èzPcG!+8:^=q= 'FbG7ǘ 6{T^vfI"Uf/(gj)24zS.*yNdk 2e#rܫiR$}z $"GES `QץN"wS0 8d::@5h``UP9@\\t]#M?lXåkBzџisqʒ=oͶ=HRuo1:sI6׽G77{Цk1܌g܃?@FS@!yLS)~x"]z'WIJH)`IM5n(.n1bb0BrR4A)0=84 .uf0egMQwfᐩ%Dڏ@we4X:kpk,ճq3drĿ67Gc혴+Uɥ"ODfPƥqJH1(5X0@oH!X+1S|U*l $ "[[ʊuLZ!bgdLSāe'@x&`rlT|d^p;cn%k yY?^\$["%a/M5-z}R trϮf(wju 4D:sij \+r /zF*фeUo9*˫CilL5H"0% x!C'iGp>Bf',#RB%\|җNA{~< JX&QnNa7YeJB.tnpHoiTܯơd27sbZ*;SW#:ԾAzEP%uQ$ N'QAWAqEp(`( !!%=7ҷ^V,eҀQJ1v)Sv;j2b¥, KWnƏK (Oݫf 2K(jً[ӽ :S ˓uPh"Ye:b6!.XsʻCЅ jyWUw&F~s-竿;l8)$%<>d1vwwYGK9&~.}oYxhcGn_J0ۗ,PɈ勄'G5yofSƷym_iLq"GUy3ôN,bΗW-1E/]zN[)֘!Zͻ=90>²ݲug]YlS}}Hr(?h<]b?CU0O/Ɯ.rt{u jfȲ泣S w8sp*hf${X}i9Tv=5zн PK?}) _build/html/genindex.htmlUT ]N]Nux V[o"7~Wz&+qj idf 3ank{{ls Kڦ݇] OІH <{*[ oCj di1ΗeƔJ%l]cnR{z١:/nwۗQe7IGأ8`&Yġ.vv=$dâ61-\O *<_9Kifua`;=12;c#Bjݴ<5@C}7ASD4 w-f~,r;yNS>eQ*=(ו4˄WB$AZૢcuuEpE.z8e%JHRǷx$Khyc= ΄~[Ӷ6QKiryJS 2SbVzptIgx`./"FXc$fUS1Wu7Ҭk]"LI.f) 21'%kw5ȦXUqa[3]9UNržS0:5PK?ς\ù 0_build/html/index.htmlUT ]N]Nux Z{o8_bIw6&AemD츇Z I=?hz] % q$G$YJ.??;!S%Is59M0f] $\(mˎn b}9o4Wr߿oCgB 1^e4%8þ|DY;y|ٻ٭Q*ӽR;?$8u)U7b=p6"*3NјnhZ9)odiWz20}H6C#pAO4h4# j6KRx3RԷ}RI ::NφsEz䟮!ח.޼zU7 zvp~zqu4<9;>>WTkֲd_{ָSQ_J&g.c&U$$FAPZTD,3[Ͽ'(Pyq! x)@q0v&iQ0i:xV_MRΪF' _g񮪾b=?qW`db:Ud{awi%$I`2f :አ x )L ybe#C@*9RLy3ЈRjBXHo.JI)ݰ0̪ z"XH2X ٔ4cR2dd;'N:r(`CPݥL$Is`lǀD}Ү:[%H2VoiXlWO=6V~Nq˦^ 9pf؛.qlߤձzBn`'"V$3B`>!u+HqiC7 ׊Aa X%5\o1~h?aTƟ3I5V =%%d0c)zz/y~"$\dvӂ߿8QMkuuC| >vDe4Pn!]kbTd.o@[m 2}'S#0΀ع׸9kYﯘy-<ktO )R! (VWj!CƛTLxi= VVp̮T[WF _k R-(%#ǎA6)22)y WVNo}OF%OuVԧy$sb5_cYeeb.OD`h.J6vFo*Ɠ %Ps2 A'ƴֿ88'zLѢF/8CdZ:l lBl=;?<8~a[<|!+1B]-ҍ8XsxW-} 㭮7[eS8sao΋DX;,197nC\ Zcc+(v,*NiZK,Rq8䓘]: &`BUA2c c.RH/%Vv\PɕTj"*B.8(1Lj1Dd[ tk G@U^B]²#@Ȁm߈5a^F|_Hdd[v0I!ok4bJs+g\1H]B3a[X6T`ԭejИK[ Y#X %8u@{,wq /sאT{L`~YO-:2n?Cx^"2DlߜYCr@DFTJU^g`3[*T9-PJC耾-JbJ \&YW>ͭJkQDؒ`rTbu1i'\>RPQN׋ѱtŰ8dݑW z$mC#=ѭVgԲw l$& Si˰ A3k "(OUIq^Z1gi‰i,azT'E< no19|d^՘&&Mr ʅe/(c6$ @x+ a!>ra8`OµZ_PK ?T--_build/html/objects.invUT ]N]Nux # Sphinx inventory version 2 # Project: Flask-Bcrypt # Version: 0.5 # The remainder of this file is compressed using zlib. xڥ E~KtصPxP`l^44jz96kP)NDA8+-*ZGzdW0e;&Z,N@&3*v70NYy7)xPνa6 4~ X8p1NԒyy/ K-ЅYI~SoPK?R!i޻ _build/html/py-modindex.htmlUT ]N]Nux Vn6}WL[4Yn 8K}2(H|imqm XP3s3&ů*Ka<q O<.a!h.𜦄 +Un""ivDW|PN蘘,eNκ1@'f4S˾ɦyXž`vu)THZ?:@,SJYoW1ቇe`lʸ ÔWs ͵ B.MW,:RS&cƔ`뮳# k )PtYS#{$_ڧPȆyqMWC~lj6,ZzquQ`6GkE5]2OakJvRGjG՜d9[U?ڶ8bRAԻ%{E:R"O ` 8O%/p5ٺ?@D34Dyׂ5l0@8#M.)Gs+[3NFK7{֠뾔YЪZklTQo]RPkJUhOA AG]ڮ f}s(,0bT}cˢ}\Z(YBR9tR}Cܴ*ɢsZfI^J#球QVmm"Id} rchihG>hIFuVCs{ift^_ߏZf>d!37#w+eY֫沲$<_F#HzjGqVh&dt2Wbܾc͆1v n_x';O\A$Qs- ת֣ ?ĵ)>%Ys񚱕[TiV͛7MPï!AXof!똯ޟPK?3G9 _build/html/search.htmlUT ]N]Nux Vo6͛F+\i-PVv 9!.I߳Tۺy>٭7׳b&07 t|_/,%\d4-iX˲sOȍkԫeG7tHG[4ŅSGa~hdL`4:LLwn@4k TL LwHNs24*8jyCawq ;-l %!a*fL%[J_*E@{v1^FRxJ J@ܿ..'ln0 tu7-/ͦxn;1El:};_VчKXDd:Z- =Sj1[˂U'z.8PA)wARd*}%J Q_Dz9v@58ƺ婨b=f|.`Gp%FyB}ڃOouZ. `pa)i3yy.e |.̳CO?UX٬ Fҵq4#]4ܒF위ʌgwjz1i~'*  3paX4قXa4R3 iV@4ZDy0-l* =1.bKD 40AYPMqHp,'3j RBU>~io0b>`oia`%tjj'kҳj9~ Սӫq[}:djyQ a,77\)%Z(ql)z;}0gD)(%{>dW ?tIS]xԝo᜺S0.N޽vf_?}bG c>PK ?_static/UT J[N]Nux PK ? _templates/UT J[N]Nux PK d?_themes/UT RN]Nux PK f? _themes/.git/UT _,N]Nux PK d?_themes/.git/branches/UT RN]Nux PKd?k%"(_themes/.git/configUT RN\Nux M1n0 Eg:IMYD$ }:>rZ;7רԆ]V0R)1*RRר o fK0ĸa9. !C\%\S:S.6B5TTRʞ\5C觙cFQx81UN9mPKd?7?I_themes/.git/descriptionUT RN\Nux  KMMQ(J-/,/VHM,Q(,VHIUPOI-N.,(SW(Wʧ"iPK d?+is_themes/.git/HEADUT RN\Nux ref: refs/heads/master PK d?_themes/.git/hooks/UT RN]Nux PKd?`X (_themes/.git/hooks/applypatch-msg.sampleUT RN\Nux }=O@ gWIT$$uGY/߹k j~^ܷ;-P xGE0!]( :b 0Cf=  :F{Z:} t&NY55#$|',Z& & qG 1@=¥.K7m p}>/6{sz"LyGwRU]UTIͦf)*AP-6ۏ{[h^%X7zz[=PKd?$_themes/.git/hooks/commit-msg.sampleUT RN\Nux }_o0şOqH+VMJ" XD&7l|w&E=Re M]C͍F^S~WrݶҡZVTɷi;OЊ Lշ"0h l'>Oպo ޒ\i ap(Hk{*uFwF G'$d OYo:ye 皒MRϗ >!-7)q]ͳ`:T|G"mm/#U1EY)*R])H6ڛ*?A _H~ uPN6N p8Waj{wypjGXOw|-/]2c\+ }FLj'#(9^j=^k.P~Y8cA1PG8jG䈐d}7+Yg4 _{]EPKd?lz%_themes/.git/hooks/post-commit.sampleUT RN\Nux -A b WM'?!PKeIU/^g^9IQ;Auk -PCT8JosԯNr*{ k-tq$X;Cm_b)}P PKd?}.U(&_themes/.git/hooks/post-receive.sampleUT RN\Nux eQr0 +T6<IaPlx vv(*C7K]yW'+5ZӅ`p Az3ECV 1$\it%7}pM?[@'g0JIS$KЪ˙W,̓B' CX42׻v DujbaEy`-td>xY]U*][ׅ]ՍRR5Xni{]enm]m]TU;5A *g D b >9BHy.f+ݸL~,"\%0Vx[5|ce 9x>6zIq21s\oPKd? %_themes/.git/hooks/post-update.sampleUT RN\Nux -Q0 b_3x/ tμm/Ø`KhC['cYapAQ. Bi5%}#b7X+2WVDS 8Xa_w4n/397}|GrXMrPKd?%[9(_themes/.git/hooks/pre-applypatch.sampleUT RN\Nux }1O0g+i҈ $$uGNzO}})SZ{ۦdgfQJܟptV񜷄NgU@{q8ECf-ں8슗GV $ju,^)i9 G*]3cY%BT@b#_癠&ژ5uvu&QʊzB|l_6oL|ZwipW-oh~PKd? \*$_themes/.git/hooks/pre-commit.sampleUT RN\Nux }T[k:~ Iw!I’}9Slڒ+ɛl)$[SܾYarH+M$ڮaِ+OV'b-v~Bn'tW!Ȁ[f2.:,/eqŵ_բUU0/狤R U3}$$ 61r+\TDp;r[No{ΓqoM=\SL+\1Mdm?$susGY𨆪zgv =0i V/&>\ ywFvd;BV5n=v[,t%ZJ{E@'t $H+TN&l+s4"u0kEt xrl$zgg}]cjee"0rRJ PI>cMtJ?%zc Ge KZܫ(9s_}ɿ[?3lXQL<=}A D/HwhcDzRhXB~|{ 7{CXBtv_`o?۪}0o"ߩȠVeAPw0uMӓt*G^h\E OaYm29MCOX.~w'gyaWg cGϺL^e/QGXȊ˷כ};UN?h!& :*py*W w"dF .H̽eϯG ~ېA^I=-ǪU\[`@.hdOBOq]OM#;FbeV4K{p%ZB!gw310t\ںqJ~.?wxA`?:>]n'O"FfsH$6ʸh84a*+;l1_һ bu5aP%rr[-RYB;13ދ ذ̯3@S%7O,JPK%o8^Ηq0ŧLYg2R%ZiAE  ;*4kٌ 5]_}E#wKA8.bhAMLVq?>y?L2. (5t/Dc&0x"'ej#@?^won^y; o`+Yl◰CREF7үtW =<t:%=qa"t`0R/ЊC_|g]]e|:VI@_W9' Ǘݢ ˯@6Vs)H)Ι Ҍ"WH uN 6 (: *o+b8ZT}@w]mxW|a]D(`Lwzxos ǫ@v7E!$٭·73Wgo{!vnx1qӌʹyt *ee#'3Bp1 8 rǖr҅ zѓwck]A޳4M mWO)goyK&^>t3ș6͖ .p_S&ZlfcI/r7ڞy^y4+}s_ m6%vcog_"W7RFVmnj 2|#&zp:*RW%6fܙO6mc=BV͠ӳ0X)Ω3i46vpq!mfQVcMp*%u 𸕕DTŕX!%B_Kqg"l!jX%H7ͧ92dt~@'rp6>.xNf-3(sCY (oP@Sz38= ;=҄‡>xMHlpk%*2'٫41NTA~!,|]|zw9i㨙,Aq8-_dt㲟Zz%)Qx:zDv~˓PKd?Rv _themes/.git/hooks/update.sampleUT RN\Nux WQo6~~U6ڰ${K ] }PlPLY\ddKk'HIwwwݠK%l8J=s4dM3?jZI&26הjA\ 9esa(1O|dcHkaRb|i"قNXe3|)hfS1"N$ž) W Q2s,uY=S2$in4SnRﺺYFSNN6i\uzrTZ/xVFM,3qáwWXH N VXNH8KysΌP2u@Os&-C0p% exV䖇u’ד ^,Q&$ {gaa2JOpt)_4FaOw˥E$SͭGKY-# P^4#jDxJΘ)}[wzP jni~Jvܼl/X5Zuv꽷-vh3v~L~w z@}a<øX n:1Ł #%*'uO*4`yl4jSpLsCUK˃Y!G!DʔCH}nfsyp ;XrdS|(Fu}Բ+F'@(su>zo)}UQ#?zЮg713vMx^FQe `wp'vL#b>:UyVrnu|ǵҵv^|kNvj COj[Qaudl^+>uB8t65};[u;Yrmu ˡF|z|JZC&/ JWb;uboϽ'=Lk;3e^·_Rx?ϪiG-|mi}C, S-C[kNǍRH|lSBEw= ֤UHS]݅PKf?ܯ%D_themes/.git/indexUT _,N\Nux s rf```bS4߽u 6<и+PHҶ=9yksm~ocK,L/Je9hC5oYhN.|%SG >ή~9jfM?ކh[0r\Y lA.`OE`1"9LbViVgX/>'0rs+KK2Jrs@a1y~{c_D^=my 1(5'$3?b$ԝX̽jS{i9u)v%zyi@s`1Z^%.?˹~EvoSE1͋;%p[ 1Strh4_J<ʪșzCr<~`K J *AlX6oiKTՏMUPK d?_themes/.git/info/UT RN]Nux PKd?w=!_themes/.git/info/excludeUT RN\Nux -A 0Dbv/\yq۟6؍g7Ǽ hc)iX& kOo@.miuk6p72)AȄgKlK s7Qq=ZƏȜ< uY^1+ >bN8Z#Eù깆PK d?_themes/.git/logs/UT RN]Nux PKd?Ė_themes/.git/logs/HEADUT RN\Nux A0EztJcC ء %$x{qڿ{/#7nYdhbP *ɭF#dvd's.dN8]Krp<I&@dII}VXMeh6ϗ{P t`&N2ʳ+]+L+Rmx_^ۍnڹp|" IJ{V>YHمtIݷfyPφŨdy׼jNyZ$G)[Ev2q^7 < ?[jcs  {ƒCp}U s.t|~e.#4b'.jQ$K 3ǖ"]NKu?ZPk ~#n:@weVFR* UKB^{hǹaA-ڥgrH{b\Be`w$S*`+sN+F*?/i$/>Bl_D@I婛~暓MoL:z ~5S2{(Rfh&P_DϹ9Ǯ.Hwa%wvi]GnA>:NU|*|xAg裦ήzyS&3ZDaz "، q&fK!D0+U y㵐"J *puû䙲7t_ C)oM´q6R!9Z`76ύ}E(\{:Kg4@׊Λ]Q-5b.6"gYup{K++h\Xs~+"f1uF2 Q0sX=Wf.=hCvU0!7R-ώsHOSij X Dfv&5u`s+X7qX/qT hgӽ5yg/F?i@/{86xX*/Bt>Ro>c^^uzc-sg?R5 Uy5!sc[[PWh">|sKvk\,4R'%DGK,Iur*؆Sku,<!;B6 8^B+z0s҉0,);_%mX#`zoQ2P(zCe`#5ҍ~L1/3_q5/i7l(X7"ӆG&=t!Z±֮ejM&сBiuFc1 -bfe Μ\&GzBa=QMWv#>ޕq 5PÛkiN^͘i-6o4^g6Uv4$lOziz޳vrzoFE`OL c]-s`{:xn,33)`95|sK 5`^m๺3W㠁xȻd(9)*&EK㤎D2}ܻ[H1W\pxc(s2IEb!TB/˞/ƧHnobbZ&ZLA{vF!z6k\R!{Bۮ?D.2J^x+wt\'=nQk,Ϻ9Шg=IȌPbJuja vlziDsRW] Bck[tD^@ӵ =bNyٯli- +gbRhSD }7O3Պ_xO"3tFSwyޖv'ЭjlQ?zWf91z밈1Q/3]DkWdZ*Q}Qz=` O/ ks ϱ.aћ\5z+ Z!@\Ђ%b[4 i _: Am}' r ʀ<X `nFAr0v\ e\戁]0R3PSdX:mF5``<{P~=e]@PW>`S0o ok A:4Aqs@}*Ы˞`.'*<Y NP\x~pntA~8?Pzty-Y(gXVP/JXoOC`,Ȃr{2i;on4j%!$b_g؝ |_iUPKd?=6=L_themes/.git/objects/pack/pack-c59acb6dab44178f3f0ceda2c240adbf9c0af295.packUT RN\Nux st:c۶ձmFǶ;qwl~箹̚w͹c_=UOU}3Dp*aD~$DMtbn@,8``Sѥ-g\J5\uwWh`sfnzl@L"|mì2VQ"q͊i@qAn@fo n1N?&̀8IIŶ[ُaZ%^G ^',@ag:%~`Aim7P=6.Lv+GH&㵨# ]9K-2-ӠI Lpju[yTNr-4Nӯݷђc ) \V|M{}FxgBh%I->DcTF)ZG%xT엎!IV$S~"DJ`%b[3bW4\(ŧk-)*ɛj 4#fl U_x1*wКX !/jXKv̅tw#!Ʌ#1Fp42 :nSN8)B}6qDx0kX- gȖ1-u !,{Y<*Dc~h%dn{?z`khBU3 N,SLtRZY0., )h.nL0&ǧcex@8V pPi%AV5d8>G0>p#$AM_)+.jS;iu> d$T`}\sKgMkp+mYrSFHKعl^/5w_m˱rqH*JS;j,2 |yK 폽H6"̟bdpwȠ"tVHŋIZNoI&˪eg}鰥-:v};.9iX+e&(\etX@8JfÉe!%dx'X~D7z8zcȢVAe$-䑳~'f~84\>wUa?G MUw:`X[RZ%,c =?{ Ýjn_`H:mwsdD]iEDe9H&!aPTؗEM\<Νo\YcOM :_3;" Ȧo^%JcM!YvK;Q~Zvtsmg/3v>O jy(5!܋)##nwHkֳ KxM@F`0ƪ%1~YUt 9`^N#!D "f2r1;hӣ.P1M.8 ҦDZq ;9#G_lVsT*%FМ>NĖkAWlG&nI%m6fAnoX0Ӡ7)o >nr^WlB1$mYڞ CUZEڙ]/<{;<|\3oOd ql+ۡdw G>]}'|' |#宬*~˕ѳni0'[?unYR|pbNH*DbūpZvtF@)Ɯ}B:gc }ڔyIgjۖza@.5 wqZgwPil; U9{pcvAt[c<<)aкeQ1zZGIжUWb;n|DsU8ξ-X2aź@Q X89BRexaSCxV\x+c\F9l~KeI " o|ups(Ɣǘ=BH7~{*d+m\3"OM ~JkaHbӤ/r%-:֧PvD78.sQ>NE֒$j%3e~5g2g҃;E<}J_6#ro!| B!PQ@V׶C,v!=" Lp=cF'}ur շ1 k8#C;h7Ee&/ ᚯd^tsښ3S`QOg4АMu>ҌFmg>̓X%˷WoPgz&MٌWtPR(4bCȤ> H'_R)jӲQ$Ȳ=M+qG%ǍEonw]Hwf|Wu:?w°x,J[U`dq`Dojgq`qPkk_uDՂ$~4Z\z |=0~dMYܚ]RZNjyoCTѺ"zH8~(ױ_}qW?FuLx7 3 3iQqzIU3'Mg]ӈcs&.ܻTX7*Xaxu%Pڞ&a詅Lf,?vx~_7ٻm_i'%u%3KӮFnih5Pt\;=qBڪR)ѶN u-4VTw~J<3]y;KG57K]*? A{K$R (uJVaC<𔄶n;AF#M-ܾ?TǑ` yK~wv +`uIasy("&²# |i]Z9_v7-=p>]}=i`ʼ ;=^CԄ50+dc*mbcVFbuvy%yRQ۳b{B*;&-sr&9\\͆99̵a݌T\(g測s3GdϹ+^/[c;u\<0|hHfS3[`qFn Mp{VUp8֙>nj>+i`_K_޸Qh?u]٣ط#x ]Op^ބ1`7 L-6 8*}q,2S9旆t2doYA9س0eXEk)J1,C:c}Ou[nqe4}j) A\ľdMK^@- ڟs$.U:ƔEIm=a4]ڔ$al(F0Ն e#ji!pVRDZa[^H o(KȣV) ƬHBKI >nr/.Ҍԍj_RX_CJAa^cΧr kao&?BFim}u؂MHBdR4ϓ4PA5԰@~Tb!6 /:)sGvB:i`=A{@<2!S#GWw]piمy+(I Be<Qx*{qdg WsH2& Nw`V0Zfv MЄ&.Ooj5X!n_KqP_aQo^<E6ɪOP3S6hKYXi&ѧg4&Uyx;Wb6p>Z՝bmG]#i32&&d:[khuvy>Y&mhV)KvVUtolOOBVg2'Z|$ϊ[;QZF*;A;:?]x&4ja!0jILTQOe (]V7$BgNONzq2C_d_WzyHRrx$$ߠdg_}>OJ5EDC EBv.R?@C8I#J f:C+ Wt/SZ- 9R},o].g .#Bޢ84B|][Z2DWE>~#R(k`#3a{%߶:߿QPKNJЌNLS6;8#'_}=6wA%Kx. )B7U:=2͗&Dͯ*wv@@x3p_11;+Ÿ2ܲzmV~/o@1xD x]kPvfeR8Xӽ|B&'#gމS.:20ёMmJF-QP qs@Sʲ֗yKNjUϿD!SFc Ht09(7.}A]'VD;@IqsjOkxp$"*/..߸zNk%_ _nsRjXPkh̆3*AG ~cO&C&^1ƬxLTF8{co22{>R)܌Z酞eul9AmFW7OPem6);joyġr<"M?PAj#Ԛ4%&1bVP{Y{ rk]9߸ 3܏Aܺgߝ1fiwRY9g4-+ I҃,'@4)BT |\ } 벏#Db 2'zaKb>%0D32vMϼ^ʿ\%syݎ(>bQJ*ѡCա1 |Tr펙˔ZM0]T] O1P _S+-ΓFB"a?3,:8cwp"7Euu1 8e†PCh.lkoؓ†(mxHfv.n`cSu *P#Ky݉ס-:=uCa[u1C|OMEHxDX`-_@lm"NaC9Ɯ9<1G!}9%C/odq #v_~31m:,U; $%Aýa 1.3.؍7$ьCMr}^nE[ ^tssqxp7S6.֖bfiZ^{s4=lbu&+^>YҒϤu+ ) $1n^M ׬ɟ ;:84;ؕ@'#زFF5AD.*G #ṽ9852_~(˭5֠JI3P^4S),Ƙ$ϾX-R9UY(yۍP%咾%RR$9\t'F2-`Qez~V1uYZE8ZpZ6ڒ׫+Br^ܲb_g2812 W;L}s'`}xbPf߾K4 5qFdt&v515cA`Q S) mndl6_=zȷH0՗ySi<@OP4<\$_9,}#39aQjJ&%ٲb p8QQZNLfF2&8ޗc~TSИ~fG$~y"Qvm4/&ȅd!Z[~8I4&;3O?sJue'8"JigF]K2YCق7Y3:Ѣ:'0UVz%J~vjZbR Oc㒠Crsd4{} /U83*y(#i+ OO,b](7On|H<,;f٤__gVU^ѱtojKDdȈLA!bE_  `lSYf52ijU_3n\j?jzM./C5J!;j{9x2 ~җ=^HSnIj{Nmf [aW]y!>zEXmqZ:+>@Hf]d\z7J\Aw#\o&A&LB;:vy0FԗA2PS]u)q7KYV,;mN`2e8{Đ%RN1Wf9GdvT˫zWpvX"ST{C :\9amy2`=:@]4~`KvӮRY8smZa'|,$bH$YFlm*q bFK.7-՝]_ E}GK9>-:HyZHnm *sߑ49o,Wnvr>b8U0c5Z;#ltҶXo.#! dDԀ^qI-ϟ H:O19C%I2Y 4+C\"ʦ)C"}3j]eVDܟ Au8Ȝuųi⬎SKϼ]0ro_ [C%2\Y!V_cCRvRynfPj<ߊ ;r}*UKz$؜=p=LٟCߡ"3q:)Z>%EYjh=?{JvrR7BeD1 |AmBdhkfC :__jJX)K"1ʷ1ac1ѥh5jFk5na}ׅSh$ _f<`a;C!0gЋ|ɹS .Ct|>"\lE1LB)NOiM[6BaXeeOD6ߩ%D ج<\?NԾTm~BDv&jN0S}~” ]r Evǜt,G~Znĩ2C q2FϐxL66(|Os3BJIy '&u5ݴsoQrJUL].lu\Qgxh3Lgd=!6C-FmQNND?$KS~}1b/`1A f~NBGNwnF7p[ݵ*5qo>/1}d:6nw5 ё"b,W&C3m撮[Lݬk31TJmKX~ݞTnO#[Z: A>#vXei:/@beMfOvic\JIgOr\J*>{P76*'*q'MM39]ChgnY\f?x[kZ ț6 umW#!feW!*B'GD_WH|(\Zu (7!8MxA =~w}r+,ӳw( i4e\j>V mp,89zP!%PTF+M$Rmd?)1ɞ+ bw`xcH<$VT;ҍmL0;2=sԍ)JnxZ67 , L̪/ưVP| ]n_Bcݡψ@W1Tf#SφQ@L_0lUIGj)eU:)X~{xFīLHI50l!U\Jƹu06b.y2NU7eMn!qx H+96 \źR ;'k>Ϡֵ41͌}e&oV>lWV(/ᰅ3Bm#GTQN&¯@C?=Df`CإK AG8-+GXsz$nQͼZ/ńEFXOUTLl6 95#"9,ڵ=,fP'EYdn`yЬ˟-)Cn p.v`aF6 X(m2uib\q  JYw v {ik[cUGrj5IoSf_JAB!)]P^yϽS^ڗ GK@G-ŕY(.X}5Ѵv(jןsIDh0 3$EC}觤WJؑ,g:{\[F3Z1Kɝ$Vy6azq[I_^)9ys%)LDX7@% NfkoTS( hNJCb$o7 tec(]5.yDn:im%,j v7!x 3^fE2&X ܡ>Ui=j+mY,Ð ={GI%g('^ ~_;6kovLm ]~X,} \(L-}deX&69 42Q+C#,im8r]jU xGD@y&ɀٷ-ݕ~xejHC9h5H&X\a~/|䳕48g!$/guQfImOSq+:vo %=|h=Xz)@kP?%:Zc&d54FhȮxӨ%((p:X֌ڄ~vɌkb[MX[ώĉG:&{3;ő8m!`9qa6UWd*\ӁZ4Cr{ls[;R]z܇WE\p7toXbN8K [&%"^*/k LFH_qLj }|&;?3Hl ܈3u]fέЂLj*l/?Gb$o -H0Ūtݲ0igKkԃO9⓯蝈l4A\ju%{f{MCB3?} }9}dJB|FfyjVNꐾ.KM1Z'pƟnD]F'eJd]t4??9'Gc ɾMٓ#槆}vENVT,1~ t x90?imOQ .ڰZRqYq`+8=2Re+OT b2,o.񿣥Cn3Q.}}jy1 ;#99~%va pbG֙ -; 0K}Ԫրqz_; 7s#r L r sPtr0K/Y(v6FtfE 2̿ZX Gba\F#(Nx$E-W״6w/֜r?jm{DP^'\!脅CC>|_GPC3Ʉ=p FT6lʾxnB/B׿xG>@#!޼!ֶ:VkgRܢeCҨ2O1$Zfcp [뿽G/O4E&¹D1{Pm0t~GcX|0]ιF7w?|_Pb-CGݛ+˽buBA)0~߬qW[+zv}&X7jO QE b8::6d*spgU@3a $5lgiЦ=Q5GK8>4v+ZTIH/H7EXBv;2nvM_w"Wxl諾3dSj;z57&}1j&0'I!Crm+```{x IJqa[|Or&Ux#| $A00a͡Y5@D䟿Y%b–+e~SP]e5yR(nFr`ƣ#31_m}E7>8[ I8}uzoEviJh(?c_PwÍUR" Kplw P%Yxa~shk dXѥ 0@rVe9^dkdZhZlNYoktGKK9Aא!=\'yI s|3?]37&9 [$귒ކ(54j>07!P:O YE]QQ(3է{7h:}ЩC:39n 4Ŭ2Li$|i$ A s ɬ8HXpM6{~0^uizQ-'W?+"$?3?SZT%"b~Z9G;lg,VNi{)M=͚p*T< 67;ٟw0vSn u.`Pnz2T^izpa: IO<Z=؃=ك'^QL^BUj@hXdL􎁎;Ђ)z^ QK l--u#x|KӪԦi|Wfӄ-GcOTZ] tvM0mLA&r@1E4޷BimTS"g*)VODCT'pfJZ&LuqtKޤ:y/h2[?I y +O(&J,iK3zs8eWm•tX2RkI&9ӌԌ7~eA%\\JC(}w;Y-qMsFK So)<(E֥BO R!P,+Zz#i%H*ߟ-ϴiҌHoF{pL.ԟOH (ޢ4Í5#o0)C]04cKB0[ PBno fF=$yΊۊ{/1p2  8O{&AyBAkN^27p($gS?mZZ('g,}xM֒Cڞa47s xңvmF#9qZ~v[<[!ZUƭe_I]aqr7c&GO݊_Vޱk/Q=wT}(Wo\n/^9BpK]UTobhuMlR[HyKA=V /z+_iѤy\BT.YdX`2_/ S(s Np=Um{w0Zv Q״wJo#C,R]F",t/X;{qPKd?&oa{_themes/flask/theme.confUT RN\Nux M0 DwEnJ0EG+5O ݍδ$1ݵ{N&K$cjd23e^(a~-g]}5^ Q&/1G42|9\(AaPK d?_themes/flask_small/UT RN]Nux PKd?QF_themes/flask_small/layout.htmlUT RN]Nux An E=ňJ1+uYEfl`@^l(RUa3s@-<μb3 "Mc\2nn#{|i9g Ez$ bWK䘍}rFz4'T;$Q]0M!3auM"maVnƸctt! IצqmD;ٷEaE2H73-c7'.,7.g.ɂKze4;XI΍tfcܑEYEnuKP9Z. .Kw#)KPK d?_themes/flask_small/static/UT RN]Nux PKd?h'_themes/flask_small/static/flasky.css_tUT RN]Nux WmO6ί@"6ݤMi<8r\(߾c;N2MZ"Hm?ُ^c5uWfءJ>3ReHy>$3I/PV3ۣςn2kM›5{$8?E!˯whLDhywcz \HLYUxvyɅD[;x4V"~%@71̷J|&\l(0 ^$L.ʝ9"BGA56o$BOLJ$ABۜI$bID 8n*9qaPJ%05 y&&h9Y˹"CaճzHl˾h54o|-1hWrv :l(Se IvÌnŷX,zC;Yo~ސ55n>kH5Ƅ\XV` -AZ2bBt6{\;ݸec jyahL(jG0߇b [O58ccla~NlPֵ͡r5&]GPJ]5z',ɩ3;;#,p΋c8塗cDSS)hwWPެГ"FN/ uW6=>A# {A`>Ngg|zS=pm s46t$ tDz{_ L:ʐ F@'|FdHNIC\HA))c~AQSgCs 2<Te+V4  5C_%ojUd!_LfR?I._PMH`Aķz^ZV!yIP0)Tԛ/bw >k sA0DdE QtX, PP@Z 5hӒ*s=+$F]Ϻ2ET˪ uU,hX$F +fp̮aM=)ȕd]R d8!)PJ,!x|ⴌUdFwb@]z EUU_H\DqV"xP$"E| B]n~/t$dz=m].#g}MD _Y*VNe:02-44#t5[R;+ewܳ*`بá (`2d)ᢪc9U* l)%n$rUָgAŹjG^4]њf #qaYAAqc@_8w t]m#ȋ'oƷ:!B5agTsHyUJw0L )e-I&d Ϙ lOJbUC; Ɛy`1y;;!Ef!<9E^֒ꙦSS9T̿"s^hGgc\3ӽs{kn\݋.eV=6lvPM/znCS}#E}8fБE+l5-!vwK꘴q[[#zct2,<#ֵ#փfnz >ҮtK.W;_YElwHa{ B9qG޸:I}iꦑM s^B"6>tAޠٺR( hbN>{t"2c+p| Nقo c>+.;un#ގ'77ޞ4]jj߭%D/-6לxVДqn Lo?PKd?ч_themes/LICENSEUT RN\Nux Sn6+{J m=m%XI4D)'{o%tw=ot6tM:!,wjkn84OظL_-`wPpf wh鯳1n进F\Z fp(em 65ƣ;73Tj5uv#~UWj|6 %<^tu$Ts<6Z"w0g%HXk?+@v)ꩲ"&wpv~4oIpX3Lj 3iMgoa<]H1Y l")3&a[mx$T$cbdGF<נ,5e˹$F\(lL䉦iO Ԗ';YLj! [hwFA2RBiKaUiYq(PR4#b@Ey\s)˭E~ak-0*T=vkpYбD||h0#|NՂPvB{J(z fCΒFqHX(H2ܕ^2Y_~PKd?(OE_themes/READMEUT RN\Nux Sn +F8czsr* !NW!b޼y1~2%hWyUO&]%H6Z})"ZQ5!wrTq%RE6}#Zk(4GaɕF q&!e_jP6ctDvmt m&!-Žf8fXE(@*Uu= 3J$ZЩ{}x`γ;]ot֎q[LMg2888)Ȩަ]kMZ']x4KkwxrZK1*NGUAy O-Ԩ5}lSſn|`acWJjۆ.Yq7:J}}~P=8=-XmYT|UakT58CԪv 7Aɤw N:n[%tzpxQ3NRtƱ{dH ywKZq !m)f@2+4-f-w>WϰkD'CW'֮֩ؔ, Y9kCa`NVӛ\,,z 18b ˦#M4\GH;gmVdzY&V!$Ko!+NtΎGCɃs b4NsPn9BBkuui$WEx)xvԘO閊 Br=:/(f*^4J@?> =!!+ۋ/BѰcmћIU=VoGbefScQS= "Y}XT<,-HcDU~Xkepqdq "[8nTUr0Q7|}@[gLb&J,[k>4_ݭkV-};/^8;dSfwl!cvqX JmCPԱpe#pndun3[Aǥva|g6Y4ÏM e. dqzV8E}U*h4,$D6 &z˱ Ys$48;'ǘ5 *n(&'gnNzwsLM)cqa׶v5`d掠D9"7lEJn6J<e xuqXDA| }rut**k?TJQel8/X{A!\S r-H4dμ~3M  -(] 5~zJ ܴbJQ y){XUi ! LcڒvQQ#b34yɩ7~gx&!Qf'\:IH(Ԩ| ᥌; . UԂOgEU |SF%Oہ$ߙG)tH)yHyJiojFF6ie{SbS6!Zf8@$R׍&O]m("w'PȬ$@&Z&|OvY]w({wj 7i(!~MaR<44bCѣHDGqF?9 Q2jO)D/#e7PM}j^訁彧g *`8ÑGi!uoL^2.*v4Dإa!pَH) ;3p1~B+(_iƞ>>}HW/Ϯ<xIa5NRO3Go ~. iP9B\{YsA <#L54U-}h+G2,H啫9t1v,H-!jU@ I%fjQaSeʥ<@T-m@SBȠ b90TJPSF5- - `:a9cB3#mAHZi$&mv4Z!QJ]!B|8pY͞2^eTa"EÑx?o]x>wuhHxâċ'|cxM:$B$h>gAJ0d`[|%9RN&.u~ߘ?x#=f'yI?e4;3U6\JU."H(0SrN^mNx7?-9;H0R ܘm= =~xxy4sZWTWo ǽ Ҍ)&/aazkO] f9cǭn53w_ 4 &Ԕ)$Ē=H- 7 XUDC='ԀNX? K >R"8 Ic?IHTw$ހ?$qṕTMȺT#ź]6 a ~I!ˆ/@!ˌ}O |㈨|0uثҤ 3*sh:% C}yЙ>ޕJ}1t/PK?r index.rstUT ]N]Nux eTn0 +n@[ qxȡCѭ Zfb-hHr\GɎvFH>G>A~nگ? Z1^BVNaUB:! [5ME:1HN;k R=A`!pJJ@L ZMx wvՀ6{]HUߟ&~5 JR5#ȟ1)u0C*ԢV~{w;HKjVHJ$h]0KU.9Bos%͑ uY? ~6ؑZše𑴕D؈\\CAK Nއ&S C]*c蚍,yX[':."/3Yˮͽ nl.5sS v-W&3ȁE ϕ>&fFyLذ b7'u<͈;gGR3ߓbcRL ]"<wB,Jy\}M2gq9$E+3~b/%k~JbiMQXl(nSd%7y+Bݸ\B͕˃L\oR'N<H7v?dG0Pqq\bArl3]>˜7ZՒe=v=)u>pj^R[PK?UW9MakefileUT J[N]Nux XmO8D{[Ep*P-nWZs6_3֚{mgόgOكK$n8ɟ a\3< =*JYk1WL" Rd2G&97/c䯋)}e6/$PvzᖎEYXk鎽w)L󧻂\ީ?f`5yhgN `XQM1OZrvގFX`#yZ@rLgDW䫔EL+a1^?W^ -%<c:yC\ < OodX fros|D9堶XJPyMp˦B2AGib`INhKv{86%P435UW ҫ`dfMס ?@*L,RHUlA(5=>x ouBu~Ǩ{GWR/W66f)/*Ssa7PK?M? .conf.py.un~UT]Nux PK?2\C\.index.rst.un~UT]Nux PK 8?A_build/UT\Nux PK ?A_build/doctrees/UT]Nux PK?F% N"=_build/doctrees/environment.pickleUT]Nux PK?3]k$v _build/doctrees/index.doctreeUT]Nux PK ? A2_build/html/UT]Nux PK?Dܭ2_build/html/.buildinfoUT]Nux PK ?A3_build/html/_sources/UT]Nux PK?r4_build/html/_sources/index.txtUT]Nux PK ?A@7_build/html/_static/UT]Nux PKe>KN 7_build/html/_static/basic.cssUT5Nux PKe>>  ?_build/html/_static/doctools.jsUT5Nux PK e>+0VJ_build/html/_static/file.pngUT5Nux PK?ψM74L_build/html/_static/flasky.cssUT]Nux PKe>4_Q_build/html/_static/jquery.jsUT5Nux PKe>Kɱ_build/html/_static/minus.pngUT5Nux PKe>aܿ_build/html/_static/plus.pngUT5Nux PK?3`S\ _build/html/_static/pygments.cssUT]Nux PKe>8"_build/html/_static/searchtools.jsUT5Nux PKe>-۠Q !_build/html/_static/underscore.jsUT5Nux PK?}) K_build/html/genindex.htmlUT]Nux PK?ς\ù 0_build/html/index.htmlUT]Nux PK ?T--_build/html/objects.invUT]Nux PK?R!i޻ _build/html/py-modindex.htmlUT]Nux PK?3G9 _build/html/search.htmlUT]Nux PK?w_build/html/searchindex.jsUT]Nux PK ?A_static/UTJ[Nux PK ? A_templates/UTJ[Nux PK d?A@_themes/UTRNux PK f? A_themes/.git/UT_,Nux PK d?A_themes/.git/branches/UTRNux PKd?k%"(_themes/.git/configUTRNux PKd?7?I(_themes/.git/descriptionUTRNux PK d?+is_themes/.git/HEADUTRNux PK d?A_themes/.git/hooks/UTRNux PKd?`X (h_themes/.git/hooks/applypatch-msg.sampleUTRNux PKd?$_themes/.git/hooks/commit-msg.sampleUTRNux PKd?lz%)_themes/.git/hooks/post-commit.sampleUTRNux PKd?}.U(&_themes/.git/hooks/post-receive.sampleUTRNux PKd? %큷_themes/.git/hooks/post-update.sampleUTRNux PKd?%[9(큠_themes/.git/hooks/pre-applypatch.sampleUTRNux PKd? \*$_themes/.git/hooks/pre-commit.sampleUTRNux PKd?,.W$큹_themes/.git/hooks/pre-rebase.sampleUTRNux PKd?, _themes/.git/hooks/prepare-commit-msg.sampleUTRNux PKd?Rv _themes/.git/hooks/update.sampleUTRNux PKf?ܯ%D_themes/.git/indexUT_,Nux PK d?AM_themes/.git/info/UTRNux PKd?w=!_themes/.git/info/excludeUTRNux PK d?A_themes/.git/logs/UTRNux PKd?Ė_themes/.git/logs/HEADUTRNux PK d?A_themes/.git/logs/refs/UTRNux PK d?A_themes/.git/logs/refs/heads/UTRNux PKd?Ė#n_themes/.git/logs/refs/heads/masterUTRNux PK d?A\_themes/.git/objects/UTRNux PK d?A_themes/.git/objects/info/UTRNux PK d?A_themes/.git/objects/pack/UTRNux PKd?Tk K$S_themes/.git/objects/pack/pack-c59acb6dab44178f3f0ceda2c240adbf9c0af295.idxUTRNux PKd?=6=L$C(_themes/.git/objects/pack/pack-c59acb6dab44178f3f0ceda2c240adbf9c0af295.packUTRNux PKd?ìW^__themes/.git/packed-refsUTRNux PK d?A__themes/.git/refs/UTRNux PK d?A__themes/.git/refs/heads/UTRNux PK d?K0))M`_themes/.git/refs/heads/masterUTRNux PK d?A`_themes/.git/refs/remotes/UTRNux PK d?!A"a_themes/.git/refs/remotes/origin/UTRNux PK d?%Ԡ %}a_themes/.git/refs/remotes/origin/HEADUTRNux PK d?Aa_themes/.git/refs/tags/UTRNux PK d?(Mb_themes/.gitignoreUTRNux PK d?Ab_themes/flask/UTRNux PKd?a0vb_themes/flask/layout.htmlUTRNux PKd?;pNd_themes/flask/relations.htmlUTRNux PK d?Af_themes/flask/static/UTRNux PKd?afђ$!Wf_themes/flask/static/flasky.css_tUTRNux PKd?]s$Dm_themes/flask/static/small_flask.cssUTRNux PKd?&oa{o_themes/flask/theme.confUTRNux PK d?Ao_themes/flask_small/UTRNux PKd?QF0p_themes/flask_small/layout.htmlUTRNux PK d?Aq_themes/flask_small/static/UTRNux PKd?h'$r_themes/flask_small/static/flasky.css_tUTRNux PKd?ʇw_themes/flask_small/theme.confUTRNux PKd?ס x_themes/flask_theme_support.pyUTRNux PKd?ч}_themes/LICENSEUTRNux PKd?(OEǁ_themes/READMEUTRNux PK? Bconf.pyUT]Nux PK?r +index.rstUT]Nux PK?UW9DMakefileUTJ[Nux PKVVD flask-bcrypt-0.7.1/docs/index.rst000066400000000000000000000035271260460620400167200ustar00rootroot00000000000000Flask-Bcrypt ============= .. module:: flaskext.bcrypt Flask-Bcrypt is a Flask extension that provides bcrypt hashing utilities for your application. Due to the recent increased prevelance of powerful hardware, such as modern GPUs, hashes have become increasingly easy to crack. A proactive solution to this is to use a hash that was designed to be "de-optimized". Bcrypt is such a hashing facility; unlike hashing algorithms such as MD5 and SHA1, which are optimized for speed, bcrypt is intentionally structured to be slow. For sensitive data that must be protected, such as passwords, bcrypt is an advisable choice. .. _Flask-Bcrypt: http://github.com/maxcountryman/flask-bcrypt .. _Flask: http://flask.pocoo.org/ Installation ------------ Install the extension with one of the following commands: $ easy_install flask-bcrypt or alternatively if you have pip installed: $ pip install flask-bcrypt .. note:: You need Python Development Headers to install py-bcrypt package, needed as a dependency. If you are on Mac OS or Windows, you probably have it already installed. Otherwise look for python-dev package for Debian-based distributives and for python-devel package for RedHat-based. Usage ----- To use the extension simply import the class wrapper and pass the Flask app object back to here. Do so like this:: from flask import Flask from flask.ext.bcrypt import Bcrypt app = Flask(__name__) bcrypt = Bcrypt(app) Two primary hashing methods are now exposed by way of the bcrypt object. Use them like so:: pw_hash = bcrypt.generate_password_hash('hunter2') bcrypt.check_password_hash(pw_hash, 'hunter2') # returns True API ___ .. autoclass:: flask.ext.bcrypt.Bcrypt :members: .. autofunction:: flask.ext.bcrypt.generate_password_hash .. autofunction:: flask.ext.bcrypt.check_password_hash flask-bcrypt-0.7.1/flask_bcrypt.py000066400000000000000000000161261260460620400171630ustar00rootroot00000000000000''' flaskext.bcrypt --------------- A Flask extension providing bcrypt hasing and comparison facilities. :copyright: (c) 2011 by Max Countryman. :license: BSD, see LICENSE for more details. ''' from __future__ import absolute_import from __future__ import print_function __version_info__ = ('0', '7', '1') __version__ = '.'.join(__version_info__) __author__ = 'Max Countryman' __license__ = 'BSD' __copyright__ = '(c) 2011 by Max Countryman' __all__ = ['Bcrypt', 'check_password_hash', 'generate_password_hash'] from werkzeug.security import safe_str_cmp try: import bcrypt except ImportError as e: print('bcrypt is required to use Flask-Bcrypt') raise e from sys import version_info PY3 = version_info[0] >= 3 def generate_password_hash(password, rounds=None): '''This helper function wraps the eponymous method of :class:`Bcrypt`. It is intended to be used as a helper function at the expense of the configuration variable provided when passing back the app object. In other words this shortcut does not make use of the app object at all. To this this function, simple import it from the module and use it in a similar fashion as the method would be used. Here is a quick example:: from flask.ext.bcrypt import generate_password_hash pw_hash = generate_password_hash('hunter2', 10) :param password: The password to be hashed. :param rounds: The optional number of rounds. ''' return Bcrypt().generate_password_hash(password, rounds) def check_password_hash(pw_hash, password): '''This helper function wraps the eponymous method of :class:`Bcrypt.` It is intended to be used as a helper function at the expense of the configuration variable provided when passing back the app object. In other words this shortcut does not make use of the app object at all. To this this function, simple import it from the module and use it in a similar fashion as the method would be used. Here is a quick example:: from flask.ext.bcrypt import check_password_hash check_password_hash(pw_hash, 'hunter2') # returns True :param pw_hash: The hash to be compared against. :param password: The password to compare. ''' return Bcrypt().check_password_hash(pw_hash, password) class Bcrypt(object): '''Bcrypt class container for password hashing and checking logic using bcrypt, of course. This class may be used to intialize your Flask app object. The purpose is to provide a simple interface for overriding Werkzeug's built-in password hashing utilities. Although such methods are not actually overriden, the API is intentionally made similar so that existing applications which make use of the previous hashing functions might be easily adapted to the stronger facility of bcrypt. To get started you will wrap your application's app object something like this:: app = Flask(__name__) bcrypt = Bcrypt(app) Now the two primary utility methods are exposed via this object, `bcrypt`. So in the context of the application, important data, such as passwords, could be hashed using this syntax:: password = 'hunter2' pw_hash = bcrypt.generate_password_hash(password) Once hashed, the value is irreversible. However in the case of validating logins a simple hashing of candidate password and subsequent comparison. Importantly a comparison should be done in constant time. This helps prevent timing attacks. A simple utility method is provided for this:: candidate = 'secret' bcrypt.check_password_hash(pw_hash, candidate) If both the candidate and the existing password hash are a match `check_password_hash` returns True. Otherwise, it returns False. .. admonition:: Namespacing Issues It's worth noting that if you use the format, `bcrypt = Bcrypt(app)` you are effectively overriding the bcrypt module. Though it's unlikely you would need to access the module outside of the scope of the extension be aware that it's overriden. Alternatively consider using a different name, such as `flask_bcrypt = Bcrypt(app)` to prevent naming collisions. Additionally a configuration value for `BCRYPT_LOG_ROUNDS` may be set in the configuration of the Flask app. If none is provided this will internally be assigned to 12. (This value is used in determining the complexity of the encryption, see bcrypt for more details.) :param app: The Flask application object. Defaults to None. ''' _log_rounds = 12 def __init__(self, app=None): if app is not None: self.init_app(app) def init_app(self, app): '''Initalizes the application with the extension. :param app: The Flask application object. ''' self._log_rounds = app.config.get('BCRYPT_LOG_ROUNDS', 12) def generate_password_hash(self, password, rounds=None): '''Generates a password hash using bcrypt. Specifying `rounds` sets the log_rounds parameter of `bcrypt.gensalt()` which determines the complexity of the salt. 12 is the default value. Example usage of :class:`generate_password_hash` might look something like this:: pw_hash = bcrypt.generate_password_hash('secret', 10) :param password: The password to be hashed. :param rounds: The optional number of rounds. ''' if not password: raise ValueError('Password must be non-empty.') if rounds is None: rounds = self._log_rounds # Python 3 unicode strings must be encoded as bytes before hashing. if PY3 and isinstance(password, str): password = bytes(password, 'utf-8') if not PY3 and isinstance(password, unicode): password = password.encode('utf-8') return bcrypt.hashpw(password, bcrypt.gensalt(rounds)) def check_password_hash(self, pw_hash, password): '''Tests a password hash against a candidate password. The candidate password is first hashed and then subsequently compared in constant time to the existing hash. This will either return `True` or `False`. Example usage of :class:`check_password_hash` would look something like this:: pw_hash = bcrypt.generate_password_hash('secret', 10) bcrypt.check_password_hash(pw_hash, 'secret') # returns True :param pw_hash: The hash to be compared against. :param password: The password to compare. ''' # Python 3 unicode strings must be encoded as bytes before hashing. if PY3 and isinstance(pw_hash, str): pw_hash = bytes(pw_hash, 'utf-8') if PY3 and isinstance(password, str): password = bytes(password, 'utf-8') if not PY3 and isinstance(pw_hash, unicode): pw_hash = pw_hash.encode('utf-8') if not PY3 and isinstance(password, unicode): password = password.encode('utf-8') return safe_str_cmp(bcrypt.hashpw(password, pw_hash), pw_hash) flask-bcrypt-0.7.1/setup.py000066400000000000000000000023211260460620400156300ustar00rootroot00000000000000''' Flask-Bcrypt ------------ Bcrypt hashing for your Flask. ''' import os from setuptools import setup module_path = os.path.join(os.path.dirname(__file__), 'flask_bcrypt.py') with open(module_path) as module: for line in module: if line.startswith('__version_info__'): version_line = line break __version__ = '.'.join(eval(version_line.split('__version_info__ = ')[-1])) setup( name='Flask-Bcrypt', version=__version__, url='https://github.com/maxcountryman/flask-bcrypt', license='BSD', author='Max Countryman', author_email='maxc@me.com', description='Brcrypt hashing for Flask.', long_description=__doc__, py_modules=['flask_bcrypt'], zip_safe=False, platforms='any', install_requires=['Flask', 'bcrypt'], classifiers=[ 'Environment :: Web Environment', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', 'Topic :: Software Development :: Libraries :: Python Modules' ], test_suite='test_bcrypt' ) flask-bcrypt-0.7.1/test_bcrypt.py000066400000000000000000000037231260460620400170410ustar00rootroot00000000000000# coding:utf-8 import unittest import flask from flask_bcrypt import (Bcrypt, check_password_hash, generate_password_hash, PY3) class BasicTestCase(unittest.TestCase): def setUp(self): app = flask.Flask(__name__) app.config['BCRYPT_LOG_ROUNDS'] = 6 self.bcrypt = Bcrypt(app) def test_is_string(self): pw_hash = self.bcrypt.generate_password_hash('secret') if PY3: self.assertTrue(isinstance(pw_hash, bytes)) else: self.assertTrue(isinstance(pw_hash, str)) def test_custom_rounds(self): password = 'secret' pw_hash1 = self.bcrypt.generate_password_hash(password, 5) self.assertNotEqual(password, pw_hash1) def test_check_hash(self): pw_hash = self.bcrypt.generate_password_hash('secret') # check a correct password self.assertTrue(self.bcrypt.check_password_hash(pw_hash, 'secret')) # check an incorrect password self.assertFalse(self.bcrypt.check_password_hash(pw_hash, 'hunter2')) # check unicode pw_hash = self.bcrypt.generate_password_hash(u'\u2603') self.assertTrue(self.bcrypt.check_password_hash(pw_hash, u'\u2603')) # check helpers pw_hash = generate_password_hash('hunter2') self.assertTrue(check_password_hash(pw_hash, 'hunter2')) def test_check_hash_unicode_is_utf8(self): password = u'\u2603' pw_hash = self.bcrypt.generate_password_hash(password) # check a correct password self.assertTrue(self.bcrypt.check_password_hash(pw_hash, b'\xe2\x98\x83')) def test_rounds_set(self): self.assertEqual(self.bcrypt._log_rounds, 6) def test_unicode_hash(self): password = u'東京' h = generate_password_hash(password).decode('utf-8') self.assertIs(check_password_hash(h, password), True) if __name__ == '__main__': unittest.main()